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)