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

## Envoy/Istioシリーズの最終編
今回が、本件に関する最後の記事になります。Isito community が提供してくれている bookinfo servicemesh application を使って、TraceをDynatraceに取り込むところまで実施しました。Traceが取れると、次はMetricsかなと思います。APM各社同じだと思いますが、Envoy/Istioのメトリクスを取り込む場合、Prometheus serverを使ってメトリクスを取り込み、それをAPM各社のAgentを使って scrap するパターンが一般的ではないでしょうか。Dynatraceも同じやりかたで、それらメトリクスをDynatraceに取り込めますので、早速やってみましょう。

## なにはともあれ Prometheus server のインストール
Istio の tar ball archive には、prometheus server の manifest がデフォルトで用意されています。`istio-1.26.0/samples/addon/prometheus.yaml` がその対象ファイルです。そのYAMLファイルの中身を見ると分かりますが、job_name の定義がすでに投入済みですので、kubectl apply -f で当該ファイルを適用すれば、prometheus server がDeployされ、istio および envoy のメトリクスが取れるようになっています。

:::note warn
isitoのドキュメントにも記載されていますが、この addon フォルダ配下のmanifestはテスト目的で作られたファイルですので、本番環境に適用する場合は別途用意されている production ready に関する [best practice](https://istio.io/latest/docs/ops/best-practices/observability/) ガイドに沿って対応しましょう。
:::

では早速applyしましょう。
```
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl apply -f prometheus.yaml 
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get pods -n istio-system
NAME                          READY   STATUS    RESTARTS       AGE
istiod-5bb7c56c9-zk85h        1/1     Running   1 (4d6h ago)   6d1h
prometheus-854f57945b-rxq8g   2/2     Running   0              7s
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get svc -n istio-system
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                 AGE
istiod       ClusterIP   10.43.170.171   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   6d1h
prometheus   ClusterIP   10.43.203.209   <none>        9090/TCP                                12s
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$
```
このように、prometheus Podとprometheus serviceが見えたらOKです。

### 1. Dynatraceにメトリクスを取り込む前に、prometheusでメトリクスの確認
DynatraceのOneAgentでprometheusのメトリクスをscrapeするまえに、prometheusでメトリクスが取得できているか、実際に確認してみましょう。まずは、bookinfo-app にブラウザでアクセスします。アクセスする際は、port-forwardすることを忘れないようにしましょう。
```
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get svc -n bookinfo-app
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)            AGE
bookinfo-gateway-istio   ClusterIP   10.43.188.10   <none>        15021/TCP,80/TCP   6d1h
details                  ClusterIP   10.43.181.84   <none>        9080/TCP           29h
productpage              ClusterIP   10.43.37.224   <none>        9080/TCP           29h
ratings                  ClusterIP   10.43.92.44    <none>        9080/TCP           29h
reviews                  ClusterIP   10.43.38.37    <none>        9080/TCP           29h
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl -n bookinfo-app port-forward svc/bookinfo-gateway-istio --address 0.0.0.0 8080:80
Forwarding from 0.0.0.0:8080 -> 80
Handling connection for 8080
Handling connection for 8080
```
ブラウザでPCからアクセスして、下記のように表示されればOKです。port-forardの出力も `Handling connection for 8080` と出れば、外部からのリクエストが Kubernetes gateway を通じて処理されている証拠です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/5b44e784-b868-43c1-9a75-092fb2dcb9af.png)

この状態で、prometheus server にアクセスしてみます。デフォルトでは prometheus server のサービスはexposeされていないので、port-forward をつかってこちらもブラウザから直接アクセスできるようにします。
```
ubuntu@envoy-qiita:~$ kubectl get svc -n istio-system
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                 AGE
istiod       ClusterIP   10.43.170.171   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   6d1h
prometheus   ClusterIP   10.43.203.209   <none>        9090/TCP                                7m19s
ubuntu@envoy-qiita:~$ kubectl -n istio-system port-forward svc/prometheus --address 0.0.0.0 9090:9090
Forwarding from 0.0.0.0:9090 -> 9090
Handling connection for 9090
Handling connection for 9090
Handling connection for 9090
```
このように　prometheus serverの画面が表示されたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/5017dd1c-7997-45cb-ad34-872970cf50c2.png)
次に、prometheus serverで取得できている isitod のメトリクスを確認しましょう。Query に `istiod_uptime_seconds`と入力し、`Graph` 表示に変えてみて、istiod の uptime グラフが表示されれば、prometheus server はきちんとistiod のメトリクスを収集出来ていると判断できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/74e7f465-f8b5-4d1a-9c21-4567dd07d53b.png)
これで、Dynatraceにistioのメトリクスを取り込む準備は完了です。

### 2. Dynatraceの Istio Service Mesh extension のインストール
Dynatrace では istio メトリクスを簡単にダッシュボードで表現できるように、Extensionと呼ばれるパッケージが用意されています。[Dynatrace Hub](https://www.dynatrace.com/hub/) にアクセスして頂き、`istio`と検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/bf8f25ab-aa2a-4d01-b70d-ff969bf9485a.png)
すると、赤枠で示すように2つのプログラムが表示されます。直感的に見分けが付けにくくて申し訳ないのですが、
* 左側が istio metrics を表示するためのダッシュボードをインストールするためのExtension
* 右側が istio を trace するための integration に関する説明

を意味しています。右側の説明は、このブログの第2回のシリーズで説明した[Trace編](https://qiita.com/yasusuzu/items/ed4f87dfc9e27173271d)と同じです。で、今回は左側の istio metricsダッシュボードの方を活用します。ただ、このExtensionを自分のSaaSテナントにインストールしたい場合は、自身のSaaSテナントのExtensionからその作業をする必要がありますで、一旦ここで自身のSaaSテナントに戻り、Extensions を開きます。ここで、以下の作業を行います。

* Extensions > Discover で "istio" と検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/1b174953-aa7f-4790-be9e-0dd0a0a97813.png)

* Istio Service Mesh をクリックし、画面右上の"Add to environment"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/4c6376af-2ca5-49fa-9638-d6bc34507555.png)
"Add to environment"をクリック後、画面がリフレッシュされ、"Configure" タブが表示され、"Active version: 1.1.1"と表示されれば、インストールは完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/83f05748-be3d-4c24-833f-2231ce4f41e4.png)
* インストールされたダッシュボードの確認
このExtensionが提供してくれるのは、現時点ではダッシュボードクラッシックのみになるため、ダッシュボードクラッシックの画面に移動します。ダッシュボークラッシック画面に遷移し、
  * Istio - Data Plane
  * Istio - Control Plane
この2つにダッシュボードが追加されれば、当該Extensionのインストールは完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/8a75b0b3-c3f3-4b19-b000-85aa674ab258.png)
* 補足情報
:::note info
補足すると、このExtensionにはIstioに関するカスタムアラート設定も2つ追加されています。これらの設定は、Settings > Anomaly detection > Metrics events に追加されています。参考までに、追加されたカスタムアラートの情報を記載しておきます。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/88408c4d-8cbe-402a-9c3a-7d146d4c20d1.png)

### 3. Dynatrace OneAgent で prometheus metrics を scrape する
ここからが一番大切な手順です（汗。Dynatrace OneAgent を通じて、prometheus metrics を scrape できるよう設定を追加していきます。この設定手順は先ほど（2のステップ）のExtensionのインストールが画面に記載されています。この`Get started`という箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/f285f245-2035-43f5-a624-a3a5139a1c19.png)
1つ目が、Istiod のメトリクスをscrapeするためのannotation設定で、2つ目がenvoy proxyのメトリクスをscrapeするためのannotation設定です。ここは言われるがままに、設定していきます。
- istiod メトリクスをscrapeするためのannotationの追加
Dynatraceの画面に表示されている annotation 設定をコピーして、貼り付けます。その後、annotationが正しく反映されているか kubectl コマンドで確認します。
```
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl annotate --overwrite service istiod -n istio-system \
metrics.dynatrace.com/port='15014' metrics.dynatrace.com/scrape='true'
service/istiod annotated
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get svc/istiod -n istio-system
NAME     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                 AGE
istiod   ClusterIP   10.43.170.171   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   6d2h
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get svc/istiod -n istio-system -o jsonpath='{.metadata.annotations}'
{"metrics.dynatrace.com/port":"15014","metrics.dynatrace.com/scrape":"true"}
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ 
```
OKですね。2つの annotation が追加されています。
- envoy proxy メトリクスをscrape するためのannotationの追加
こちらは bookinfo-app をどの namespace に deploy されているかにも依存するため、単純なコピー＆ペーストでは設定が反映できません。今回のこのブログでは、`bookinfo-app`という namepspaceにアプリをDeployしたので、そこは自身の環境に合わせます。
```
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl annotate --overwrite service --all -n bookinfo-app \
metrics.dynatrace.com/port='15020' metrics.dynatrace.com/scrape='true' \
metrics.dynatrace.com/path="/stats/prometheus" \
metrics.dynatrace.com/filter='{
    "mode": "include",
    "names": [
      "istio_requests_total",
      "istio_tcp_received_bytes_total",
      "istio_tcp_sent_bytes_total",
      "istio_tcp_connections_closed_total",
      "istio_tcp_connections_opened_total",
      "istio_request_duration_milliseconds",
      "pilot_k8s_cfg_events"
    ]
  }'
service/bookinfo-gateway-istio annotated
service/details annotated
service/productpage annotated
service/ratings annotated
service/reviews annotated
ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ kubectl get svc/bookinfo-gateway-istio -n bookinfo-app -o jsonpath='{.metadata.annotations}'
{"metrics.dynatrace.com/filter":"{\n    \"mode\": \"include\",\n    \"names\": [\n      \"istio_requests_total\",\n      \"istio_tcp_received_bytes_total\",\n      \"istio_tcp_sent_bytes_total\",\n      \"istio_tcp_connections_closed_total\",\n      \"istio_tcp_connections_opened_total\",\n      \"istio_request_duration_milliseconds\",\n      \"pilot_k8s_cfg_events\"\n    ]\n  }","metrics.dynatrace.com/path":"/stats/prometheus","metrics.dynatrace.com/port":"15020","metrics.dynatrace.com/scrape":"true","networking.istio.io/service-type":"ClusterIP"}ubuntu@envoy-qiita:~/istio-1.26.0/samples/addons$ 
```
今回もkubectlコマンドでbookinfo-app namespace の全てのサービスにannotationが反映されているか確認します。ここでは、代表として bookinfo-gateway-istio のみ確認しました。
これでやっと全ての準備が完了しました。ブラウザを使って、bookinfo-app にもう一度アクセスしてみます。アクセスしてアプリの画面が表示されたら、何回か Ctl+Rを押して、画面をリロードします。
* Istio - COntrol Plane のダッシュボード確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/d75675eb-0df1-497b-8bde-eefdd745372d.png)
* Istio - Data Plane のダッシュボード確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/9c5196c6-bb95-4e3f-b13c-7e650b366563.png)
パチパチパチ、おめでとうございます。無事Istio/EnvoyメトリクスもDynatraceで見ることもできるようになりました。

ここではダッシュボードクラッシックを使いましたが、もちろん新しいダッシュボードとノートブックでも、これらメトリクスは可視化可能ですので、ご安心ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/6251870d-4398-4639-a0a2-292b78669a70.png)

## まとめ
いかがだったでしょうか？今回は、Istio/Envoy をDynatraceでモニタリングするというテーマで、3回に分けて執筆しました。DynatraceとEnvoyの関わりは、古くはOpenTracing APIを通じて行われていましたが、OpenTelemetryの時代到来とともにそのTrace方法もそちらにシフトしています。これまでOneAgentのEnvoy code moduleを使ってEnvoyのトレースを可視化してきたお客様はこのタイミングを機に、ぜひOpenTelemetry方式への移行を検討してみてはいかがでしょうか？ライセンスについても、すでにfullstackでモニタリングされているKubernetesクラスタからのIstio/Envoy traceは detector コンフィグを追加することで、fullstack license と見なされるので安心にご利用頂けるのではないかと思っています。

まだ、Dynatraceを触ったことがない方、このブログを見てやってみたいと思われた方は、下記フリートライアルにてお試し下さい。↓↓↓

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/

Happy Dynatracing!