This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 4_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 7a169796fa7def7044f53fd90ea2fbdd283c915e
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Oct 15 09:04:42 2025 +0200

    [SYNCOPE-1916] CXF server metrics
---
 .../core/rest/cxf/IdRepoRESTCXFContext.java        |  5 +++--
 core/metrics-starter/pom.xml                       |  5 +++++
 .../syncope/core/starter/MetricsContext.java       | 23 ++++++++++++++++++++++
 pom.xml                                            |  5 +++++
 4 files changed, 36 insertions(+), 2 deletions(-)

diff --git 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
index ebe7ed979b..ed422f422f 100644
--- 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
+++ 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.cxf.Bus;
 import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.feature.Feature;
 import org.apache.cxf.jaxrs.ext.ContextProvider;
 import org.apache.cxf.jaxrs.ext.search.SearchContext;
 import org.apache.cxf.jaxrs.ext.search.SearchContextImpl;
@@ -300,7 +301,7 @@ public class IdRepoRESTCXFContext {
             final GZIPInInterceptor gzipInInterceptor,
             final GZIPOutInterceptor gzipOutInterceptor,
             final ThreadLocalCleanupOutInterceptor 
threadLocalCleanupOutInterceptor,
-            final OpenApiFeature openapiFeature,
+            final List<Feature> features,
             final RestServiceExceptionMapper restServiceExceptionMapper,
             final Bus bus) {
 
@@ -331,7 +332,7 @@ public class IdRepoRESTCXFContext {
 
         restContainer.setOutInterceptors(List.of(gzipOutInterceptor, 
threadLocalCleanupOutInterceptor));
 
-        restContainer.setFeatures(List.of(openapiFeature));
+        restContainer.setFeatures(features);
 
         return restContainer.create();
     }
diff --git a/core/metrics-starter/pom.xml b/core/metrics-starter/pom.xml
index f72bbd153b..ce3765b806 100644
--- a/core/metrics-starter/pom.xml
+++ b/core/metrics-starter/pom.xml
@@ -44,6 +44,11 @@ under the License.
       <version>${project.version}</version>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-features-metrics</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>io.micrometer</groupId>
       <artifactId>micrometer-core</artifactId>
diff --git 
a/core/metrics-starter/src/main/java/org/apache/syncope/core/starter/MetricsContext.java
 
b/core/metrics-starter/src/main/java/org/apache/syncope/core/starter/MetricsContext.java
index f7720ada02..5d8165f40c 100644
--- 
a/core/metrics-starter/src/main/java/org/apache/syncope/core/starter/MetricsContext.java
+++ 
b/core/metrics-starter/src/main/java/org/apache/syncope/core/starter/MetricsContext.java
@@ -20,6 +20,16 @@ package org.apache.syncope.core.starter;
 
 import io.micrometer.core.instrument.MeterRegistry;
 import java.util.List;
+import org.apache.cxf.metrics.MetricsFeature;
+import org.apache.cxf.metrics.MetricsProvider;
+import org.apache.cxf.metrics.micrometer.MicrometerMetricsProperties;
+import org.apache.cxf.metrics.micrometer.MicrometerMetricsProvider;
+import 
org.apache.cxf.metrics.micrometer.provider.DefaultExceptionClassProvider;
+import 
org.apache.cxf.metrics.micrometer.provider.DefaultTimedAnnotationProvider;
+import org.apache.cxf.metrics.micrometer.provider.StandardTags;
+import org.apache.cxf.metrics.micrometer.provider.StandardTagsProvider;
+import 
org.apache.cxf.metrics.micrometer.provider.jaxrs.JaxrsOperationTagsCustomizer;
+import org.apache.cxf.metrics.micrometer.provider.jaxrs.JaxrsTags;
 import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
 import org.apache.syncope.core.persistence.api.EncryptorManager;
 import 
org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
@@ -58,6 +68,19 @@ import org.springframework.core.task.AsyncTaskExecutor;
 @Configuration(proxyBeanMethods = false)
 public class MetricsContext {
 
+    @ConditionalOnMissingBean
+    @Bean
+    public MetricsFeature metricsFeature(final MeterRegistry meterRegistry) {
+        MetricsProvider metricsProvider = new MicrometerMetricsProvider(
+                meterRegistry,
+                new StandardTagsProvider(new DefaultExceptionClassProvider(), 
new StandardTags()),
+                List.of(new JaxrsOperationTagsCustomizer(new JaxrsTags())),
+                new DefaultTimedAnnotationProvider(),
+                new MicrometerMetricsProperties());
+
+        return new MetricsFeature(metricsProvider);
+    }
+
     @ConditionalOnMissingBean(name = "instrumentedAuthDataAccessor")
     @Bean(name = { "authDataAccessor", "instrumentedAuthDataAccessor" })
     public AuthDataAccessor instrumentedAuthDataAccessor(
diff --git a/pom.xml b/pom.xml
index 963fc9719b..506fcba8ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -602,6 +602,11 @@ under the License.
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>${cxf.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.cxf</groupId>
+        <artifactId>cxf-rt-features-metrics</artifactId>
+        <version>${cxf.version}</version>
+      </dependency>
       <!-- /CXF -->
 
       <!-- Swagger -->

Reply via email to