Metrics

本项目基于 Dropwizard metrics 实现了 Vert.x 指标监控的SPI(Service Provider Interface,服务供应接口)。

特性

Vert.x 提供了一个相当易用的API接口 Measured 用于查询监控指标, 很多 Vert.x 组件都实现了这个接口,包括 HttpServerNetServer,以及 Vertx 本身等等。

本项目基于 Dropwizard 实现了可配置的 JMX 上报服务,可将 Vert.x 作为 JMX 的 MBean 使用。

入门

使用 Vert.x 指标监控需要在您项目的构建配置增加以下 依赖

  • Maven(位于 pom.xml):

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-dropwizard-metrics</artifactId>
 <version>4.4.0</version>
</dependency>
  • Gradle(位于 build.gradle):

compile 'io.vertx:vertx-dropwizard-metrics:4.4.0'

创建 Vertx 实例时通过 DropwizardMetricsOptions 启用指标监控:

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

也可以启用 JMX 支持:

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

更多关于 JMX 的信息请参阅文末的 JMX 章节。

命令行模式激活指标监控

在命令行模式(Vert.x CLI)启动的 Vert.x 应用可以通过 JVM 系统属性启用指标监控。 vertx.metrics.options. 开头的系统属性会被传递到指标监控的配置。

vertx.metrics.options.enabled 是一个标准 Vert.x Core 配置,用于启用指标监控, (欲启用指标监控)此选项必须设置为 true

java -jar your-fat-jar -Dvertx.metrics.options.enabled=true

vertx.metrics.options.registryName 配置项用于设置要使用的(现存的) Dropwizard Registry

java -jar your-fat-jar -Dvertx.metrics.options.enabled=true -Dvertx.metrics.options.registryName=my-registry

vertx.metrics.options.jmxEnabledvertx.metrics.options.jmxDomain 配置项用于配置 JMX 注册信息:

java -jar your-fat-jar -Dvertx.metrics.options.enabled=true -Dvertx.metrics.options.jmxEnabled=true ...

vertx.metrics.options.configPath 配置项用于指定监控配置文件。

指标监控服务

Vert.x core 定了了上报监控指标的 SPI (本项目已实现), 但并没有定义读取监控指标的 API (因为某些指标监控的实现只上报监控指标,不做其他事情)。

MetricsService 封装了 Dropwizard Registry, 提供了获取监控指标快照(snapshot)的API。

监控指标命名

下面列出的每个可监控组件(Vertx除外)都有与之关联的基本指标名(baseName,译者注:即指标名的前缀)。 所有监控指标都可以通过 Vertx 对象,使用全限定指标名 <fqn> (baseName + . + metricName)获取。

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

或者通过要监控的组件对象,使用指标名(metricName)获取监控指标:

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

更多关于从指定组件对象获取/使用监控指标的例子,请参见下文。

您可以可以列出所有监控指标名:

Set<String> metricsNames = metricsService.metricsNames();
for (String metricsName : metricsNames) {
  System.out.println("Known metrics name " + metricsName);
}

基本指标名(baseName) 默认是 vertx,但也可以自定义一个基本指标名:

DropwizardMetricsOptions metricsOptions =
  new DropwizardMetricsOptions().setBaseName("foo");

获取监控指标

启用指标监控后, MetricsService 可以从 Measured 实例获取监控指标的快照(snapshot); 快照是一个键为指标名、值为指标值的 JsonObject 对象。 下面的例子打印了 Vertx 实例所有的监控指标(快照):

MetricsService metricsService = MetricsService.create(vertx);
JsonObject metrics = metricsService.getMetricsSnapshot(vertx);
System.out.println(metrics);
注意
有关 JsonObject 快照实例包含的实际内容(实际监控指标)详情, 请参阅具体指标实现的文档,如 vertx-metrics

通常您只需获取特定组件(例如 http 服务器)的特定指标, 而不必知道每个指标的命名细节(留给 SPI 的实现处理)。

HttpServer 实现了 Measured, 因此您可以轻松获取到指定 http 服务器的所有监控指标。

MetricsService metricsService = MetricsService.create(vertx);
HttpServer server = vertx.createHttpServer();
// 设置 HTTP 服务器
JsonObject metrics = metricsService.getMetricsSnapshot(server);

使用基本指标名(baseName)也可以获取到监控指标:

MetricsService metricsService = MetricsService.create(vertx);
JsonObject metrics = metricsService.getMetricsSnapshot("vertx.eventbus.message");

指标数据

下面是(快照)JSON 中的所有 dropwizard 监控指标。 每个监控指标的详情请参阅 Dropwizard metrics 文档。

测量值

{
 "type"  : "gauge",
 "value" : value // 任一json值(译者注:数字、字符串、数组、对象等)
}

计数器

{
 "type"  : "counter",
 "count" : 1 // 数字
}

柱状图

{
 "type"   : "histogram",
 "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)

{
 "type"              : "meter",
 "count"             : 1 // long
 "meanRate"          : 1.0 // double
 "oneMinuteRate"     : 1.0 // double
 "fiveMinuteRate"    : 1.0 // double
 "fifteenMinuteRate" : 1.0 // double
 "rate"              : "events/second" // 速率,字符串
}

吞吐量统计

即时吞吐量统计,扩展自 仪表

{
 "type"              : "meter",
 "count"             : 40 // long
 "meanRate"          : 2.0 // double
 "oneSecondRate"     : 3 // long - 最近一秒的取值
 "oneMinuteRate"     : 1.0 // double
 "fiveMinuteRate"    : 1.0 // double
 "fifteenMinuteRate" : 1.0 // double
 "rate"              : "events/second" // 速率,字符串
}

计时器

A timer is basically a combination of Histogram + Meter.

{
 "type": "timer",

 // 柱状图数据
 "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)数据
 "meanRate"          : 1.0 // double
 "oneMinuteRate"     : 1.0 // double
 "fiveMinuteRate"    : 1.0 // double
 "fifteenMinuteRate" : 1.0 // double
 "rate"              : "events/second" // 速率,字符串
}

吞吐量计时器

扩展了 计时器 ,可提供即时吞吐量指标。

{
 "type": "timer",

 // 柱状图数据
 "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)数据
 "meanRate"          : 1.0 // double
 "oneSecondRate"     : 3 // long - 最近一秒的取值
 "oneMinuteRate"     : 1.0 // double
 "fiveMinuteRate"    : 1.0 // double
 "fifteenMinuteRate" : 1.0 // double
 "rate"              : "events/second" // 速率,字符串
}

监控指标

Vert.x 目前提供以下指标。

Vert.x 指标

目前提供以下指标:

  • vertx.event-loop-size - 类型:测量值,含义:event-loop 线程池的线程数量

  • vertx.worker-pool-size - 类型:测量值,含义:worker-pool 线程池的线程数量

  • vertx.cluster-host - 类型:测量值,含义:cluster-host 配置值

  • vertx.cluster-port - 类型:测量值,含义:cluster-port 配置值

Event bus 指标

基本指标名(baseName): vertx.eventbus

  • handlers - 类型:计数器,含义:eventbus 中已注册的处理器数量

  • handlers.myaddress - 类型:计时器,含义:名为 myaddress 的处理器处理消息的速率

  • messages.bytes-read - 类型:仪表(Meter),含义:接收到的远程消息总字节量

  • messages.bytes-written - 类型:仪表(Meter),含义:发送到远程地址的消息总字节量

  • messages.pending - 类型:计数器,含义:已经被 eventbus 接收,但是还未被处理器所处理的消息数。

  • messages.pending-local - 类型:计数器,含义:已经被本地 eventbus 接收,但是还未被处理器所处理的消息数。

  • messages.pending-remote - 类型:计数器,含义:已经被远程 eventbus 接收,但是还未被处理器所处理的消息数。

  • messages.discarded - 类型:计数器,含义:已被处理器丢弃的消息数

  • messages.discarded-local - 类型:计数器,含义:已被本地处理器丢弃的消息数

  • messages.discarded-remote - 类型:计数器,含义:已被远程处理器丢弃的消息数

  • messages.received - 类型:吞吐量统计,含义:接受消息的速率

  • messages.received-local - 类型:吞吐量统计,含义:接受本地消息的速率

  • messages.received-remote - 类型:吞吐量统计,含义:接受远程消息的速率

  • messages.delivered - 类型:吞吐量统计,含义:消息被传递到处理器的速率

  • messages.delivered-local - 类型:吞吐量统计,含义:本地消息被传递到处理器的速率

  • messages.delivered-remote - 类型:吞吐量统计,含义:远程消息被传递到处理器的速率

  • messages.sent - 类型:[throughput_metert],含义:发送消息的速率

  • messages.sent-local - 类型:吞吐量统计,含义:本地发送消息的速率

  • messages.sent-remote - 类型:吞吐量统计,含义:远程发送消息的速率

  • messages.published - 类型:吞吐量统计,含义:发布消息的速率

  • messages.published-local - 类型:吞吐量统计,含义:本地发布消息的速率

  • messages.published-remote - 类型:吞吐量统计,含义:远程发布消息的速率

  • messages.reply-failures - 类型:仪表(Meter),含义:回复消息失败的速率

可以通过 Event Bus 订阅地址的字符串匹配设置需要监控的 Event Bus 处理器。 Vert.x 可能注册了大量的 Event Bus , 因此最佳的监控默认配置是不监控任何 Event Bus 处理器。

使用 DropwizardMetricsOptions 可以通过字符串匹配或正则匹配设置需要监控的 Event Bus 处理器。

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))
));
警告
使用正则匹配时,错误的正则表达式可能会匹配上很多处理器。

Http server 指标

基本指标名(baseName): vertx.http.servers.<host>:<port>

Http 服务器的指标包括 Net 服务 的所有指标以及以下内容:

  • requests - 类型:吞吐量计时器,含义:单个请求及其出现的频率

  • <http-method>-requests - 类型:吞吐量计时器,含义:指定 HTTP 方法(译者注:由 <http-method> 指定)的请求及其频率。

    • 例如: get-requestspost-requests

  • <http-method>-requests./<uri> - 类型:吞吐量计时器,含义:指定 HTTP 方法和 URI 的请求及其频率。

    • 例如: get-requests./some/uripost-requests./some/uri?foo=bar

  • <http-method>-requests./<route> - 类型:吞吐量计时器,含义:指定 HTTP 方法和路由的请求及其频率。

    • 例如: get-requests./route1, post-requests./resource/:id

  • responses-1xx - 类型:吞吐量统计,含义:1xx响应的频次

  • responses-2xx - 类型:吞吐量统计,含义:2xx响应的频次

  • responses-3xx - 类型:吞吐量统计,含义:3xx响应的频次

  • responses-4xx - 类型:吞吐量统计,含义:4xx响应的频次

  • responses-5xx - 类型:吞吐量统计,含义:5xx响应的频次

  • open-websockets - 类型:计数器,含义:打开的网络套接字连接数量

  • open-websockets.<remote-host> - 类型:计数器,含义:连接到指定远程主机(译者注:由 <remote-host> 指定)所打开网络套接字的连接数量

Http URI 指标必须在 MetricsOptions 中显式配置,可以使用完全匹配或正则表达式匹配:

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
        setEnabled(true).
        addMonitoredHttpServerUri(
            new Match().setValue("/")).
        addMonitoredHttpServerUri(
            new Match().setValue("/foo/.*").setType(MatchType.REGEX))
));

对于带路径参数的 uri,如 /users/:userId,每个用户ID对应的入口 uri 分别注册监控指标没有意义 (比如 get-requests./users/1get-requests./users/2 等等),应该统一注册一个监控 uri。 为此,可以为 Match 实例设置别名,该别名将作为注册指标名的一部分,如: <http-method>-requests.<别名> 。 此外,对于已定义别名的监控 uri,每个响应组有单独的监控指标(计数器),如: responses-<code>.<别名>

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
        setEnabled(true).
        addMonitoredHttpServerUri(new Match().setValue("/users/.*").setAlias("users").setType(MatchType.REGEX))
));

每个 HTTP 请求的请求路由可以由 HTTP 框架(如 vertx-web)上报,换而言之 Vert.x core 本身不会上报任何路由信息。 与 URI 监控指标一样,路由监控指标必须在以下选项中显式配置:

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
  new DropwizardMetricsOptions().
    setEnabled(true).
    addMonitoredHttpServerRoute(new Match().setValue("/users/.*").setType(MatchType.REGEX))
));

与 URI 监控指标类似,请求路由监控也可以提供监控指标别名,但通常请求路由本身已经提供了足够和适当的 URI 语义分组。 请注意,单个 HTTP 请求可以多次路由(例如由于 vertx-web 子路由器的作用), 而每个请求的所有路由在监控中将用 > 拼接在一起(例如 /internal_api>/resource/:id )。

bytes-readbytes-written 监控指标只统计了请求体/响应体的字节数,不包括 header 等。

Http 客户端指标

基本指标名(baseName): vertx.http.clients (默认),或 vertx.http.clients.<id> ,其中 <id> 是由 setMetricsName 设置的非空字符串。

HTTP 客户端的指标包括 Http 服务 的所有指标以及下述指标:

  • connections.max-pool-size - 类型:测量值,含义:连接池规模

  • connections.pool-ratio - 类型:ratio 测量值,含义:已打开的连接与连接池规模的比率

  • responses-1xx - 类型:仪表(Meter),含义:1xx响应码

  • responses-2xx - 类型:仪表(Meter),含义:2xx响应码

  • responses-3xx - 类型:仪表(Meter),含义:3xx响应码

  • responses-4xx - 类型:仪表(Meter),含义:4xx响应码

  • responses-5xx - 类型:仪表(Meter),含义:5xx响应码

HTTP 客户端使用延迟请求队列管理每个远程 HTTP 服务节点的连接池。

远程HTTP服务节点的可用监控指标如下:

  • endpoint.<host:port>.queue-delay - 类型:计时器,含义:队列中延迟请求的等待时间

  • endpoint.<host:port>.queue-size - 类型:计数器,含义:队列实际大小

  • endpoint.<host:port>.open-netsockets - 类型:计数器,含义:连接到HTTP服务节点所开启的套接字数量

  • endpoint.<host:port>.usage - 类型:计时器,含义:请求开始到响应结束的耗时

  • endpoint.<host:port>.in-use - 类型:计数器,含义:实际请求/响应数

  • endpoint.<host:port>.ttfb - 类型:计时器,含义:请求结束到响应开始之间的等待时间

其中 <host> 是HTTP服务节点的主机名(可能未解析),而 <port> 是 TCP 端口。

可以通过 HTTP 服务的 $主机:$端口 的文本匹配来配置 HTTP 服务节点监控。 默认没有配置 HTTP 服务节点的监控。

使用 DropwizardMetricsOptions 可以通过字符串匹配或正则匹配设置需要监控的 HTTP 服务节点:

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
        setEnabled(true).
        addMonitoredHttpClientEndpoint(
            new Match().setValue("some-host:80")).
        addMonitoredHttpClientEndpoint(
            new Match().setValue("another-host:.*").setType(MatchType.REGEX))
));

Net 服务指标

基本指标名(baseName): vertx.net.servers.<host>:<port>

  • open-netsockets - 类型:计数器,含义:打开 net 套接字的连接数

  • open-netsockets.<remote-host> - 类型:计数器,含义:连接到指定远程主机所打开的 net 套接字连接数

  • connections - 类型:计时器,含义:连接及其创建频率

  • exceptions - 类型:计数器,含义:出现异常的次数

  • bytes-read - 类型:计数器,含义:读取的字节数

  • bytes-written - 类型:计数器,含义:写入的字节数

Net 客户端指标

基本指标名(baseName): vertx.net.clients(默认), 或 vertx.net.clients.<id> ,其中 <id>setMetricsName 配置的非空字符串。

Net 客户端的指标包括 Net 服务 的所有指标。

客户端指标

基本指标名(baseName): vertx.<type>.clients (默认)或 vertx.<type>.clients.<id> ,其中 <id> 是客户端指标的标识符,而 <type> 是指标的类型。

SQL 客户端的 <type>sql<id> 为客户端选项所配置的 metricsName

客户指标包括以下内容:

  • endpoint.<host:port>.requests - 类型:计时器,含义:请求等待时间

  • endpoint.<host:port>.queue-delay - 类型:计时器,含义:队列中待处理请求的等待时间

  • endpoint.<host:port>.queue-size - 类型:计数器,含义:队列实际大小

  • endpoint.<host:port>.in-use - 类型:计数器,含义:实际请求/响应数

  • endpoint.<host:port>.ttfb - 类型:计时器,含义:请求结束到响应开始之间的等待时间

数据报套接字指标

基本指标名(baseName): vertx.datagram

  • sockets - 类型:计数器,含义:数据报套接字数量

  • exceptions - 类型:计数器,含义:异常数量

  • bytes-written - 类型:计数器,含义:已写入字节数

  • <host>:<port>.bytes-read - 类型:计数器,含义:已读取字节数

    • 此指标仅当数据报套接字正在监听时可用

池的指标

基本指标名(baseName): vertx.pools.<type>.<name> 。其中 type 是池类型(如 workerdatasource), name 是池的名字(如 vert.x-worker-thread )。

用于运行阻塞任务的工作线程池类型为 worker 。Vert.x将其用于 vert.x-worker-thread 线程和 vert.x-internal-blocking 线程。名为 worker 的执行线程都是由 WorkerExecutor 创建的。

Vert.x JDBC客户端创建的数据源使用的池名为 datasource

  • queue-delay - 类型:计时器,含义:获取某个资源的等待时间,例如在队列中的等待时间。

  • queue-size - 类型:计数器,含义:在队列中等待的资源数

  • usage - 类型:计时器,含义:某个资源被持续使用的时间

  • in-use - 类型:[count],含义:使用资源的实际数量

  • pool-ratio - A ratio 测量值,含义:已使用的资源和池规模的比率

  • max-pool-size - 类型:测量值,含义:池的最大规模

当池没有声明最大规模时,pool-ratiomax_pool_size 将没有任何数据。

JMX

默认禁用 JMX。

使用 JMX 需要手动启用,如下:

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

如果从命令行运行 Vert.x,可以通过取消注释 vertxvertx.bat 脚本中的 JMX_OPTS 行来启用指标监控和 JMX:

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

您可以配置创建 MBean 时使用的域:

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().
        setJmxEnabled(true).
        setJmxDomain("mydomain")
));

在命令行中,只需将以下系统属性添加到您的应用程序即可(适用于 vertx 命令行和 fat-jar ):

-Dvertx.metrics.options.jmxEnabled=true -Dvertx.metrics.options.jmxDomain=vertx

启用远程 JMX

如果希望通过 JMX 开放监控指标的远程访问,则至少需要设置以下系统属性:

com.sun.management.jmxremote

如果从命令行运行 Vert.x,可以通过取消注释 vertxvertx.bat 脚本中的 JMX_OPTS 行来启用远程 JMX。

关于配置 JMX 的更多信息请参阅 Oracle JMX 文档

如果在公共服务器上运行 Vert.x,请谨慎开放远程 JMX 访问

访问 Dropwizard Registry

配置指标服务时,可以指定一个可选的注册名(Registry Name), 用于在 Dropwizard Shared Registry 中注册底层的 Dropwizard Registry 对象。 可以使用这个注册名获取 MetricRegistry 对象并按需使用。

VertxOptions options = new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions().setEnabled(true).setRegistryName("my-registry")
);
Vertx vertx = Vertx.vertx(options);
// 获取 MetricRegistry 对象
MetricRegistry registry = SharedMetricRegistries.getOrCreate("my-registry");}

使用已有的 Dropwizard Registry

您也可以利用已有的 Dropwizard Registry 对象。 只需在 VertxOptions 对象上调用 setMetricRegistry 方法,并传入 MetricRegistry 实例。

MetricRegistry metricRegistry = new MetricRegistry();
VertxOptions options = new VertxOptions().setMetricsOptions(
   new DropwizardMetricsOptions().setEnabled(true).setMetricRegistry(metricRegistry)
);
Vertx vertx = Vertx.vertx(options);

使用 Jolokia 和 Hawtio

Jolokia 是 JMX-HTTP 的桥接,为 JSR-160 连接器提供了替代方案。 Jolokia 基于代理实现,支持许多平台。 除了基本的 JMX 操作外,它还有一些增强了 JMX 远程处理能力的特性, 如批量请求等。

Hawtio 是一个模块化的Web控制台,使用了 Jolokia 开放的数据。 您可以使用它创建仪表板并从 JMX 检索数据,例如内存,cpu 或任意 vert.x 指标。

本节介绍了如何配置 vert.x 应用程序,以便 Hawtio 获取监控指标。

首先,您需要使用以下选项来配置 vert.x 实例:

Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
    new DropwizardMetricsOptions()
        .setEnabled(true)
        .setJmxEnabled(true)
        .setJmxDomain("vertx-metrics")));

您可以将 JMX 域更改为任意值。 Vert.x 集群的实例可以使用相同的配置。 此配置可以让 vertx-dropwizard-metrics 将监控指标开放给本地 MBean 服务, 由此,Jolokia 可以获取这些监控指标。

然后需要 引入 Jolokia 以开放监控数据。 有多种 引入 Jolokia 的方法。 请参考 详情文档。 这里介绍如何以默认配置使用 Jolokia Agent(译者注:代理,指JMX 的 Agent)。 可以参考 Jolokia 文档 进行配置。

Jolokia Agent 既可以在启动应用程序时配置,也可以附加在正在运行的 JVM 上(需要特殊权限才能访问该进程)。 对于第一种情况,请使用以下命令启动应用程序:

java -javaagent:/.../agents/jolokia-jvm.jar=port=7777,host=localhost -jar ...

-javaagent 参数指定了 Jolokia Agent 的 jar 包路径。 您可以在命令行中指定主机地址和端口。 在上面的例子里,配置了 REST 服务地址为 http://localhost:7777

您也可以将 Jolokia Agent 注册到运行中的 JVM 上:

java -jar jolokia-jvm.jar start PID

其中 PID 请替换为 JVM 的进程ID。

Jolokia 配置好并启动后,就可以用 Hawtio 消费监控数据。

在 Hawtio 可以进入连接详情:

hawtio connect

然后打开 JMX 标签页,可以看到一个 目录, 其名为您在 Vert.x 配置中设定的 JMX 域:

hawtio jmx

由此,您可以配置仪表板,并获取 Vert.x 开放的所有监控指标。

使用 Jolokia 和 JMX4Perl 向 Nagios 开放监控指标

Check_jmx4perl 是 Nagios 的一款插件,基于 jmx4perl 实现,可以访问远程 JMX 数据。 通过这款插件可以将 Vert.x 的监控指标开放给 Nagios。

首先需要在启动您的应用程序时配置 Jolokia Agent。 配置附加 Jolokia Agent 有多种方法。查阅 获得更多详情。 本文介绍如何用默认配置启用 Jolokia Agent 。 详细配置可参考 Jolokia 文档

Jolokia Agent 既可以在启动应用程序时配置,也可以附加在正在运行的 JVM 上(需要特殊权限才能访问该进程)。 对于第一种情况,请使用以下命令启动应用程序:

java -javaagent:/.../agents/jolokia-jvm.jar=port=7777,host=localhost -jar ...

-javaagent 参数指定了 Jolokia Agent 的 jar 包路径。 您可以在命令行中指定主机地址和端口。 在上面的例子里,配置了 REST 服务地址为 http://localhost:7777

您也可以将 Jolokia Agent 注册到运行中的 JVM 上:

java -jar jolokia-jvm.jar start PID

其中 PID 请替换为 JVM 的进程ID。

Jolokia 配置好并启动后,可以参考下面命令配置 Nagios:

check_jmx4perl --url http://10.0.2.2:8778/jolokia --name eventloops --mbean vertx:name=vertx.event-loop-size
--attribute Value --warning 4

请参阅 check_jmx4perl 文档 获取更多关于检查配置的详情。

在 Vert.x Shell 服务中通过 Telnet 或 SSH 执行的监控指标命令

Metrics commands via Telnet or SSH in Vert.x Shell service

可以使用内置的 help 命令查找可用的监控指标命令:

  • 可用的命令

    1. metrics-ls :列出当前 Vert.x 实例的已知监控指标

    2. metrics-info :以 JSON 格式显示当前 Vert.x 实例的监控指标信息

    3. metrics-histogram :实时显示当前 Vert.x 实例的监控指标柱状图