Jaegerを使った分散トレーシング
たけるです。
最近Observabilityに関して学ぶ機会が多かったのでJaegerを触って
今回はKubernetes(kind)上にJaegerを構築してわいわいやっていこうと思います
Jaegerは以下のコンポーネントから構成されるみたいです (参考)
- jaeger-client
- アプリケーションに組み込まれたOpenTracingAPIの言語固有の
- 例えばgo-grpcだとopentracing-contrib/go-grpc
- jaeger-agent
- UDPを通して送信されたスパンをコレクターに流すネットワークデーモン
- jaeger-collector
- Agentからトレースを受け取り、トレースを検証し、インデックスを付けてDBに保存する
- jaeher-query
- DBからトレースを取得してWeb UIを表示する

- 適当にクラスタを立てます
$ kind create cluster
- helmでクラスタにJaeger Operatorをインストールします
$ helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
$ helm repo update
- JaegerをAll In One Deploymentでデプロイします。
今回はデータの永続化はしませんが、ElasticSearch Operatorなりk8ssandraなりを入れてあげてウェイってしてあげればいいのかなぁと思います。
$ kubectl apply -f jager.yaml
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: jaeger
namespace: monitoring
- ここまででjaeger-queryにアクセスできるようになっているのでポートフォワーディングして確認してみます。
$ kubectl port-forward -n monitoring svc/jaeger-query 16686:16686
- ただこのままだと何もトレーシングしていないので、jaegerがデモアプリとして用意しているHot R.O.D. - Rides on Demandをデプロイしてトレースしてみます。
jaeger-agentはannotationにsidecar.jaegertracing.io/inject
を設定するとjaeger-operatorが挿入してくれます。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hotrod
name: hotrod
namespace: monitoring
annotations:
sidecar.jaegertracing.io/inject: "true"
spec:
replicas: 1
selector:
matchLabels:
app: hotrod
template:
metadata:
labels:
app: hotrod
spec:
containers:
- image: docker.io/jaegertracing/example-hotrod
name: hotrod
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hotrod
namespace: monitoring
spec:
ports:
- name: hotrod
port: 8000
targetPort: 8080
selector:
app: hotrod
ちゃんとサイドカーとしてjaeger-agentか挿入されていたらhotrodのコンテナが2つになっているはずです
NAMESPACE NAME READY STATUS RESTARTS AGE
monitoring hotrod-576695ccc5-zmspl 2/2 Running 0 1m
-
hotrodを弄り倒します
-
jager-queryにアクセスしてみるとしっかりとトレーシングできてることがわかります。べんり
エラーもしっかり