Claus Ibsen created CAMEL-26611:
-----------------------------------

             Summary: camel-micrometer - use tags and attributes from headers 
as given
                 Key: CAMEL-26611
                 URL: https://issues.apache.org/jira/browse/CAMEL-26611
             Project: Camel
          Issue Type: Bug
          Components: camel-opentelemetry, camel-micrometer
            Reporter: Claus Ibsen
            Assignee: Claus Ibsen
             Fix For: 4.24.0, 4.22.3, 4.18.6


The metrics producers of camel-micrometer and camel-opentelemetry-metrics apply 
the Simple language to every tag and attribute of a metric, including the ones 
supplied in the CamelMetricsTags and CamelMetricsAttributes headers. Only the 
endpoint options tags and attributes are documented as supporting Simple; the 
header metadata and the component docs do not say that header values are 
resolved. The CamelMetricsName and CamelMetricsDescription headers are already 
used literally.

h3. Behaviour today

* A tag or attribute set in the header whose key or value contains ${...} is 
resolved as a Simple expression, so the recorded meter carries a different 
value than the one the route set, or the exchange fails when the text is not a 
valid expression.

h3. Behaviour after the change

* Only the endpoint tags / attributes options are resolved with Simple, per 
exchange, as today.
* Tags and attributes from the CamelMetricsTags / CamelMetricsAttributes 
headers are used as given, like the name and description headers.
* A header tag or attribute still overrides an endpoint tag or attribute with 
the same key.
* A route that needs a computed value in a header tag builds the value in the 
route (for example in a processor) before setting the header.

h3. Classes involved

* components/camel-micrometer: AbstractMicrometerProducer.process() - resolve 
only the endpoint tags with simple(...), then add the header Tags unchanged 
(Tags.and(...), so header tags keep precedence), then the camelContext tag.
* components/camel-opentelemetry-metrics: 
AbstractOpenTelemetryProducer.process() - resolve only the entries of the 
endpoint attributes, then put the header Attributes entries without resolving 
them, keeping the current String conversion of keys and values.
* MicrometerConstants.HEADER_METRIC_TAGS and 
OpenTelemetryConstants.HEADER_METRIC_ATTRIBUTES: the @Metadata description says 
that the values are used as given and points to the tags / attributes options 
for Simple expressions. Regenerate the component JSON and the catalog.
* Docs: micrometer-component.adoc and opentelemetry-metrics-component.adoc 
state that header tags / attributes are used as given, with an example of 
computing the value in the route.

h3. Tests

* camel-micrometer CounterRouteTest: a header tag whose value or key contains 
${body} is recorded with that literal text; the existing route with 
tags.a=${body.length} still shows endpoint tags resolved per exchange.
* camel-micrometer TimerRouteTest / DistributionSummaryRouteTest: a header tag 
overrides an endpoint tag with the same key.
* camel-opentelemetry-metrics CounterRouteTest: a header attribute value is 
used as given, and a header attribute overrides an endpoint attribute with the 
same key.

h3. Upgrade guide

Routes that relied on tags or attributes from the headers being resolved as 
Simple must resolve the value in the route before setting the header. Document 
this in the 4.24 upgrade guide, and in the 4.22.3 and 4.18.6 sections of the 
4.22 and 4.18 guides.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to