系统监控 (Monitoring)
你当前正在浏览历史版本 Vert.x 5.0.12 的文档。 访问本页面的 最新版本。

Vert.x 健康检查(Health Checks)

该组件提供了一种简单的方法来执行系统健康检查。 健康检查用于以非常直接简单的术语表示应用程序当前的运行状态:UP(正常可用)或 DOWN(不可用/故障)。

使用 Vert.x Health Checks

添加如下依赖:

  • Maven(在你的 pom.xml 中配置):

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-health-check</artifactId>
  <version>5.0.12</version>
</dependency>
  • Gradle(在你的 build.gradle 文件中配置):

compile 'io.vertx:vertx-health-check:5.0.12'

创建健康检查对象

核心对象为 HealthChecks。 你可以通过以下方式创建新实例:

HealthChecks hc = HealthChecks.create(vertx);

hc.register(
  "my-procedure",
  promise -> promise.complete(Status.OK()));

// 注册带有超时限制的检查规程。若未能在指定时间内完成,则判定检查失败。
// 超时时间以毫秒为单位。
hc.register(
  "my-procedure",
  2000,
  promise -> promise.complete(Status.OK()));

创建该对象后,你便可以注册和注销各类检查规程(Procedures)。

检查规程(Procedures)

检查规程是一个用于检查系统某个特定方面以推导当前健康状况的函数。 它返回一个 Status,指明测试通过(Passed)还是失败(Failed)。 该函数绝不能阻塞,并通过给定的 Promise 异步上报成功或失败。

注册规程时,你需要指定一个名称以及执行检查的函数(处理器)。

判定状态的规则如下:

  • 若 promise 被标记为失败(failed),则该检查被判定为 KO。

  • 若 promise 成功完成但未携带任何 Status,则该检查被判定为 OK。

  • 若 promise 成功完成且携带的 Status 被标记为 OK,则判定为 OK。

  • 若 promise 成功完成且携带的 Status 被标记为 KO,则判定为 KO。

Status 还可以携带附加的元数据:

healthChecks.register("my-procedure-name", promise -> {
  // Status 可以携带以 JSON 格式提供的附加数据
  promise.complete(Status.OK(new JsonObject().put("available-memory", "2mb")));
});

healthChecks.register("my-second-procedure-name", promise -> {
  promise.complete(Status.KO(new JsonObject().put("load", 99)));
});

规程可以按分组(Groups)进行组织管理。 规程名称通过 / 分隔以表明其所属层级。所有规程在逻辑上组织成一棵树:

healthChecks.register("a-group/my-procedure-name", promise -> {
  // ...
});
// 分组支持多层级嵌套
healthChecks.register("a-group/a-second-group/my-second-procedure-name", promise -> {
  // ...
});

常见检查规程示例

本节提供常见健康检查场景的实现示例。

SQL 客户端连接检查

该检查用于上报是否能够成功与数据库建立连接:

healthChecks.register("database", promise ->
  pool.getConnection()
    .compose(SqlConnection::close)
    .<Status>mapEmpty()
    .onComplete(promise)
);

事件总线(Event Bus)就绪检查

该检查用于验证事件总线上的特定 Consumer 消费者是否已就绪。 在此示例中采用简单的 ping/pong 协议进行探活,在实际业务中你可以设计更为精密的探针。 此检查常用于验证某个监听特定事件地址的 Verticle 是否已成功启动就绪。

healthChecks.register("receiver", promise ->
  vertx.eventBus().request("health", "ping")
    .onSuccess(msg -> {
      promise.complete(Status.OK());
    })
    .onFailure(err -> {
      promise.complete(Status.KO());
    })
);

在事件总线上暴露健康检查数据

虽然通过 Vert.x Web 处理器以 HTTP REST 端点暴露健康检查非常便捷,但有时以其他形式暴露状态数据同样大有用处。 本节演示如何在事件总线上暴露健康检查数据:

vertx.eventBus().consumer("health", message ->
  healthChecks.checkStatus()
    .onSuccess(message::reply)
    .onFailure(err -> message.fail(0, err.getMessage()))
);