[
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 commented on CAMEL-21858:
----------------------------------------------------
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)