ウェブアプリケーションサーバはPlayFramework for Scalaを使うことを想定します。
DataDogとは
サーバ監視サービスです。
類似のサービスにNewRelicなどがあります。
システム構成
公式サイトの動画を見るのが速いですが、一応説明
DataDogAgent : ネットワーク内に常駐させて、DataDogのクラウドに情報を投げるサービス。API_KEYとport:8126 さえ開けておけばとりあえず機嫌よく動いてくれる。なおDataDogはこいつの数が課金単位なので気を付けよう。
APM(datadog-java-agent):アプリケーションサーバの起動箇所にフックしてアプリケーションの挙動をDataDogAgentにチクる装置。送信先のホストとポートが間違ってるとアプリごと死ぬ。
公式の導入方法
DD_AGENT_HOST=$DD_AGENT_PORT_8126_TCP_ADDR \
DD_AGENT_PORT=$DD_AGENT_PORT_8126_TCP_PORT \
java -javaagent:/path/to/the/dd-java-agent.jar -jar /your/app.jar
簡単に言ってくれちゃってこのやろう…
実際の運用でjavaコマンドをダイレクトに叩いてる人はいないんじゃないでしょうか。
そう、例えば sbt docker:publishlocal
で最小限のコンテナを構築してコンテナリポジトリからk8sに展開するなど。
sbt docker:publishlocal
docker-compose up
こんな風にね。
そうした場合、-javaagent
なんてオプションを差し込むのにも一筋縄では行かず、sbtのプラグインでsbt-javaagentの導入が必要になります。
project/plugins.sbt
addSbtPlugin("com.lightbend.sbt" % "sbt-javaagent" % "0.1.4")
lazy val root = (project in file(".")).enablePlugins(PlayScala, JavaAgent, JavaAppPackaging)
.settings(
javaAgents += "com.datadoghq" % "dd-java-agent" % "0.7.0"
)
libraryDependencies += "com.datadoghq" % "dd-java-agent" % "0.7.0"
dd-java-agent
のplayframework対応は、β版で、標準では対応していません。
そのため、java実行時に以下のオプションを指定する必要があります。
-Ddd.integration.java_concurrent.enabled=true -Ddd.integration.play.enabled=true
参考:https://docs.datadoghq.com/tracing/setup/java/#beta-instrumentation
これも一筋縄では行かない。
結論から言うとdockerエントリポイントに引数を追加しましょう。
dockerEntrypoint := Seq("bin/" + name , "-Ddd.integration.java_concurrent.enabled=true", "-Ddd.integration.play.enabled=true")
なぜdockerエントリポイントに引数を追加するのがオプションになっているのかというと、
sbt-docker
の生成する自動起動スクリプトの構造で、引数の中で-D*
, -agentlib*
, -J* *
のオプションはjava実行時に引数として渡すようになっているからです。