This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch 4.0.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/4.0.x-fixes by this push:
new 5e6b0d1e3f [CXF-9168]No Micrometer Metric for requests failing early
on server side interceptor chain(No BindingOperationInfo yet so no
OperationContext) (#2664)
5e6b0d1e3f is described below
commit 5e6b0d1e3fbbb37d59f9807efbf4adb5104a622b
Author: Freeman(Yue) Fang <[email protected]>
AuthorDate: Tue Oct 14 18:19:24 2025 -0400
[CXF-9168]No Micrometer Metric for requests failing early on server side
interceptor chain(No BindingOperationInfo yet so no OperationContext) (#2664)
(cherry picked from commit de39a250d855ecb16211a26e4ab4ecd6e84722bf)
---
.../micrometer/MicrometerMetricsProvider.java | 8 +-
systests/jaxws/pom.xml | 5 +
.../SchemaValidationMetricsClientServerTest.java | 145 +++++++++++++++++++++
3 files changed, 157 insertions(+), 1 deletion(-)
diff --git
a/rt/features/metrics/src/main/java/org/apache/cxf/metrics/micrometer/MicrometerMetricsProvider.java
b/rt/features/metrics/src/main/java/org/apache/cxf/metrics/micrometer/MicrometerMetricsProvider.java
index 99f553ff09..e8c3d89d16 100644
---
a/rt/features/metrics/src/main/java/org/apache/cxf/metrics/micrometer/MicrometerMetricsProvider.java
+++
b/rt/features/metrics/src/main/java/org/apache/cxf/metrics/micrometer/MicrometerMetricsProvider.java
@@ -61,7 +61,13 @@ public class MicrometerMetricsProvider implements
MetricsProvider {
*/
@Override
public MetricsContext createEndpointContext(Endpoint endpoint, boolean
asClient, String clientId) {
- return null;
+ if (asClient) {
+ return null;
+ } else {
+ return new MicrometerServerMetricsContext(registry, tagsProvider,
timedAnnotationProvider, tagsCustomizers,
+ micrometerMetricsProperties.getServerRequestsMetricName(),
+ micrometerMetricsProperties.isAutoTimeRequests());
+ }
}
/**
diff --git a/systests/jaxws/pom.xml b/systests/jaxws/pom.xml
index 6c37cbb725..e53e1d8dbb 100644
--- a/systests/jaxws/pom.xml
+++ b/systests/jaxws/pom.xml
@@ -324,6 +324,11 @@
<version>${cxf.jacorb.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<profiles>
<profile>
diff --git
a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/SchemaValidationMetricsClientServerTest.java
b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/SchemaValidationMetricsClientServerTest.java
new file mode 100644
index 0000000000..226e3547e1
--- /dev/null
+++
b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/SchemaValidationMetricsClientServerTest.java
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.jaxws;
+
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import jakarta.xml.ws.Endpoint;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.apache.cxf.jaxws.schemavalidation.CkRequestType;
+import org.apache.cxf.jaxws.schemavalidation.RequestHeader;
+import org.apache.cxf.jaxws.schemavalidation.RequestIdType;
+import org.apache.cxf.jaxws.schemavalidation.Service;
+import org.apache.cxf.jaxws.schemavalidation.ServicePortType;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.metrics.MetricsFeature;
+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.jaxws.JaxwsFaultCodeProvider;
+import
org.apache.cxf.metrics.micrometer.provider.jaxws.JaxwsFaultCodeTagsCustomizer;
+import
org.apache.cxf.metrics.micrometer.provider.jaxws.JaxwsOperationTagsCustomizer;
+import org.apache.cxf.metrics.micrometer.provider.jaxws.JaxwsTags;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class SchemaValidationMetricsClientServerTest extends
AbstractBusClientServerTestBase {
+
+
+ private static final MeterRegistry METER_REGISTER = new
SimpleMeterRegistry();
+ private static final String PORT = allocatePort(Server.class);
+
+ private final QName portName = new
QName("http://cxf.apache.org/jaxws/schemavalidation", "servicePort");
+
+ public static class Server extends AbstractBusTestServerBase {
+
+ protected void run() {
+ var jaxwsTags = new JaxwsTags();
+ var operationsCustomizer = new
JaxwsOperationTagsCustomizer(jaxwsTags);
+ var faultsCustomizer = new JaxwsFaultCodeTagsCustomizer(jaxwsTags,
new JaxwsFaultCodeProvider());
+ var standardTags = new StandardTags();
+ var tagsProvider = new StandardTagsProvider(new
DefaultExceptionClassProvider(), standardTags);
+ var properties = new MicrometerMetricsProperties();
+
+ var provider = new MicrometerMetricsProvider(
+ METER_REGISTER,
+ tagsProvider,
+ List.of(operationsCustomizer, faultsCustomizer),
+ new DefaultTimedAnnotationProvider(),
+ properties
+ );
+
+ String address;
+ Object implementor = new ServicePortTypeImpl();
+ address = "http://localhost:" + PORT + "/schemavalidation";
+ Endpoint ep = Endpoint.create(implementor);
+ Map<String, Object> map = new HashMap<>();
+ map.put(Message.SCHEMA_VALIDATION_ENABLED, Boolean.TRUE);
+ ep.setProperties(map);
+
((EndpointImpl)ep).setWsdlLocation("wsdl_systest_jaxws/schemaValidation.wsdl");
+ ((EndpointImpl)ep).setServiceName(new QName(
+ "http://cxf.apache.org/jaxws/schemavalidation",
"service"));
+ ((EndpointImpl)ep).getInInterceptors().add(new
LoggingInInterceptor());
+ ((EndpointImpl)ep).getOutInterceptors().add(new
LoggingOutInterceptor());
+ ((EndpointImpl)ep).setFeatures(Arrays.asList(new
MetricsFeature(provider)));
+ ep.publish(address);
+ }
+ }
+
+ @BeforeClass
+ public static void startServers() {
+ createStaticBus();
+ assertTrue("server did not launch correctly",
launchServer(Server.class, true));
+ }
+
+ @Test
+ public void testSchemaValidationWithMultipleXsds() throws Exception {
+ Service service = new Service();
+ assertNotNull(service);
+
+ try (ServicePortType greeter = service.getPort(portName,
ServicePortType.class)) {
+ greeter.getInInterceptors().add(new LoggingInInterceptor());
+ greeter.getOutInterceptors().add(new LoggingOutInterceptor());
+ updateAddressPort(greeter, PORT);
+
+ RequestIdType requestId = new RequestIdType();
+ requestId.setId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeez");
+ CkRequestType request = new CkRequestType();
+ request.setRequest(requestId);
+ RequestHeader header = new RequestHeader();
+ header.setHeaderValue("AABBCC");
+
+ try {
+ greeter.ckR(request, header);
+ fail("should catch marshall exception as the invalid outgoing
message per schema");
+ } catch (Exception e) {
+ assertTrue(e.getMessage().contains("Unmarshalling Error"));
+ boolean english =
"en".equals(java.util.Locale.getDefault().getLanguage());
+ if (english) {
+ assertTrue(e.getMessage().contains("is not facet-valid
with respect to pattern"));
+ }
+ } finally {
+ assertEquals(1, METER_REGISTER.getMeters().size());
+ }
+ }
+ }
+}
\ No newline at end of file