これは、なにをしたくて書いたもの?
- Infinispan 9.4.1.Finalで、Prometheus向けにメトリクスがエクスポートできるようになったらしい
- 正確には、Infinispan Serverで使える
- せっかくなので、試してみようと
Infinispan: Infinispan 9.4.1.Final and Infinispan Spring Boot Starter 2.1.0.Final are out!
Infinispan Server & Prometheus JMX Exporter
Infinispan Serverの起動時にオプションを加えることで、Prometheus向けのExporterが起動するようです。
具体的には、JMX Exporterが起動します。9779ポートを使って起動するようです。
ドキュメントはまだない…ので、このあたりの情報を見つつ。
JMX Exporterは、JMXの情報からPrometheus向けにメトリクスをエクスポートすることができるライブラリですね。JavaAgentとして
使用します。
JMX Exporterについては、以前にエントリを書きました。
PrometheusのJMX Exporterを試す - CLOVER🍀
というわけで、Infinispan ServerにPrometheus JMX Exporterの設定ファイルが含まれるようになっています。
内容的には、JMXの情報をこの4つに絞り、
whitelistObjectNames: - "jboss.datagrid-infinispan:type=Cache,name=*,manager=*,component=Statistics" - "jboss.datagrid-infinispan:type=Cache,name=*,manager=*,component=Cache" - "jboss.datagrid-infinispan:type=Cache,name=*,manager=*,component=ClusterCacheStats" - "jboss.datagrid-infinispan:type=Cache,name=*,manager=*,component=StateTransferManager"
メトリクスの名前を短くしたりと、加工しているようですね。1度取得してみるとわかりますが、「datagrid_〜」みたいな
メトリクス名で取得することになります。
※ClusterCacheStatsやStateTransferManagerは、クラスタリングしないと現れません
Infinispanで取得できるJMXの情報は、こちらを見るとよいでしょう。
JConsoleなどで直接MBeanを見るとわかりますが、いくつか取得できる種類のうち、Cacheにのみ絞られていることと、
かつCacheから取得できる情報も一部に絞られていることがわかります。
ポイントは、まずはこれくらいでしょうか。では、実際にInfinispan ServerでPrometheus向けのJMX Exporterを有効にして
みましょう。
Infinispan ServerをJMX Exporterを有効にして起動する
今回の環境は、こちらです。
$ java -version openjdk version "1.8.0_191" OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
Infinispan Serverは、9.4.9.Finalを使用します。ダウンドードして展開。
$ wget http://downloads.jboss.org/infinispan/9.4.9.Final/infinispan-server-9.4.9.Final.zip $ unzip infinispan-server-9.4.9.Final.zip $ cd infinispan-server-9.4.9.Final
起動には、「--jmx」オプションを有効にして起動します。
$ bin/standalone.sh --jmx
するとまあ、こんな例外を出力してコケてしまいます。
15:54:32,777 INFO [org.jboss.modules] (main) JBoss Modules version 1.8.6.Final java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager") at org.jboss.logmanager.Logger.getLogger(Logger.java:57) at org.jboss.as.server.Main.main(Main.java:89) at org.jboss.modules.Module.run(Module.java:352) at org.jboss.modules.Module.run(Module.java:320) at org.jboss.modules.Main.main(Main.java:593) 15:54:33,089 FATAL [org.jboss.as.server] (main) WFLYSRV0239: Aborting with exit code 1
エラーメッセージにあるとおりに、「-Djava.util.logging.manager=org.jboss.logmanager.LogManager」を追加してもうまくいきません。
ちなみにこれ、調べてみたところ、Infinispan Server 9.4.3.Finalまでは「--jmx」オプションだけで起動していたんですよ。
どうしたものかなぁとちょっと調べてみたら、こういうエントリを見つけたので
Hawkular - Running Hawkular Agent
参考に試してみたら、起動しました…。
$ JBOSS_MODULES_SYSTEM_PKGS=org.jboss.byteman,org.jboss.logmanager bin/standalone.sh --jmx
もともと「--jmx」を付けたら「JBOSS_MODULES_SYSTEM_PKGS」も調整していてくれたのが、Java 11で起動しないという
問題に対応する時に、なくなってしまったようです。
if [ "x$JBOSS_MODULES_SYSTEM_PKGS" = "x" ]; then if [ "x$JBOSS_MODULES_SYSTEM_PKGS" = "x" ]; then JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman,org.jboss.logmanager.LogManager" JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman" if [ $USE_JMX_COLLECTORS ]; then JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman,org.jboss.logmanager" fi fi
かといって、Java 11で「--jmx」をつけて起動した場合には違う問題が出るんですけどね…。
$ java -version openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment (build 11.0.2+9-Debian-3bpo91) OpenJDK 64-Bit Server VM (build 11.0.2+9-Debian-3bpo91, mixed mode, sharing) $ JBOSS_MODULES_SYSTEM_PKGS=org.jboss.byteman,org.jboss.logmanager bin/standalone.sh --jmx JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager -Djava.awt.headless=true --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED --add-modules=java.se -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Xbootclasspath/p:/opt/infinispan-server-9.4.9.Final/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.4.Final.jar -Xbootclasspath/p:/opt/infinispan-server-9.4.9.Final/modules/system/layers/base/org/wildfly/common/main/wildfly-common-1.4.0.Final.jar -javaagent:/opt/infinispan-server-9.4.9.Final/modules/system/add-ons/ispn/io/prometheus/jmx/ispn-9.4/jmx_prometheus_javaagent-0.3.1.jar=9779:bin/prometheus_config.yaml ========================================================================= -Xbootclasspath/p is no longer a supported option. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
「-Xbootclasspath/p」…遠い…。今回はこのままいきましょう…。
先ほどのとおり、「JBOSS_MODULES_SYSTEM_PKGS」に「org.jboss.logmanager」を追加すれば、Prometheus向けの
Exporterが有効になります。
## スタンドアロンで起動する場合は、こちら $ JBOSS_MODULES_SYSTEM_PKGS=org.jboss.byteman,org.jboss.logmanager bin/standalone.sh --jmx ## クラスタを構成する場合、こちら $ JBOSS_MODULES_SYSTEM_PKGS=org.jboss.byteman,org.jboss.logmanager bin/standalone.sh --jmx -c clustered.xml
今回はSingle Nodeですが、clustered.xmlを使った構成でいきます。
ちなみに、「--jmx」の後ろにパスを付けてあげると、PrometheusのJMX Exporter向けの設定ファイルとして解釈されます。
$ JBOSS_MODULES_SYSTEM_PKGS=org.jboss.byteman,org.jboss.logmanager bin/standalone.sh --jmx my_prometheus_config.yml
メトリクスが取得できるか、確認してみます。
$ curl -s localhost:9779 | grep datagrid | head -n 10 # HELP datagrid_state_transfer_manager JMX MBean StateTransferManager # TYPE datagrid_state_transfer_manager untyped datagrid_state_transfer_manager{attribute="join_complete",container="clustered",name="org.infinispan.CLIENT_SERVER_TX_TABLE",} 1.0 datagrid_state_transfer_manager{attribute="state_transfer_in_progress",container="clustered",name="org.infinispan.CLIENT_SERVER_TX_TABLE",} 0.0 datagrid_state_transfer_manager{attribute="join_complete",container="clustered",name="repl",} 1.0 datagrid_state_transfer_manager{attribute="state_transfer_in_progress",container="clustered",name="repl",} 0.0 datagrid_state_transfer_manager{attribute="join_complete",container="clustered",name="org.infinispan.CONFIG",} 1.0 datagrid_state_transfer_manager{attribute="state_transfer_in_progress",container="clustered",name="org.infinispan.CONFIG",} 0.0 datagrid_state_transfer_manager{attribute="join_complete",container="clustered",name="___protobuf_metadata",} 1.0 datagrid_state_transfer_manager{attribute="state_transfer_in_progress",container="clustered",name="___protobuf_metadata",} 0.0
Cacheにもアクセスしてみましょう。REST Cacheにアクセスするために、アプリケーションユーザーを追加。
$ bin/add-user.sh -a -u ispn-user -p password
データの登録、取得。
$ curl -i -u ispn-user:password -XPUT localhost:8080/rest/default/key1 -d 'value1' HTTP/1.1 200 OK connection: keep-alive etag: 282873 content-length: 0 $ curl -i -u ispn-user:password localhost:8080/rest/default/key1 HTTP/1.1 200 OK connection: keep-alive etag: 282873 last-modified: Thu, 1 Jan 1970 09:00:00 +0900 content-type: application/octet-stream content-length: 6 value1
メトリクスの確認(いくつか抜粋しています)。
$ curl -s localhost:9779 | grep datagrid | grep default datagrid_cache_stats{attribute="hits",container="clustered",name="default",} 1.0 datagrid_cache_stats{attribute="read_write_ratio",container="clustered",name="default",} 2.0 datagrid_cache_stats{attribute="stores",container="clustered",name="default",} 1.0 datagrid_cache_stats{attribute="number_of_entries",container="clustered",name="default",} 1.0
それっぽい値が表示されました。
あとは、Prometheus側にScrapeの設定を入れます。Prometheusは、2.7.2を使用しています。
prometheus.yml
global: scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 5s # Evaluate rules every 15 seconds. The default is every 1 minute. scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'infinispan-server' static_configs: - targets: ['192.168.0.2:9779']
この部分ですね。
- job_name: 'infinispan-server' static_configs: - targets: ['192.168.0.2:9779']
PrometheusのWeb Consoleで、認識されているか確認。
PromQL で絞り込んでみましょう。
datagrid_cache_stats{name="default",attribute=~".*hits.*|.*ratio.*|.*remove.*|stores"}
表示できました、と。
まとめ
Infinispan Serverで、JMX Exporterを有効にして動作確認してみました。
現在のバージョンでも、Java 8で動かすのにちょっと細工が必要だったり、Java 11では怪しかったりといろいろあるようですが、
とりあえずどういうものか確認はできましたと。
起動まわりのところは、どう見ていこうかなぁ…。