Quarkus Micrometer deployment module that provides build-time processing for metrics collection and monitoring capabilities in Quarkus applications
—
Core deployment-time components that handle the fundamental Micrometer configuration and registry management during Quarkus application builds.
Build item for registering MeterRegistry classes in the composite registry during build time.
/**
* Build item that registers MeterRegistry classes for inclusion in the composite registry
*/
public final class MicrometerRegistryProviderBuildItem extends MultiBuildItem {
/**
* Register a MeterRegistry class by Class reference
* @param providedRegistryClass The MeterRegistry class to register
*/
public MicrometerRegistryProviderBuildItem(Class<?> providedRegistryClass);
/**
* Register a MeterRegistry class by class name string
* @param registryClassName The fully qualified class name of the MeterRegistry
*/
public MicrometerRegistryProviderBuildItem(String registryClassName);
/**
* Get the registry class that was registered
* @return The MeterRegistry class
*/
public Class<? extends MeterRegistry> getRegistryClass();
/**
* String representation of the build item
* @return String describing the registered registry
*/
public String toString();
}Usage Examples:
// Register by class reference
@BuildStep
MicrometerRegistryProviderBuildItem prometheusRegistry() {
return new MicrometerRegistryProviderBuildItem(PrometheusMeterRegistry.class);
}
// Register by class name
@BuildStep
MicrometerRegistryProviderBuildItem customRegistry() {
return new MicrometerRegistryProviderBuildItem("com.example.CustomMeterRegistry");
}Build item providing access to the root MeterRegistry runtime value.
/**
* Build item that provides runtime value of the root MeterRegistry
*/
public final class RootMeterRegistryBuildItem extends SimpleBuildItem {
/**
* Create build item with registry runtime value
* @param value The runtime value containing the MeterRegistry
*/
public RootMeterRegistryBuildItem(RuntimeValue<MeterRegistry> value);
/**
* Get the runtime value of the root MeterRegistry
* @return RuntimeValue wrapping the MeterRegistry
*/
public RuntimeValue<MeterRegistry> getValue();
}Main deployment processor handling core Micrometer configuration and setup.
/**
* Main processor for Micrometer configuration and setup
*/
@BuildSteps(onlyIf = MicrometerProcessor.MicrometerEnabled.class)
public class MicrometerProcessor {
/**
* Creates metrics capability build item when Prometheus is not enabled
* @return MetricsCapabilityBuildItem for general metrics support
*/
@BuildStep(onlyIfNot = PrometheusRegistryProcessor.PrometheusEnabled.class)
public MetricsCapabilityBuildItem metricsCapabilityBuildItem();
/**
* Registers empty exemplar provider when Prometheus is not enabled
* @param additionalBeans Producer for additional beans
*/
@BuildStep(onlyIfNot = PrometheusRegistryProcessor.PrometheusEnabled.class)
public void registerEmptyExamplarProvider(
BuildProducer<AdditionalBeanBuildItem> additionalBeans
);
/**
* Creates Prometheus-specific metrics capability when Prometheus is enabled
* @param nonApplicationRootPathBuildItem Non-application root path configuration
* @return MetricsCapabilityBuildItem for Prometheus metrics
*/
@BuildStep(onlyIf = PrometheusRegistryProcessor.PrometheusEnabled.class)
public MetricsCapabilityBuildItem metricsCapabilityPrometheusBuildItem(
NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem
);
/**
* Registers core Micrometer beans and configures reflection for CDI
* @param indexBuildItem Combined index for annotation processing
* @param providerClasses Producer for registry provider build items
* @param reflectiveClasses Producer for reflective class build items
* @param additionalBeans Producer for additional bean build items
* @param interceptorBindings Producer for interceptor binding registrar build items
* @param reflectiveMethods Producer for reflective method build items
* @return UnremovableBeanBuildItem for core unremovable beans
*/
@BuildStep
public UnremovableBeanBuildItem registerAdditionalBeans(
CombinedIndexBuildItem indexBuildItem,
BuildProducer<MicrometerRegistryProviderBuildItem> providerClasses,
BuildProducer<ReflectiveClassBuildItem> reflectiveClasses,
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
BuildProducer<InterceptorBindingRegistrarBuildItem> interceptorBindings,
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods
);
/**
* Configures logging levels for Micrometer components
* @param logCategoryProducer Producer for log category build items
*/
@BuildStep
public void configLoggingLevel(BuildProducer<LogCategoryBuildItem> logCategoryProducer);
/**
* Creates the root meter registry
* @param recorder Micrometer recorder for runtime operations
* @param nonApplicationRootPathBuildItem Non-application root path configuration
* @return RootMeterRegistryBuildItem with configured registry
*/
@BuildStep
@Consume(BeanContainerBuildItem.class)
@Record(ExecutionTime.STATIC_INIT)
public RootMeterRegistryBuildItem createRootRegistry(
MicrometerRecorder recorder,
NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem
);
/**
* Registers static initialization extension metrics
* @param recorder Micrometer recorder for runtime operations
* @param metricsFactoryConsumerBuildItems List of metrics factory consumer build items
*/
@BuildStep
@Consume(RootMeterRegistryBuildItem.class)
@Record(ExecutionTime.STATIC_INIT)
public void registerExtensionMetrics(
MicrometerRecorder recorder,
List<MetricsFactoryConsumerBuildItem> metricsFactoryConsumerBuildItems
);
/**
* Configures meter registries with customizers and runtime initialization metrics
* @param recorder Micrometer recorder for runtime operations
* @param providerClassItems List of registry provider build items
* @param metricsFactoryConsumerBuildItems List of metrics factory consumer build items
* @param shutdownContextBuildItem Shutdown context for cleanup
*/
@BuildStep
@Consume(RootMeterRegistryBuildItem.class)
@Consume(LoggingSetupBuildItem.class)
@Record(ExecutionTime.RUNTIME_INIT)
public void configureRegistry(
MicrometerRecorder recorder,
List<MicrometerRegistryProviderBuildItem> providerClassItems,
List<MetricsFactoryConsumerBuildItem> metricsFactoryConsumerBuildItems,
ShutdownContextBuildItem shutdownContextBuildItem
);
/**
* Creates DevUI card for development mode (development only)
* @param registries Available registry build items
* @return CardPageBuildItem for DevUI integration
*/
@BuildStep(onlyIf = IsDevelopment.class)
public CardPageBuildItem createCard(List<RegistryBuildItem> registries);
}Always-enabled processor for basic Micrometer configuration that runs regardless of feature enablement.
/**
* Always-enabled processor for basic configuration
*/
public class MicrometerConfigAlwaysEnabledProcessor {
/**
* Returns FeatureBuildItem for Micrometer
* @return Feature build item identifying Micrometer support
*/
@BuildStep
public FeatureBuildItem feature();
/**
* Makes MicrometerConfig unremovable for CDI
* @return UnremovableBeanBuildItem for config preservation
*/
@BuildStep
public UnremovableBeanBuildItem mpConfigAsBean();
}// Feature enablement condition
public static class MicrometerEnabled implements BooleanSupplier {
/**
* Check if Micrometer is enabled
* @return true if Micrometer feature is enabled
*/
public boolean getAsBoolean();
}
// Important DotName constants for annotation processing and build items
public static final DotName METER_REGISTRY = DotName.createSimple(MeterRegistry.class.getName());
public static final DotName METER_BINDER = DotName.createSimple(MeterBinder.class.getName());
public static final DotName METER_FILTER = DotName.createSimple(MeterFilter.class.getName());
public static final DotName METER_REGISTRY_CUSTOMIZER = DotName.createSimple(MeterRegistryCustomizer.class.getName());
public static final DotName NAMING_CONVENTION = DotName.createSimple(NamingConvention.class.getName());
// Annotation processing constants
public static final DotName COUNTED_ANNOTATION = DotName.createSimple(Counted.class.getName());
public static final DotName COUNTED_INTERCEPTOR = DotName.createSimple(MicrometerCountedInterceptor.class.getName());
public static final DotName TIMED_ANNOTATION = DotName.createSimple(Timed.class.getName());
public static final DotName TIMED_INTERCEPTOR = DotName.createSimple(MicrometerTimedInterceptor.class.getName());
public static final DotName METER_TAG_SUPPORT = DotName.createSimple(MeterTagsSupport.class.getName());
// Operating system bean class names for system metrics reflection
public static final List<String> OPERATING_SYSTEM_BEAN_CLASS_NAMES = List.of(
"com.ibm.lang.management.OperatingSystemMXBean", // J9
"com.sun.management.OperatingSystemMXBean" // HotSpot
);Usage Examples:
// Custom extension using MicrometerProcessor features
@BuildSteps
public class CustomMetricsProcessor {
@BuildStep(onlyIf = MicrometerProcessor.MicrometerEnabled.class)
AdditionalBeanBuildItem addCustomMetrics() {
return AdditionalBeanBuildItem.builder()
.addBeanClass(CustomMetricProducer.class)
.setUnremovable()
.build();
}
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
SyntheticBeanBuildItem configureCustomMetrics(
RootMeterRegistryBuildItem rootRegistry,
CustomMetricsRecorder recorder
) {
return SyntheticBeanBuildItem.configure(CustomMetricsManager.class)
.supplier(recorder.createCustomMetricsManager(rootRegistry.getValue()))
.done();
}
}Install with Tessl CLI
npx tessl i tessl/maven-io-quarkus--quarkus-micrometer-deployment