Scalaアプリケーションのメトリクスを取得する(sbt-javaagent/jmx_exporter編)

掲題の通り。
sbt-javaagentとjmx_exporterを使ってScalaアプリケーションのメトリクスをPrometheusに溜める。
(Prometheusの設定方法は割愛する。)

背景とか

  • 練習
  • Javaアプリケーションの例はちょいちょい転がってる
  • Scalaアプリケーションの記事は見た感じ無かったため書いた

背景の背景

  • Akkaの避難先としていくつかライブラリを素振りしておくか~(2023年1月くらい)
    • http4sでDiscordのBotを書き始める(2023年5月くらい)
    • pekkoがいい感じっぽいしまあいいか~(最近)
  • せっかくずっと動かしてるしメトリクスも取ってリソースの使い方を観察したい
    • という理由は後付けでただ試したかっただけ

required

そもそもJMXって何なの?

Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様です。JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できます。SNMP やその他の管理規格と同様に、JMX は公開された仕様で、一般に使用されている監視製品を提供する多くのベンダによってサポートされています。

引用元 : JMX について

はい。

設定例

それほど難しいことはしていないため、設定内容を見てもらうのが早くて...(いきなり説明放棄)

// JMX Settings

lazy val jmxExporterPort = 9090

// Docker用のJavaAgent設定
lazy val dockerJavaAgentSetting = JavaAgent(
  Dependencies.jmxExporterJavaAgent,
  arguments = s"$jmxExporterPort:/opt/docker/conf/jmx_exporter_config.yml"
)

...

lazy val root = (project in file("."))
  .enablePlugins(
    DockerPlugin,
    JavaAgent,
    JavaAppPackaging
  )
  .configure(baseConfig)
  .settings(
    ...
    ...
    javaAgents += dockerJavaAgentSetting
  )

キモの部分

jmx_exporter(のJavaエージェント)は引数に 待ち受け(アドレスと)ポート設定ファイルのパス を取る。

java -javaagent:./jmx_prometheus_javaagent-0.19.0.jar=12345:config.yaml -jar yourJar.jar

Metrics will now be accessible at http://localhost:12345/metrics. To bind the java agent to a specific IP change the port number to host:port.

引用元 : prometheus/jmx_exporter: A process for exposing JMX Beans via HTTP for Prometheus consumption

sbt-javaagentプラグインを使ってイイカンジに渡すと良い。
そのほかコンパイル時に動かす?テスト時に動かす?runのとき動かす?とか設定できるためよしなに。

  case class AgentScope(compile: Boolean = false, test: Boolean = false, run: Boolean = false, dist: Boolean = true) ...

  def apply(module: ModuleID, name: String = null, scope: AgentScope = AgentScope(), arguments: String = null): AgentModule = { ...

引用元 : sbt-javaagent/src/main/scala/com/lightbend/sbt/javaagent/JavaAgent.scala at 17119479327f9b1d99088fe5c5536a5034ec74af · sbt/sbt-javaagent

sbt-native-packagerのDocker Pluginのワーキングディレクトリはデフォルトで/opt/dockerになる。
Docker PluginはUniversal Pluginに依存しているため、Universal Pluginのディレクトリレイアウトに沿った形に設定ファイルを配置すればイメージにもいい感じに詰め込まれる。
(mappingを追加するなり、変更するなり、そのあたりの設定はよしなに...)

Universal Conventions This plugin has a set of conventions for universal packages that enable the automatic generation of native packages. The universal convention has the following package layout:

bin/
   <scripts and things you want on the path>
lib/
   <shared libraries>
conf/
   <configuration files that should be accessible using platform standard config locations.>
doc/
   <Documentation files that should be easily accessible. (index.html treated specially)>

引用元 : Universal Plugin — sbt-native-packager 1.0a1 documentation

また、dockerExposedPorts も必要に応じて設定。

ref