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 too large on account of request mapping timings, set it to "false" and use @Timed or @TimeSet on a per invocation basis as needed. | 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)));
...