Custom checks extensions

The @PLUGIN@ plugin allows other plugins to provide their own custom check that should participate in the definition of healthiness of the node.

Plugins that are interested in doing so, will need to add a dependency on the healthcheck plugin, for example, their BUILD file could be as such:

gerrit_plugin(
    name = "plugin-foo",
    srcs = glob(["src/main/java/**/*.java"]),
    manifest_entries = [
        "Implementation-Title: Foo plugin",
        "Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/foo",
        "Gerrit-PluginName: foo",
        "Gerrit-Module: com.googlesource.gerrit.plugins.foo.Module",
    ],
    resources = glob(["src/main/resources/**/*"]),
    deps = [
        "gerrit-healthcheck-neverlink",
    ],
)

java_library(
    name = "gerrit-healthcheck-neverlink",
    neverlink = True,
    exports = ["//plugins/healthcheck"],
)

Then, the plugin can provide its own healthcheck logic via a concrete implementation of an AbstractHealthCheck, for example:


@Singleton public class FooHealthCheck extends AbstractHealthCheck { @Inject public FooHealthCheck( ListeningExecutorService executor, HealthCheckConfig config, @PluginName String name, MetricMaker metricMaker) { super(executor, config, name, metricMaker); } @Override protected Result doCheck() throws Exception { // health logic goes here return Result.PASSED; } }

Finally, you will need to register your plugin‘s healthcheck in the plugin’s Module class:

DynamicSet.bind(binder(), HealthCheck.class).to(FooHealthCheck.class);

To build the plugin in the gerrit-CI, as documented by gerrit, you should be configuring your build job as follows:

- project:
    name: plugin-foo
    jobs:
      - 'plugin-{name}-bazel-{branch}':
          extra-plugins: 'healthcheck'
          branch:
            - master

To get the CI to validate your plugin you should also add the dependency to your Jenkinsfile:

pluginPipeline(
  formatCheckId: 'gerritforge:foo-format-3852e64366bb37d13b8baf8af9b15cfd38eb9227',
  buildCheckId: 'gerritforge:foo-3852e64366bb37d13b8baf8af9b15cfd38eb9227',
  extraPlugins: ['healthcheck'])

Hitting the healthcheck status endpoint will now report the foo check, where foo is the name of the plugin, as defined in its manifest:

curl -v 'http://gerrit:8080/config/server/healthcheck~status'

{
  "elapsed": 18,
  "foo": {
    "result": "passed",
    "ts": 1683723806276,
    "elapsed": 0
  },
  "auth": {
    "result": "passed",
    "ts": 1683723806269,
    "elapsed": 4
  },
  "querychanges": {
    "result": "passed",
    "ts": 1683723806266,
    "elapsed": 3
  },
  "jgit": {
    "result": "passed",
    "ts": 1683723806258,
    "elapsed": 7
  },
  "projectslist": {
    "result": "passed",
    "ts": 1683723806265,
    "elapsed": 1
  },
  "ts": 1683723806258
}

and the metrics for such component will also be reported, out of the box.

foo_latest_latency{quantile="0.5",} 0.008638662
foo_latest_latency{quantile="0.75",} 0.008638662
foo_latest_latency{quantile="0.95",} 0.010553707
foo_latest_latency{quantile="0.98",} 0.147902061
foo_latest_latency{quantile="0.99",} 0.147902061
foo_latest_latency{quantile="0.999",} 0.147902061
foo_latest_latency_count 4.0
foo_failure_total 0.0