ããã¯ããªã«ãããããŠæžãããã®ïŒ
æè¿ãã¡ãã®ãšã³ããªãæžããã®ã§ããããã®æã¯MicroProfile MetricsããŸã£ããç¥ããŸããã§ããã
WildFlyのMetricsサブシステム、MicroProfile Metricsサブシステムを試してみる - CLOVER🍀
ãã£ããã®æ©äŒãªã®ã§ãMicroProfile Metricsãè©ŠããŠã¿ããããªãšã
Eclipse MicroProfile Metrics
Eclipse MicroProfile Metricsãšããã®ãæ£ããå称ã¿ããã§ããã
GitHub - eclipse/microprofile-metrics: microprofile-metrics
Eclipse MicroProfileã«æºæ ãããåããã»ã¹ã®ã¡ããªã¯ã¹ãšã³ããã€ã³ãããã³ã¡ããªã¯ã¹ã®è¿œå ãè¡ãæ©èœã§ãã
çŸåšã®ããŒãžã§ã³ã¯3.0ã§ãã
ä»æ§æžã¯GitHubããããŠã³ããŒãããŠãããã®ã§ãã
Release MicroProfile Metrics 3.0 · eclipse/microprofile-metrics · GitHub
ãã¡ãããããŠã³ããŒãããŠãããã§ãããã
https://download.eclipse.org/microprofile/microprofile-metrics-3.0/
Javadocã¯ãã¡ãã§ãã
ã¡ãªã¿ã«ã§ãããEclipse MicroProfile Metrics 4.xã§ã¯Micrometerã調æ»ããçµæãšããŠãå€æŽãè¡ãããããã§ãã
4.xã§3.0ããã©ã®ãããäºææ§ãç¶æããããã¯æªå®ã®ããã§ãã
ãŸããããã¯ãããšããŠä»åã¯æ±ã£ãŠã¿ãŸãã
Eclipse MicroProfile Metricsã®å®è£ ã¯ããã¡ãã«äžèŠ§ããããŸãã
MicroProfile/Implementation / MP Metrics implementations
- OpenLiberty
- WebSphere Liberty
- SmallRye Metrics
- Payara ServerïŒPayara Micro
- Helidon
- Geronimo Metrics
- KumuluzEE Metrics
ãããã§ããããã£ãšã3.0ãŸã§å®è£ ããŠããã®ã¯ãããªãéãããŠããŸããã
ããå°ã詳现ã
Eclipse MicroProfile Metricsãã©ããããã®ãããããå°ãèŠãŠã¿ãŸãããã
Metrics for Eclipse MicroProfile / Architecture
ã¡ããªã¯ã¹ãšããŠã次ã®3çš®é¡ã®ãµããªãœãŒã¹ïŒã¹ã³ãŒãïŒãå®çŸ©ãããŠããŸãã
- Base metrics ⊠ãã¹ãŠã®MicroProfileã®ãã³ããŒãæäŸãã¹ãã¡ããªã¯ã¹
- Vendor specific metrics ⊠ãã³ããŒåºæã®ã¡ããªã¯ã¹
- Application metrics ⊠ã¢ããªã±ãŒã·ã§ã³åºæã®ã¡ããªã¯ã¹
ãããã¯ãRESTãšã³ããã€ã³ãã§å ¬éãããŸãããã©ãŒãããã¯JSONãŸãã¯OpenMetricsã§ãã
Base metricsã¯/metrics/base
ãšãããã¹ã§å
¬éããããã¡ãã«ãªã¹ãããããŸãã
ããŒããã¹ã¬ãããOSã®æ
å ±ãªã©JavaVMã«é¢ãããã®ã䞊ãã§ããŸãããªãã·ã§ã³ãšããŠæ±ãããŠãããã®ããããŸããã
ç°ãªãEclipse MicroProfile Metricså®è£
ã§ç§»æ€å¯èœã§ããããšãç®çã«ããã¹ã³ãŒãã§ããã
Vendor specific metricsã¯/metrics/vendor
ãšãããã¹ã§å
¬éããããã³ããŒãåºæã®ã¡ããªã¯ã¹ãæäŸããŸãã
ç°ãªãEclipse MicroProfile Metricså®è£
ã®éã§ç§»æ€å¯èœã§ããããšã¯æ³å®ãããŠããŸããã
Application metricsã¯/metrics/application
ãšãããã¹ã§å
¬éãããEclipse MicroProfile Metricsã®APIã䜿ã£ãŠã¢ããªã±ãŒã·ã§ã³ã
å®è£
ããŸãã
Application Metrics Programming Model
ãã®ã¹ã³ãŒãã®ã¡ããªã¯ã¹ã¯ãEclipse MicroProfile Metricsä»æ§ã«åã£ãŠäœæããŠããã°ãç°ãªããã³ããŒïŒãµãŒããŒïŒã«
移ããŠãåãã¡ããªã¯ã¹ãå
¬éã§ããŸãã
ã¡ããªã¯ã¹ã«ã¯ãã¿ã°ãšã¡ã¿ããŒã¿ããããŸãã
ã¿ã°ã¯ãã©ãã«ãšãèšããã¡ããªã¯ã¹ã«ä»äžãããŸãã
ã¡ã¿ããŒã¿ã¯ãã¡ããªã¯ã¹ã®ååãåäœãçš®é¡ïŒCounterãGaugeãMeterãHistogramãTimerãªã©ïŒã説æãªã©ã§ãã
ã¡ããªã¯ã¹ãã¡ã¿ããŒã¿ã®æ
å ±ã¯MetricRegistryã«ä¿åãããåã¹ã³ãŒãããšã«ã²ãšã€ã®MetricRegistryã®ã€ã³ã¹ã¿ã³ã¹ã
ãããŸãã
ã¡ããªã¯ã¹ãå ¬éãããRESTãšã³ããã€ã³ãé¢ããæ å ±ã¯ããã¡ãã§ãã
ãšãæŠèŠã¯ãããããã«ããŠãå®éã«Eclipse MicroProfile Metricsã䜿ã£ãŠã¿ãããšæããŸãã
SmallRye Metrics
ä»åã¯Eclipse MicroProfile Metricsã®å®è£ ãšããŠãSmallRye Metricsã䜿ããŸãã
GitHub - smallrye/smallrye-metrics
ããã¥ã¡ã³ãã¯ããã¡ãã
SmallRye Metrics Documentation :: SmallRye documentation
SmallRye Metrics 3.0ã¯ãEclipse MicroProfile Metrics 3.0ã®å®è£
ã®ããã§ãã
QuarkusãWildFlyã«çµã¿èŸŒãŸããŠããŸãã
ãšããããã§ãä»åã¯WildFlyã§SmalleRye Metricsã䜿ã£ãŠã¿ãŸãããã
ããã€ãæ¡åŒµæ©èœãåºæã®æ å ±ãããã®ã§ããã
- CDI Extension for eager registration of annotated application metrics :: SmallRye documentation
- Activating base and vendor metrics :: SmallRye documentation
- Metric registry lifecycle :: SmallRye documentation
- JAX-RS metrics :: SmallRye documentation
JAX-RSã«é¢ããã¡ããªã¯ã¹ã®è©±ã¯ãä»åã¯è«ŠããŸããâŠã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ java --version openjdk 11.0.11 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04) OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing) $ mvn --version Apache Maven 3.8.2 (ea98e05a04480131370aa0c110b8c54cf726c06f) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-81-generic", arch: "amd64", family: "unix"
WildFlyã¯ã24.0.1.Finalã䜿ããŸãã
æºå
Mavenã§ã®ãããžã§ã¯ãå®çŸ©ã¯ããããªæãã«ããŸããã
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.littlewings</groupId> <artifactId>microprofile-metrics-example</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <failOnMissingWebXml>false</failOnMissingWebXml> </properties> <dependencies> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-web-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.eclipse.microprofile.metrics</groupId> <artifactId>microprofile-metrics-api</artifactId> <version>3.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> </build> </project>
Eclipse MicroProfile Metricsã®APIã䜿ãã«ã¯ãmicroprofile-metrics-api
ãäŸåé¢ä¿ã«è¿œå ããŸãã
<dependency> <groupId>org.eclipse.microprofile.metrics</groupId> <artifactId>microprofile-metrics-api</artifactId> <version>3.0</version> <scope>provided</scope> </dependency>
WARãã¡ã€ã«ã®ååã¯ãmicroprofile-metrics-example.war
ãšããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãJAX-RSã䜿ã£ãŠæžãããšã«ããŸããããJAX-RSæå¹åã®ã¯ã©ã¹ãäœæããŠãããŸãã
src/main/java/org/littlewings/microprofile/metrics/JaxrsActivator.java
package org.littlewings.microprofile.metrics; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("") public class JaxrsActivator extends Application { }
WildFlyã®ããŠã³ããŒãã
$ curl -OL https://download.jboss.org/wildfly/24.0.1.Final/wildfly-24.0.1.Final.zip $ unzip wildfly-24.0.1.Final.zip $ cd wildfly-24.0.1.Final
Eclipse MicroProfileã䜿ãã®ã§ãèšå®ãã¡ã€ã«ã¯standalone-microprofile.xml
ãæå®ããŠèµ·åããŸãã
$ bin/standalone.sh -c standalone-microprofile.xml -Dwildfly.statistics-enabled=true
WildFlyèªèº«ã®ã¡ããªã¯ã¹ãååŸã§ããããã«ã-Dwildfly.statistics-enabled=true
ãæå®ããŠãããŸãããã
管çCLIãèµ·åããŠãããŸãã
$ bin/jboss-cli.sh -c [standalone@localhost:9990 /]
RESTãšã³ããã€ã³ãã§ãWildFlyã®ã¡ããªã¯ã¹ãååŸããŠã¿ã
èµ·åããç¶æ ã®WildFlyã®ã¡ããªã¯ã¹ãååŸããŠã¿ãŸãããã
WildFlyã®å Žåã9990ããŒãã§ã¢ã¯ã»ã¹ããŸãã
/metrics
ã§ãå
šã¹ã³ãŒãã®ã¡ããªã¯ã¹ãååŸã§ããŸãã
$ curl -s localhost:9990/metrics | grep -v '^#' | perl -wp -e 's!^(.+?_.+?)_.+!$1!' | sort | uniq -c 3 base_classloader 4 base_cpu 4 base_gc 1 base_jvm 6 base_memory 3 base_thread 2 vendor_BufferPool 16 vendor_memoryPool 60 wildfly_datasources 14 wildfly_ee 7 wildfly_io 17 wildfly_jca 12 wildfly_messaging 1 wildfly_request 11 wildfly_transactions 12 wildfly_undertow
/metrics/base
ãšããããšã§ãBase metricsã«çµãããšãã§ããŸãã
$ curl -s localhost:9990/metrics/base | grep -v '^#' | perl -wp -e 's!^(.+?_.+?)_.+!$1!' | sort | uniq -c 3 base_classloader 4 base_cpu 4 base_gc 1 base_jvm 6 base_memory 3 base_thread
/metrics/vendor
ã§ãVendor specific metricsã§ãã
$ curl -s localhost:9990/metrics/vendor | grep -v '^#' | perl -wp -e 's!^(.+?_.+?)_.+!$1!' | sort | uniq -c 2 vendor_BufferPool 16 vendor_memoryPool 60 wildfly_datasources 14 wildfly_ee 7 wildfly_io 17 wildfly_jca 12 wildfly_messaging 1 wildfly_request 11 wildfly_transactions 12 wildfly_undertow
Application metricsã¯ããŸã ã¢ããªã±ãŒã·ã§ã³ãç»é²ãããŠããªãã®ã§ååšããŸããã
$ curl -s localhost:9990/metrics/application | grep -v '^#' | perl -wp -e 's!^(.+?_.+?)_.+!$1!' | sort | uniq -c
ãããªæãã§ã/metrics/[ã¹ã³ãŒã]
ã§ååŸããã¡ããªã¯ã¹ã®ã¹ã³ãŒããçµãããšãã§ããŸãã
ããã«/metrics/[ã¹ã³ãŒã]/[ã¡ããªã¯ã¹å]
ã§ã¡ããªã¯ã¹ãçµã£ãŠååŸããããšãã§ããŸãã
$ curl localhost:9990/metrics/vendor/wildfly_io_io_thread_count # HELP wildfly_io_io_thread_count I/O thread count # TYPE wildfly_io_io_thread_count gauge wildfly_io_io_thread_count{worker="default",microprofile_scope="vendor"} 16.0
ã¡ããªã¯ã¹ã®çš®é¡
ããã°ã©ã ãæžãåã«ãå ã«ã¡ããªã¯ã¹ã®çš®é¡ãèŠãŠãããæ¹ãè¯ãããã§ãã
ãšãããããããªãæžãå§ããŠé²ããŠã¿ãããèªåãå°ããŸããâŠã
- Counter ⊠å調ã«å¢å ããæ°å€ïŒlongïŒ
- ConcurrentGause ⊠å¢æžããæ°å€ïŒlongïŒãçŸåšã®ã«ãŠã³ããåã«å®äºãã1åã®éã®æ倧å€ãæå°å€ã®3ã€ã®å€ãå ¬éããã
- Gauge ⊠CPUã®æž©åºŠããã£ã¹ã¯äœ¿çšçãªã©ããµã³ããªã³ã°ãããã¡ããªã¯ã¹
- Gaugeã«ã€ããŠã¯ãã¡ããªã¯ã¹ååŸæã«
Gauge#getValue
ã®åŒã³åºããè¡ããã - Gauge JSON Format
- Gaugeã«ã€ããŠã¯ãã¡ããªã¯ã¹ååŸæã«
- Meter ⊠平åã¹ã«ãŒãããã1åã5åã15åã®ææ°å é移åå¹³åã¹ã«ãŒãããã远跡ãã
- Histogram ⊠å€ïŒlongïŒã®ååžãèšç®ãã
- Timer ⊠æéãéèšããæéã®çµ±èšãšã¹ã«ãŒãããã®çµ±èšãæäŸãã
Duration
ãCallable
ãRunnable
ãContext
ã§èšé²
- SimpleTimer ⊠Timerã®è»œéç
- çµéæéãåŒã³åºãã«ãŠã³ããåã«å®äºãã1åéã®æ倧ãæå°ãèšé²
- Prometheusã§äœ¿ãå ŽåãTimerã䜿ãæ¹ãè¯ã
ã©ããªã¡ããªã¯ã¹ã«ãªãã®ãã¯ãRESTãšã³ããã€ã³ãã®åã¡ããªã¯ã¹ã®èšèŒãèŠãæ¹ãããããããã§ããããã
ãŸããHistgram以å€ã®ã¡ããªã¯ã¹ã¯ãã¢ãããŒã·ã§ã³ã§ã®èšé²ãå¯èœã§ãã
ã¢ãããŒã·ã§ã³ã§ã¡ããªã¯ã¹ãèšé²ãã
ã§ã¯ããŸãã¯ã¢ãããŒã·ã§ã³ã䜿ã£ãŠã¡ããªã¯ã¹ãèšé²ããŠã¿ãŸãããã
ãã¡ããèŠãªããäœæããŠãããŸãã
é圢ãšãªãJAX-RSãªãœãŒã¹ã¯ã©ã¹ãçšæã
src/main/java/org/littlewings/microprofile/metrics/SimpleAnnotatedResource.java
package org.littlewings.microprofile.metrics; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.eclipse.microprofile.metrics.annotation.ConcurrentGauge; import org.eclipse.microprofile.metrics.annotation.Counted; import org.eclipse.microprofile.metrics.annotation.SimplyTimed; import org.eclipse.microprofile.metrics.annotation.Timed; @Path("annotated") public class SimpleAnnotatedResource { // ããã«ãã¡ããªã¯ã¹ãèšé²ããã³ãŒããæžã }
ãã¡ãã«ãã¡ããªã¯ã¹ãèšé²ããã³ãŒããåã蟌ãã§ãããŸãã
Counter metricsãèšé²ããã@Counted
ãå±æ§ã¯name
ã ããæå®ããŠã¿ãŸããã
@GET @Path("count-hello-world") @Produces(MediaType.TEXT_PLAIN) @Counted(name = "hello_world_call_count") public String countHelloWorld() { return "Hello World!!"; }
ãã¡ãã§ããã
@Counted(name = "hello_world_call_count")
ããã§ããã®ãªãœãŒã¹ã¡ãœããã®åŒã³åºãåæ°ãã¡ããªã¯ã¹ãšããŠèšé²ãããããã«ãªããŸãã
ããã±ãŒãžã³ã°ããŠ
$ mvn package
ãããã€ã
[standalone@localhost:9990 /] deploy /path/to/target/microprofile-metrics-example.war
以éã¯ããã®æäœãçç¥ããŸãïŒèšèŒãããœãŒã¹ã³ãŒããå«ãŸããWebã¢ããªã±ãŒã·ã§ã³ããããã€ããããã®ãšããŠ
話ãé²ããŸãïŒã
ãã®æç¹ã§ãå®ã¯ã¡ããªã¯ã¹ã¯èŠãããããã«ãªã£ãŠããŸãã
$ curl localhost:9990/metrics/application # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total counter application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total 0.0
ã¢ã¯ã»ã¹ããŠã¿ãŸãããã
$ curl localhost:8080/microprofile-metrics-example/annotated/count-hello-world Hello World!! $ curl localhost:8080/microprofile-metrics-example/annotated/count-hello-world Hello World!!
ãããªæãã§ã«ãŠã³ãã¢ãããããŠãããŸãã
$ curl -s localhost:9990/metrics/application # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total counter application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total 2.0
次ã¯ãããå°ãå±æ§ãæå®ããŠã¿ãŸããããå±æ§ãæå®ãããšããããšã¯ãã¡ã¿ããŒã¿ãæå®ããããšã«ãªããŸãã
@GET @Path("count-yeah") @Produces(MediaType.TEXT_PLAIN) @Counted(name = "yeah_call_count", absolute = true, displayName = "yeah call count metrics", description = "yeah call count description") public String countYeah() { return "Yeah!!"; }
ã¢ã¯ã»ã¹ããŠã¿ãŸãã
$ curl localhost:8080/microprofile-metrics-example/annotated/count-yeah Yeah!! $ curl localhost:8080/microprofile-metrics-example/annotated/count-yeah Yeah!!
ã¡ããªã¯ã¹ã¯ããããªæãã«ãªããŸãã
# HELP application_yeah_call_count_total yeah call count description # TYPE application_yeah_call_count_total counter application_yeah_call_count_total 2.0
description
ã¯ãHELPã«äœ¿ãããŠããããšã確èªã§ããŸãã
å
ã»ã©ãšæ¯ã¹ããšãã¡ããªã¯ã¹ã®ååããããçãã§ãããããã¯absolute
ãtrue
ãšããããã§ãã
absolute
ãfalse
ïŒããã©ã«ãïŒãšãããšãã¯ã©ã¹ã®FQCNãã¡ããªã¯ã¹ã®ååã«å«ãŸããããã«ãªããŸãã
ã¢ãããŒã·ã§ã³ã䜿ã£ãŠã¡ããªã¯ã¹ãèšé²ããå Žåã®ãã¡ããªã¯ã¹åã«é¢ããèŠåã¯ãã¡ãã«èšèŒãããŠããŸãã
ã¡ããªã¯ã¹åã«ã¯ã¹ã³ãŒãããã³ã¡ããªã¯ã¹ã«ãã£ãŠã¯ãµãã£ãã¯ã¹ãä»äžãããã®ã§ãããããã®ã¡ããªã¯ã¹ã®
æ
å ±ãåç
§ããŸãããã
ãšããã§ãdisplayName
ã®æ
å ±ã¯ã©ãã«ãã£ãã®ã§ããããïŒããã¯ãOPTIONS
ã§ç¢ºèªã§ããŸãã
$ curl -XOPTIONS -H 'Accept: application/json' localhost:9990/metrics/application { "org.littlewings.microprofile.metrics.SimpleAnnotatedResource.hello_world_call_count": { "unit": "none", "type": "counter", "displayName": "org.littlewings.microprofile.metrics.SimpleAnnotatedResource.hello_world_call_count", "tags": [ [ ] ] }, "yeah_call_count": { "unit": "none", "type": "counter", "description": "yeah call count description", "displayName": "yeah call count metrics", "tags": [ [ ] ] } }
ããŒãã¡ããªã¯ã¹åã«ãªã£ãŠããããšã«æ³šæããŸãããã
ã€ãŸããèªåãäœã£ãŠããä»åã®äŸã ãš
application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total
ãšãã
èŠãç®ã®ã¡ããªã¯ã¹ã¯ãorg.littlewings.microprofile.metrics.SimpleAnnotatedResource.hello_world_call_count
ãšãã
ååã§ã¢ã¯ã»ã¹ã§ããããšã«ãªããŸãã
$ curl -s localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.hello_world_call_count # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total counter application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total 2.0
ã¡ãã£ãšãããã«ããã®ã§ãå°ã£ããOPTIONS
ã§ã¡ããªã¯ã¹ã®ã¡ã¿ããŒã¿ãèŠãŠã¿ãŸãããã
ã¡ããªã¯ã¹åäœã§ååŸãããå Žåãªã©ã«ããã®æ
å ±ã¯åœ¹ç«ã€ã§ãããã
話ãæ»ããŠã
åãã¡ããªã¯ã¹ãå¥ã®ã¡ãœããã§ãèšé²ããããšãã§ããŸããããã²ãšã€ãJAX-RSãªãœãŒã¹ã¡ãœãããè¿œå ã
@GET @Path("count-yeah2") @Produces(MediaType.TEXT_PLAIN) @Counted(name = "yeah_call_count", absolute = true, displayName = "yeah call count metrics", description = "yeah call count description") public String countYeah2() { return "Yeah2!!"; }
ãã¡ãã«èšèŒã®ããããã«ãã¡ããªã¯ã¹ã¯ã¡ã¿ããŒã¿ããåãã§ããã°è€æ°ã®ã¢ãããŒã·ã§ã³ã§åãã¡ããªã¯ã¹ã
åç
§ããããšãã§ããŸãã
åãååã®ã¡ããªã¯ã¹ã§ãç°ãªãã¡ã¿ããŒã¿ã®ãã®ãå®çŸ©ããå Žåã¯ãIllegalArgumentException
ãã¹ããŒãããŸããã
ããšãGaugeã¯ãã®ã«ãŒã«ã®å¯Ÿè±¡å€ã«ãªããŸãã
åŒã³åºãã
$ curl localhost:8080/microprofile-metrics-example/annotated/count-yeah2 Yeah2!! $ curl localhost:8080/microprofile-metrics-example/annotated/count-yeah2 Yeah2!!
ããã§ã2ã€ã®JAX-RSãªãœãŒã¹ã¡ãœããã®ã©ã¡ããåŒã³åºããŠããåãCounterã¡ããªã¯ã¹ãæŽæ°ãããããã«ãªããŸããã
$ curl localhost:9990/metrics/application/yeah_call_count # HELP application_yeah_call_count_total yeah call count description # TYPE application_yeah_call_count_total counter application_yeah_call_count_total 4.0
次ã«ãConcurrent Gaugeã䜿ã£ãŠã¿ãŸãããã
ã©ã³ãã ãªç§æ°ãã¹ãªãŒãããããã«ä»èŸŒãã§ãããã«ã¯çµäºããªãããã«ããŸãã
@GET @Path("concurrent-gause") @Produces(MediaType.TEXT_PLAIN) @ConcurrentGauge(name = "my_concurrent_gause") public String concurrentGause() throws InterruptedException { long sleepSeconds = randomService.randomInt(5); TimeUnit.SECONDS.sleep(sleepSeconds); return String.format("sleeped %d sec", sleepSeconds); }
ãã®æãã©ã³ãã ãªæŽæ°ãååŸããåŠçã¯CDI管çBeanãšãããã¡ããCountã¡ããªã¯ã¹ãååŸããããã«ããŸãããã
src/main/java/org/littlewings/microprofile/metrics/RandomService.java
package org.littlewings.microprofile.metrics; import java.util.Random; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.metrics.annotation.Counted; @ApplicationScoped public class RandomService { Random random; @PostConstruct public void init() { random = new Random(); random.nextInt(); } @Counted public int randomInt(int bound) { return random.nextInt(bound); } }
ãããªæãã§ã¢ã¯ã»ã¹ããŠããéã«
$ curl localhost:8080/microprofile-metrics-example/annotated/concurrent-gause & $ curl localhost:8080/microprofile-metrics-example/annotated/concurrent-gause & $ curl localhost:8080/microprofile-metrics-example/annotated/concurrent-gause & $ curl localhost:8080/microprofile-metrics-example/annotated/concurrent-gause & $ curl localhost:8080/microprofile-metrics-example/annotated/concurrent-gause &
ã¡ããªã¯ã¹ãèŠããšãçŸåšã¡ãœããåŠçäžã®æ°ãããã£ããããŸãã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.my_concurrent_gause # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_current gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_current 6.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_max gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_max 0.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_min gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_min 0.0
åŠçãå
šéšçµäºãããšãcurrent
ã¯0ã«ãªããŸãã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.my_concurrent_gause # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_current gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_current 0.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_max gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_max 6.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_min gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_concurrent_gause_min 0.0
æéãçµã€ãšãmax
ãªã©ã«åæ ãããŠãããŸãã
CDI管çBeanã«ä»äžããCounterãããããªæãã«ãªããŸããã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.RandomService.randomInt # TYPE application_org_littlewings_microprofile_metrics_RandomService_randomInt_total counter application_org_littlewings_microprofile_metrics_RandomService_randomInt_total 5.0
TimerãšSimple Timerãè©ŠããŠã¿ãŸãããããã¡ãããã©ã³ãã ã«ã¹ãªãŒããå ¥ããŸãã
@GET @Path("timer") @Produces(MediaType.TEXT_PLAIN) @Timed(name = "my_timer") public int timer() throws InterruptedException { long sleepSeconds = randomService.randomInt(5); TimeUnit.SECONDS.sleep(sleepSeconds); return (int) sleepSeconds; } @GET @Path("simply-timer") @Produces(MediaType.TEXT_PLAIN) @SimplyTimed(name = "my_simply_timer") public int simplyTimer() throws InterruptedException { long sleepSeconds = randomService.randomInt(5); TimeUnit.SECONDS.sleep(sleepSeconds); return (int) sleepSeconds; }
Timerã§èšé²ããã¡ãœããã«ã¢ã¯ã»ã¹ããŠã¿ãŸãã5åã»ã©ã
$ curl localhost:8080/microprofile-metrics-example/annotated/timer 4 $ curl localhost:8080/microprofile-metrics-example/annotated/timer 4 $ curl localhost:8080/microprofile-metrics-example/annotated/timer 3 $ curl localhost:8080/microprofile-metrics-example/annotated/timer 2 $ curl localhost:8080/microprofile-metrics-example/annotated/timer 3
Timerã§èšé²ããã¡ããªã¯ã¹ã§ãã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.my_timer # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_rate_per_second gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_rate_per_second 0.04659992804288887 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_one_min_rate_per_second gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_one_min_rate_per_second 0.03803114091972095 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_five_min_rate_per_second gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_five_min_rate_per_second 0.014230203582008386 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_fifteen_min_rate_per_second gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_fifteen_min_rate_per_second 0.005270118248321379 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_min_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_min_seconds 2.000252859 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_max_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_max_seconds 4.000690081 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_mean_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_mean_seconds 3.1550887689637688 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_stddev_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_stddev_seconds 0.7427672463717483 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds summary application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds_count 5.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds_sum gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds_sum 16.001751731 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.5"} 3.000265941 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.75"} 4.000317245 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.95"} 4.000690081 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.98"} 4.000690081 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.99"} 4.000690081 application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_timer_seconds{quantile="0.999"} 4.000690081
次ã«ãSimple Timerã
$ curl localhost:8080/microprofile-metrics-example/annotated/simply-timer 4 $ curl localhost:8080/microprofile-metrics-example/annotated/simply-timer 1 $ curl localhost:8080/microprofile-metrics-example/annotated/simply-timer 0 $ curl localhost:8080/microprofile-metrics-example/annotated/simply-timer 3 $ curl localhost:8080/microprofile-metrics-example/annotated/simply-timer 0
Timerã«æ¯ã¹ããšãèšé²ãããã¡ããªã¯ã¹ã¯ãã£ãšæžããŸãã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.my_simply_timer # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_total counter application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_total 5.0 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_elapsedTime_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_elapsedTime_seconds 8.000970078 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_minTimeDuration_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_minTimeDuration_seconds 6.6287E-5 # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_maxTimeDuration_seconds gauge application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_my_simply_timer_maxTimeDuration_seconds 4.000279805
Gause
ã¢ãããŒã·ã§ã³ã䜿ã£ããµã³ãã«ã®æåŸã«ãGaugeãè©ŠããŠã¿ãŸãããã
Gaugeã¯ç¹æ®ã§ãã¢ãããŒã·ã§ã³ãä»äžããŠãããã«ã¯ã¡ããªã¯ã¹ã«ç»é²ããããå®éã«ã¢ãããŒã·ã§ã³ãä»äžãã
CDI管çBeanãã€ã³ã¹ã¿ã³ã¹åããããŸã§é
延ããŸãã
Responsibility of the MicroProfile Metrics implementation
ãŸããGaugeã¯è€æ°ã®CDI管çBeanã«çŽä»ããããããšãèš±å¯ããŸããã
ãã®ãããã泚æç¹ã§ãã ã§ãGaugeã䜿çšãããµã³ãã«ã
src/main/java/org/littlewings/microprofile/metrics/ApplicationScopedAnnotatedResource.java
package org.littlewings.microprofile.metrics; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.eclipse.microprofile.metrics.MetricUnits; import org.eclipse.microprofile.metrics.annotation.Gauge; @Path("application-scoped-annotated") @ApplicationScoped public class ApplicationScopedAnnotatedResource { @Inject RandomService randomService; @GET @Path("gauge") @Produces(MediaType.TEXT_PLAIN) @Gauge(name = "my_gauge", unit = MetricUnits.BYTES) public int gause() { Thread.dumpStack(); return randomService.randomInt(1024); } }
Gaugeã¯ãä»ã®ã¡ããªã¯ã¹ãšéã£ãŠåäœãæ瀺çã«æå®ããå¿ èŠããããŸãã
@Gauge(name = "my_gauge", unit = MetricUnits.BYTES)
Gaugeã䜿ã£ãã¡ãœããã«ã¢ã¯ã»ã¹ããŠã¿ãŸãã
$ curl localhost:8080/microprofile-metrics-example/application-scoped-annotated/gauge 360 $ curl localhost:8080/microprofile-metrics-example/application-scoped-annotated/gauge 999
ããã§ãã¡ããªã¯ã¹ãèšé²ãããã®ã§ããâŠã
å®éã«èšé²ãããã¡ããªã¯ã¹ã確èªããŠã¿ãŸãã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.ApplicationScopedAnnotatedResource.my_gauge # TYPE application_org_littlewings_microprofile_metrics_ApplicationScopedAnnotatedResource_my_gauge_bytes gauge application_org_littlewings_microprofile_metrics_ApplicationScopedAnnotatedResource_my_gauge_bytes 541.0
ãã®æãè£ã§ã¯@Gauge
ã¢ãããŒã·ã§ã³ãä»äžããã¡ãœãããåŒã³åºãããŠããŸãã
18:23:40,560 ERROR [stderr] (management I/O-1) java.lang.Exception: Stack trace 18:23:40,560 ERROR [stderr] (management I/O-1) at java.base/java.lang.Thread.dumpStack(Thread.java:1383) 18:23:40,560 ERROR [stderr] (management I/O-1) at deployment.microprofile-metrics-example.war//org.littlewings.microprofile.metrics.ApplicationScopedAnnotatedResource.gause(ApplicationScopedAnnotatedResource.java:24) 18:23:40,560 ERROR [stderr] (management I/O-1) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 18:23:40,560 ERROR [stderr] (management I/O-1) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 18:23:40,560 ERROR [stderr] (management I/O-1) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 18:23:40,560 ERROR [stderr] (management I/O-1) at java.base/java.lang.reflect.Method.invoke(Method.java:566) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.interceptors.GaugeRegistrationInterceptor.invokeMethod(GaugeRegistrationInterceptor.java:88) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.interceptors.GaugeRegistrationInterceptor.access$100(GaugeRegistrationInterceptor.java:46) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.interceptors.GaugeRegistrationInterceptor$ForwardingGauge.getValue(GaugeRegistrationInterceptor.java:108) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.interceptors.GaugeRegistrationInterceptor$ForwardingGauge.getValue(GaugeRegistrationInterceptor.java:94) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.exporters.OpenMetricsExporter.createSimpleValueLine(OpenMetricsExporter.java:513) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.exporters.OpenMetricsExporter.exposeEntries(OpenMetricsExporter.java:200) 18:23:40,560 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.exporters.OpenMetricsExporter.exportMetricsByName(OpenMetricsExporter.java:148) 18:23:40,561 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.MetricsRequestHandler.handleRequest(MetricsRequestHandler.java:139) 18:23:40,561 ERROR [stderr] (management I/O-1) at io.smallrye.metrics//io.smallrye.metrics.MetricsRequestHandler.handleRequest(MetricsRequestHandler.java:79)
Thread#dumpStack
ãå
¥ããŠããã®ã¯ããã®ããã§ãã
public int gause() { Thread.dumpStack();
ä»ã®ã¡ããªã¯ã¹ãšç°ãªããGaugeã¯ã¡ããªã¯ã¹ååŸæã«çŽä»ããããåŠçãåŒã³åºãããŸããããšãã話ã§ããã
MetricRegistryã䜿ã
æåŸã«ãMtricRegistryã䜿ã£ãŠã¿ãŸãããã
Registering metrics dynamically
ãããŸã§ã¯ã¢ãããŒã·ã§ã³ã§ã¡ããªã¯ã¹ãå®çŸ©ããããå€ãèšé²ãããããŠããŸããããMetricRegistryã䜿ãããšã§
ã¡ããªã¯ã¹ã®å®çŸ©ãèšé²ãAPIã§è¡ãããšãã§ããŸãã
MetricRegistryã¯ã¹ã³ãŒãïŒBase metricsãVendor specific metricsãApplication metricsïŒããšã«ã·ã³ã°ã«ãã³ã®ã€ã³ã¹ã¿ã³ã¹ã
ããã@Inject
ã¢ãããŒã·ã§ã³ã§ååŸã§ããŸãã
MetricRegistryã䜿ã£ãã³ãŒãã®é圢ãããã®ããã«çšæã
src/main/java/org/littlewings/microprofile/metrics/MetricRegistryResource.java
package org.littlewings.microprofile.metrics; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.eclipse.microprofile.metrics.Counter; import org.eclipse.microprofile.metrics.Histogram; import org.eclipse.microprofile.metrics.Metadata; import org.eclipse.microprofile.metrics.MetricRegistry; import org.eclipse.microprofile.metrics.MetricType; import org.eclipse.microprofile.metrics.MetricUnits; import org.eclipse.microprofile.metrics.Tag; @Path("metric-registry") public class MetricRegistryResource { @Inject MetricRegistry metricRegistry; // ããã«ãMetricRegistryã䜿ã£ãã³ãŒããæžãïŒïŒ }
MetricRegistry
ã¯ãããªæãã§@Inject
ã§CDI管çBeanã«ã€ã³ãžã§ã¯ã·ã§ã³ã§ããŸãããããã§Application metricsã«å¯Ÿå¿ãã
ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãã
@Inject
MetricRegistry metricRegistry;
ãããªæãã«ãããšBase metricsãVendor specific metricsã«å¯Ÿå¿ããã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãããã¢ããªã±ãŒã·ã§ã³ã§ã¯
䜿ãããšã¯ãªãã§ãããã
@Inject @RegistryType(type=MetricRegistry.Type.BASE) MetricRegistry baseRegistry; @Inject @RegistryType(type=MetricRegistry.Type.VENDOR) MetricRegistry vendorRegistry;
Application metricsãæ瀺ããå Žåã¯ããããªããŸãã
@Inject @RegistryType(type=MetricRegistry.Type.APPLICATION) MetricRegistry metricRegistry;
ã§ã¯ãé²ããŠãããŸãã
ãŸãã¯Counter
ã䜿ã£ãŠã¿ãŸãããã
@GET @Path("simple-counter") @Produces(MediaType.TEXT_PLAIN) public String simpleCounter() { Counter counter = metricRegistry.counter("simple_counter_by_registry"); counter.inc(); return "Hello World!!"; }
MetricRegistry
ããååãæå®ããŠCounter
ãååŸããCounter#inc
ã§ã«ãŠã³ã¿ãå¢å ã§ããŸãã
確èªã
$ curl localhost:8080/microprofile-metrics-example/metric-registry/simple-counter Hello World!! $ curl localhost:8080/microprofile-metrics-example/metric-registry/simple-counter Hello World!!
MetricRegistry
ã䜿ã£ãŠå®çŸ©ããå Žåã¯ãã¡ããªã¯ã¹ã®ååã¯æå®ããååãã®ãã®ã«ãªããŸãã
$ curl localhost:9990/metrics/application/simple_counter_by_registry # TYPE application_simple_counter_by_registry_total counter application_simple_counter_by_registry_total 2.0
MetricRegistry#counter
ã®ããã«ãåçš®ã¡ããªã¯ã¹ã«å¯Ÿå¿ããã¡ãœãããããã®ã§ãããããã¯get-or-createãªã®ã§
MetricIDããã§ã«ååšããŠããã°åãã¡ããªã¯ã¹ãè¿ãããŸãã
List of methods of the MetricRegistry related to registering new metrics
Counter counter = metricRegistry.counter("simple_counter_by_registry");
MetricIDãšã¯ãã¡ããªã¯ã¹ã®ååãšã¿ã°ã®çµã¿åããã§ãã
次ã¯ãã¡ã¿ããŒã¿ãå®çŸ©ããŠã¿ãŸãããã
ã¡ããªã¯ã¹ã®get-or-createæã«ã¡ã¿ããŒã¿ãæå®ããããšãã§ããã®ã§ãããä»åã¯æåã«ç»é²ããŠããããšã«ããŸãããã
@PostConstruct public void init() { Metadata counterMetadata = Metadata .builder() .withName("registered_counter_by_registry") .withDescription("pre registered counter by registry") .withType(MetricType.COUNTER) .withUnit(MetricUnits.NONE) .build(); metricRegistry.counter(counterMetadata); }
䜿çšäŸãã¡ã¿ããŒã¿ã§æå®ããååãšãåãååã§MetricRegistry
ããã¡ããªã¯ã¹ãååŸããã°OKã§ãã
@GET @Path("pre-registered-counter") @Produces(MediaType.TEXT_PLAIN) public String preRegisteredCounter() { Counter counter = metricRegistry.counter("registered_counter_by_registry"); counter.inc(); return "Pre Registered Counter!!"; }
ãŸããã¡ããªã¯ã¹ã®ã¯ã©ã¹ãçŽæ¥äœ¿çšããå Žåã¯ããã®ããã«ã¿ã°ãæå®ããããšãã§ããŸãã
ãã¡ãã¯ãå
ã»ã©ãšåãååã®Counter
ã䜿çšããŠããŸãã
@GET @Path("pre-registered-counter2") @Produces(MediaType.TEXT_PLAIN) public String preRegisteredCounter2() { Counter counter = metricRegistry .counter( "registered_counter_by_registry", new Tag("path", "/metric-registry/pre-registered-counter2"), new Tag("type", "2") ); counter.inc(); return "Pre Registered Counter2!!"; }
ããããã«ã¢ã¯ã»ã¹ã
$ curl localhost:8080/microprofile-metrics-example/metric-registry/pre-registered-counter Pre Registered Counter!! $ curl localhost:8080/microprofile-metrics-example/metric-registry/pre-registered-counter Pre Registered Counter!! $ curl localhost:8080/microprofile-metrics-example/metric-registry/pre-registered-counter2 Pre Registered Counter2!! $ curl localhost:8080/microprofile-metrics-example/metric-registry/pre-registered-counter2 Pre Registered Counter2!!
ã¡ããªã¯ã¹ã確èªã
$ curl localhost:9990/metrics/application/registered_counter_by_registry # HELP application_registered_counter_by_registry_total pre registered counter by registry # TYPE application_registered_counter_by_registry_total counter application_registered_counter_by_registry_total{path="/metric-registry/pre-registered-counter2",type="2"} 2.0 application_registered_counter_by_registry_total 2.0
ã¿ã°ã®æç¡ã§ãçµæãå¥ã ã«ãªããŸãããã
ããã§ãã¿ã°ã®ç¢ºèªãã§ããŸããã
Histgram
ã¢ãããŒã·ã§ã³ã§ã¯ã¡ããªã¯ã¹ãèšé²ã§ãããã¡ããªã¯ã¹ã«å¯Ÿå¿ããã¯ã©ã¹ãçŽæ¥æ±ã£ãŠèšé²ãããã®ãšããŠHistogramã
ãããŸãã
æåŸã«ãã¡ãã䜿ã£ãŠã¿ãŸãããã
ã¡ã¿ããŒã¿ã¯Counter
ãšåãããã«ç»é²ããŠãããŸãã
@PostConstruct public void init() { Metadata counterMetadata = Metadata .builder() .withName("registered_counter_by_registry") .withDescription("pre registered counter by registry") .withType(MetricType.COUNTER) .withUnit(MetricUnits.NONE) .build(); metricRegistry.counter(counterMetadata); Metadata histogramMetadata = Metadata .builder() .withName("my_histogram") .withDescription("my histogram example") .withType(MetricType.HISTOGRAM) .withUnit(MetricUnits.BYTES) .build(); metricRegistry.histogram(histogramMetadata); }
åäœãèŠããããããŸããããã€ãæ°ãããŒãã«ããŠã¿ãŸãã
Histogram
ã䜿ã£ãäŸãã¿ã°ã䜿ã£ãŠã¿ãŸãã
@GET @Path("histogram") @Produces(MediaType.TEXT_PLAIN) public String histogram() { Histogram histogram = metricRegistry.histogram( "my_histogram", new Tag("path", "/metric-registry/histogram") ); long randomInt = randomService.randomInt(1024); histogram.update(randomInt); return String.format("Histogram, random = %d", randomInt); }
ã©ã³ãã ãªæ°åãèšé²ããŠã¿ãŸãã
ã¢ã¯ã»ã¹ããŠã¿ãŸãã
$ curl localhost:8080/microprofile-metrics-example/metric-registry/histogram Histogram, random = 171 $ curl localhost:8080/microprofile-metrics-example/metric-registry/histogram Histogram, random = 86 $ curl localhost:8080/microprofile-metrics-example/metric-registry/histogram Histogram, random = 819
ã¡ããªã¯ã¹ãèŠãŠã¿ãŸãã
$ curl localhost:9990/metrics/application/my_histogram # HELP application_my_histogram_bytes my histogram example # TYPE application_my_histogram_min_bytes gauge application_my_histogram_min_bytes{path="/metric-registry/histogram"} 86.0 # TYPE application_my_histogram_max_bytes gauge application_my_histogram_max_bytes{path="/metric-registry/histogram"} 819.0 # TYPE application_my_histogram_mean_bytes gauge application_my_histogram_mean_bytes{path="/metric-registry/histogram"} 361.91676959746343 # TYPE application_my_histogram_stddev_bytes gauge application_my_histogram_stddev_bytes{path="/metric-registry/histogram"} 328.6816538560838 # TYPE application_my_histogram_bytes summary application_my_histogram_bytes_count{path="/metric-registry/histogram"} 3.0 application_my_histogram_bytes_sum{path="/metric-registry/histogram"} 1076.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.5"} 171.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.75"} 819.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.95"} 819.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.98"} 819.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.99"} 819.0 application_my_histogram_bytes{path="/metric-registry/histogram",quantile="0.999"} 819.0 application_my_histogram_min_bytes 0.0 application_my_histogram_max_bytes 0.0 application_my_histogram_mean_bytes 0.0 application_my_histogram_stddev_bytes 0.0 application_my_histogram_bytes_count 0.0 application_my_histogram_bytes_sum 0.0 application_my_histogram_bytes{quantile="0.5"} 0.0 application_my_histogram_bytes{quantile="0.75"} 0.0 application_my_histogram_bytes{quantile="0.95"} 0.0 application_my_histogram_bytes{quantile="0.98"} 0.0 application_my_histogram_bytes{quantile="0.99"} 0.0 application_my_histogram_bytes{quantile="0.999"} 0.0
ãããªæãã§ãããããèšé²ãããŸããã¿ã°ãªãã®æ¹ãèšé²ãããŠããªãã®ã¯ãã¹ã«ãŒããŸãããã
ãµãã£ãã¯ã¹ã¯ãã¡ããªã¯ã¹ã«æå®ããåäœãåæ ãããŸãã
Histogram OpenMetrics Text Format
ãšããããããããªãšããã§ããããã
ãŸãšã
Eclipse MicroProfile Metricsãè©ŠããŠã¿ãŸããã
ããããæ±ã£ãŠã¿ãã®ã§ããããã£ããç¯å²ãåºããŠã«ããŒããããªããšãããããšã³ããªèªäœãäžéå端ã«ãªã£ããããª
æ°ãããŸããâŠã
ããå°ããçµã£ãŠæžããæ¹ãããã£ããããããŸããâŠã
SmallRye Metricsã®JAX-RSã®éšåãããŸãæ±ããªãã£ããããã®ã§ããã®ãããã¯ãŸãå¥éããããã§ããã
ãšãããããä»åã¯ãããªãšããã§ã
ãªãã±
äœåãWildFlyã«ãããã€ããŠç¢ºèªããã®ãé¢åã ã£ãã®ã§ããœãŒã¹ã³ãŒããæžããŠããæã¯WildFly Bootable JARã§
å€æŽããªã¢ã«ã¿ã€ã ã«åæ ããªãã確èªããŠããŸããã
以äžã®èšå®ãpom.xml
ã«å
¥ããŠ
<profiles> <profile> <id>bootable</id> <build> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-jar-maven-plugin</artifactId> <version>5.0.2.Final</version> <configuration> <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#24.0.1.Final </feature-pack-location> <layers> <layer>jaxrs-server</layer> <layer>management</layer> <layer>microprofile-metrics</layer> </layers> <plugin-options> <jboss-maven-dist/> </plugin-options> </configuration> </plugin> </plugins> </build> </profile> </profiles>
以äžã§ããœãŒã¹ã³ãŒãã®å€æŽã®åºŠã«åæ ãããããã«ãªããŸãã
$ mvn -P bootable wildfly-jar:dev-watch
ãã®åœ¢æ
ã ãšããããã€ãããWARãã¡ã€ã«ã¯ROOT.war
ã«ãªã£ãŠããããšã«ãªãã®ã§ããã®ç¹ã ã泚æã§ããã
$ curl localhost:8080/annotated/count-hello-world Hello World!!
ã¡ããªã¯ã¹ååŸã®URLã¯ãBootable JARã§ãå€ãããŸããã
$ curl localhost:9990/metrics/application/org.littlewings.microprofile.metrics.SimpleAnnotatedResource.hello_world_call_count # TYPE application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total counter application_org_littlewings_microprofile_metrics_SimpleAnnotatedResource_hello_world_call_count_total 1.0
ã ãããã§ããããæåŸã«WildFlyã«ãããã€ããŠç¢ºèªããŠããŸããã