掲題の通り。
sbt-javaagentとjmx_exporterを使ってScalaアプリケーションのメトリクスをPrometheusに溜める。
(Prometheusの設定方法は割愛する。)
背景とか
背景の背景
- Akkaの避難先としていくつかライブラリを素振りしておくか~(2023年1月くらい)
- http4sでDiscordのBotを書き始める(2023年5月くらい)
- pekkoがいい感じっぽいしまあいいか~(最近)
- せっかくずっと動かしてるしメトリクスも取ってリソースの使い方を観察したい
- という理由は後付けでただ試したかっただけ
required
- sbt/sbt-javaagent: sbt plugin for adding java agents to projects
- prometheus/jmx_exporter: A process for exposing JMX Beans via HTTP for Prometheus consumption
そもそもJMXって何なの?
Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様です。JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できます。SNMP やその他の管理規格と同様に、JMX は公開された仕様で、一般に使用されている監視製品を提供する多くのベンダによってサポートされています。
引用元 : JMX について
はい。
設定例
それほど難しいことはしていないため、設定内容を見てもらうのが早くて...(いきなり説明放棄)
- berner/build.sbt at a704c1ab29390682a7df1184fb2edb2776e54bd4 · stoneream/berner
- berner/project/Dependencies.scala at a704c1ab29390682a7df1184fb2edb2776e54bd4 · stoneream/berner
- berner/src/universal/conf/jmx_exporter_config.yml at a704c1ab29390682a7df1184fb2edb2776e54bd4 · stoneream/berner
// 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-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
- PrometheusのJMX Exporterを試す - CLOVER🍀
- ScalaのPlayアプリケーションをsbt-native-packagerの力を借りてDockerで動かす - Lambdaカクテル
- Docker Plugin — sbt-native-packager 1.0a1 documentation
- sbt-native-packager/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala at 665e4e245a3d88fa0e567eb3918c808a03bfd88a · sbt/sbt-native-packager
- sbt-native-packager/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala at 665e4e245a3d88fa0e567eb3918c808a03bfd88a · sbt/sbt-native-packager