package io.prometheus.client.vertx; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.exporter.common.TextFormat; import io.vertx.core.Handler; import io.vertx.core.buffer.Buffer; import io.vertx.ext.web.RoutingContext; import java.io.IOException; import java.io.Writer; /** * Metrics Handler for Vert.x Web. * * This handler will allow the usage of Prometheus Client Java API with * Vert.x applications and expose a API compatible handler for the collector. * * Usage: * * router.route("/metrics").handler(new MetricsHandler()); */ public class MetricsHandler implements Handler<RoutingContext> { /** * Wrap a Vert.x Buffer as a Writer so it can be used with * TextFormat writer */ private static class BufferWriter extends Writer { private final Buffer buffer = Buffer.buffer(); @Override public void write(char[] cbuf, int off, int len) throws IOException { buffer.appendString(new String(cbuf, off, len)); } @Override public void flush() throws IOException { // NO-OP } @Override public void close() throws IOException { // NO-OP } Buffer getBuffer() { return buffer; } } private CollectorRegistry registry; /** * Construct a MetricsHandler for the default registry. */ public MetricsHandler() { this(CollectorRegistry.defaultRegistry); } /** * Construct a MetricsHandler for the given registry. */ public MetricsHandler(CollectorRegistry registry) { this.registry = registry; } @Override public void handle(RoutingContext ctx) { try { final BufferWriter writer = new BufferWriter(); TextFormat.write004(writer, registry.metricFamilySamples()); ctx.response() .setStatusCode(200) .putHeader("Content-Type", TextFormat.CONTENT_TYPE_004) .end(writer.getBuffer()); } catch (IOException e) { ctx.fail(e); } } }