-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
Component(s)
processor/transform
Is your feature request related to a problem? Please describe.
Due to open-telemetry/opentelemetry-collector#3410 it is currently impossible to use the metric_relabel_configs
to rename metrics. A use case we have from https://github.com/datastax/metric-collector-for-apache-cassandra requires us to do a lot of specific renamings (see https://github.com/datastax/metric-collector-for-apache-cassandra/releases/download/v0.3.4/datastax-mcac-dashboards-0.3.4.zip).
A simple example is
- source_labels: ["mcac"]
regex: org\.apache\.cassandra\.metrics\.keyspace\.(\w+)\.(\w+)
target_label: __name__
replacement: mcac_keyspace_${1}
The regex matches different metrics collectd_mcac_micros_count_total
, collectd_mcac_micros_sum
, collectd_mcac_micros_bucket_654949
, etc ... However, these are shared by a lot of other different "metrics" which are distinguished by the "mcac" label.
E.g.
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.dropped_message.internal_dropped_latency.read_repair",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 0 1684912308142
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.dropped_message.internal_dropped_latency.request_response",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 0 1684912308341
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.keyspace.cas_commit_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123147 1684912308145
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.keyspace.cas_prepare_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123191 1684912308349
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.keyspace.cas_propose_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123174 1684912308145
collectd_mcac_micros_count_total{mcac="org.apache.cassandra.metrics.keyspace.range_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 115970287 1684912308370
I've tried a lot of different ways to specifically rename the metrics and limit the amount of impacted metrics, resulting in this ugly piece of (semi-generated) code
transform:
error_mode: propagate
metric_statements:
- context: datapoint
statements:
- set(attributes["is_rename"], "true") where IsMatch(attributes["mcac"], "org\\.apache\\.cassandra\\.metrics\\.keyspace\\.(\\w+)\\.(\\w+)")
- set(attributes["new_name"], attributes["mcac"]) where IsMatch(attributes["mcac"], "org\\.apache\\.cassandra\\.metrics\\.keyspace\\.(\\w+)\\.(\\w+)")
- set(attributes["rararandom"], "86434") where IsMatch(attributes["mcac"], "org\\.apache\\.cassandra\\.metrics\\.keyspace\\.(\\w+)\\.(\\w+)")
- replace_pattern(attributes["new_name"], "org\\.apache\\.cassandra\\.metrics\\.keyspace\\.(\\w+)\\.(\\w+)", "mcac_keyspace_$$1")
- set(metric.name, attributes["new_name"]) where attributes["is_rename"] == "true" and attributes["rararandom"] == "86434"
The new_name
attribute is set correctly (even when running all ~30 similar blocks of code), however, the set(metric.name, attributes["new_name"])
renames all metric values.
So, taking the above example, the result (without the extra labels) would be
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.dropped_message.internal_dropped_latency.read_repair",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 0 1684912308142
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.dropped_message.internal_dropped_latency.request_response",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 0 1684912308341
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.keyspace.cas_commit_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123147 1684912308145
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.keyspace.cas_prepare_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123191 1684912308349
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.keyspace.cas_propose_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 1123174 1684912308145
mcac_keyspace_dev{mcac="org.apache.cassandra.metrics.keyspace.range_latency.dev",instance="10.102.107.214",mcac_filtered="true",cluster="dev-backend-cassandra3-cluster",dc="eu-west-dev-backend",rack="1c"} 115970287 1684912308370
Describe the solution you'd like
I'm not 100% sure what is exactly possible, but preferably it would be great that where
statements in a set(metric.name, attributes["new_name"])
line could be honored.
If that would result in undesirable side-effects when implemented directly into the processor, it would be great if there would be a possibility to do those steps by hand using something like a copy_metric(from_name, to_name)
. This way we could copy the metric to a new one with as name attributes["new_name"]
A note in the documentation about these limitations would also be very nice.
Describe alternatives you've considered
The metricstransformprocessor can also rename metrics, but substitution only works on with groups from the metric name and not from the experimental_match_labels
.
I've also thought about using the metricsgenerationprocessor and scale the metrics with 1.0, but with it's development stability level it's a bit too fresh for our tastes.
Additional context
No response