Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prometheus exporter handles instrumentation scope and prevents collisions #3072

Open
dashpole opened this issue Dec 2, 2022 · 4 comments
Open

Comments

@dashpole
Copy link

dashpole commented Dec 2, 2022

Now that open-telemetry/opentelemetry-specification#2703 is released, we can update the prometheus exporter to make use of OpenTelemetry scope, particularly for reducing collisions between metrics with the same name.

Describe the solution you'd like

There are a few components:

Note that the exporter SHOULD do the above by default, but may allow disabling the behavior.

@dashpole
Copy link
Author

dashpole commented Dec 2, 2022

One additional consideration: The prometheus spec says:

All lines for a given metric must be provided as one single group, with the optional HELP and TYPE lines first (in no particular order). Beyond that, reproducible sorting in repeated expositions is preferred but not required, i.e. do not sort if the computational cost is prohibitive.

When name collisions between two metrics occur, and we handle that by combining the two metic groups (e.g. adopting one of the two descriptions), we have to make sure the metrics points for a given metric family are grouped together. For example, we might produce these metrics today, if we had a foo metric in two different scopes:

# TYPE foo gauge
# HELP foo help text a
foo{} 1
# TYPE bar gauge
# HELP bar another useless gauge
bar{} 1
# TYPE foo gauge
# HELP foo help text b
foo{} 1

This would not be valid per the prometheus spec. If we adopted the spec for instrumentation scope labels, and prevented duplicate type and descriptions, we would get:

# TYPE foo gauge
# HELP foo help text a
foo{otel_scope_name ="scope1", otel_scope_version ="1.2.3"} 1
# TYPE bar gauge
# HELP bar another useless gauge
bar{otel_scope_name ="scope1", otel_scope_version ="1.2.3"} 1
foo{otel_scope_name ="scope2", otel_scope_version ="1.2.3"} 1

But we still need to make sure the resulting metric lines are grouped by metric name like this:

# TYPE foo gauge
# HELP foo help text a
foo{otel_scope_name ="scope1", otel_scope_version ="1.2.3"} 1
foo{otel_scope_name ="scope2", otel_scope_version ="1.2.3"} 1
# TYPE bar gauge
# HELP bar another useless gauge
bar{otel_scope_name ="scope1", otel_scope_version ="1.2.3"} 1

@XuanWang-Amos
Copy link

Hi @dashpole, has this feature been implemented yet?

@dashpole
Copy link
Author

not that i'm aware of

@XuanWang-Amos
Copy link

Thanks for the reply, is there any plans to implement this? I'm from gRPC team and working on Python OpenTelemetry integration, without those labels Python will fail our interoperability tests.

XuanWang-Amos added a commit to grpc/psm-interop that referenced this issue Jun 6, 2024
Ad-hoc run:
- [x]
[grpc/core/master/linux/psm-csm-python](https://source.cloud.google.com/results/invocations/ba5c2183-34e0-4442-89e9-afd65eff94b1)

### Note
* Removed `otel_scope_name` and `otel_scope_version` tag for Python
because python Prometheus exporter doesn't have them yet:
open-telemetry/opentelemetry-python#3072
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants