[ https://issues.apache.org/jira/browse/CAMEL-21858?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17934488#comment-17934488 ]
Luis Sergio Faria Carneiro edited comment on CAMEL-21858 at 3/12/25 3:36 PM: ----------------------------------------------------------------------------- I was able to overcome this problem by creating a custom SpanDecorator in my application , registering it and handling the httpMethod param: {code:java} public class HttpsSpanDecorator extends org.apache.camel.tracing.decorators.HttpsSpanDecorator { private static final Pattern METHOD = Pattern.compile("(?i)httpMethod=([A-Z]+)"); @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { return getMethod(exchange, endpoint); } @Override public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); span.setLowCardinalityTag(Tag.HTTP_METHOD, getMethod(exchange, endpoint)); } private String getMethod(Exchange exchange, Endpoint endpoint) { // try to get the httpMethod parameter from the the query string header String queryStringHeader = (String) exchange.getIn().getHeader(Exchange.HTTP_QUERY); if (queryStringHeader != null) { String methodFromQuery = getMethodFromQueryString(queryStringHeader); if (methodFromQuery != null) { return methodFromQuery; } } // try to get the httpMethod parameter from the the query string in the uri int queryIndex = endpoint.getEndpointUri().indexOf('?'); if (queryIndex != -1) { String queryString = endpoint.getEndpointUri().substring(queryIndex + 1); String methodFromQuery = getMethodFromQueryString(queryString); if (methodFromQuery != null) { return methodFromQuery; } } // if the query does not contain the httpMethod, delegate to the original code return getHttpMethod(exchange, endpoint); } private static String getMethodFromQueryString(String queryString) { Matcher m = METHOD.matcher(queryString); if (m.find()) { return m.group(1); } return null; } } {code} Just in case this is useful for understanding or fixing the issue. was (Author: luiscarneiro): I was able to overcome this problem by creating a custom SpanDecorator in my application and registering it and handling the httpMethod param: {code:java} public class HttpsSpanDecorator extends org.apache.camel.tracing.decorators.HttpsSpanDecorator { private static final Pattern METHOD = Pattern.compile("(?i)httpMethod=([A-Z]+)"); @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { return getMethod(exchange, endpoint); } @Override public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); span.setLowCardinalityTag(Tag.HTTP_METHOD, getMethod(exchange, endpoint)); } private String getMethod(Exchange exchange, Endpoint endpoint) { // try to get the httpMethod parameter from the the query string header String queryStringHeader = (String) exchange.getIn().getHeader(Exchange.HTTP_QUERY); if (queryStringHeader != null) { String methodFromQuery = getMethodFromQueryString(queryStringHeader); if (methodFromQuery != null) { return methodFromQuery; } } // try to get the httpMethod parameter from the the query string in the uri int queryIndex = endpoint.getEndpointUri().indexOf('?'); if (queryIndex != -1) { String queryString = endpoint.getEndpointUri().substring(queryIndex + 1); String methodFromQuery = getMethodFromQueryString(queryString); if (methodFromQuery != null) { return methodFromQuery; } } // if the query does not contain the httpMethod, delegate to the original code return getHttpMethod(exchange, endpoint); } private static String getMethodFromQueryString(String queryString) { Matcher m = METHOD.matcher(queryString); if (m.find()) { return m.group(1); } return null; } } {code} Just in case this is useful for understanding or fixing the issue. > camel-tracing: Incorrect http method on trace record > ---------------------------------------------------- > > Key: CAMEL-21858 > URL: https://issues.apache.org/jira/browse/CAMEL-21858 > Project: Camel > Issue Type: Bug > Components: camel-tracing > Reporter: Luis Sergio Faria Carneiro > Priority: Minor > > Consider the following integration created with the yaml dsl: > {code:java} > - from: > uri: rest:get:/demo > steps: > - setBody: > expression: > constant: '{"hello": "world"}' > - toD: > uri: "https://webhook.site/0148d971-4a63-4c61-8845-efd62b7242de" > parameters: > bridgeEndpoint: true > httpMethod: POST > throwExceptionOnFailure: false{code} > and that open telemetry tracing is enabled. > When a request to /demo is performed, we can see that the code performs a > POST request to [https://webhook.site/0148d971-4a63-4c61-8845-efd62b7242de,] > as it should, but the corresponding trace span reports the http.method as GET > instead. > This happens because the rest consumer sets the CamelHttpMethod header to GET > and this header is used by the tracing component to build the span. I > expected it to use give priority to the httpMethod endpoint parameter, as the > http component does. > similar scenario happens in this case: > > {code:java} > - from: > uri: rest:post:/demo > steps: > - removeHeaders: > pattern: "*" > - setBody: > expression: > constant: '{"hello": "world"}' > - toD: > uri: "https://webhook.site/0148d971-4a63-4c61-8845-efd62b7242de" > parameters: > bridgeEndpoint: true > httpMethod: POST > throwExceptionOnFailure: false {code} > Here we have the rest consumer defined with POST, but we remove the headers. > And the [span > decorator|https://github.com/apache/camel/blob/main/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java#L47] > decides it is a GET because the endpoint has query parameters. The endpoint > in this case is > [https://webhook.site/0148d971-4a63-4c61-8845-efd62b7242de?bridgeEndpoint=true&httpMethod=POST&throwExceptionOnFailure=false|https://webhook.site/0148d971-4a63-4c61-8845-efd62b7242de?httMethod=true&httpMethod=POST&throwExceptionOnFailure=false] > > > > > -- This message was sent by Atlassian Jira (v8.20.10#820010)