Skip to main content

该项目是Vert.x指标服务提供者接口(SPI)的实现. 它使用Micrometer来管理指标并向多个后端报告.

Features

  • Vert.x核心工具监视:TCP / HTTP客户端和服务器, DatagramSocketEventBus和池

  • 用户通过千分尺定义的指标

  • 向Micrometer支持的任何后端报告

  • InfluxDBPrometheus和JMX报告的内置选项.

InfluxDB

Prerequisites

Getting started

类路径中必须存在模块vertx-micrometer-metricsmicrometer-registry- influx .

Maven用户应将此添加到他们的项目POM文件中:

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

和Gradle用户一起,将其生成文件:

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

Configuration examples

默认情况下,Vert.x不启用SPI实现. 您必须在Vert.x选项中启用度量标准收集.

def vertx = Vertx.vertx([
  metricsOptions:[
    influxDbOptions:[
      enabled:true
    ],
    enabled:true
  ]
])

Using a specific URI and database name

def vertx = Vertx.vertx([
  metricsOptions:[
    influxDbOptions:[
      enabled:true,
      uri:"http://influxdb.example.com:8888",
      db:"sales-department"
    ],
    enabled:true
  ]
])

With authentication

def vertx = Vertx.vertx([
  metricsOptions:[
    influxDbOptions:[
      enabled:true,
      userName:"username",
      password:"password"
    ],
    enabled:true
  ]
])

Prometheus

Prerequisites

Getting started

模块vertx-micrometer-metricsmicrometer-registry-prometheus必须存在于类路径中. 您可能还需要vertx-web来公开指标.

Maven用户应将此添加到他们的项目POM文件中:

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

和Gradle用户一起,将其生成文件:

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

Configuration examples

默认情况下,Vert.x不启用SPI实现. 您必须在Vert.x选项中启用指标收集

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true
    ],
    enabled:true
  ]
])

Using an embedded HTTP server with custom endpoint

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true,
      startEmbeddedServer:true,
      embeddedServerOptions:[
        port:8080
      ],
      embeddedServerEndpoint:"/metrics/vertx"
    ],
    enabled:true
  ]
])

如果未指定嵌入式服务器端点,则默认为/ metrics .

Binding metrics to an existing Vert.x Web router

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true
    ],
    enabled:true
  ]
])

// Later on, creating a router
def router = Router.router(vertx)
router.route("/metrics").handler(PrometheusScrapingHandler.create())
vertx.createHttpServer().requestHandler(router).listen(8080)

JMX

Getting started

模块vertx-micrometer-metricsmicrometer-registry-jmx必须存在于类路径中.

Maven用户应将此添加到他们的项目POM文件中:

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

和Gradle用户一起,将其生成文件:

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

Configuration examples

默认情况下,Vert.x不启用SPI实现. 您必须在Vert.x选项中启用指标收集

def vertx = Vertx.vertx([
  metricsOptions:[
    jmxMetricsOptions:[
      enabled:true
    ],
    enabled:true
  ]
])

With step and domain

在"千分尺"中," step指的是报告周期,以秒为单位. domain是在其下注册MBean的JMX域.

def vertx = Vertx.vertx([
  metricsOptions:[
    jmxMetricsOptions:[
      enabled:true,
      step:5,
      domain:"my.metrics.domain"
    ],
    enabled:true
  ]
])

Other backends or combinations

即使未在Vert.x选项中实现Micrometer支持的所有后端,仍然可以创建任何Micrometer注册表并将其传递给Vert.x.

可用的后端列表包括Graphite,Ganglia,Atlas . 它还启用了Micrometer Composite Registry ,以便向多个后端报告相同的指标.

在此示例中,同时报告了JMX和Graphite的指标:

def myRegistry = new io.micrometer.core.instrument.composite.CompositeMeterRegistry()
myRegistry.add(new io.micrometer.jmx.JmxMeterRegistry({ s ->
  null
}, io.micrometer.core.instrument.Clock.SYSTEM))
myRegistry.add(new io.micrometer.graphite.GraphiteMeterRegistry({ s ->
  null
}, io.micrometer.core.instrument.Clock.SYSTEM))

def vertx = Vertx.vertx([
  metricsOptions:[
    micrometerRegistry:myRegistry,
    enabled:true
  ]
])

Advanced usage

请参阅MicrometerMetricsOptions以获得详尽的选项列表.

Averages and quantiles in Prometheus

默认情况下,使用Prometheus注册表时,直方图类型的度量标准将不包含平均值或分位数统计信息.

平均值不是开箱即用的,但通常在查询时使用promql 计算 . 例如,对于最近5分钟内HTTP客户端平均响应时间:

 rate(vertx_http_client_responseTime_seconds_sum[5m])
/
 rate(vertx_http_client_responseTime_seconds_count[5m])

要计算分位数,有两个可用选项. 第一个是全局激活分位数统计,并使它们可用于Prometheus函数histogram_quantile

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true,
      publishQuantiles:true
    ],
    enabled:true
  ]
])

然后,例如, promql查询HTTP客户端响应时间,即最近5分钟的第99个百分点:

 histogram_quantile(0.99, sum(rate(vertx_http_client_responseTime_seconds_bucket[5m])) by (le))

该选项的优点是可以在promql利用它,并且可以跨维度进行promql . 不利的一面是,它为统计数据创建了大量的时间序列.

第二种选择是创建有限的统计数据,这些统计数据在各个维度上都是不可聚合的. 它需要直接访问Micrometer / Prometheus注册表:

def registry = io.vertx.micrometer.backends.BackendRegistries.getDefaultNow()
registry.config().meterFilter(new io.micrometer.core.instrument.config.MeterFilter())

另请参见有关直方图和百分位数的更多信息:

此外,您可以查看一些完整的工作示例 . 他们附带一些说明,以使用Prometheus进行设置并在Grafana中查看仪表板.

Disable some metric domains

可以使用disabledMetricsCategories来限制要监视的Vert.x模块.

有关域的完整列表,请参阅MetricsDomain

User-defined metrics

千分尺注册表可以访问,以便创建新的度量标准或获取现有的度量标准. 默认情况下,使用唯一的注册表,并将在JVM的Vert.x实例之间共享:

def registry = io.vertx.micrometer.backends.BackendRegistries.getDefaultNow()

通过在指标选项中提供注册表名称,每个Vertx实例也可以具有单独的注册表. 然后可以专门检索它:

def vertx = Vertx.vertx([
  metricsOptions:[
    influxDbOptions:[
      enabled:true
    ],
    registryName:"my registry",
    enabled:true
  ]
])

// Later on:
def registry = io.vertx.micrometer.backends.BackendRegistries.getNow("my registry")

例如,这是一个自定义计时器,该计时器将跟踪通常被调用的一段代码的执行时间:

def registry = io.vertx.micrometer.backends.BackendRegistries.getDefaultNow()
def timer = io.micrometer.core.instrument.Timer.builder("my.timer").description("a description of what this timer does").register(registry)

vertx.setPeriodic(1000, { l ->
  timer.record({ ->
    // Running here some operation to monitor
  })
})

有关更多示例,有关Micrometer注册表以及如何创建指标的文档 ,请查看Micrometer doc .

Reusing an existing registry

可以重用现有的Micrometer注册表(或来自Prometheus Java客户端的CollectorRegistry ),并将其注入到Vert.x度量标准选项中:

// This registry might be used to collect metrics other than Vert.x ones
def registry = new io.micrometer.prometheus.PrometheusMeterRegistry(io.micrometer.prometheus.PrometheusConfig.DEFAULT)

// You could also reuse an existing registry from the Prometheus Java client:
def prometheusClientRegistry = new io.prometheus.client.CollectorRegistry()
registry = new io.micrometer.prometheus.PrometheusMeterRegistry(io.micrometer.prometheus.PrometheusConfig.DEFAULT, prometheusClientRegistry, io.micrometer.core.instrument.Clock.SYSTEM)

// It's reused in MicrometerMetricsOptions.
// Prometheus options configured here, such as "setPublishQuantiles(true)", will affect the whole registry.
def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true,
      publishQuantiles:true
    ],
    micrometerRegistry:registry,
    enabled:true
  ]
])

JVM or other instrumentations

由于提供了对Micrometer注册表的简单访问,因此可以利用Micrometer API. 例如,要检测JVM:

def registry = io.vertx.micrometer.backends.BackendRegistries.getDefaultNow()

new io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics().bindTo(registry)
new io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics().bindTo(registry)
new io.micrometer.core.instrument.binder.jvm.JvmGcMetrics().bindTo(registry)
new io.micrometer.core.instrument.binder.system.ProcessorMetrics().bindTo(registry)
new io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics().bindTo(registry)

Labels and matchers

Vert.x千分尺度量标准定义了一组标签(也称为标签或字段),用于为度量提供维度. 例如,与事件总线消息相关的度量具有地址标签,该地址标签允许随后查询特定事件总线地址的时间序列,或比较每个地址的时间序列,或执行查询API允许的任何类型的汇总.

在设置指标选项时,您可以指定要启用或不启用的标签:

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true
    ],
    labels:java.util.EnumSet.of(Label.REMOTE, Label.LOCAL, Label.HTTP_CODE, Label.HTTP_PATH),
    enabled:true
  ]
])

标签的完整列表在此处详细说明: Label .

Warning
启用标签可能会导致值的基数过高,从而可能导致指标后端出现问题并影响性能. 因此,必须谨慎使用. 通常,在限制可能值的集合时启用标签是可以的.

因此,默认情况下启用的标签仅限于具有已知边界值的标签.

不仅可以启用/禁用,还可以与标签进行进一步的交互. 有两种方法:

Using Matchers

Match对象可用于通过与确切的字符串或正则表达式进行匹配来过滤或重命名某些标签值(前者效率更高).

这是将HTTP服务器指标限制为仅带有标签local = localhost:8080的示例:

def vertx = Vertx.vertx([
  metricsOptions:[
    prometheusOptions:[
      enabled:true
    ],
    labelMatchs:[
      [
        domain:"HTTP_SERVER",
        label:"local",
        value:"localhost:8080"
      ]
    ],
    enabled:true
  ]
])

在"匹配"中指定别名时 ,将使用别名来重命名值,而不是进行过滤.

匹配器对于通过配置控制标签特别有用,因为它们是通过MicrometerMetricsOptions设置的.

Using Micrometer’s MeterFilter

可以直接访问Micrometer的MeterFilter API ,以在标签上定义规则. 与Matchers相比,它在处理标签方面提供了更多功能,但无法通过配置进行定义. 因此两者都有其优势.

这是一个使用正则表达式以通用形式替换HTTP请求的实际path标签的示例:

def registry = io.vertx.micrometer.backends.BackendRegistries.getDefaultNow()
def pattern = java.util.regex.Pattern.compile("/foo/bar/.*")

registry.config().meterFilter(io.micrometer.core.instrument.config.MeterFilter.replaceTagValues(Label.HTTP_PATH.toString(), { actualPath ->
  def m = pattern.matcher(actualPath)
  if (m.matches()) {
    return "/foo/bar/:id"
  }
  return actualPath
}, ""))
Note
匹配者在引擎盖下使用仪表过滤器.

Snapshots

可以从Measured对象中创建MetricsService ,以获取其相关指标和度量的快照. 快照作为JsonObject返回.

众所周知的Measured对象就是Vertx

def metricsService = MetricsService.create(vertx)
def metrics = metricsService.getMetricsSnapshot()
println(metrics)

其他组件,例如EventBusHttpServer也可以测量:

def server = vertx.createHttpServer()
def metricsService = MetricsService.create(server)
def metrics = metricsService.getMetricsSnapshot()
println(metrics)

最后,可以从其基本名称中过滤返回的指标:

def metricsService = MetricsService.create(vertx)
// Client + server
def metrics = metricsService.getMetricsSnapshot("vertx.http")
println(metrics)

Vert.x core tools metrics

本节列出了通过监视Vert.x核心工具生成的所有指标.

Note
指标后端可能具有用于命名指标的不同约定或规则. 下面描述的名称带有下划线分隔符,但实际名称可能会因所使用的后端而异.

Net Client

指标名称 Labels Type Description

vertx_net_client_connections

local, remote

Gauge

与当前打开的远程主机的连接数.

vertx_net_client_bytesReceived

local, remote

Summary

从远程主机接收的字节数.

vertx_net_client_bytesSent

local, remote

Summary

发送到远程主机的字节数.

vertx_net_client_errors

local, remote, class

Counter

错误数.

HTTP Client

指标名称 Labels Type Description

vertx_http_client_connections

local, remote

Gauge

与当前打开的远程主机的连接数.

vertx_http_client_bytesReceived

local, remote

Summary

从远程主机接收的字节数.

vertx_http_client_bytesSent

local, remote

Summary

发送到远程主机的字节数.

vertx_http_client_errors

local, remote, class

Counter

错误数.

vertx_http_client_requests

local, remote, path, method

Gauge

等待响应的请求数.

vertx_http_client_requestCount

local, remote, path, method

Counter

发送的请求数.

vertx_http_client_responseTime

local, remote, path, method, code

Timer

Response time.

vertx_http_client_responseCount

local, remote, path, method, code

Counter

收到的响应数.

vertx_http_client_wsConnections

local, remote

Gauge

当前打开的WebSocket数量.

Net Server

指标名称 Labels Type Description

vertx_net_server_connections

local, remote

Gauge

与Net Server的已打开连接数.

vertx_net_server_bytesReceived

local, remote

Summary

Net Server接收的字节数.

vertx_net_server_bytesSent

local, remote

Summary

网络服务器发送的字节数.

vertx_net_server_errors

local, remote, class

Counter

错误数.

HTTP Server

指标名称 Labels Type Description

vertx_http_server_connections

local, remote

Gauge

与HTTP Server的已打开连接数.

vertx_http_server_bytesReceived

local, remote

Summary

HTTP服务器接收的字节数.

vertx_http_server_bytesSent

local, remote

Summary

HTTP服务器发送的字节数.

vertx_http_server_errors

local, remote, class

Counter

错误数.

vertx_http_server_requests

local, remote, path, method

Gauge

正在处理的请求数.

vertx_http_server_requestCount

local, remote, path, method, code

Counter

已处理的请求数.

vertx_http_server_requestResetCount

local, remote, path, method

Counter

重置请求数.

vertx_http_server_processingTime

local, remote, path, method, code

Timer

要求处理时间.

vertx_http_client_wsConnections

local, remote

Gauge

当前打开的WebSocket数量.

Datagram socket

指标名称 Labels Type Description

vertx_datagram_bytesReceived

local

Summary

<host>:<port>侦听地址上接收到的字节总数.

vertx_datagram_bytesSent

(none)

Summary

发送到远程主机的字节总数.

vertx_datagram_errors

class

Counter

错误总数.

Event Bus

指标名称 Labels Type Description

vertx_eventbus_handlers

address

Gauge

正在使用的事件总线处理程序的数量.

vertx_eventbus_errors

address,class

Counter

Number of errors.

vertx_eventbus_bytesWritten

address

Summary

向事件总线集群对等方发送消息时发送的字节总数.

vertx_eventbus_bytesRead

address

Summary

从事件总线集群对等方读取消息时接收到的字节总数.

vertx_eventbus_pending

address,side (local/remote)

Gauge

尚未处理的消息数. 如果将N处理程序注册到相应的地址,则发布的一条消息将计为N未决.

vertx_eventbus_published

address,side (local/remote)

Counter

已发布(发布/订阅)的消息数.

vertx_eventbus_sent

address,side (local/remote)

Counter

发送的消息数(点对点).

vertx_eventbus_received

address,side (local/remote)

Counter

收到的消息数.

vertx_eventbus_delivered

address,side (local/remote)

Counter

传递给处理程序的消息数.

vertx_eventbus_replyFailures

address,failure

Counter

消息回复失败的次数.

vertx_eventbus_processingTime

address

Timer

处理程序侦听address .

Vert.x pool metrics

本节列出了通过监视Vert.x池生成的所有指标.

当前支持两种类型:

  • worker (see WorkerExecutor)

  • 数据源 (使用Vert.x JDBC客户端创建)

Note
Vert.x预先创建了两个工作池, worker-threadinternal-blocking .
指标名称 Labels Type Description

vertx_pool_queue_delay

pool_type,pool_name

Timer

等待资源的时间(排队时间).

vertx_pool_queue_size

pool_type,pool_name

Gauge

等待资源的元素数.

vertx_pool_usage

pool_type,pool_name

Timer

使用资源的时间(即工作池的处理时间).

vertx_pool_inUse

pool_type,pool_name

Gauge

使用的资源数量.

vertx_pool_completed

pool_type,pool_name

Counter

资源完成的元素数(即,为工作池执行的任务总数).

vertx_pool_ratio

pool_type,pool_name

Gauge

池使用率,仅当可以确定最大池大小时才存在.

Verticle metrics

指标名称 Labels Type Description

vertx_verticle_deployed

name

Gauge

部署的Verticle实例数.

by  ICOPY.SITE