Grafana 系列文章(三):Tempo-使用 HTTP 推送 Spans

東風微鳴發表於2023-01-30

?️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,以檢視:

single span

更多 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"
  }
}]'

而現在,使用者介面顯示:

parent and child spans

Spans from everything

追蹤並不限於具有複雜框架的企業語言。正如你所看到的,從你的 js、python 或 bash 指令碼中儲存和追蹤事件很容易。今天你可以使用 Tempo/分散式追蹤來追蹤 CI 管道,長期執行的 bash 程式,python 資料處理流程或任何你能想到的其他東西。

祝你追蹤 (tracing) 成功!

Grafana 系列文章

Grafana 系列文章

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章