Vertx 3 Metrics And Monitoring

  1. Features
  2. Getting started
  3. Metrics service
  4. Naming
  5. Retrieving metrics
  6. Data
    1. Gauge
    2. Counter
    3. Histogram
    4. Meter
    5. ThroughputMeter
    6. Timer
    7. Throughput Timer
  • The metrics
    1. Vert.x metrics
    2. Event bus metrics
    3. Http server metrics
    4. Http client metrics
    5. Net server metrics
    6. Net client metrics
    7. Datagram socket metrics
  • JMX
  • Enabling remote JMX
  • Accessing Dropwizard Registry

  • Features

    Measured接口提供一套简单的API来检索metrics,很多Vert.x组件都实现了这个接口,例如 HttpServer, NetServer,甚至Vertx实例自身.

    我们基于Dropwizard接口配置JMX报告,这个接口将Vert.xJMX MBeans那样暴露出来.

    Getting started

    想要使用metrics,首先我们在pom文件里依赖下面的仓库:

    1
    2
    3
    4
    5
    <dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-metrics</artifactId>
    <version>${vertx.metrics.version}</version>
    </dependency>

    然后我们使用DropwizardMetricsOptionsVertx实例开启metrics.

    1
    2
    3
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().setEnabled(true)
    ));

    你也可以开启JMX:

    1
    2
    3
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().setJmxEnabled(true)
    ));

    Metrics service

    Naming

    下文中列出的每一个测量组件都会被分配一个名字. 每个metric都可以通过全限定名baseName + . + metricNameVertx实例中获得.

    1
    2
    JsonObject metrics = metricsService.getMetricsSnapshot(vertx);
    metrics.getJsonObject("vertx.eventbus.handlers");

    或者使用metric名字获得该自身.

    1
    2
    3
    EventBus eventBus = vertx.eventBus();
    JsonObject metrics = metricsService.getMetricsSnapshot(eventBus);
    metrics.getJsonObject("handlers");

    Retrieving metrics

    一旦开启了metrics功能, MetricsService可以从任意Measured对象中检索出metrics快照, Measured对象提供了一个meteric namemeteric data映射关系的map,这个map通过JsonObject存储。

    下面的例子打印出Vertx实例中所有的metrics.

    1
    2
    3
    MetricsService metricsService = MetricsService.create(vertx);
    JsonObject metrics = metricsService.getMetricsSnapshot(vertx);
    System.out.println(metrics);

    由于HttpServer实现了Measured,你可以轻松地抓取到该http服务器上所有的metrics

    1
    2
    3
    4
    MetricsService metricsService = MetricsService.create(vertx);
    HttpServer server = vertx.createHttpServer();
    // set up server
    JsonObject metrics = metricsService.getMetricsSnapshot(server);

    Data

    下面列出了每个dropwizard metricJSON中的表现形式. 对于每个metric详细信息请参考Dropwizard metrics documentation

    Gauge

    1
    2
    3
    {
    "value" : value // any json value
    }

    Counter

    1
    2
    3
    {
    "count" : 1 // number
    }

    Histogram

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "count" : 1 // long
    "min" : 1 // long
    "max" : 1 // long
    "mean" : 1.0 // double
    "stddev" : 1.0 // double
    "median" : 1.0 // double
    "75%" : 1.0 // double
    "95%" : 1.0 // double
    "98%" : 1.0 // double
    "99%" : 1.0 // double
    "99.9%" : 1.0 // double
    }

    Meter

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "count" : 1 // long
    "meanRate" : 1.0 // double
    "oneMinuteRate" : 1.0 // double
    "fiveMinuteRate" : 1.0 // double
    "fifteenMinuteRate" : 1.0 // double
    "rate" : "events/second" // string representing rate
    }

    ThroughputMeter

    扩展自Meter,提供即时吞吐量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "count" : 40 // long
    "meanRate" : 2.0 // double
    "oneSecondRate" : 3 // long - number of occurence for the last second
    "oneMinuteRate" : 1.0 // double
    "fiveMinuteRate" : 1.0 // double
    "fifteenMinuteRate" : 1.0 // double
    "rate" : "events/second" // string representing rate
    }

    Timer

    HistogramMeter的组合:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    {
    // histogram data
    "count" : 1 // long
    "min" : 1 // long
    "max" : 1 // long
    "mean" : 1.0 // double
    "stddev" : 1.0 // double
    "median" : 1.0 // double
    "75%" : 1.0 // double
    "95%" : 1.0 // double
    "98%" : 1.0 // double
    "99%" : 1.0 // double
    "99.9%" : 1.0 // double

    // meter data
    "meanRate" : 1.0 // double
    "oneMinuteRate" : 1.0 // double
    "fiveMinuteRate" : 1.0 // double
    "fifteenMinuteRate" : 1.0 // double
    "rate" : "events/second" // string representing rate
    }

    Throughput Timer

    拓展自Timer,提供即时吞吐量的metric

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    {
    // histogram data
    "count" : 1 // long
    "min" : 1 // long
    "max" : 1 // long
    "mean" : 1.0 // double
    "stddev" : 1.0 // double
    "median" : 1.0 // double
    "75%" : 1.0 // double
    "95%" : 1.0 // double
    "98%" : 1.0 // double
    "99%" : 1.0 // double
    "99.9%" : 1.0 // double

    // meter data
    "meanRate" : 1.0 // double
    "oneSecondRate" : 3 // long - number of occurence for the last second
    "oneMinuteRate" : 1.0 // double
    "fiveMinuteRate" : 1.0 // double
    "fifteenMinuteRate" : 1.0 // double
    "rate" : "events/second" // string representing rate
    }

    The metrics

    下面列出了当前支持的metric

    Vert.x metrics

    • vertx.event-loop-size - event loop pool线程的数量。(Gauge表示)

    • vertx.worker-pool-size - worker pool线程的数量。(Gauge表示)

    • vertx.cluster-host - cluster-host设置。(Gauge表示)

    • vertx.cluster-port - cluster-port设置。(Gauge表示)

    • vertx.verticles - 当前被部署的verticle的数量。(Counter表示)

    Event bus metrics

    Base name: vertx.eventbus

    • handlers - event bushandler的数量.(Counter表示)

    • handlers.myaddress - Timer,表示myaddresshandler接收到消息的比例

    • messages.bytes-read - Meter, 表示接收到远端消息时读到的字节数的Meter

    • messages.bytes-written - 向远端发送消息时,写入字节的Meter

    • messages.pending - 接收到消息但并没有传递给handller的统计消息数的Counter

    • messages.pending-local - 接收到locally消息但并没有传递给handller的统计消息数的Counter

    • messages.pending-remote - Counter, 表示接收到远端但是并没有传递给handler的消息数量.

    • messages.received - ThroughputMeter,表示接收到消息的比例

    • messages.received-local - ThroughputMeter,表示接收到本地消息的比例

    • messages.received-remote - ThroughputMeter, 表示接收到远程消息接收到的比例

    • messages.delivered - [throughpu_metert], 表示消息传递给handler的比例.

    • messages.delivered-local - ThroughputMeter,表示local消息传递给handler的比例.

    • messages.delivered-remote - ThroughputMeter,表示remote消息传递给handler的比例.

    • messages.sent - [throughput_metert], 表示发送出去的消息的比例.

    • messages.sent-local -ThroughputMeter, 表示本地send出去的消息的比例.

    • messages.sent-remote - ThroughputMeter, 表示远端send出去的消息的比例.

    • messages.published - ThroughputMeter, 表示publish出去的消息的比例.

    • messages.published-local - ThroughputMeter, 表示向本地publish出去的消息的比例.

    • messages.published-remote - ThroughputMeter, 表示给远端publish出去的消息的比例.

    • messages.reply-failures - Meter, 表示reply失败的比例

    monitored event bus handlers 通过向handler注册地址上的match来完成配置. 由于Vert.x可以在event bus进行海量的注册,因此比较好的配置是在默认的情况下我们不对任何handler进行监听.

    monitored handlers可以通过一个指定的address match或者regex matchDropwizardMetricsOptions中完成配置.

    1
    2
    3
    4
    5
    6
    7
    8
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
    setEnabled(true).
    addMonitoredEventBusHandler(
    new Match().setValue("some-address")).
    addMonitoredEventBusHandler(
    new Match().setValue("business-.*").setType(MatchType.REGEX))
    ));

    警告:如果你使用regex match, 当出现错误的regex,那么可能会match出大量的handler

    Http server metrics

    Base name: vertx.http.servers.<host>:<port>

    Http server除了包含Net Servermetrics之外还包含下面这些:

    • requests - 请求的Throughput Timer和该请求出现的比例

    • <http-method>-requests - 指定的http method请求的Throughput Timer和该http method请求的出现的比例

      Examples: get-requests, post-requests

    • <http-method>-requests./<uri> - 指定的http method & URI请求的Throughput Timer和该请求的出现的比例

      Examples: get-requests./some/uri, post-requests./some/uri?foo=bar

    • responses-1xx - 回应状态码为1xxThroughputMeter

    • responses-2xx - 回应状态码为2xxThroughputMeter

    • responses-3xx - 回应状态码为3xxThroughputMeter

    • responses-4xx - 回应状态码为4xxThroughputMeter

    • responses-5xx - 回应状态码为5xxThroughputMeter

    • open-websockets - 统计开启的web socket连接数的Counter

    • open-websockets.<remote-host> - 统计对某个指定的remote host开启的web socket连接数的Counter

    不管是exact match还是regex match,Http URI metrics必须在DropwizardMetricsOptions中显式地配置.

    1
    2
    3
    4
    5
    6
    7
    8
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
    setEnabled(true).
    addMonitoredHttpServerUri(
    new Match().setValue("/")).
    addMonitoredHttpServerUri(
    new Match().setValue("/foo/.*").setType(MatchType.REGEX))
    ));

    For bytes-read and bytes-written the bytes represent the body of the request/response, so headers, etc are ignored.

    Http client metrics

    Base name: vertx.http.clients.@<id>

    Http client除了包含Http Server全部的metrics之外,还包含下面这些.

    • connections.max-pool-size - 表示最大连接池大小的Gauge

    • connections.pool-ratio - 表示open connections / max connection pool size的比例Gauge

    • responses-1xx - 回应状态码为1xxMeter

    • responses-2xx - 回应状态码为2xxMeter

    • responses-3xx - 回应状态码为3xxMeter

    • responses-4xx - 回应状态码为4xxMeter

    • responses-5xx - 回应状态码为5xxMeter

    Net server metrics

    Base name: vertx.net.servers.<host>:<port>

    • open-netsockets - 开启的socket连接数的Counter
    • open-netsockets.<remote-host> - 统计对于某个指定remote host开启的socket连接数的Counter
    • connections - 某个连接的Timer和该连接出现的比例
    • exceptions - 出现异常次数的Counter
    • bytes-read - 已读字节数的Histogram.
    • bytes-written - 写出字节数的Histogram.

    Net client metrics

    Base name: vertx.net.clients.@<id>

    Net client包含全部的Net Servermetrics

    Datagram socket metrics

    Base name: vertx.datagram

    • sockets - 统计datagram sockets数的Counter
    • exceptions - 统计异常出现次数的Counter
    • bytes-written - 写出字节数的Histogram.
    • <host>:<port>.bytes-read - 已读字节数的Histogram.

    只有当datagram socket被监听的时候上面的统计才有效。

    JMX

    JMX is disabled by default.

    JMX是被默认不开启的.

    如果你想要开启JMX,你需要像下面那样开启它.

    1
    2
    3
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().setJmxEnabled(true)
    ));

    如果你是从命令行中运行Vert.x想要开启JMX, 你可以在vertx或者vertx.bat脚本中将JMX_OPTS那一行取消掉注释.

    1
    JMX_OPTS="-Dcom.sun.management.jmxremote -Dvertx.options.jmxEnabled=true"

    你可以配置MBeans创建时是处于哪个域名下的:

    1
    2
    3
    4
    5
    Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
    setJmxEnabled(true).
    setJmxDomain("mydomain")
    ));

    Enabling remote JMX

    如果你想metrics远程被JMX暴露,最少你需要设置下面这个系统属性:

    1
    com.sun.management.jmxremote

    如果你是通过命令行运行Vert.x,那么你需要在vertx or vertx.bat文件中将JMX_OPTS的注释去掉。

    如果你在公共服务器上运行Vert.x,那么你需要小心对JMX的远程访问了。

    Please see the Oracle JMX documentation for more information on configuring JMX

    Accessing Dropwizard Registry

    When configuring the metrics service, an optional registry name can be specified for registering the underlying Dropwizard Registry in the the Dropwizard Shared Registry so you can retrieve this registry and use according to your needs.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    VertxOptions options = new VertxOptions().setMetricsOptions(
    new MetricsServiceOptions().setEnabled(true).setRegistryName("the_name")
    );
    Vertx vertx = Vertx.vertxt(options);

    // Get the registry
    MetricRegistry registry = SharedMetricRegistries.getOrCreate("the_name");

    // Do whatever you need with the registry