LibertyのメトリクスをPrometheus/Grafanaで表示する方法を確認する。以下の記事に書いた手順でPrometheus/Grafanaがデプロイ済みのMinikube環境を使用。
アプリケーションの準備
サンプルとしてここに置いてあるとても簡単なJavaアプリケーションを使用する。Libertyサーバーでは、mpMetrics-1.1
フィーチャーとmonitor-1.0
を有効化する。
...
<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コンテナイメージをsotoiwa540/sample:1.0
としてDockerHubにPushし、以下ではこのイメージを使用する。
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/
docker build -t sotoiwa540/sample:1.0 .
docker push sotoiwa540/sample:1.0
アプリケーションのデプロイ
デプロイ先のNamespaceを作成する。
kubectl create ns liberty
マニフェストを作成し、デプロイする。
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
kubectl apply -f liberty-deployment.yaml -n liberty
サービスの作成
PrometheusがLibertyの性能情報を取得するようにするには、Service定義にアノテーションを追加する。
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
kubectl apply -f liberty-service.yaml -n liberty
メトリクスの確認
Prometheusのメニューで、Status > Targetsを確認する。
kubernertes-service-endpointsにLibertyのエンドポイントが追加されたことを確認。
base:
やvendor:
と入力してみて、mpMetrics
フィーチャーのメトリクスが取得できるようになっていることを確認。
試しにbase:memory_used_heap_bytes
を入力し、Executeを実行して値を確認する。Libertyのレプリカ数が2のため、それぞれの直近のデータが表示される。
Grafanaでの表示
パネルを追加し、base:memory_used_heap_bytes
(ヒープの使用量)とbase:memory_committed_heap_bytes
(ヒープサイズ)のクエリーを入力する。base:memory_max_heap_bytes
(最大ヒープサイズ)も表示させてもいいかもしれない。凡例はinstance
のラベルを表示させているが、これはServiceのEndpointであり、Pod名ではないのがちょっと不便かもしれない。
以下のようなダッシュボードが表示できた。
Pod名の表示
ServiceのEndpointではなくPod名を表示させるには、Prometheusのscrape_configsをカスタマイズして、Pod名のラベルにつけてあげる必要がある。現在の設定はStatus > Configurationから確認できる。
設定はprometheus-server
というConfigMapに格納されている。カスタマイズはChartのリリース時に指定できる。既にチャートをリリース済みの場合は、チャートのパラメータを修正してhelm upgrade
で適用することができるし、ConfigMapを直接修正してもよい。
チャートのパラメータを修正する場合はデフォルトの他のものも含めて書く必要がありそう。今回は簡単にConfigMapを修正する。
kubectl edit cm prometheus-server -n monitoring
以下を追加。
...
- job_name: kubernetes-service-endpoints
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
...
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: kubernetes_pod
...
ラベルが追加されていることを確認。
Grafanaでもこのラベルを凡例に指定する。