有时,使用追踪系统是令人生畏的,因为你似乎需要复杂的应用程序仪器或 span 摄取管道才能推送 span。本指南旨在展示一种极其基本的技术,即使用Zipkin[1]接收器,从Bash脚本中用http/json推送 span。
首先,让我们在配置好Zipkin接收器的情况下启动Tempo。为了做到这一点,要创建一个配置文件,像这样:
server:
http_listen_port: 3200
distributor:
receivers:
zipkin:
storage:
trace:
backend: local
local:
path: /tmp/tempo/blocks
并且运行 Tempo:
docker run -p 9411:9411 -p 3200:3200 -v $(pwd)/config.yaml:/config.yaml grafana/tempo:latest -config.file /config.yaml
现在Tempo正在运行,并且在9411端口监听Zipkin spans[2],让我们用curl
推送一个span到它。
curl -X POST http://localhost:9411 -H 'Content-Type: application/json' -d '[{
"id": "1234",
"traceId": "0123456789abcdef",
"timestamp": 1608239395286533,
"duration": 100000,
"name": "span from bash!",
"tags": {
"http.method": "GET",
"http.path": "/api"
},
"localEndpoint": {
"serviceName": "shell script"
}
}]'
请注意,timestamp
字段是以微秒为单位的,是通过运行date +%s%6N
得到的。duration
字段也是以微秒为单位,所以100000是100毫秒。
获得追踪的最简单方法是对Tempo执行一个简单的curl命令。返回的格式是OTLP[3]。
curl http://localhost:3200/api/traces/0123456789abcdef | jq
{
"batches": [
{
"resource": {
"attributes": [
{
"key": "service.name",
"value": {
"stringValue": "shell script"
}
}
]
},
"instrumentationLibrarySpans": [
{
"spans": [
{
"traceId": "AAAAAAAAAAABI0VniavN7w==",
"spanId": "AAAAAAAAEjQ=",
"name": "span from bash!",
"startTimeUnixNano": "1608239395286533000",
"endTimeUnixNano": "1608239395386533000",
"attributes": [
{
"key": "http.path",
"value": {
"stringValue": "/api"
}
},
{
"key": "http.method",
"value": {
"stringValue": "GET"
}
}
]
}
]
}
]
}
]
}
然而,在bash中盯着一个json blob不是很有趣。让我们启动Tempo query ,这样我们就可以直观地看到我们的追踪。Tempo query是Jaeger Query[4]的一个GRPC Plugin[5],它可以用来查询Tempo。
docker run --env BACKEND=localhost:3200 --net host grafana/tempo-query:latest
并在你选择的浏览器中打开http://localhost:16686/trace/0123456789abcdef
,以查看:
single span
现在我们已经有了基本的东西,很容易继续建立我们的追踪。通过指定相同的 trace ID和一个parent span ID,我们可以开始建立一个追踪。
curl -X POST http://localhost:9411 -H 'Content-Type: application/json' -d '[{
"id": "5678",
"traceId": "0123456789abcdef",
"parentId": "1234",
"timestamp": 1608239395316533,
"duration": 100000,
"name": "child span from bash!",
"localEndpoint": {
"serviceName": "shell script"
}
}]'
而现在,用户界面显示:
parent and child spans
追踪并不限于具有复杂框架的企业语言。正如你所看到的,从你的js、python或bash脚本中存储和追踪事件很容易。今天你可以使用Tempo/分布式追踪来追踪CI管道,长期运行的bash进程,python数据处理流程或任何你能想到的其他东西。
祝你追踪(tracing)成功!
[1]
Zipkin: https://zipkin.io/
[2]
Zipkin spans: https://zipkin.io/zipkin-api/#/default/post_spans
[3]
OTLP: https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/trace/v1/trace.proto
[4]
Jaeger Query: https://hub.docker.com/r/jaegertracing/jaeger-query/
[5]
GRPC Plugin: https://github.com/jaegertracing/jaeger/tree/master/plugin/storage/grpc