0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Dynatrace] Envoy/Istioを使った Service Mesh アプリをDynatraceでモニタリングする(Trace 編)

Posted at

Bookinfo applicationのTraceをDynatraceに取り込む

さっそく、続編を書くことにしました。前回のブログで、Bookinfo applicationをKubernetes上で動かすところまでを紹介しました。今回はそのアプリの分散トレースを可視化すべく、envoy ingress/egress traceはOpenTelemetry経由で取得し、その他のサービスはOneAgentで取得したいと思います。ただし、Product page と Detailsサービスはそれぞれ python と ruby で書かれているため、こちらのトレースはOneAgentではとれません。
image.png

何はともあれ、Dynatrace Operatorのインストールから

KuberntesのアプリをDynatraceでモニタリングする場合は、Dynatrace Operatorを使用します。2025年5月の本記事執筆時点では、下記3つの Deployment option があります。

  1. Kubernetes Platform monitoring
  2. Kubernetes Platform monitoring + Application monitoring
  3. 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 に ServiceEntryVirutalServices が作成され、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はインストールされています。
image.png
Infrastructure & Operations App で、envoy-qiitaというホストが見えたら正しくOneAgentもインストールされています。
image.png
ただ、この時点では 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
    image.png
  • review written by Java
    image.png
  • ratings written by Node.js
    image.png
    Distributed Tracing Appで見ても、OneAgentからのTraceは全て見ていることが分かります。
    image.png

でも、本当に見たいのは Envoy proxy を含むEnd-to-endの分散トレースです。ここから、isitoを通じて、Dynatraceに envoy proxy のトレース情報を取得できるように設定していきます。

4. Envoy proxy trace をDynatraceでモニタリングする

Dynatraceのヘルプドキュメントには、OpenTelemetryを介してEnvoy Traceをとる方法が丁寧に記載されています。ここのガイドに沿って、このブログでも紹介していきます。実際には、Dynatraceのテナントのメニューに沿って表示されるConfigをそのまま使って下さい。

  • Seetings > Install OneAgent > Istio とクリックした際に表示される画面
    image.png
    image.png
    image.png

a) AccessTokenを設定する
Envoy proxy のトレース情報を取り込むために必要なトークンは、下記2つです。予め、istioにConfigを投入する前にDynatraceの Access Tokenで設定しておきます。

  • openTelemetryIrace.injest
  • adaptiveTrafficManaged.read

image.png

b) MeshConfig をistio に適用する
今回のデモで使ったbookinfo applicationのプロファイルにMeshConfigの設定を追加することで、extensionProviderを使えるようにします。Dynatraceに表示された設定をそのまま、bookinfo applicationのプロファイルに追加します。ただし、apiVersionkindは削除可能です(デモプロファイル上に設定があるため)。

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 されています。
    image.png
  • Distributed Tracing App
    次に、分散トレーシングアプリで確認します。こちらも良さそうですね。OpenTelemety経由で envoy proxy のトーレスが、JavaやNode.jsのトレースはOneAgentから、それぞれInjestされているのが分かります。
    image.png
    Kubernetes Gatewayを経由して入ってきた root span を見ると、綺麗に分散トレースが表現されています。
    image.png

これで完璧です♪

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 ラインセスと認識されています。
image.png
image.png
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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?