自架 Grafana Tempo (2) 配置 Agent, Tempo, Grafana

上一篇已經簡單介紹了這幾個服務的功能,這篇就使用 docker compose 來架設這幾個服務,並且修改一些小地方以符合我們想要的設定。

接下來的內容各服務會用以下版本作為範例:

  • Grafana Agent: 0.29.0
  • Grafana Tempo: 1.5.x
  • Grafana: 9.3.2
  • Grafana Prometheus: 2.40.7

官方 GitHub 上的範例會比較新,會跟我的範例可能會有所很大的差異,畢竟 Grafana 的更新速度很快,一不留神就不知道該了什麼東東…

安裝

以 Grafana Tempo 官方 GitHub 上 docker compose local 版為範例 (記得要選 local 資料夾內的 docker compose)。版本我提供 1.5.0 版,如果覺得差異太多,可自行修改分支。
Grafana Tempo (v1.5.0) docker-compose - GitHub

修改設定

由於官方範例只是 demo,有很多設定被改成暫時性而已,資料來源也是從範例傳入,而不是由自己的服務傳入,所以我們來改造一下成可以作為服務的設定。我會這麼說是因為裡面的設定非常多,需要再詳細規畫和設定過才會比較合適。

Agent

這裡我們加一些特殊功能,開啟 Grafana 的 service graph 和過濾一些經常被作為 health check 網址,例如 metrics。過濾的寫法可能需要注意,在搜尋寫法的時候可能會搜到官方部落格裡面的介紹,但實際經過測試後,還是要依照 OpenTelemetry tail sampling processor 的寫法才行。

agent.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ...略...
traces:
configs:
- name: default
# ...略...
remote_write: # 資料往外傳送的位置
- endpoint: tempo:4317
insecure: true
service_graphs: # 啟用 service graph
enabled: true
tail_sampling: # 過濾不想要接收資料的規則
policies:
[
{
name: healthcheck-filter,
type: string_attribute,
string_attribute:
{
key: http.url,
values: ['^\/(?:metrics|healthcheck)$'],
enabled_regex_matching: true,
invert_match: true
}
}
]

Tempo

Tempo 的設定我們也要稍微修改一下,我們只要接收 otlp 的資料、設定資料保留的時間還有資料可以查詢的時間。範例內的資料是儲存在本地端,就是這個 yaml 檔的位置,我們先維持不動,當然也支援儲存到其他地方,例如 S3。

tempo.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 只接收otlp的資料
distributor:
receivers:
otlp:
protocols:
http:
grpc:

# 設定資料保留時間
compactor:
compaction:
# ...略...
block_retention: 720h # 資料保留時間,預設14天(336h)
# ...略...

# 設定資料可被搜尋的最大範圍
query_frontend:
search:
max_duration: 30d # 查詢日期範圍限制,預設 1h1m0s,0=無限制

Grafana

Grafana 我們可以加入一些圖表功能 (Tempo APM Table, Service Graph),讓 Tempo 的 Exporter 不只有看追蹤資料而已。不過這個功能在 Grafana 9.3.2 版本還是在測試版,需要手動把功能打開。

圖1:Service Graph。原始圖片來源:https://grafana.com/docs/tempo/latest/metrics-generator/service-graph-view/

Grafana Feature Toggles

因為這個功能還在測試階段,需要手動把功能性的開關打開。這項操作需要修改 docker-compose.yaml,後面會在說明修改的位置。

Service Graph

這個功能在上面 agent 的設定裡就先設定好了,不用再改。

agent.yaml

1
2
service_graphs: # 啟用 service graph
enabled: true

docker compose

接下來修改 docker compose 的設定,列出來的建議修改,其他的可以維持不動。

k6-tracing

這裡面就是透過 docker compose 來設定自動餵入資料,我們需要把它刪除(當然不刪也是可以,但是會看到一堆那些資料)。

1
2
3
4
5
6
7
8
9
10
# 刪除開始
# Generate fake traces...
k6-tracing:
image: ghcr.io/grafana/xk6-client-tracing:v0.0.2
environment:
- ENDPOINT=agent:4317
restart: always
depends_on:
- tempo
# 刪除結束

agent

將資料全部導到 agent 再傳到 Tempo,所以我們把 agent 的 port 打開並且對應到外部。

1
2
3
4
5
6
7
8
9
10
11
agent:
image: grafana/agent:v0.29.0
volumes:
- ./agent/agent.yaml:/etc/agent.yaml
entrypoint:
- /bin/agent
- -config.file=/etc/agent.yaml
# 把 port 打開,並對應到外部
ports:
- "4317:4317" # otlp grpc
- "4318:4318" # otlp http

Tempo

Tempo 我們只要開 Tempo(建議對外)和 otlp 的 port。之前我們設定agent.yaml裡,會把資料送到這裡的 4317 port。

1
2
3
4
5
6
7
8
9
10
tempo:
image: grafana/tempo:main-81aa300-arm64
command: [ "-config.file=/etc/tempo.yaml" ]
volumes:
- ./tempo/tempo.yaml:/etc/tempo.yaml
- ./tempo-data:/tmp/tempo
ports:
- "3200:3200" # tempo
- "4317" # otlp grpc
- "4318" # otlp http

Grafana

我們只要加入這個參數 GF_FEATURE_TOGGLES_ENABLE 就能修改要啟用實驗性或測試中的功能,後面有多個的話,用 , 隔開即可。其餘的設定不變。

1
2
3
4
5
6
7
grafana:
image: grafana/grafana:9.3.2
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
- GF_FEATURE_TOGGLES_ENABLE=tempoApmTable # 加入這行

啟動

大功告成,最後就到 docker-compose.yaml 路徑底下,輸入指令 docker-compose up -d 就 OK 啦。

好啦,休息一下,待會再戰,接下來就準備把追蹤資料送進去。

懶得看我的文章

那就直接去看我 GitHub 的 Repository 吧:zamhsu/GrafanaTempo

參考