DatadogでJavaのメトリクスを取得する


JavaアプリケーションのパフォーマンスをDatadogで可視化しようとしたときにハマったので、
誰かの役に立てばと思い、残しておきます。

やりたかったこと

  • JVMHeap使用状況などのメトリクスを取得したかった。

公式ドキュメントは以下にあるので、ドキュメントを参考にやってみます。
JMX Checks

JavaのIntegrationを有効にする

DatadogはデフォルトではJavaのメトリクスを取得するようになっていません。
なので明示的に設定をOnにする必要があります。
サイドバーのIntegrationから、Javaを検索し設定をOnにします。

availableをクリックし詳細画面からinstall integrationをクリック

jmx.yamlを追加

次にdatadog-agentをinstallしたサーバ内に入り、Javaが動いているサーバの情報をdatadog-agentに教えてあげる必要があります。

datadog-agentはデフォルトで様々なintegrationのコンフィグファイル例を用意してくれており、今回はそれをコピーしてそのまま使います。

$ cp /etc/dd-agent/conf.d/jmx.yaml.example  /etc/dd-agent/conf.d/jmx.yaml
$ vim /etc/dd-agent/conf.d/jmx.yaml
/etc/dd-agent/conf.d/jmx.yaml
init_config:
instances:
-   host: localhost
    port: 7199

port: 7199など気になる設定はありますが、そのまま使用します。

datadog-agentをrestartする

設定ファイルを変更した際はagentをrestartすると変更した設定が読み込まれます。

$ sudo /etc/init.d/datadog-agent restart

だが値は取れない

dashboardを作成したときに、jmx.hogehogeが候補として出てくることを期待するが出てこない。
Listenしてないportなどを指定していたので当たり前といえば当たり前です。

結論から言うとJavaアプリケーション起動時にJMXのポートを公開しておかないと値が取れません。
JMXとは何かという方は以下を参照してください。
JMX について

起動時に以下のオプションを追加する。

# jmxをonにする
-Dcom.sun.management.jmxremote
# jmxの情報を取得できるportを指定します。jmx.yamlで指定したportはここでの設定したportになります
-Dcom.sun.management.jmxremote.port=7199
# 通信時にsslをonにするかどうか。今回はlocalhostでの通信なのでOffにします。
-Dcom.sun.management.jmxremote.ssl=false
# password認証をするか
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=true

追加すると

jvmがプレフィックスにつくメトリクスが、Datadogのコンソール上に表示されるようになりました。