はじめに
今回は、Kubernetes上で実行されているDatadog AgentでJMXカスタムメトリクスを取得する方法を記述していきたいと思います。
本記事を読むにあたっての前提条件
-
本記事で指すアプリケーションはTomcat+SpringBootで作られたアプリケーションのことです。
-
本記事はKubernetes上で実行されているDatadog AgentでJava JMXカスタムメトリクスを取得するための設定方法に取り上げています。Java JMXカスタムメトリクスをアプリケーションのコード上でどう設定するか等については触れません。
-
なお、Datadog-AgentはDaemonSetで動かします。
実行環境
- Kubernetes環境
- EKS
- application
- Java
- Tomcat + SpringBoot
- Java
設定方法
Datadog Agent側
Configmap.yamlの設定
apiVersion: v1
kind: ConfigMap
metadata:
name: <任意の名前>
namespace: kube-support
labels: {}
data:
metrics-yaml: |
jmx_metrics:
- include:
domain: <取得したいカスタムメトリクスのドメイン>
type: Pool
name: ConnectionPool
attribute:
PoolStats.available:
#aliasには任意の文字列を入れてください。
alias: <application_name>.poolstats.available
metric_type: gauge
今回は、コネクションプールを取得しようとしているので上記のような設定を行っています。
Datadog-agent.yamlの設定
spec:
spec:
containers:
- name: agent
- image: "gcr.io/datadoghq/agent:latest"
+ image: "gcr.io/datadoghq/agent:latest-jmx"
imagePullPolicy: IfNotPresent
volumeMounts:
+ - {name: metrics-yaml, mountPath: /etc/datadog-agent/conf.d/tomcat.d/metrics.yaml,subPath: metrics.yaml}
volumes:
+ - {name: metrics-yaml, configMap: {name: <任意の名前>, items: [{key: metrics-yaml, path: metrics.yaml}]}}
※Kubernetesマニフェストファイルの重要な部分のみ本記事では記載しています
初めて、Datadog Agentの構築を行う場合は、Kubernetes に Datadog Agent をインストールする
を参考にしつつ本記事で記載している設定を行なってください。
point
- JMXを取得するためには、DatadogのimageをJMXに対応しているものにする必要があります。
gcr.io/datadoghq/agent:latest-jmx
-
public.ecr.aws/datadog/agent:latest-jmx
など- ref: Datadog document JMX
- カスタムメトリクスを取得するためにmetric.yamlをmountします。
- metric.yamlの書き方については以下のGithubリポジトリを参考にしています。
- ref:metric.yaml
Deployment.yamlの設定
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: tomcat_sample_application
name: tomcaat_sample_application
spec:
template:
metadata:
annotations:
+ ad.datadoghq.com/tomcaat_sample_application.check_names: '["tomcat"]'
+ ad.datadoghq.com/tomcaat_sample_application.init_configs: '[{"is_jmx": true, "collect_default_metrics": true}]'
+ ad.datadoghq.com/tomcaat_sample_application.instances: '[{"host": "%%host%%","port":"8086"}]'
+ ad.datadoghq.com/tomcaat_sample_application.logs: '[{"source":"tomcat","service":"tomcat"}]'
containers:
- name: tomcat_sample-application
image: tomcat_sample-application
env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: JAVA_TOOL_OPTIONS
+ value: "-Dspring.jmx.enabled=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.rmi.port=8086 -Dcom.sun.management.jmxremote.port=8086 -Djava.rmi.server.hostname=$(POD_IP)"
※Kubernetesマニフェストファイルの重要な部分のみ本記事では記載しています
point
-
アプリケーション側の設定は以下のドキュメントを参考にオートディスカバディアノテーションを書きました。
-
JMXの起動パラメータについてはこちらの記事をご覧ください。
動作確認
Datadog AgentがアプリケーションのJMXに接続できているかについての確認
$agent status
========
JMXFetch
========
Information
==================
runtime_version : 11.0.15
version : 0.46.0
Initialized checks
==================
tomcat
instance_name : tomcat-{Node_IP}-8086
message : <no value>
metric_count : metricの数
service_check_count : 0
status : OK
Failed checks
=============
no checks
statusの部分がOKになっていればアプリケーションとDatadog Agentが接続できています。
metric_countは、350個の制限があります。metric_countが、350個を超える場合には、Datadog サポートチームに問い合わせる必要があります。
ref: JMX:メトリクスの収集
イメージ
JMX カスタムメトリクスがDatadogに送信できているかについての確認
$agent jmx list collected
2022-09-20 00:29:29 GMT | JMX | DEBUG | Connection | Querying bean names on scope: <bean domain>:name=ConnectionPool,type=Pool,*
agent jmx list collected で該当のmetricが取得できなかった場合
agent jmx list collected
で該当のmetricが取得できなかった場合は、agent jmx list not-matching
コマンドなどを利用してなぜmatchingしていないのか理由を知るのがよいと思います。
-
agent jmx
コマンドの説明
イメージ
実際にDatadog でデータが取得できているか確認
最後に、Datadog で反映されているかを確認します。
Datadog でJava JMX カスタムメトリクスが取得できていることがわかります。
まとめ
本記事では、Kubernetes上で実行されているDatadog AgentでJava JMXカスタムメトリクスを取得する方法をまとめました。Datadog AgentでJMX カスタムメトリクスを取得する際の参考になれば幸いです。