Skip to content

Selectively rename metrics #22735

@PW999

Description

@PW999

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions