Skip to content

Commit beb70f7

Browse files
authored
Exporter/Prometheus: Convert None label values to empty string. (census-instrumentation#486)
* Exporter/Prometheus: Convert None label values to empty string. * Use list comprehension.
1 parent e12909e commit beb70f7

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

opencensus/stats/exporters/prometheus_exporter.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,16 @@ def to_metric(self, desc, tag_values, agg_data):
166166
metric_description = desc['documentation']
167167
label_keys = desc['labels']
168168

169+
# Prometheus requires that all tag values be strings hence
170+
# the need to cast none to the empty string before exporting. See
171+
# https://github.com/census-instrumentation/opencensus-python/issues/480
172+
tag_values = [tv if tv else "" for tv in tag_values]
173+
169174
if isinstance(agg_data, aggregation_data_module.CountAggregationData):
170175
metric = CounterMetricFamily(name=metric_name,
171176
documentation=metric_description,
172177
labels=label_keys)
173-
metric.add_metric(labels=list(tag_values),
178+
metric.add_metric(labels=tag_values,
174179
value=agg_data.count_data)
175180
return metric
176181

@@ -186,7 +191,7 @@ def to_metric(self, desc, tag_values, agg_data):
186191
metric = HistogramMetricFamily(name=metric_name,
187192
documentation=metric_description,
188193
labels=label_keys)
189-
metric.add_metric(labels=list(tag_values),
194+
metric.add_metric(labels=tag_values,
190195
buckets=list(points.items()),
191196
sum_value=agg_data.sum,)
192197
return metric
@@ -196,7 +201,7 @@ def to_metric(self, desc, tag_values, agg_data):
196201
metric = UntypedMetricFamily(name=metric_name,
197202
documentation=metric_description,
198203
labels=label_keys)
199-
metric.add_metric(labels=list(tag_values),
204+
metric.add_metric(labels=tag_values,
200205
value=agg_data.sum_data)
201206
return metric
202207

@@ -205,7 +210,7 @@ def to_metric(self, desc, tag_values, agg_data):
205210
metric = GaugeMetricFamily(name=metric_name,
206211
documentation=metric_description,
207212
labels=label_keys)
208-
metric.add_metric(labels=list(tag_values),
213+
metric.add_metric(labels=tag_values,
209214
value=agg_data.value)
210215
return metric
211216

tests/unit/stats/exporter/test_prometheus_stats.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,25 @@ def test_collector_collect(self):
240240
self.assertEqual('histogram', metric.type)
241241
self.assertEqual(4, len(metric.samples))
242242

243+
def test_collector_collect_with_none_label_value(self):
244+
agg = aggregation_module.LastValueAggregation(256)
245+
view = view_module.View("new_view", "processed video size over time",
246+
[FRONTEND_KEY], VIDEO_SIZE_MEASURE, agg)
247+
registry = mock.Mock()
248+
options = prometheus.Options("test3", 8001, "localhost", registry)
249+
collector = prometheus.Collector(options=options)
250+
collector.register_view(view)
251+
desc = collector.registered_views['test3_new_view']
252+
metric = collector.to_metric(
253+
desc=desc, tag_values=[None], agg_data=agg.aggregation_data)
254+
255+
self.assertEqual(1, len(metric.samples))
256+
sample = metric.samples[0]
257+
# Sample is a namedtuple
258+
# ('Sample', ['name', 'labels', 'value', 'timestamp', 'exemplar'])
259+
label_map = sample[1]
260+
self.assertEqual({"myorg_keys_frontend": ""}, label_map)
261+
243262

244263
class TestPrometheusStatsExporter(unittest.TestCase):
245264
def test_exporter_constructor_no_namespace(self):

0 commit comments

Comments
 (0)