?️URL: https://grafana.com/docs/tempo/latest/api_docs/pushing-spans-with-http/
?Description:
有時,使用追蹤系統是令人生畏的,因為它似乎需要複雜的應用程式儀器或 span 攝取管道,以便 ...
有時,使用追蹤系統是令人生畏的,因為你似乎需要複雜的應用程式儀器或 span 攝取管道才能推送 span。本指南旨在展示一種極其基本的技術,即使用 Zipkin 接收器,從 Bash 指令碼中用 http/json 推送 span。
啟動 Tempo
首先,讓我們在配置好 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
推送 Spans
現在 Tempo 正在執行,並且在 9411 埠監聽 Zipkin spans,讓我們用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 毫秒。
接收 Traces
獲得追蹤的最簡單方法是對 Tempo 執行一個簡單的 curl 命令。返回的格式是 OTLP。
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 的一個 GRPC Plugin,它可以用來查詢 Tempo。
docker run --env BACKEND=localhost:3200 --net host grafana/tempo-query:latest
並在你選擇的瀏覽器中開啟http://localhost:16686/trace/0123456789abcdef
,以檢視:
更多 Spans
現在我們已經有了基本的東西,很容易繼續建立我們的追蹤。透過指定相同的 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"
}
}]'
而現在,使用者介面顯示:
Spans from everything
追蹤並不限於具有複雜框架的企業語言。正如你所看到的,從你的 js、python 或 bash 指令碼中儲存和追蹤事件很容易。今天你可以使用 Tempo/分散式追蹤來追蹤 CI 管道,長期執行的 bash 程式,python 資料處理流程或任何你能想到的其他東西。
祝你追蹤 (tracing) 成功!
Grafana 系列文章
三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.