Skip to content

Commit b7e1888

Browse files
kornercocelotl
andauthored
Prometheus exporter sanitize info metric (#3572)
* Prometheus Exporter sanitize info metric * Update CHANGELOG.md * Test Prometheus exporter target info sanitize * Prometheus exporter paint it black --------- Co-authored-by: Diego Hurtado <[email protected]>
1 parent 3cc459e commit b7e1888

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Prometheus exporter sanitize info metric ([#3572](https://github.com/open-telemetry/opentelemetry-python/pull/3572))
1011
- Remove Jaeger exporters
1112
([#3554](https://github.com/open-telemetry/opentelemetry-python/pull/3554))
1213
- Log stacktrace on `UNKNOWN` status OTLP export error

exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,10 @@ def _create_info_metric(
378378
self, name: str, description: str, attributes: Dict[str, str]
379379
) -> InfoMetricFamily:
380380
"""Create an Info Metric Family with list of attributes"""
381+
# sanitize the attribute names according to Prometheus rule
382+
attributes = {
383+
self._sanitize(key): value for key, value in attributes.items()
384+
}
381385
info = InfoMetricFamily(name, description, labels=attributes)
382386
info.add_metric(labels=list(attributes.keys()), value=attributes)
383387
return info

exporter/opentelemetry-exporter-prometheus/tests/test_prometheus_exporter.py

+32
Original file line numberDiff line numberDiff line change
@@ -389,3 +389,35 @@ def test_target_info_disabled(self):
389389
)
390390
self.assertNotIn("os", prometheus_metric.samples[0].labels)
391391
self.assertNotIn("histo", prometheus_metric.samples[0].labels)
392+
393+
def test_target_info_sanitize(self):
394+
metric_reader = PrometheusMetricReader()
395+
provider = MeterProvider(
396+
metric_readers=[metric_reader],
397+
resource=Resource(
398+
{
399+
"system.os": "Unix",
400+
"system.name": "Prometheus Target Sanitize",
401+
}
402+
),
403+
)
404+
meter = provider.get_meter("getting-started", "0.1.2")
405+
counter = meter.create_counter("counter")
406+
counter.add(1)
407+
prometheus_metric = list(metric_reader._collector.collect())[0]
408+
409+
self.assertEqual(type(prometheus_metric), InfoMetricFamily)
410+
self.assertEqual(prometheus_metric.name, "target")
411+
self.assertEqual(prometheus_metric.documentation, "Target metadata")
412+
self.assertTrue(len(prometheus_metric.samples) == 1)
413+
self.assertEqual(prometheus_metric.samples[0].value, 1)
414+
self.assertTrue(len(prometheus_metric.samples[0].labels) == 2)
415+
self.assertTrue("system_os" in prometheus_metric.samples[0].labels)
416+
self.assertEqual(
417+
prometheus_metric.samples[0].labels["system_os"], "Unix"
418+
)
419+
self.assertTrue("system_name" in prometheus_metric.samples[0].labels)
420+
self.assertEqual(
421+
prometheus_metric.samples[0].labels["system_name"],
422+
"Prometheus Target Sanitize",
423+
)

0 commit comments

Comments
 (0)