Vert.x 健康检查

此组件提供了一种计算健康检查的简单方法。健康检查用于以非常简单的术语表达应用程序的当前状态:UPDOWN

使用 Vert.x 健康检查

添加以下依赖项

  • Maven(在您的 pom.xml 中)

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

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

创建健康检查对象。

核心对象是 HealthChecks。您可以使用以下方式创建一个新实例:

HealthChecks hc = HealthChecks.create(vertx);

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

// Register with a timeout. The check fails if it does not complete in time.
// The timeout is given in ms.
hc.register(
  "my-procedure",
  2000,
  promise -> promise.complete(Status.OK()));

创建此对象后,您可以注册和注销过程。

过程

过程是检查系统某些方面以推断当前健康状况的函数。它报告一个 Status,指示测试是否通过或失败。此函数不得阻塞,并应向给定的 Promise 报告其成功或失败。

当您注册过程时,您会提供一个名称和执行检查的函数(处理程序)。

推断状态的规则如下:

  • 如果 Promise 被标记为失败,则检查被视为 KO

  • 如果 Promise 成功完成但没有 Status,则检查被视为 OK

  • 如果 Promise 成功完成,且 Status 被标记为 OK,则检查被视为 OK

  • 如果 Promise 成功完成,且 Status 被标记为 KO,则检查被视为 KO

Status 还可以提供额外的数据。

healthChecks.register("my-procedure-name", promise -> {
  // Status can provide additional data provided as 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)));
});

过程可以分组。过程名称指示组(由 / 分隔)。过程以树状结构组织。

healthChecks.register("a-group/my-procedure-name", promise -> {
  //....
});
// Groups can contain other groups
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)
);

事件总线

此检查报告事件总线上是否有消费者准备就绪。在本例中,协议是一个简单的 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 暴露健康检查很方便,但以不同方式暴露数据可能很有用。本节提供一个在事件总线上暴露数据的示例。

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