Introduction
The Micrometer metrics library become a de factor instrumentation choice for JVM application. It has been supported by Apache CXF starting from 3.4.1 / 3.3.8 and above for the server-side and 3.4.2 / 3.3.9 and above for the client-side.
Metrics Provider
The Micrometer integration is provided by MicrometerMetricsProvider.
Configuration
There MicrometerMetricsProvider supports the following properties (encapsulated inside MicrometerMetricsProperties).
Property | Description | Default |
---|---|---|
autoTimeRequests | Whether requests handled by CXF should be automatically timed. If the number of time series emitted grows | true |
serverRequestsMetricName | Name of the metric for received requests (server-side) | cxf.server.requests |
clientRequestsMetricName | Name of the metric for sent requests (client-side) | cxf.client.requests |
Integration with JAX-WS
Server
The typical way to plug Micrometer integration on the server-side is by using WebServiceFeature mechanism, for which there is a dedicated MetricsFeature implementation. The snipped below illustrated the basic initialization sequence and set of the dependencies involved.
final MeterRegistry registry = ...; /* Micrometer MeterRegistry instance */ final JaxwsTags jaxwsTags = new JaxwsTags(); final TagsCustomizer operationsCustomizer = new JaxwsOperationTagsCustomizer(jaxwsTags); final TagsCustomizer faultsCustomizer = new JaxwsFaultCodeTagsCustomizer(jaxwsTags, new JaxwsFaultCodeProvider()); final TagsProvider tagsProvider = new StandardTagsProvider(new DefaultExceptionClassProvider(), new StandardTags()); final MicrometerMetricsProperties properties = new MicrometerMetricsProperties(); final MetricsProvider metricsProvider = new MicrometerMetricsProvider(registry, tagsProvider, Arrays.asList(operationsCustomizer, faultsCustomizer), new DefaultTimedAnnotationProvider(), properties); final JAXWSServerFactoryBean factory = new JAXWSServerFactoryBean(); factory.setWsFeatures(Arrays.asList(new MetricsFeature(metricsProvider))); ...
Alternatively, the MetricsFeature could be supplied directly to JAX-WS endpoint, for example:
EndpointImpl endpoint = new EndpointImpl(bus, new HelloPortImpl(), null, null, new WebServiceFeature[]{ new MetricsFeature(metricsProvider) });
Client (since 3.3.9 / 3.4.2)
The client integration is no different from the server and uses the same MetricsFeature feature.
final MeterRegistry registry = ...; /* Micrometer MeterRegistry instance */ final JaxwsTags jaxwsTags = new JaxwsTags(); final TagsCustomizer operationsCustomizer = new JaxwsOperationTagsCustomizer(jaxwsTags); final TagsCustomizer faultsCustomizer = new JaxwsFaultCodeTagsCustomizer(jaxwsTags, new JaxwsFaultCodeProvider()); final TagsProvider tagsProvider = new StandardTagsProvider(new DefaultExceptionClassProvider(), new StandardTags()); final MicrometerMetricsProperties properties = new MicrometerMetricsProperties(); final MetricsProvider metricsProvider = new MicrometerMetricsProvider(registry, tagsProvider, Arrays.asList(operationsCustomizer, faultsCustomizer), new DefaultTimedAnnotationProvider(), properties); final JaxWsClientFactoryBean factory = new JaxWsClientFactoryBean(); factory.setFeatures(Arrays.asList(new MetricsFeature(new MicrometerMetricsProvider(metricsProvider)))); ...
Integration with JAX-RS
Server
The typical way to plug Micrometer integration on the server-side is by using AbstractFeature which is implemented by MetricsFeature. The snipped below illustrated the basic initialization sequence and set of the dependencies involved.
final MeterRegistry registry = ...; /* Micrometer MeterRegistry instance */ final JaxrsTags jaxrsTags = new JaxrsTags(); final TagsCustomizer operationsCustomizer = new JaxrsOperationTagsCustomizer(jaxrsTags); final TagsProvider tagsProvider = new StandardTagsProvider(new DefaultExceptionClassProvider(), new StandardTags()); final MicrometerMetricsProperties properties = new MicrometerMetricsProperties(); final MetricsProvider metricsProvider = new MicrometerMetricsProvider(registry, tagsProvider, Arrays.asList(operationsCustomizer), new DefaultTimedAnnotationProvider(), properties); final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean(); factory.setFeatures(Arrays.asList(new MetricsFeature(metricsProvider))); ...
Client (since 3.3.9 / 3.4.2)
The client integration is no different from the server and uses the same MetricsFeature feature.
final MeterRegistry registry = ...; /* Micrometer MeterRegistry instance */ final JaxrsTags jaxrsTags = new JaxrsTags(); final TagsCustomizer operationsCustomizer = new JaxrsOperationTagsCustomizer(jaxrsTags); final TagsProvider tagsProvider = new StandardTagsProvider(new DefaultExceptionClassProvider(), new StandardTags()); final MicrometerMetricsProperties properties = new MicrometerMetricsProperties(); final MetricsProvider metricsProvider = new MicrometerMetricsProvider(registry, tagsProvider, Arrays.asList(operationsCustomizer), new DefaultTimedAnnotationProvider(), properties); final JAXRSClientFactoryBean factory = new JAXRSClientFactoryBean(); factory.setFeatures(Arrays.asList(new MetricsFeature(metricsProvider))); ...