Features
Measured接口提供一套简单的API来检索metrics,很多Vert.x组件都实现了这个接口,例如 HttpServer, NetServer,甚至Vertx实例自身.
我们基于Dropwizard接口配置JMX报告,这个接口将Vert.x像JMX MBeans那样暴露出来.
Getting started
想要使用metrics,首先我们在pom文件里依赖下面的仓库:
1 | <dependency> |
然后我们使用DropwizardMetricsOptions对Vertx实例开启metrics.
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
你也可以开启JMX:
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
Metrics service
Naming
下文中列出的每一个测量组件都会被分配一个名字. 每个metric都可以通过全限定名baseName + . + metricName从Vertx实例中获得.
1 | JsonObject metrics = metricsService.getMetricsSnapshot(vertx); |
或者使用metric名字获得该自身.
1 | EventBus eventBus = vertx.eventBus(); |
Retrieving metrics
一旦开启了metrics功能, MetricsService可以从任意Measured对象中检索出metrics快照, Measured对象提供了一个meteric name和meteric data映射关系的map,这个map通过JsonObject存储。
下面的例子打印出Vertx实例中所有的metrics.
1 | MetricsService metricsService = MetricsService.create(vertx); |
由于HttpServer实现了Measured,你可以轻松地抓取到该http服务器上所有的metrics
1 | MetricsService metricsService = MetricsService.create(vertx); |
Data
下面列出了每个dropwizard metric在JSON中的表现形式. 对于每个metric详细信息请参考Dropwizard metrics documentation
Gauge
1 | { |
Counter
1 | { |
Histogram
1 | { |
Meter
1 | { |
ThroughputMeter
扩展自Meter,提供即时吞吐量。
1 | { |
Timer
Histogram和Meter的组合:
1 | { |
Throughput Timer
拓展自Timer,提供即时吞吐量的metric
1 | { |
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 bus里handler的数量.(Counter表示)handlers.myaddress- Timer,表示myaddress的handler接收到消息的比例messages.bytes-read- Meter, 表示接收到远端消息时读到的字节数的Metermessages.bytes-written- 向远端发送消息时,写入字节的Metermessages.pending- 接收到消息但并没有传递给handller的统计消息数的Countermessages.pending-local- 接收到locally消息但并没有传递给handller的统计消息数的Countermessages.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 match在DropwizardMetricsOptions中完成配置.
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
警告:如果你使用
regex match, 当出现错误的regex,那么可能会match出大量的handler
Http server metrics
Base name: vertx.http.servers.<host>:<port>
Http server除了包含Net Server的metrics之外还包含下面这些:
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- 回应状态码为1xx的ThroughputMeterresponses-2xx- 回应状态码为2xx的ThroughputMeterresponses-3xx- 回应状态码为3xx的ThroughputMeterresponses-4xx- 回应状态码为4xx的ThroughputMeterresponses-5xx- 回应状态码为5xx的ThroughputMeteropen-websockets- 统计开启的web socket连接数的Counteropen-websockets.<remote-host>- 统计对某个指定的remote host开启的web socket连接数的Counter
不管是exact match还是regex match,Http URI metrics必须在DropwizardMetricsOptions中显式地配置.
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
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- 表示最大连接池大小的Gaugeconnections.pool-ratio- 表示open connections / max connection pool size的比例Gaugeresponses-1xx- 回应状态码为1xx的Meterresponses-2xx- 回应状态码为2xx的Meterresponses-3xx- 回应状态码为3xx的Meterresponses-4xx- 回应状态码为4xx的Meterresponses-5xx- 回应状态码为5xx的Meter
Net server metrics
Base name: vertx.net.servers.<host>:<port>
open-netsockets- 开启的socket连接数的Counteropen-netsockets.<remote-host>- 统计对于某个指定remote host开启的socket连接数的Counterconnections- 某个连接的Timer和该连接出现的比例exceptions- 出现异常次数的Counterbytes-read- 已读字节数的Histogram.bytes-written- 写出字节数的Histogram.
Net client metrics
Base name: vertx.net.clients.@<id>
Net client包含全部的Net Server的metrics
Datagram socket metrics
Base name: vertx.datagram
sockets- 统计datagram sockets数的Counterexceptions- 统计异常出现次数的Counterbytes-written- 写出字节数的Histogram.<host>:<port>.bytes-read- 已读字节数的Histogram.
只有当datagram socket被监听的时候上面的统计才有效。
JMX
JMX is disabled by default.
JMX是被默认不开启的.
如果你想要开启JMX,你需要像下面那样开启它.
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
如果你是从命令行中运行Vert.x想要开启JMX, 你可以在vertx或者vertx.bat脚本中将JMX_OPTS那一行取消掉注释.
1 | JMX_OPTS="-Dcom.sun.management.jmxremote -Dvertx.options.jmxEnabled=true" |
你可以配置MBeans创建时是处于哪个域名下的:
1 | Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions( |
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 | VertxOptions options = new VertxOptions().setMetricsOptions( |