Skip to content

Commit 6a02bef

Browse files
committed
Ensure metric attributes don't override Scope during collisions
Signed-off-by: Arthur Silva Sens <arthursens2005@gmail.com>
1 parent 8a2067c commit 6a02bef

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

opentelemetry-prometheus/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,10 @@ fn get_attrs(kvs: &mut dyn Iterator<Item = (&Key, &Value)>, extra: &[LabelPair])
380380
let mut keys_map = BTreeMap::<String, Vec<String>>::new();
381381
for (key, value) in kvs {
382382
let key = utils::sanitize_prom_kv(key.as_str());
383+
if extra.iter().any(|label| label.name() == key) {
384+
continue;
385+
}
386+
383387
keys_map
384388
.entry(key)
385389
.and_modify(|v| v.push(value.to_string()))

opentelemetry-prometheus/tests/integration_test.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,42 @@ fn scope_info_labels_are_added_to_metric_points() {
5454
assert!(!output.contains("reserved-schema-url"));
5555
}
5656

57+
#[test]
58+
fn scope_info_labels_do_not_collide_with_metric_attributes() {
59+
let registry = prometheus::Registry::new();
60+
let exporter = ExporterBuilder::default()
61+
.with_registry(registry.clone())
62+
.build()
63+
.unwrap();
64+
let provider = SdkMeterProvider::builder().with_reader(exporter).build();
65+
66+
let scope = InstrumentationScope::builder("scope-test")
67+
.with_version("v1.2.3")
68+
.with_schema_url("https://opentelemetry.io/schemas/1.0.0")
69+
.build();
70+
let meter = provider.meter_with_scope(scope);
71+
72+
let counter = meter.u64_counter("scope.counter").build();
73+
counter.add(
74+
1,
75+
&[
76+
KeyValue::new("metric.attr", "metric-value"),
77+
KeyValue::new("otel_scope_name", "metric-scope-name"),
78+
KeyValue::new("otel_scope_version", "metric-scope-version"),
79+
KeyValue::new("otel_scope_schema_url", "metric-scope-schema-url"),
80+
],
81+
);
82+
83+
let output = gather_and_encode(registry);
84+
85+
assert!(output.contains(
86+
r#"scope_counter_total{metric_attr="metric-value",otel_scope_name="scope-test",otel_scope_version="v1.2.3",otel_scope_schema_url="https://opentelemetry.io/schemas/1.0.0"} 1"#
87+
));
88+
assert!(!output.contains("metric-scope-name"));
89+
assert!(!output.contains("metric-scope-version"));
90+
assert!(!output.contains("metric-scope-schema-url"));
91+
}
92+
5793
#[test]
5894
fn scope_info_labels_can_be_disabled() {
5995
let registry = prometheus::Registry::new();

0 commit comments

Comments
 (0)