用 Go 语言把「应用日志」变成「可追溯故事」——CozeLoop Go SDK 全流程入门
如果你是一名后端工程师,正在寻找一种不侵入业务代码、又能清晰记录每一次请求链路的方案,这篇文章就是为你写的。
读完你将掌握:
如何用 10 分钟跑通 CozeLoop Go SDK 的安装、配置、上报 如何通过「Trace」与「Prompt」两大核心能力,把日志从“一坨文本”升级为“可追溯故事” 常见坑点、排障思路与官方安全通道
1. CozeLoop 是什么?为什么它值得我花时间?
一句话版本:
CozeLoop 是一个把请求链路(Trace)和大模型提示(Prompt)统一管理的平台。
用 Go SDK,你可以像写本地日志一样,把每一次调用、每一次大模型交互,自动上传到云端,并在可视化界面上看到谁在什么时候输入了什么、得到了什么输出。
1.1 与传统日志的区别
维度 | 传统日志 | CozeLoop Trace + Prompt |
---|---|---|
数据结构 | 纯文本 | 结构化 JSON,自带输入、输出、耗时字段 |
查询方式 | grep / awk | 网页上点击过滤条件即可 |
可追溯性 | 需手动注入 request-id | SDK 自动注入 trace-id |
大模型调试 | 打印 prompt + completion | 自动记录并支持变量替换可视化 |
多人协作 | 日志文件传来传去 | 同一看板,权限可控 |
2. 10 分钟跑通:从 0 到第一次上报
2.1 前提检查
-
本地已安装 Go 1.18 或以上
执行go version
能看到go1.18
及以上即可。 -
能访问 GitHub
因为依赖托管在github.com/coze-dev/cozeloop-go
。
2.2 安装 SDK
打开终端,进入你的项目根目录:
go get github.com/coze-dev/cozeloop-go
go mod tidy # 把依赖写进 go.mod
2.3 在 CozeLoop 控制台创建 OAuth 应用
-
浏览器访问 https://loop.coze.cn/console/enterprise/personal/open/oauth/apps -
点击「创建应用」,类型选「服务器应用」 -
记录以下四个值:
环境变量名 | 含义示例 |
---|---|
COZELOOP_WORKSPACE_ID | 你所在的工作空间 id |
COZELOOP_JWT_OAUTH_CLIENT_ID | 应用编号,形如 12345 |
COZELOOP_JWT_OAUTH_PRIVATE_KEY | 应用私钥,整段 PEM |
COZELOOP_JWT_OAUTH_PUBLIC_KEY_ID | 公钥编号,形如 k-1 |
把这些值写进 .bashrc
或直接在终端 export:
export COZELOOP_WORKSPACE_ID=ws_abc123
export COZELOOP_JWT_OAUTH_CLIENT_ID=12345
export COZELOOP_JWT_OAUTH_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
export COZELOOP_JWT_OAUTH_PUBLIC_KEY_ID=k-1
2.4 写第一个 Trace 示例
在 main.go
里粘贴:
package main
import (
"context"
"github.com/coze-dev/cozeloop-go/loop"
)
func main() {
ctx := context.Background()
// 1. 启动一个 span
ctx, span := loop.StartSpan(ctx, "root", "demo")
// 2. 记录输入输出
span.SetInput(ctx, "Hello")
span.SetOutput(ctx, "World")
// 3. 结束并上报
span.Finish(ctx)
loop.Close(ctx)
}
运行:
go run main.go
此时回到 CozeLoop 控制台 → Trace 页面,应该能看到一条刚刚上报的记录。
3. Prompt:让大模型提示像模板一样可维护
3.1 为什么需要 Prompt 管理?
-
把提示词从代码里抽离,非程序员也能改文案 -
支持变量替换,同一段提示可复用 N 个场景 -
版本控制:修改后可灰度、可回滚
3.2 上传 Prompt 模板
在控制台 → Prompt 管理
-
新建 Prompt Key:例如 greeting_prompt
-
内容写成模板语法:
你是一个{{role}},请用不超过20字向{{user}}打招呼。
-
保存并发布
3.3 在代码里调用
package main
import (
"context"
"fmt"
"github.com/coze-dev/cozeloop-go/loop"
)
func main() {
ctx := context.Background()
prompt, err := loop.GetPrompt(ctx, loop.GetPromptParam{PromptKey: "greeting_prompt"})
if err != nil {
panic(err)
}
messages, err := loop.PromptFormat(ctx, prompt, map[string]any{
"role": "客服机器人",
"user": "张三",
})
if err != nil {
panic(err)
}
fmt.Println(messages) // 打印最终提示
}
输出示例:
你是一个客服机器人,请用不超过20字向张三打招呼。
4. 常见疑问 FAQ
4.1 一定要在代码里 export 变量吗?
不一定。
-
本地调试:用 export
最方便 -
线上容器:把变量写进 Kubernetes Secret 或配置中心,再注入容器环境变量
4.2 私钥太长,写在命令行里好麻烦?
可把整段私钥放进文件,例如 key.pem
,然后在程序里:
os.Setenv("COZELOOP_JWT_OAUTH_PRIVATE_KEY", string(os.ReadFile("key.pem")))
注意 .gitignore
掉 key.pem
,避免提交到仓库。
4.3 能自定义字段吗?
可以。
span.SetTag(ctx, "cost_ms", 123)
就能把自定义键值对带上去。
4.4 会不会拖垮我的 QPS?
SDK 默认异步批量上报,内部有缓冲,正常不会阻塞业务逻辑。
极端高并发场景可在初始化时调大缓冲区,或开启本地磁盘队列做兜底。
4.5 我要上报的数据包含敏感信息怎么办?
-
先在 span.SetInput
/span.SetOutput
前做脱敏 -
或在控制台配置「采样率」,只保留部分 trace -
若仍担心,可在内网部署私有化版本(需联系官方商务)
4.6 必须上报到公网吗?
默认域名是公网。
若公司合规要求,可配置自定义接入点(需官方提供接入网关)。
5. 本地构建与贡献代码
如果你想给 SDK 提 PR,步骤如下:
-
Fork 仓库到个人 GitHub -
本地 clone 后,确保 Go 版本 ≥ 1.18 -
安装依赖 go mod tidy
-
构建验证 go build ./...
-
跑单测 go test ./...
-
push 分支 → 提 Pull Request
官方 Review 周期一般 1~2 个工作日,合并后会自动打 tag。
6. 安全问题如何上报?
发现任何潜在安全漏洞,请勿在公开 issue 里讨论。
官方提供两种私密通道:
-
访问 https://security.bytedance.com/src 提交 -
或直接邮件至 sec@bytedance.com
邮件标题格式:CozeLoop Go SDK 安全问题报告 - [简述]
7. 许可证
本项目采用 MIT 许可证,简单理解:
-
可商用、可修改 -
需保留原作者版权声明 -
无担保,风险自担
许可证全文见仓库根目录的 LICENSE
文件。
8. 小结与下一步
通过上文,你已经:
-
✅ 安装并验证了 Go SDK -
✅ 成功上报第一条 Trace -
✅ 用 Prompt 模板把大模型提示抽离 -
✅ 知道如何安全地贡献代码或上报漏洞
下一步建议:
-
把 SDK 接入现有 HTTP 或 gRPC 服务,给每个请求自动注入 trace-id -
在控制台配置告警:当某接口错误率 > 5% 时飞书通知 -
尝试 A/B Prompt:同一功能两个提示词版本,通过 trace 对比效果
祝你玩得开心,任何问题欢迎留言或发 issue。