指标

本项目实现了 Vert.x 指标服务提供者接口(SPI),将指标报告给 Dropwizard metrics 库。

特性

一个相当简单的 API,通过 Measured 接口检索指标,该接口由各种 Vert.x 组件实现,如 HttpServerNetServer,甚至是 Vertx 本身。

基于 Dropwizard 实现的可配置 JMX 报告,将 Vert.x 作为 JMX MBean 暴露。

快速入门

要启用指标,请将以下依赖项添加到构建描述符的 dependencies 部分

  • Maven(在您的 pom.xml 中)

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-dropwizard-metrics</artifactId>
  <version>5.0.1</version>
</dependency>
  • Gradle(在您的 build.gradle 文件中)

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

然后,当您创建 Vert.x 时,使用 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 时,可以通过 JVM 系统属性激活指标。以 vertx.metrics.options. 开头的系统属性会传递给指标选项。

_vertx.metrics.options.enabled_ 是一个标准的 Vert.x Core 选项,用于启用指标实现,此选项必须设置为 true

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

vertx.metrics.options.configPath 选项允许从属性文件重新配置指标。

指标服务

虽然 Vert.x 核心定义了用于报告指标的 SPI(例如本项目中实现),但它没有定义用于检索指标的 API(因为某些指标收集器只进行报告,没有其他功能)。

MetricsService 在 Dropwizard Registry 之前提供了一个 API,用于获取指标数据快照。

命名

下面列出的每个被测量组件(Vertx 除外)都将有一个关联的基名称。每个指标都可以通过提供完整的限定名称 <fqn> baseName + . + metricName 从 Vertx 中检索。

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

或从被测量组件本身仅使用指标名称。

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 对象检索指标快照,该对象提供指标名称到数据的映射,由 JsonObject 表示。因此,例如,如果我们打印出特定 Vert.x 实例的所有指标

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();
// set up server
JsonObject metrics = metricsService.getMetricsSnapshot(server);

指标也可以使用基名称检索

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

数据

下面是每个 Dropwizard 指标在 JSON 中的表示方式。有关每个指标的详细信息,请参阅 Dropwizard metrics 文档。

Gauge(度量计)

{
  "type"  : "gauge",
  "value" : value // any json value
}

Counter(计数器)

{
  "type"  : "counter",
  "count" : 1 // number
}

Histogram(直方图)

{
  "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" // string representing rate
}

ThroughputMeter(吞吐量计量器)

扩展 Meter(计量器) 以提供即时吞吐量。

{
  "type"              : "meter",
  "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(计时器)

计时器基本上是 Histogram(直方图) + Meter(计量器)的组合。

{
  "type": "timer",

  // 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(计时器) 以提供即时吞吐量指标。

{
  "type": "timer",

  // 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
}

指标

目前提供以下指标。

Vert.x 指标

提供以下指标

事件总线指标

基名称:vertx.eventbus

受监控的事件总线处理程序可通过对处理程序注册地址执行匹配进行配置。Vert.x 可能有大量的已注册事件总线,因此此设置的唯一良好默认值是监控零个处理程序。

受监控的处理程序可以在 DropwizardMetricsOptions 中通过特定地址匹配或正则表达式匹配进行配置

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 服务器指标

基名称:vertx.http.servers.<host>:<port>

HTTP 服务器包括 Net 服务器 的所有指标以及以下指标

HTTP URI 指标必须在选项中明确配置,可以通过精确匹配或正则表达式匹配进行配置

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(例如 get-requests./users/1get-requests./users/2 等)在注册表中设置单独的条目可能没有意义,而是需要一个汇总的条目。为此,您可以为匹配实例设置一个别名,在这种情况下,别名将用作注册表名称的一部分,而不是 URI,例如 <http-method>-requests.<alias>。此外,每个定义的别名还将为每个响应组设置单独的计数器,例如 responses-<code>.<alias>

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

HTTP 请求路由可以由 vertx-web 等框架按请求报告,即核心 Vert.x 本身不报告任何路由信息。与 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,字节表示请求/响应的主体,因此会忽略头部等。

HTTP 客户端指标

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

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

HTTP 客户端为每个远程端点管理一个连接池,并带有一个待处理请求队列

端点指标也可用

其中 <host> 是可能未解析的端点主机名,<port> 是 TCP 端口。

受监控的端点可通过对服务器 $host:$port 执行匹配进行配置。此设置的默认值是不监控任何端点。

受监控的端点可以在 DropwizardMetricsOptions 中通过特定主机名匹配或正则表达式匹配进行配置

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))
));
HTTP 客户端连接池指标暴露为 池指标

Net 服务器指标

基名称:vertx.net.servers.<host>:<port>

Net 客户端指标

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

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

客户端指标

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

SQL 客户端的类型是 sql,标识符是由客户端选项定义的 metricsName

客户端包括以下内容

数据报套接字指标

基名称:vertx.datagram

池指标

基名称:vertx.pools.<type>.<name>,其中 type 是池的类型(例如 workerhttpdatasource),name 是池的名称(例如 vert.x-worker-thread)。

_worker_ 类型的池是阻塞工作池。Vert.x 将其工作池暴露为 _vert.x-worker-thread_ 和 _vert.x-internal-blocking_。使用 WorkerExecutor 创建的命名工作执行器也会被暴露。

_http_ 类型的池是 HTTP 客户端连接池。

使用 Vert.x SQL 客户端创建的数据源暴露为 _sql_。

当无法确定受测量池的最大池大小时,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 CLI 和胖 JAR)

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

启用远程 JMX

如果您希望指标通过 JMX 远程暴露,那么您至少需要设置以下系统属性

com.sun.management.jmxremote

如果从命令行运行,可以通过编辑 vertxvertx.bat 并取消 JMX_OPTS 行的注释来完成。

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

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

访问 Dropwizard Registry

配置指标服务时,可以指定一个可选的注册表名称,用于在 Dropwizard 共享注册表 中注册底层 Dropwizard Registry,以便您可以检索此注册表并根据您的需要使用。

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

使用已存在的 Dropwizard Registry

可选地,可以使用已存在的 Dropwizard Registry。为此,请将 MetricRegistry 实例作为参数传递给 VertxOptions 对象中的 setMetricRegistry 函数。

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 连接器的替代方案。它是一种基于代理的方法,支持多种平台。除了基本的 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")));

您可以将域更改为任何您想要的。相同的配置可用于集群 Vert.x 实例。此配置指示 vertx-dropwizard-metrics 在本地 MBean 服务器中暴露指标,以便 Jolokia 可以检索它们。

然后,您需要 _插入_ Jolokia 以暴露数据。有多种方法可以 _插入_ Jolokia。请参阅 以获取更多详细信息。在这里,我们解释如何使用默认配置的 Jolokia 代理。请参阅 Jolokia 文档 以配置它。

代理可以在启动应用程序时附加,也可以在运行中的 JVM 上附加(您需要特殊权限才能访问该进程)。在第一种情况下,使用以下方式启动您的应用程序

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

-javaagent 指定 Jolokia 代理 JAR 文件的路径。您可以从命令行配置端口和主机。这里它在 https://:7777 上注册 REST 端点。

您也可以通过以下方式将代理附加到运行中的 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 JVM 代理。有多种方法可以附加 Jolokia。请参阅 以获取更多详细信息。在这里,我们解释如何使用默认配置的 Jolokia 代理。请参阅 Jolokia 文档 以配置它。

代理可以在启动应用程序时附加,也可以在运行中的 JVM 上附加(您需要特殊权限才能访问该进程)。在第一种情况下,使用以下方式启动您的应用程序

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

-javaagent 指定 Jolokia 代理 JAR 文件的路径。您可以从命令行配置端口和主机。这里它在 https://:7777 上注册 REST 端点。

您也可以通过以下方式将代理附加到运行中的 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 文档 以获取有关检查配置的更多详细信息。

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

要查找可用的指标命令,您可以使用内置的 _help_ 命令

  • 可用命令

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

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

    3. metrics-histogram: 实时显示当前 Vert.x 实例的直方图指标表