Bookinfo applicationのTraceをDynatraceに取り込む
さっそく、続編を書くことにしました。前回のブログで、Bookinfo applicationをKubernetes上で動かすところまでを紹介しました。今回はそのアプリの分散トレースを可視化すべく、envoy ingress/egress traceはOpenTelemetry経由で取得し、その他のサービスはOneAgentで取得したいと思います。ただし、Product page と Detailsサービスはそれぞれ python と ruby で書かれているため、こちらのトレースはOneAgentではとれません。
何はともあれ、Dynatrace Operatorのインストールから
KuberntesのアプリをDynatraceでモニタリングする場合は、Dynatrace Operatorを使用します。2025年5月の本記事執筆時点では、下記3つの Deployment option があります。
- Kubernetes Platform monitoring
- Kubernetes Platform monitoring + Application monitoring
- Kubernetes Platform monitoring + Fullstack observability
今回はアプリケーションの分散トーレスを可視化したいので、2 or 3 のいずれかのオプションを使う必要がありますが、Kuberntes のホストも今回は追加で見ようと思いますので、3つ目のオプション(Kubernetes Platform monitoring + fullstack observability)を使用します。
Kubernetes platform monitoring + Fullstack observaiblity の導入
Dynatraceでは、このオプションのインストール方法がこちらに記載されています。今回は、皆さんもよく使うであろう helm chart を使ってインストールしたいと思います。
1. Dynatrace Operator のインストール
まずは Dynatrace operator をインストールします。multipass を使って spin up した VM には、helm コマンドがインストールされていないため、まず snap コマンドで helm をインストールします。
ubuntu@envoy-qiita:~$ which helm
ubuntu@envoy-qiita:~$
ubuntu@envoy-qiita:~$ sudo snap install helm --classic
2025-05-12T13:47:04+09:00 INFO Waiting for automatic snapd restart...
helm 3.17.3 from Snapcrafters✪ installed
ubuntu@envoy-qiita:~$ which helm
/snap/bin/helm
ubuntu@envoy-qiita:~$ helm version
version.BuildInfo{Version:"v3.17.3", GitCommit:"e4da49785aa6e6ee2b86efd5dd9e43400318262b", GitTreeState:"clean", GoVersion:"go1.23.7"}
ubuntu@envoy-qiita:~$
helm version
コマンドを実行し、version 3.x が表示されればOKです。このhelmコマンドを使って、Dynatrace operator をインストールします。
ubuntu@envoy-qiita:~$ helm install dynatrace-operator oci://public.ecr.aws/dynatrace/dynatrace-operator --create-namespace --namespace dynatrace --atomic
Pulled: public.ecr.aws/dynatrace/dynatrace-operator:1.5.1
Digest: sha256:255f7bcef32ecb53109a287943ed8f665aedee7a382443bb07ee6319dca7d017
NAME: dynatrace-operator
LAST DEPLOYED: Mon May 12 13:48:47 2025
NAMESPACE: dynatrace
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing dynatrace-operator.
Your release is named dynatrace-operator.
To find more information about the Dynatrace Operator, try:
https://github.com/Dynatrace/dynatrace-operator
To verify the current state of the deployments, try:
$ kubectl get pods -n dynatrace
$ kubectl logs -f deployment/dynatrace-operator -n dynatrace
ubuntu@envoy-qiita:~$
helmコマンドの出力で、STATUS: Deployed
になっていればOKです。また、追加で kubectl get pods -n dynatrace コマンドで、Dynatrace Operator 関連の Pod が Running
になっていることも確認しましょう。
ubuntu@envoy-qiita:~$ kubectl get pods -n dynatrace
NAME READY STATUS RESTARTS AGE
dynatrace-oneagent-csi-driver-lpsh4 4/4 Running 0 2m1s
dynatrace-operator-79f4845898-6l6xr 1/1 Running 0 2m1s
dynatrace-webhook-68875cd7c5-kcc22 1/1 Running 0 2m1s
dynatrace-webhook-68875cd7c5-n4f8j 1/1 Running 0 2m1s
ubuntu@envoy-qiita:~$
この時点では、まだ Dynatrace のテナントには接続されていません。Dynakubeと呼ばれる CRD(Custom Resource Definition)を使って、自身が持つDynatraceテナント(environment)にデータが遅れるようにしていきます。
その前に、Dynatrace OneAgentがテナントにデータを遅れるように、Token を設定しておきます。必要なトークンは2種類あり、Operatot token と Data injest token です。それぞれのトークンに必要な permission は、下記リンクをクリックして下さい。
kubectl -n dynatrace create secret generic dynakube --from-literal="apiToken=<OPERATOR_TOKEN>" --from-literal="dataIngestToken=<DATA_INGEST_TOKEN>"
ubuntu@envoy-qiita:~$ kubectl get secret -n dynatrace
NAME TYPE DATA AGE
dynakube Opaque 2 6s
dynatrace-webhook-certs Opaque 5 41m
sh.helm.release.v1.dynatrace-operator.v1 helm.sh/release.v1 1 41m
ubuntu@envoy-qiita:~$ kubectl get secret dynakube -n dynatrace -o yaml
apiVersion: v1
data:
apiToken: <hash for YOUR OPERATOR TOKEN>
dataIngestToken: <hash for YOUR DATA_INGEST TOKEN>
kind: Secret
metadata:
creationTimestamp: "2025-05-12T05:30:24Z"
name: dynakube
namespace: dynatrace
resourceVersion: "53225"
uid: 733172c5-d97a-4fff-84af-421f0ed5e26f
type: Opaque
ubuntu@envoy-qiita:~$
dynakube という secret が作成されていればOKです。secretに保存されているトークンは入力したトークンそのものではありませんのでご注意下さい。
2. Dynakube のインストール
次に、dynakube をインストールします。fullstack モニタリングの手順3に書かれた yaml ファイルを参考にしましょう。このサンプルには記載されていないが大事な設定としては、
- Dynatrace の K8s app に表示されるクラスタ名のカスタマイズ
metadata > annocations で、feature.dynatrace.com/automatic-kubernetes-api-monitoring-cluster-name
を分かりやすく変更しておきましょう。デフォルトだとdynakube
になるので、沢山K8s clusterをモニタリングしていると、分からなくなってしまいますので。
metadata:
name: dynakube
namespace: dynatrace
annotations:
feature.dynatrace.com/k8s-app-enabled: "true"
feature.dynatrace.com/injection-readonly-volume: "true"
feature.dynatrace.com/automatic-kubernetes-api-monitoring-cluster-name: "envoy-qiita"
- istio integrationの設定
dynakube の spec にて、enableIstio
オプションを有効にしておきます。このオプションを有効にしておくと、自動的に dynatrace namespace にServiceEntry
とVirutalServices
が作成され、envoy proxy を介して Dynatrace 環境(SaaSテナント、OneAgent、ActiveGate)と通信できるようになります。
spec:
# Optional: Configure istio to allow access to the Dynatrace Cluster from the OneAgent or ActiveGate pods.
#
enableIstio: true
Dynakube の YAML の準備ができたら、apply します。kubectl get dynakube -n dynatrace コマンドの出力で STATUS
が空白になっていれば、Deployの準備が進んでいることを意味します。ここでErrorなどのメッセージが表示されている場合は、トークンの認証が失敗しているなどの理由が考えられますので、今一度設定手順を見直して下さい。
ubuntu@envoy-qiita:~$ kubectl apply -f dynakube-cncf.yaml
dynakube.dynatrace.com/dynakube created
ubuntu@envoy-qiita:~$ kubectl get dynakube -n dynatrace
NAME APIURL STATUS AGE
dynakube https://<your tenant>.live.dynatrace.com/api 9s
ubuntu@envoy-qiita:~$ kubectl get dynakube -n dynatrace -w
NAME APIURL STATUS AGE
dynakube https://<your tenant>.live.dynatrace.com/api 11s
dynakube https://<your tenant>.live.dynatrace.com/api 29s
dynakube https://<your tenant>.live.dynatrace.com/api Deploying 30s
dynakube https://<your tenant>.live.dynatrace.com/api Deploying 5m30s
dynakube https://<your tenant>.live.dynatrace.com/api Running 5m41s
STATUS=Running
になったらpodを確認します。activegateとoneagentのPodがSTATUS=Running
になっていれば、OKです。
ubuntu@envoy-qiita:~$ kubectl get pods -n dynatrace
NAME READY STATUS RESTARTS AGE
dynakube-activegate-0 1/1 Running 0 6m43s
dynakube-oneagent-xl7cb 1/1 Running 0 6m42s
dynatrace-oneagent-csi-driver-lpsh4 4/4 Running 0 75m
dynatrace-operator-79f4845898-6l6xr 1/1 Running 0 75m
dynatrace-webhook-68875cd7c5-kcc22 1/1 Running 0 75m
dynatrace-webhook-68875cd7c5-n4f8j 1/1 Running 0 75m
DynatraceのKubernetes Appで、envoy-qiita
という K8s clusterが見えたら正しくActiveGateはインストールされています。
Infrastructure & Operations App で、envoy-qiita
というホストが見えたら正しくOneAgentもインストールされています。
ただ、この時点では bookinfo application の Node.Js / Java / Python プロセスに対してOneAgentがinjectされていないため、フルスタックでもモニタはできていません。なぜなら、OneAgentが起動するまえに、Bookinfo applicationが先に動いていたためです。なので、ここで bookinfo application を削除しても、もう一度 deploy します。その後、これらのプロセスがフルスタックでもモニタされるか確認します。
ubuntu@envoy-qiita:~$ kubectl -n bookinfo-app delete -f istio-1.26.0/samples/bookinfo/platform/kube/bookinfo.yaml
service "details" deleted
serviceaccount "bookinfo-details" deleted
deployment.apps "details-v1" deleted
service "ratings" deleted
serviceaccount "bookinfo-ratings" deleted
deployment.apps "ratings-v1" deleted
service "reviews" deleted
serviceaccount "bookinfo-reviews" deleted
deployment.apps "reviews-v1" deleted
deployment.apps "reviews-v2" deleted
deployment.apps "reviews-v3" deleted
service "productpage" deleted
serviceaccount "bookinfo-productpage" deleted
deployment.apps "productpage-v1" deleted
ubuntu@envoy-qiita:~$ kubectl -n bookinfo-app get pods
NAME READY STATUS RESTARTS AGE
bookinfo-gateway-istio-56954d7d95-qmd2h 1/1 Running 0 3h59m
ubuntu@envoy-qiita:~$
もう一度、applyし直す。
ubuntu@envoy-qiita:~$ kubectl -n bookinfo-app apply -f istio-1.26.0/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
ubuntu@envoy-qiita:~$ kubectl get pods -n bookinfo-app
NAME READY STATUS RESTARTS AGE
bookinfo-gateway-istio-56954d7d95-qmd2h 1/1 Running 0 4h8m
details-v1-77b775f46-mkbzf 2/2 Running 0 3m26s
productpage-v1-78dfd4688c-7rmfc 2/2 Running 0 3m26s
ratings-v1-7c4c8d6794-jnz52 2/2 Running 0 3m26s
reviews-v1-849f9bc5d6-zg2gd 2/2 Running 0 3m26s
reviews-v2-5c757d5846-2cgpj 2/2 Running 0 3m26s
reviews-v3-6d5d98f5c4-zrhj4 2/2 Running 0 3m26s
ubuntu@envoy-qiita:~$
3. OneAgentのトレース情報の確認
これでOneAgentが各プロセスにInjectされたと思いますので、DynatraceのUIで各プロセスの様子を見てみます。OneAgentが対応しているプロセスについては、正しくRuntimeのメトリクスが取れているのが分かります。
- productpage written by Python
- review written by Java
- ratings written by Node.js
Distributed Tracing Appで見ても、OneAgentからのTraceは全て見ていることが分かります。
でも、本当に見たいのは Envoy proxy を含むEnd-to-endの分散トレースです。ここから、isitoを通じて、Dynatraceに envoy proxy のトレース情報を取得できるように設定していきます。
4. Envoy proxy trace をDynatraceでモニタリングする
Dynatraceのヘルプドキュメントには、OpenTelemetryを介してEnvoy Traceをとる方法が丁寧に記載されています。ここのガイドに沿って、このブログでも紹介していきます。実際には、Dynatraceのテナントのメニューに沿って表示されるConfigをそのまま使って下さい。
a) AccessTokenを設定する
Envoy proxy のトレース情報を取り込むために必要なトークンは、下記2つです。予め、istioにConfigを投入する前にDynatraceの Access Token
で設定しておきます。
- openTelemetryIrace.injest
- adaptiveTrafficManaged.read
b) MeshConfig をistio に適用する
今回のデモで使ったbookinfo applicationのプロファイルにMeshConfigの設定を追加することで、extensionProviderを使えるようにします。Dynatraceに表示された設定をそのまま、bookinfo applicationのプロファイルに追加します。ただし、apiVersion
とkind
は削除可能です(デモプロファイル上に設定があるため)。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
extensionProviders:
- name: dynatrace-otel
opentelemetry:
port: 80
service: "istio-system/scz18209.live.dynatrace.com"
http:
path: "/api/v2/otlp/v1/traces"
timeout: 10s
headers:
- name: "Authorization"
value: "Api-Token <your access token>"
resource_detectors:
dynatrace: {}
dynatrace_sampler:
tenant: "scz18209"
cluster_id: -1733236678
デモプロファイルに上記内容を追加したうえで、istioctl コマンドで再度プロファイルをインストールします。
ubuntu@envoy-qiita:~/istio-1.26.0/samples/bookinfo$ istioctl install -f demo-profile-no-gateways.yaml -y
|\
| \
| \
| \
/|| \
/ || \
/ || \
/ || \
/ || \
/ || \
/______||__________\
____________________
\__ _____/
\_____/
✔ Istio core installed ⛵️
✔ Istiod installed 🧠
✔ Installation complete
ubuntu@envoy-qiita:~/istio-1.26.0/samples/bookinfo$
c) Dynatrace ServiceEntry を作成する
UIの手順に従い、下記マニフェストを istio-system namespace に適用します。
ubuntu@envoy-qiita:~$ cat qiita-serviceentry.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: dynatrace-se-otel
spec:
hosts:
- scz18209.live.dynatrace.com
ports:
- number: 80
name: http-port
protocol: HTTP
targetPort: 443
- number: 443
name: https-port
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: dynatrace-dr-otel
spec:
host: scz18209.live.dynatrace.com
trafficPolicy:
portLevelSettings:
- port:
number: 80
tls:
mode: SIMPLE
------------------------------------------------------------------------------
ubuntu@envoy-qiita:~$ kubectl apply -f qiita-serviceentry.yaml -n istio-system
serviceentry.networking.istio.io/dynatrace-se-otel created
destinationrule.networking.istio.io/dynatrace-dr-otel created
ubuntu@envoy-qiita:~$ kubectl get se -n istio-system
NAME HOSTS LOCATION RESOLUTION AGE
dynatrace-se-otel ["scz18209.live.dynatrace.com"] MESH_EXTERNAL DNS 6s
ubuntu@envoy-qiita:~$ kubectl get dr -n istio-system
NAME HOST AGE
dynatrace-dr-otel scz18209.live.dynatrace.com 11s
ubuntu@envoy-qiita:~$
Apply したら、ServiceEntry(se)とDestinationRoute(dr)が、isito-system namespace 配下に設定されているか確認しましょう。
d) Tracerの有効化
最後の手順です。UIに表示されたマニフェストをコピーして、istio-system namespace配下に適用します。
ubuntu@envoy-qiita:~$ cat qiita-tracing-provier.yaml
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: dynatrace-telemetry-otel
spec:
tracing:
- providers:
- name: dynatrace-otel
ubuntu@envoy-qiita:~$
ubuntu@envoy-qiita:~$ kubectl apply -f qiita-tracing-provier.yaml -n istio-system
telemetry.telemetry.istio.io/dynatrace-telemetry-otel created
ubuntu@envoy-qiita:~$ kubectl get telemetry -n istio-system
NAME AGE
dynatrace-telemetry-otel 10s
ubuntu@envoy-qiita:~$
Tracerが作成されているか、ここもちゃんと確認しましょう。
e) Bookinfo applicationの再デプロイとEnvoy Traceの表示確認
Bookinfo applicationを一度削除して、再び apply します。Applyし、PodがRunningになったら、istioctl コマンドで envoy proxy のコンフィグを確認しましょう。ここでは例として、producpage pod のsidecar envoy のコンフィグを確認しています。
ubuntu@envoy-qiita:~$ kubectl get pods -n bookinfo-app
NAME READY STATUS RESTARTS AGE
bookinfo-gateway-istio-56954d7d95-qmd2h 1/1 Running 0 4h51m
details-v1-77b775f46-57qjq 2/2 Running 0 2m47s
productpage-v1-78dfd4688c-f64fj 2/2 Running 0 2m47s
ratings-v1-7c4c8d6794-9rdnq 2/2 Running 0 2m47s
reviews-v1-849f9bc5d6-rfxmv 2/2 Running 0 2m47s
reviews-v2-5c757d5846-lj267 2/2 Running 0 2m47s
reviews-v3-6d5d98f5c4-jd67g 2/2 Running 0 2m47s
ubuntu@envoy-qiita:~$
ubuntu@envoy-qiita:~$ istioctl pc l productpage-v1-78dfd4688c-f64fj -n bookinfo-app -o yaml | grep -i opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
- name: envoy.tracers.opentelemetry.resource_detectors.dynatrace
ubuntu@envoy-qiita:~$
このように、設定投入したOpenTelemetyの resource detector の情報が表示されれば、OKです。あとは、port-forwardの設定を再度行ったブラウザから bookinfo application にアクセスしましょう。
Bookinfo applicationにアクセスしたのち、DynatraceのUIに戻り、envoy proxyのトレース情報がDynatrace上に表示されているか、確認します。
- Services App
まずはServices App
で確認してみます。いいですね、下記のようにistioアイコンのサービスが表示されれば、正しく Envoy ingress/egress trace が OpenTelemetry 経由で Dynatrace に Injest されています。
- Distributed Tracing App
次に、分散トレーシングアプリで確認します。こちらも良さそうですね。OpenTelemety経由で envoy proxy のトーレスが、JavaやNode.jsのトレースはOneAgentから、それぞれInjestされているのが分かります。
Kubernetes Gatewayを経由して入ってきた root span を見ると、綺麗に分散トレースが表現されています。
これで完璧です♪
OpenTelemetry経由でInjestされる envoy trace のライセンスについて
なお、OpenTelemetry経由でinjectされる envoy trace のライセンスについて、最後まとめておきます。通常、Dynatraceの trace api 経由で取り込む OTel などのトレースデータは、ホストライセンスとは別に管理(チャージ)されます。が、envoy trace については、full stack ライセンスを持つOneAgentでモニタリングされているホストノード(Kubernetes host node)から injest されたデータはその fullstack license と紐付けられ、個別にチャージされない仕組みがあります。これを実現させるためには、忘れずにMeshConfig をistio に適用する
の手順で resource_detectors
をきちんとApplyしましょう。この(↓)設定です。
resource_detectors:
dynatrace: {}
この resource_detectors の設定をすることで、OTel traceに、OneAgentがfullstackでモニタリングしているホスト情報、プロセスグループ情報、プロセスグループインスタンス情報などを自動的に enrichment してくれ、そのデータがDynatraceテナントに届いた時に、DDUなどのカスタムメトリクスにチャージされないようになっています。Distributed Tracing Appでも、envoy traceのメタ情報を見ると確かに、enrichment され、fullstack ラインセスと認識されています。
resource_detectors の設定に関するドキュメントは、istio 本家の document にも記載されていますので、ぜひ目を通しておいて下さい。
まとめ
いかがだったでしょうか?前回のブログの準備編に続き、Istio sample application の bookinfo application の trace 情報を envoy 含めて可視化するを記事にしてみました。ちょうどタイミングよく、Istio 1.26.0 の最新版が先週(May 8th, 2025)にリリースされたので、私的にも最新版で動作確認できてよかったです。折角なので、次回は Istio metricsをDynatraceに取り込んでみたいと思います。Isitoのinstall directory配下には prometheus serverのmainfestもありますし。Promethus serverで取得したisito metricsをDynatrace OneAgent で scrap して、Dynatraceに取り込んでみましょう。
まだ、Dynatraceを触ったことがない方、このブログを見てやってみたいと思われた方は、下記フリートライアルにてお試し下さい。↓↓↓
Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/