Golang 示例¶
安装依赖¶
安装 ddtrace golang library 在开发目录下运行
设置 DataKit¶
需先安装、启动 datakit,并开启 ddtrace 采集器
代码示例¶
以下代码演示了一个文件打开操作的 trace 数据收集。
在 main()
入口代码中,设置好基本的 trace 参数,并启动 trace:
package main
import (
"io/ioutil"
"os"
"time"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)
func main() {
tracer.Start(
tracer.WithEnv("prod"),
tracer.WithService("test-file-read"),
tracer.WithServiceVersion("1.2.3"),
tracer.WithGlobalTag("project", "add-ddtrace-in-golang-project"),
)
// end of app exit, make sure tracer stopped
defer tracer.Stop()
tick := time.NewTicker(time.Second)
defer tick.Stop()
// your-app-main-entry...
for {
runApp()
runAppWithError()
select {
case <-tick.C:
}
}
}
func runApp() {
var err error
// Start a root span.
span := tracer.StartSpan("get.data")
defer span.Finish(tracer.WithError(err))
// Create a child of it, computing the time needed to read a file.
child := tracer.StartSpan("read.file", tracer.ChildOf(span.Context()))
child.SetTag(ext.ResourceName, os.Args[0])
// Perform an operation.
var bts []byte
bts, err = ioutil.ReadFile(os.Args[0])
span.SetTag("file_len", len(bts))
child.Finish(tracer.WithError(err))
}
func runAppWithError() {
var err error
// Start a root span.
span := tracer.StartSpan("get.data")
// Create a child of it, computing the time needed to read a file.
child := tracer.StartSpan("read.file", tracer.ChildOf(span.Context()))
child.SetTag(ext.ResourceName, "somefile-not-found.go")
defer func() {
child.Finish(tracer.WithError(err))
span.Finish(tracer.WithError(err))
}()
// Perform an error operation.
if _, err = ioutil.ReadFile("somefile-not-found.go"); err != nil {
// error handle
}
}
编译运行¶
程序运行一段时间后,即可在观测云看到类似如下 trace 数据:
支持的环境变量¶
以下环境变量支持在启动程序的时候指定 ddtrace 的一些配置参数,其基本形式为:
Attention
这些环境变量将会被代码中用 WithXXX()
注入的对应字段覆盖,故代码注入的配置,优先级更高,这些 ENV 只有在代码未指定对应字段时才生效。
Key | 默认值 | 说明 |
---|---|---|
DD_VERSION |
- | 设置应用程序版本,如 1.2.3、2022.02.13 |
DD_SERVICE |
- | 设置应用服务名 |
DD_ENV |
- | 设置应用当前的环境,如 prod、pre-prod 等 |
DD_AGENT_HOST |
localhost |
设置 DataKit 的 IP 地址,应用产生的 trace 数据将发送给 DataKit |
DD_TRACE_AGENT_PORT |
- | 设置 DataKit trace 数据的接收端口。这里需手动指定 DataKit 的 HTTP 端口(一般为 9529) |
DD_DOGSTATSD_PORT |
- | 如果要接收 ddtrace 产生的 statsd 数据,需在 DataKit 上手动开启 statsd 采集器 |
DD_TRACE_SAMPLING_RULES |
- | 这里用 JSON 数组来表示采样设置(采样率应用以数组顺序为准),其中 sample_rate 为采样率,取值范围为 [0.0, 1.0] 。示例一:设置全局采样率为 20%: DD_TRACE_SAMPLE_RATE='[{"sample_rate": 0.2}]' ./my-app 示例二:服务名通配 app1.* 、且 span 名称为 abc 的,将采样率设置为 10%,除此之外,采样率设置为 20%:DD_TRACE_SAMPLE_RATE='[{"service": "app1.*", "name": "b", "sample_rate": 0.1}, {"sample_rate": 0.2}]' ./my-app |
DD_TRACE_SAMPLE_RATE |
- | 开启上面的采样率开关 |
DD_TRACE_RATE_LIMIT |
- | 设置每个 golang 进程每秒钟的 span 采样数。如果 DD_TRACE_SAMPLE_RATE 已经打开,则默认为 100 |
DD_TAGS |
- | 这里可注入一组全局 tag,这些 tag 会出现在每个 span 和 profile 数据中。多个 tag 之间可以用空格和英文逗号分割,例如 layer:api,team:intake 、layer:api team:intake |
DD_TRACE_STARTUP_LOGS |
true |
开启 ddtrace 有关的配置和诊断日志 |
DD_TRACE_DEBUG |
false |
开启 ddtrace 有关的调试日志 |
DD_TRACE_ENABLED |
true |
开启 trace 开关。如果手动将该开关关闭,则不会产生任何 trace 数据 |
DD_SERVICE_MAPPING |
- | 动态重命名服务名,各个服务名映射之间可用空格和英文逗号分割,如 mysql:mysql-service-name,postgres:postgres-service-name ,mysql:mysql-service-name postgres:postgres-service-name |