Splunk APMでKubernetes上のアプリケーション監視 (Tracing) をしてみる

# はじめに
某SIerでKubernetesの監視について検証している @suzuyan です。
前回は[初投稿の記事](https://qiita.com/suzuyan/items/013fad3de09c5e5334a6)にて、Splunk IMを使いKubernetesのリソースを監視してみました。
今回の記事では、同じくSplunk社のSplunk APMを使ってKubernetes上のコンテナアプリケーションの監視(Tracing)を試してみたいと思います。

# 環境
- Kubernetes: OpenShift 4.9.43 (Kubernetes v1.22.8)
- AWS 上に構築
- macOS Big Sur 11.6.6 (作業端末)


# Splunk APM を使ってみる
文章で色々確認するのは大事ですが、実際に触ってみた方が理解も進みそうなので、さっそく監視設定を進めたいと思います。

## Splunk Observability Cloud にログインする
https://app.jp0.signalfx.com/#/signin

アカウント作成の際に選択したリージョンによってサブドメインが異なります。
前回はus1でしたが、今回はAPACを選択したためjp0になっています。
![スクリーンショット 2022-08-07 16.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/aceed620-bbe4-c806-0c6b-65691d228e52.png)

Splunk Observability Cloudというのが前回の記事で利用したSplunk Infrastructure Monitoringや今回のSplunk APMなど、Splunkのクラウド監視製品の総称のようですね。前回の投稿から1年以上経過しており、ダッシュボードのUIもかなり変わったような気がします。
![スクリーンショット 2022-08-05 15.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/5dff76d5-dbe9-6a83-e3a0-b23fd9f10f5a.png)

## Splunk OpenTelemetry Collector のセットアップ

APMによるアプリケーションの監視を行うためには、Splunk OpenTelemetry Collectorを事前にセットアップしておく必要があります。
ダッシュボードよりData Setupを選択し、Kubernetesをクリックします。
![スクリーンショット 2022-08-05 15.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/daa656b7-c244-6320-b7a2-13ceb1a95892.png)

1.Integration Summary
最下部のNextをクリックします。
![スクリーンショット 2022-08-07 16.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/8717383b-de9c-de36-c868-08ed96a76999.png)

2.Configure Integration
今回は以下のように入力して進めました。
Splunk access token: Default (デフォルトのまま)
Cluster Name: testcluster (任意のクラスタ名を入力)
Provider: Other (デフォルトのまま)
Distribution: RedHat OpenShift （今回OpenShiftのためRedHat OpenShiftを選択）
Add Gateway: No (デフォルトのまま)
Profiling: True (デフォルトのまま)
![スクリーンショット 2022-08-05 15.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/1ad4c1f5-43b5-1abf-d3cb-e2987f0ca74d.png)

3.Install Integration
ここでhelmによるインストール手順が公開されます。 お使いの作業端末にhelm3をインストールしておく必要があります。
Macであればbrewでインストール可能です。
![スクリーンショット 2022-08-05 15.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/233c5dec-bf8f-f9a4-ddf4-170a791965a1.png)

Helmのリポジトリを追加します。
```
$ helm repo add splunk-otel-collector-chart https://signalfx.github.io/splunk-otel-collector-chart
"splunk-otel-collector-chart" has been added to your repositories
```

お決まりですが。リポジトリの最新情報を取得します。
```
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "splunk-otel-collector-chart" chart repository
Update Complete. ⎈Happy Helming!⎈
```

ACCESS TOKENの箇所はそれぞれの環境で異なります。Dの部分に表示されているコマンドをコピペすれば大丈夫です。
以下のコマンドを実行すると、DeploymentとDaemonSetが作成され、Podが生成されます。
Namespaceは必要に応じて-nオプションで指定します。
```
$ helm install --set cloudProvider=' ' --set distribution='openshift' --set splunkObservability.accessToken='<ACCESS TOKEN>' --set clusterName='testcluster' --set splunkObservability.realm='jp0' --set gateway.enabled='false' --generate-name splunk-otel-collector-chart/splunk-otel-collector --set splunkObservability.profilingEnabled='true'`
NAME: splunk-otel-collector-1659682227
LAST DEPLOYED: Fri Aug  5 06:50:29 2022
NAMESPACE: test-apm
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Splunk OpenTelemetry Collector is installed and configured to send data to Splunk Observability realm jp0
```

Podの動作を確認してみます。DaemonSetで、ノード毎に1Podずつ、agentが配置されていることが分かります。
```
$ kubectl get pod
NAME                                                              READY   STATUS    RESTARTS      AGE
splunk-otel-collector-1659682227-agent-59l74                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-agent-9n2zk                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-agent-9wtbl                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-agent-dw6wz                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-agent-pjcbw                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-agent-z7nj4                      1/1     Running   0             2d3h
splunk-otel-collector-1659682227-k8s-cluster-receiver-589b94pv2   1/1     Running   0             2d3h
```

ブラウザに戻り、Nextをクリックし、4に進みます。

4.Review Inventory
これまでの設定がうまくいっていれば、この段階で対象のクラスタの情報が表示されます。
![スクリーンショット 2022-08-07 17.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/2283783e-00a4-c92d-d250-a9313d13c531.png)

## アプリケーションの監視設定 (Tracing)
既にKubernetesクラスタの情報を確認できますが、肝心のAPM Tracingを行うためにはコンテナ自体にTracingを行うための設定が必要です。

ダッシュボードに戻り、改めて`Data Setup`をクリックします。
既に設定が完了した、Kubernetesのところにチェックマークが入っています。
Monitor applications をクリックします。
![スクリーンショット 2022-08-07 23.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/8d1f1618-b6f0-9614-5ee9-66865630cb44.png)

ここで様々なプログラミング言語が表示されますが、今回はJava (Provides Traces.)をクリックします。
![スクリーンショット 2022-08-07 23.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/5453cbad-8ff4-1269-7cf5-6bbd9b93a4f6.png)

1.Integration Summary
Nextをクリックします

2.Configure Integration
Service name: java-test-app (任意のサービス名を入力)
Collector endpoint: http://localhost:4317 (デフォルトのまま)
Environment: test (任意の環境名を入力)
AlwaysOn Profiling: No (デフォルトのまま)
Application metrics: No (デフォルトのまま)
Kubernetes: Yes (KubernetesのためYesにします)
Legacy Agent: No (デフォルトのまま)
![スクリーンショット 2022-08-07 23.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/da842898-027e-47e8-c2a4-12f5f96cf270.png)

3.Install Integration
正直、ここで表示される手順はかなり情報不足だと思います。
![スクリーンショット 2022-08-08 12.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/991eb443-65ac-52f7-d586-d137644d0e2d.png)


Aは既に実施したSplunk OpenTelemetry Collectorの導入に関する内容です。
Bはコンテナイメージに組み込むためのjarファイルのダウンロードです。
Cはコンテナをデプロイする際のDeploymentのyamlファイルの例です。
Dはコンテナで実行する必要があるコマンドです。

BからDでもう少し丁寧に解説されていると良いのですが。。。
このあたりの情報について、合わせて[[1]](https://lantern.splunk.com/Observability/Product_Tips/Application_Performance_Monitoring/Instrumenting_Java_apps_in_Amazon_EKS_and_non-EKS_environments
)を参照した方が分かりやすいです。
というより私は[[1]](https://lantern.splunk.com/Observability/Product_Tips/Application_Performance_Monitoring/Instrumenting_Java_apps_in_Amazon_EKS_and_non-EKS_environments
)がなければ、恐らくTracingの設定方法を理解できなかったかもしれません。
結論としては、A、BおよびDはDockerfileで、コンテナイメージを作成する際に必要になります。
今回は[[1]](https://lantern.splunk.com/Observability/Product_Tips/Application_Performance_Monitoring/Instrumenting_Java_apps_in_Amazon_EKS_and_non-EKS_environments
)に記載されている、コンテナイメージ
`image: docker.io/astro7982/curlappstatic:lastest`
を利用するため、A, B, Dの手順は割愛します。おそらく[[1]](https://lantern.splunk.com/Observability/Product_Tips/Application_Performance_Monitoring/Instrumenting_Java_apps_in_Amazon_EKS_and_non-EKS_environments
)の記事を書いた方が作成したコンテナイメージでしょうか。

Cを参考にして、Deploymentのyamlファイルを作成します。
service.name=, deployment.environment= には 2. Configure Integration で入力した値をそれぞれ記載する必要があります。

```yaml: java-test-app.yaml
apiVersion: v1
kind: Pod
metadata:
  name: httpgooglechecker
spec:
  containers:
  - name: httpgooglechecker
    image: docker.io/astro7982/curlappstatic:lastest
    env:
    - name: SPLUNK_OTEL_AGENT
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP
    - name: OTEL_RESOURCE_ATTRIBUTES
      value: service.name=java-test-app,deployment.environment=test
    - name: SPLUNK_METRICS_ENDPOINT
      value: http://$(SPLUNK_OTEL_AGENT):9943
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: http://$(SPLUNK_OTEL_AGENT):4317
    command: ["/bin/sh"]
    args: ["run.sh"]
```

作成したyamlを使用してPodをデプロイします。
```
$ kubectl create -f java-test-app.yaml
pod/httpgooglechecker created
```

4.Review Inventory
今回の設定手順では、ここでは何も表示されませんでした。
設定自体は3のPodの作成まで実施すれば完了です。

## Tracing の内容を確認する
下部の Explore Service Spans もしくは左メニューの APM をクリックします。
デプロイしたアプリケーションに関する概要情報が表示されます。
![スクリーンショット 2022-08-08 0.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/c84172ef-5b37-40c6-bf10-5d4f757cc926.png)

右メニューの Exprole をクリックします。
今回のアプリケーションに関する情報が表示されます。
www.google.com にcurlでHTTPリクエストするだけのシンプルなアプリケーションです。
![スクリーンショット 2022-08-08 0.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/f86837c8-dbed-cdc2-cc86-080c2621e4db.png)
< Overview をクリックして前の画面に戻ります。

続いて Traces をクリックします。
Tracingの状況が時系列で表示されます。一番上のTrace IDをクリックしてみます。
![スクリーンショット 2022-08-08 9.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/b9b2e0b4-b9ab-88b5-a095-67289e84b143.png)

Trace ID毎にパフォーマンスを確認することができますね。これはパフォーマンスの分析に役立ちそうです。
![スクリーンショット 2022-08-08 9.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55284/44a0b81a-f23c-8593-4d41-c8363aaadfcd.png)


今回は最低限の設定と、シンプルなサンプルアプリケーションを試しにデプロイしただけですが、Tracingとはどのようなものかを確認することができました。
多数のPodで構成される複雑なアプリケーションや、マイクロサービス化されたシステムで活用すれば、より効果的な監視を行えるのではないでしょうか。
次回は、マイクロサービスのサンプルアプリケーションを使用してTracingの素晴らしさを実感してみたいと思います！

# References

https://lantern.splunk.com/Observability/Product_Tips/Application_Performance_Monitoring/Instrumenting_Java_apps_in_Amazon_EKS_and_non-EKS_environments