第7章 JBoss EAP 用 Micrometer アプリケーションの開発
7.1. JBoss EAP に Micrometer メトリクスを統合 リンクのコピーリンクがクリップボードにコピーされました!
Micrometer を使用すると、JBoss EAP でアプリケーションメトリクスを監視および収集できます。Micrometer サポートにより、アプリケーションメトリクスが公開されます。エクスポートプロセスは PUSH ベースであり、メトリクスが OpenTelemetry Collector に送信されるようにします。
前提条件
- JDK 17 がインストールされている。
- Maven 3.6 以降のバージョンがインストールされている。詳細は、Downloading Apache Maven を参照してください。
- Docker がインストールされている。詳細は、Get Docker を参照してください。
- オプション: システムに podman がインストールされている。サポート対象の RHEL で利用可能な最新の podman バージョンを使用してください。詳細は、Red Hat JBoss Enterprise Application Platform 8.0 でサポートされる構成 を参照してください。
-
configure-micrometer.cliファイルは、アプリケーションのルートディレクトリーにあります。
このセクションの例 (configure-micrometer.cli ファイルの使用方法を含む) は、Micrometer クイックスタート に基づいています。
手順
- 端末を開きます。
次のスクリプトを使用して、JBoss EAP をスタンドアロンサーバーとして起動します。
$ <EAP_HOME>/bin/standalone.sh -c standalone-microprofile.xml注記Windows Server の場合は、
<EAP_HOME>\bin\standalone.batスクリプトを使用します。- 新しいターミナルを開きます。
- アプリケーションのルートディレクトリーに移動します。
サーバーを設定するには、次のコマンドを実行します。
$ <EAP_HOME>/bin/jboss-cli.sh --connect --file=configure-micrometer.cli注記Windows Server の場合は、
<EAP_HOME>\bin\jboss-cli.batスクリプトを使用します。<EAP_HOME> をサーバーへのパスに置き換えます。
想定される出力:
The batch executed successfully process-state: reload-required以下の管理コマンドでサーバーをリロードします。
$ <EAP_HOME>/bin/jboss-cli.sh --connect --commands=reload次の内容を含む
docker-compose.yamlという名前の設定ファイルを作成します。version: "3" services: otel-collector: image: otel/opentelemetry-collector command: [--config=/etc/otel-collector-config.yaml] volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:Z ports: - 1888:1888 # pprof extension - 8888:8888 # Prometheus metrics exposed by the collector - 8889:8889 # Prometheus exporter metrics - 13133:13133 # health_check extension - 4317:4317 # OTLP gRPC receiver - 4318:4318 # OTLP http receiver - 55679:55679 # zpages extension - 1234:1234 # /metrics endpoint次の内容を含む
otel-collector-config.yamlという名前の設定ファイルを作成します。extensions: health_check: pprof: endpoint: 0.0.0.0:1777 zpages: endpoint: 0.0.0.0:55679 receivers: otlp: protocols: grpc: http: processors: batch: exporters: prometheus: endpoint: "0.0.0.0:1234" service: pipelines: metrics: receivers: [otlp] processors: [batch] exporters: [prometheus] extensions: [health_check, pprof, zpages]次のコマンドを実行して、コレクターサーバーインスタンスを起動します。
$ docker-compose up注記Docker の代わりに Podman を使用することもできます。Podman を選択した場合は、
$ docker-compose upではなく$ podman-compose upコマンドを使用します。ご使用の環境で Docker または Podman がサポートされていない場合は、Otel Collector のドキュメント で OpenTelemetry Collector のインストールと実行に関するガイダンスを参照してください。RootResourceクラスでは、メーター登録前に適切なセットアップを確実に行うために、MeterRegistryがクラスに挿入される方法を確認します。@Path("/") @ApplicationScoped public class RootResource { // ... @Inject private MeterRegistry registry; private Counter performCheckCounter; private Counter originalCounter; private Counter duplicatedCounter; @PostConstruct private void createMeters() { Gauge.builder("prime.highestSoFar", () -> highestPrimeNumberSoFar) .description("Highest prime number so far.") .register(registry); performCheckCounter = Counter .builder("prime.performedChecks") .description("How many prime checks have been performed.") .register(registry); originalCounter = Counter .builder("prime.duplicatedCounter") .tags(List.of(Tag.of("type", "original"))) .register(registry); duplicatedCounter = Counter .builder("prime.duplicatedCounter") .tags(List.of(Tag.of("type", "copy"))) .register(registry); } // ... }checkIfPrime()メソッド本体を調べて、登録されたメーターがアプリケーションロジック内でどのように使用されるかを確認します。以下に例を示します。@GET @Path("/prime/{number}") public String checkIfPrime(@PathParam("number") long number) throws Exception { performCheckCounter.increment(); Timer timer = registry.timer("prime.timer"); return timer.recordCallable(() -> { if (number < 1) { return "Only natural numbers can be prime numbers."; } if (number == 1) { return "1 is not prime."; } if (number == 2) { return "2 is prime."; } if (number % 2 == 0) { return number + " is not prime, it is divisible by 2."; } for (int i = 3; i < Math.floor(Math.sqrt(number)) + 1; i = i + 2) { try { Thread.sleep(10); } catch (InterruptedException e) { // } if (number % i == 0) { return number + " is not prime, is divisible by " + i + "."; } } if (number > highestPrimeNumberSoFar) { highestPrimeNumberSoFar = number; } return number + " is prime."; }); }アプリケーションのルートディレクトリーに移動します。
構文
$ cd <path_to_application_root>/<application_root>Micrometer Quickstart を参考にした例:
$ cd ~/quickstarts/micrometer次のコマンドを使用して、アプリケーションをコンパイルおよびデプロイします。
$ mvn clean package wildfly:deploy
これにより、実行中のサーバーに micrometer/target/micrometer.war がデプロイされます。
検証
Web ブラウザー を使用してアプリケーションにアクセスするか、次のコマンドを実行します。
$ curl http://localhost:8080/micrometer/prime/13想定される出力:
13 is prime.