LibertyのメトリクスをPrometheus/Grafanaで確認する

LibertyのメトリクスをPrometheus/Grafanaで表示する方法を確認する。以下の記事に書いた手順でPrometheus/Grafanaがデプロイ済みのMinikube環境を使用。

- [MinikubeにPrometheusとGrafanaをHelmチャートでデプロイする](https://qiita.com/sotoiwa/items/993990edf2bb98af7c1d)

## アプリケーションの準備

サンプルとして[ここ](https://github.com/sotoiwa/sample)に置いてあるとても簡単なJavaアプリケーションを使用する。Libertyサーバーでは、`mpMetrics-1.1`フィーチャーと`monitor-1.0`を有効化する。

```xml:server.xml
...
  <featureManager>
...
    <feature>mpMetrics-1.1</feature>
    <feature>monitor-1.0</feature>
  </featureManager>
...
  <mpMetrics authentication="false" />
...
````

`mpMetrics-1.1`フィーチャーを有効にすると、`/metrics`でメトリクス情報が公開されるようになる。`monitor-1.0`を有効にすると、`base`だけでなく`vendor`スコープのメトリクスがとれるようになる。どのようなメトリクスがとれるかなどは、以下の記事にも書いているのでそちらを参照。

- [Libertyの性能情報をPythonのSidecarで取得する（mpMetrics）](https://qiita.com/sotoiwa/items/113258e8ac52b676b791)

このアプリケーションを稼働させるLibertyコンテナイメージを`sotoiwa540/sample:1.0`としてDockerHubにPushし、以下ではこのイメージを使用する。

```dockerfile:Dockerfile
FROM websphere-liberty:18.0.0.4-webProfile8
COPY --chown=1001:0 server.xml /config/
RUN installUtility install --acceptLicense defaultServer
COPY --chown=1001:0 mysql-connector-java-8.0.13.jar /config/resources/mysql/
COPY --chown=1001:0 sample.war /config/apps/
```

```shell
docker build -t sotoiwa540/sample:1.0 .
docker push sotoiwa540/sample:1.0
```

## アプリケーションのデプロイ

デプロイ先のNamespaceを作成する。

```shell
kubectl create ns liberty
```

マニフェストを作成し、デプロイする。

```yaml:liberty-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: liberty
spec:
  selector:
    matchLabels:
      app: liberty
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: sotoiwa540/sample:1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 9080
```

```shell
kubectl apply -f liberty-deployment.yaml -n liberty
```

## サービスの作成

PrometheusがLibertyの性能情報を取得するようにするには、Service定義にアノテーションを追加する。

```yaml:liberty-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: liberty
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9080"
spec:
  type: ClusterIP
  selector:
    app: liberty
  ports:
  - protocol: TCP
    port: 9080
```

```shell
kubectl apply -f liberty-service.yaml -n liberty
```

## メトリクスの確認

Prometheusのメニューで、Status > Targetsを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/bd7247b8-9795-a525-05dd-d47e91d71df8.png)

kubernertes-service-endpointsにLibertyのエンドポイントが追加されたことを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/70f9a704-2506-4a0a-a933-2b9e1be96eb2.png)

`base:`や`vendor:`と入力してみて、`mpMetrics`フィーチャーのメトリクスが取得できるようになっていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/373db8fb-c988-b669-1bbe-a60ae674e445.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/198a3562-9584-c316-d10f-90cec727ae12.png)

試しに`base:memory_used_heap_bytes`を入力し、Executeを実行して値を確認する。Libertyのレプリカ数が2のため、それぞれの直近のデータが表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/4499fb93-218f-c2e8-39a4-d6e3220be879.png)

## Grafanaでの表示

パネルを追加し、`base:memory_used_heap_bytes`（ヒープの使用量）と`base:memory_committed_heap_bytes`（ヒープサイズ）のクエリーを入力する。`base:memory_max_heap_bytes`（最大ヒープサイズ）も表示させてもいいかもしれない。凡例は`instance`のラベルを表示させているが、これはServiceのEndpointであり、Pod名ではないのがちょっと不便かもしれない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/a042c33e-0b5b-fcb7-9726-668d7bbb3fc1.png)

以下のようなダッシュボードが表示できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/02090376-932e-bf02-aa55-27f0341a63ab.png)

## Pod名の表示

ServiceのEndpointではなくPod名を表示させるには、Prometheusの[scrape_configs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)をカスタマイズして、Pod名のラベルにつけてあげる必要がある。現在の設定はStatus > Configurationから確認できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/d6b031d1-73cc-3d98-ddd0-75a78817aa2b.png)

設定は`prometheus-server`というConfigMapに格納されている。カスタマイズはChartのリリース時に指定できる。既にチャートをリリース済みの場合は、チャートのパラメータを修正して`helm upgrade`で適用することができるし、ConfigMapを直接修正してもよい。

チャートのパラメータを修正する場合はデフォルトの他のものも含めて書く必要がありそう。今回は簡単にConfigMapを修正する。

```shell
kubectl edit cm prometheus-server -n monitoring
```

以下を追加。

```yaml
...
    - job_name: kubernetes-service-endpoints
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
...
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_name
        target_label: kubernetes_pod
...
```

ラベルが追加されていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/64d999d9-3e32-526e-9f7b-399e0030a22a.png)

Grafanaでもこのラベルを凡例に指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/357dfbbe-4ddc-2d29-b3f1-321ad70858b2.png)