본문 바로가기

Java/Vert.x

버텍스 매트릭스: Micrometer Metrics

더보기

Micrometer를 사용하면 Metrics를 관리하고 여러 백엔드의 측정 결과를 리포팅 할 수 있습니다.

이 문서에서는 Micrometer에 대한 SPI(Vert.x Metrics Service Provider Interface) 구현을 소개합니다.

Metrics 리포팅 방법: InfluxDB와 연동

InfuxDB에 대한 구성은 docs.infuxdata: instructions to get InfluxDB up and running을 참고합니다.

vertx-micrometer-metrics와 micrometer-registry-influx 모듈을 classpath에 등록합니다.

Maven 사용자는 POM 파일에 다음을 추가합니다.

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-micrometer-metrics</artifactId>
 <version>3.9.15</version>
</dependency>
<dependency>
 <groupId>io.micrometer</groupId>
 <artifactId>micrometer-registry-influx</artifactId>
 <version>${micrometer.version}</version>
</dependency>

Gradle 사용자는 Build 파일에 다음을 추가합니다.

compile 'io.vertx:vertx-micrometer-metrics:3.9.15'
compile 'io.micrometer:micrometer-registry-influx:${micrometer.version}'

Vertx의 디폴트 설정은 SPI 구현을 사용하지 않습니다. VertxOptions에서 Metrics 수집을 허용합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setInfluxDbOptions(new VertxInfluxDbOptions().setEnabled(true))
    .setEnabled(true)));

VertxOptions에서 Metrics를 리포팅하는 InfluxDB 정보를 입력합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setInfluxDbOptions(new VertxInfluxDbOptions().setEnabled(true)
      .setUri("<InfluxDB URI>")
      .setDb("<InfluxDB Name>"))
      .setUserName("<InfluxDB Username>")
      .setPassword("<InfluxDB Password>"))
    .setEnabled(true)));

Metrics 리포팅 방법: Prometheus와 연동

Prometheus에 대한 구성은 prometheus.io: instructions to get Prometheus up and running를 참고합니다.

vertx-micrometer-metrics와 micrometer-registry-prometheus 모듈을 classpath에 등록합니다. 수집된 Mertics를 표시하려면 vertx-web 모듈 역시 필요 할 수 있습니다.

Maven 사용자는 POM 파일에 다음을 추가합니다.

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-micrometer-metrics</artifactId>
 <version>3.9.15</version>
</dependency>
<dependency>
 <groupId>io.micrometer</groupId>
 <artifactId>micrometer-registry-prometheus</artifactId>
 <version>${micrometer.version}</version>
</dependency>

Gradle 사용자는 Build 파일에 다음을 추가합니다.

compile 'io.vertx:vertx-micrometer-metrics:3.9.15'
compile 'io.micrometer:micrometer-registry-prometheus:${micrometer.version}'

Vertx의 디폴트 설정은 SPI 구현을 사용하지 않습니다. VertxOptions에서 Metrics 수집을 허용합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setPrometheusOptions(new VertxPrometheusOptions().setEnabled(true))
    .setEnabled(true)));

VertxOptions에서 Metrics를 리포팅하는 Prometheus 정보를 입력합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setPrometheusOptions(new VertxPrometheusOptions().setEnabled(true)
      .setStartEmbeddedServer(true)
      .setEmbeddedServerOptions(new HttpServerOptions().setPort(8080))
      .setEmbeddedServerEndpoint("/metrics/vertx"))
    .setEnabled(true)));
더보기

임베디드 서버의 앤드포인트 setEmbeddedServerEndPoint()가 지정되지 않으면 디폴트 앤드포인트는 /metrics입니다.

웹 서버 라우터를 구성하고 Mertics를 바인딩합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setPrometheusOptions(new VertxPrometheusOptions().setEnabled(true))
    .setEnabled(true)));
 
// Later on, creating a router
Router router = Router.router(vertx);
router.route("/metrics").handler(PrometheusScrapingHandler.create());
vertx.createHttpServer().requestHandler(router).listen(8080);
코드 비고
Line 8 route("/metrics") /metrics 리소스로 HTTP 요청에 대해서 Metrics를 리포팅합니다.
Line 9 listen(8080) Metrics 리포팅을 위해 8080 포트 리스닝합니다.

Metrics 리포팅 방법: JMX와 연동

JMX(Java Management Extensions)는 Java 애플리케이션의 모니터링과 관리기능을 제공하는 모듈입니다.

Metrix를 JMX에 리포팅하려면 vertx-micrometer-metrics와 micrometer-registry-jmx 모듈을 classpath에 등록합니다.

Maven 사용자는 POM 파일에 다음을 추가합니다:

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-micrometer-metrics</artifactId>
 <version>3.9.15</version>
</dependency>
<dependency>
 <groupId>io.micrometer</groupId>
 <artifactId>micrometer-registry-jmx</artifactId>
 <version>${micrometer.version}</version>
</dependency>

Gradle 사용자는 Build 파일에 다음을 추가합니다:

compile 'io.vertx:vertx-micrometer-metrics:3.9.15'
compile 'io.micrometer:micrometer-registry-jmx:${micrometer.version}'

Vertx의 디폴트 설정은 SPI 구현을 사용하지 않습니다. VertxOptions에서 Metrics 수집을 허용합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setJmxMetricsOptions(new VertxJmxMetricsOptions().setEnabled(true))
    .setEnabled(true)));

VertxOptions에서 Metrics를 리포팅하는 JMX 정보를 입력합니다.

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new MicrometerMetricsOptions()
    .setJmxMetricsOptions(new VertxJmxMetricsOptions().setEnabled(true)
      .setStep(5)
      .setDomain("<JMX Domain>"))
    .setEnabled(true)));
코드 비고
Line 4 setStep(5) 리포팅 간격(단위:초)를 지정합니다.
Line 5 setDomain("<JMX Domain>") MBeans가 등록되는 JMX 도메인입니다.

Metrics 리포팅 방법: Micrometer 레지스트리와 동시 리포팅

Vertx에서는 Mircrometer에서 지원하는 모든 백엔드를 구현하고 있지 않습니다.

대신 Vertx의 Mircometer 레지스트리를 사용하면 기본으로 제공되지 않는 백엔드에 대해서도 리포팅 할 수 있습니다(Graphite, Ganglia, Atlas 등).

Micrometer Composite Registry 사용하면 여러 백엔드 레지스트리에 대해 동일한 Metrics를 리포팅 할 수 있습니다.

CompositeMeterRegistry myRegistry = new CompositeMeterRegistry();
myRegistry.add(new JmxMeterRegistry(s -> null, Clock.SYSTEM));
myRegistry.add(new GraphiteMeterRegistry(s -> null, Clock.SYSTEM));
 
Vertx vertx = Vertx.vertx(new VertxOptions()
  .setMetricsOptions(new MicrometerMetricsOptions()
    .setMicrometerRegistry(myRegistry)
    .setEnabled(true)));
코드 비고
Line 2:3 new JmxMeterRegistry
new GraphiteMeterRegistry
Vertx 애플리케이션이 JMX와 Graphite에 Mertics를 동시에 리포팅합니다.

정리 및 복습

  • Vertx 애플리케이션에서 Micrometer Metrics를 활성화하고 백엔드에 리포팅 할 수 있습니다.
  • 연동 가능한 백엔드는 InfluxDB Prometheus JMX Graphite Ganglia Atlas 등이 있습니다.
  • Vertx에서 제공하지 않는 백엔드는 Micrometer 레지스트리를 사용하여 리포팅합니다.
  • Micrometer Composite Registry 사용하면 여러 백엔드 레지스트리에 대해 동일한 Metrics를 리포팅 할 수 있습니다.