CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-quarkus--quarkus-micrometer-deployment

Quarkus Micrometer deployment module that provides build-time processing for metrics collection and monitoring capabilities in Quarkus applications

Pending
Overview
Eval results
Files

registry-exports.mddocs/

Registry Export Processors

Processors that configure and expose metrics through various registry endpoints, providing different formats and protocols for metrics consumption by monitoring systems.

Capabilities

RegistryBuildItem

Build item representing a configured meter registry endpoint that will be exposed by the application.

/**
 * Build item representing a configured meter registry endpoint
 */
public final class RegistryBuildItem extends MultiBuildItem {
    /**
     * Create a registry build item with name and path
     * @param name The name identifier of the registry
     * @param path The HTTP path where the registry will be exposed
     */
    public RegistryBuildItem(String name, String path);
    
    /**
     * Get the registry name
     * @return The name identifier of this registry
     */
    public String name();
    
    /**
     * Get the registry path
     * @return The HTTP path where this registry is exposed
     */
    public String path();
}

Prometheus Registry Processor

Configures Prometheus meter registry and creates HTTP endpoints for Prometheus metrics scraping.

/**
 * Deployment processor for Prometheus registry configuration
 */
@BuildSteps
public class PrometheusRegistryProcessor {
    
    /**
     * Creates Prometheus registry provider
     * @param config Micrometer configuration
     * @param additionalBeans Producer for additional bean build items
     * @return MicrometerRegistryProviderBuildItem for Prometheus registry
     */
    @BuildStep
    public MicrometerRegistryProviderBuildItem createPrometheusRegistry(
        MicrometerConfig config,
        BuildProducer<AdditionalBeanBuildItem> additionalBeans
    );
    
    /**
     * Registers OpenTelemetry exemplar sampler provider when tracing is enabled
     * @param additionalBeans Producer for additional bean build items
     */
    @BuildStep(onlyIf = TraceEnabled.class)
    public void registerOpentelemetryExemplarSamplerProvider(
        BuildProducer<AdditionalBeanBuildItem> additionalBeans
    );
    
    /**
     * Registers empty exemplar provider when tracing is disabled
     * @param additionalBeans Producer for additional bean build items
     */
    @BuildStep(onlyIfNot = TraceEnabled.class)
    public void registerEmptyExamplarProvider(
        BuildProducer<AdditionalBeanBuildItem> additionalBeans
    );
    
    /**
     * Creates Prometheus metrics endpoints
     * @param routes Producer for route build items
     * @param registries Producer for registry build items
     * @param mConfig Micrometer configuration
     * @param nonApplicationRootPathBuildItem Non-application root path configuration
     * @param managementBuildTimeConfig Management interface build-time configuration
     * @param launchModeBuildItem Launch mode build item
     * @param recorder Prometheus recorder for runtime operations
     */
    @BuildStep
    @Record(value = ExecutionTime.STATIC_INIT)
    public void createPrometheusRoute(
        BuildProducer<RouteBuildItem> routes,
        BuildProducer<RegistryBuildItem> registries,
        MicrometerConfig mConfig,
        NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
        ManagementInterfaceBuildTimeConfig managementBuildTimeConfig,
        LaunchModeBuildItem launchModeBuildItem,
        PrometheusRecorder recorder
    );
    
    // Enablement conditions
    public static class PrometheusEnabled implements BooleanSupplier;
    public static class TraceEnabled implements BooleanSupplier;
}

Usage Examples:

// Prometheus registry provides metrics at /q/metrics endpoint by default
// Example HTTP request to get Prometheus metrics:
// GET /q/metrics
// Content-Type: text/plain; version=0.0.4; charset=utf-8

// Example Prometheus metrics output:
# HELP http_server_requests_seconds Duration of HTTP server request handling
# TYPE http_server_requests_seconds summary
http_server_requests_seconds{method="GET",outcome="SUCCESS",status="200",uri="/api/users",quantile="0.5",} 0.002
http_server_requests_seconds{method="GET",outcome="SUCCESS",status="200",uri="/api/users",quantile="0.95",} 0.005
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/api/users",} 42.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/api/users",} 0.123

JSON Registry Processor

Configures JSON meter registry and creates HTTP endpoints for JSON-formatted metrics output.

/**
 * Deployment processor for JSON registry configuration
 */
@BuildSteps
public class JsonRegistryProcessor {
    
    /**
     * Initializes JSON registry and endpoints
     * @param config Micrometer configuration
     * @param registryProviders Producer for registry provider build items
     * @param routes Producer for route build items
     * @param additionalBeans Producer for additional bean build items
     * @param registries Producer for registry build items
     * @param nonApplicationRootPathBuildItem Non-application root path configuration
     * @param managementBuildTimeConfig Management interface build-time configuration
     * @param launchModeBuildItem Launch mode build item
     * @param recorder JSON recorder for runtime operations
     */
    @BuildStep
    @Record(ExecutionTime.STATIC_INIT)
    public void initializeJsonRegistry(
        MicrometerConfig config,
        BuildProducer<MicrometerRegistryProviderBuildItem> registryProviders,
        BuildProducer<RouteBuildItem> routes,
        BuildProducer<AdditionalBeanBuildItem> additionalBeans,
        BuildProducer<RegistryBuildItem> registries,
        NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
        ManagementInterfaceBuildTimeConfig managementBuildTimeConfig,
        LaunchModeBuildItem launchModeBuildItem,
        JsonRecorder recorder
    );
    
    // Enablement condition
    public static class JsonRegistryEnabled implements BooleanSupplier;
}

Usage Examples:

// JSON registry provides metrics at /q/metrics/json endpoint by default
// Example HTTP request to get JSON metrics:
// GET /q/metrics/json
// Content-Type: application/json

// Example JSON metrics output:
{
  "names": ["http.server.requests", "jvm.memory.used", "system.cpu.usage"],
  "measurements": [
    {
      "statistic": "COUNT",
      "value": 42.0
    },
    {
      "statistic": "TOTAL_TIME", 
      "value": 0.123
    }
  ],
  "availableTags": [
    {
      "tag": "method",
      "values": ["GET", "POST", "PUT", "DELETE"]
    },
    {
      "tag": "status", 
      "values": ["200", "404", "500"]
    }
  ]
}

Registry Constants and Utilities

// Prometheus registry class constants
public static final String REGISTRY_CLASS_NAME = "io.micrometer.prometheus.PrometheusMeterRegistry";
public static final Class<?> REGISTRY_CLASS; // Lazily loaded class reference

// Registry configuration utilities
public static boolean isPrometheusEnabled() {
    return ConfigProvider.getConfig()
        .getOptionalValue("quarkus.micrometer.export.prometheus.enabled", Boolean.class)
        .orElse(true);
}

public static boolean isJsonRegistryEnabled() {
    return ConfigProvider.getConfig()
        .getOptionalValue("quarkus.micrometer.export.json.enabled", Boolean.class)
        .orElse(false);
}

Custom Registry Integration

// Example: Adding a custom registry export processor
@BuildSteps
public class CustomRegistryProcessor {
    
    @BuildStep(onlyIf = CustomRegistryEnabled.class)
    MicrometerRegistryProviderBuildItem createCustomRegistry() {
        return new MicrometerRegistryProviderBuildItem(CustomMeterRegistry.class);
    }
    
    @BuildStep(onlyIf = CustomRegistryEnabled.class)
    @Record(ExecutionTime.RUNTIME_INIT)
    List<RouteBuildItem> createCustomEndpoints(
        List<RegistryBuildItem> registries,
        CustomRegistryRecorder recorder
    ) {
        return List.of(
            RouteBuildItem.builder()
                .route("/q/metrics/custom")
                .handler(recorder.createCustomHandler())
                .build()
        );
    }
    
    @BuildStep(onlyIf = CustomRegistryEnabled.class)
    RegistryBuildItem registerCustomEndpoint() {
        return new RegistryBuildItem("custom", "/q/metrics/custom");
    }
    
    public static class CustomRegistryEnabled implements BooleanSupplier {
        @Override
        public boolean getAsBoolean() {
            return ConfigProvider.getConfig()
                .getOptionalValue("quarkus.micrometer.export.custom.enabled", Boolean.class)
                .orElse(false);
        }
    }
}

OpenTelemetry Integration

The Prometheus processor includes special support for OpenTelemetry exemplars when tracing is enabled:

/**
 * OpenTelemetry exemplar integration when both Prometheus and tracing are enabled
 */
@BuildStep(onlyIf = {PrometheusEnabled.class, TraceEnabled.class})
UnremovableBeanBuildItem registerOpentelemetryExemplarSamplerProvider() {
    return UnremovableBeanBuildItem.beanClassNames(
        "io.quarkus.micrometer.runtime.export.exemplars.OpenTelemetryExemplarSamplerProvider"
    );
}

Configuration Examples:

# Enable Prometheus metrics (enabled by default)
quarkus.micrometer.export.prometheus.enabled=true

# Customize Prometheus endpoint path
quarkus.micrometer.export.prometheus.path=/custom-metrics

# Enable JSON metrics export
quarkus.micrometer.export.json.enabled=true

# Enable OpenTelemetry exemplars for Prometheus
quarkus.micrometer.export.prometheus.enable-exemplars=true

# Configure registry-specific settings
quarkus.micrometer.export.prometheus.step=PT1M
quarkus.micrometer.export.prometheus.descriptions=true

Install with Tessl CLI

npx tessl i tessl/maven-io-quarkus--quarkus-micrometer-deployment

docs

core-processors.md

framework-binders.md

index.md

mp-metrics-compatibility.md

registry-exports.md

tile.json