Skip to content

Commit 401037e

Browse files
committed
OpenCensus agent exporter fixes
- Pass start_timestamp to the timeseries in OC exporter for stateful metrics - Convert label values to strings, just in case
1 parent 4a922d6 commit 401037e

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

ext/opentelemetry-ext-opencensusexporter/src/opentelemetry/ext/opencensusexporter/metrics_exporter/__init__.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
"""OpenCensus Collector Metrics Exporter."""
1616

1717
import logging
18-
from typing import Sequence
18+
from typing import Optional, Sequence
1919

2020
import grpc
21+
from google.protobuf.timestamp_pb2 import Timestamp
2122
from opencensus.proto.agent.metrics.v1 import (
2223
metrics_service_pb2,
2324
metrics_service_pb2_grpc,
@@ -65,6 +66,8 @@ def __init__(
6566
self.client = client
6667

6768
self.node = utils.get_node(service_name, host_name)
69+
self.exporter_start_time_proto = Timestamp()
70+
self.exporter_start_time_proto.GetCurrentTime()
6871

6972
def export(
7073
self, metric_records: Sequence[MetricRecord]
@@ -89,7 +92,9 @@ def shutdown(self) -> None:
8992
def generate_metrics_requests(
9093
self, metrics: Sequence[MetricRecord]
9194
) -> metrics_service_pb2.ExportMetricsServiceRequest:
92-
collector_metrics = translate_to_collector(metrics)
95+
collector_metrics = translate_to_collector(
96+
metrics, self.exporter_start_time_proto
97+
)
9398
service_request = metrics_service_pb2.ExportMetricsServiceRequest(
9499
node=self.node, metrics=collector_metrics
95100
)
@@ -99,6 +104,7 @@ def generate_metrics_requests(
99104
# pylint: disable=too-many-branches
100105
def translate_to_collector(
101106
metric_records: Sequence[MetricRecord],
107+
exporter_start_timestamp: Optional[Timestamp],
102108
) -> Sequence[metrics_pb2.Metric]:
103109
collector_metrics = []
104110
for metric_record in metric_records:
@@ -109,7 +115,7 @@ def translate_to_collector(
109115
label_keys.append(metrics_pb2.LabelKey(key=label_tuple[0]))
110116
label_values.append(
111117
metrics_pb2.LabelValue(
112-
has_value=label_tuple[1] is not None, value=label_tuple[1]
118+
has_value=label_tuple[1] is not None, value=str(label_tuple[1])
113119
)
114120
)
115121

@@ -121,9 +127,17 @@ def translate_to_collector(
121127
label_keys=label_keys,
122128
)
123129

130+
# If cumulative and stateful, explicitly set the start_timestamp to
131+
# exporter start time.
132+
if metric_record.instrument.meter.batcher.stateful:
133+
start_timestamp = exporter_start_timestamp
134+
else:
135+
start_timestamp = None
136+
124137
timeseries = metrics_pb2.TimeSeries(
125138
label_values=label_values,
126139
points=[get_collector_point(metric_record)],
140+
start_timestamp=start_timestamp,
127141
)
128142
collector_metrics.append(
129143
metrics_pb2.Metric(

ext/opentelemetry-ext-opencensusexporter/tests/test_otcollector_metrics_exporter.py

+20-6
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def setUpClass(cls):
4141
# pylint: disable=protected-access
4242
metrics.set_meter_provider(MeterProvider())
4343
cls._meter = metrics.get_meter(__name__)
44-
cls._labels = {"environment": "staging"}
44+
cls._labels = {"environment": "staging", "number": 321}
4545
cls._key_labels = get_labels_as_key(cls._labels)
4646

4747
def test_constructor(self):
@@ -119,7 +119,7 @@ def test_export(self):
119119
client=mock_client, host_name=host_name
120120
)
121121
test_metric = self._meter.create_metric(
122-
"testname", "testdesc", "unit", int, Counter, ["environment"]
122+
"testname", "testdesc", "unit", int, Counter, self._labels.keys(),
123123
)
124124
record = MetricRecord(
125125
test_metric, self._key_labels, aggregate.SumAggregator(),
@@ -142,13 +142,21 @@ def test_export(self):
142142

143143
def test_translate_to_collector(self):
144144
test_metric = self._meter.create_metric(
145-
"testname", "testdesc", "unit", int, Counter, ["environment"]
145+
"testname",
146+
"testdesc",
147+
"unit",
148+
int,
149+
Counter,
150+
["environment", "number"],
146151
)
147152
aggregator = aggregate.SumAggregator()
148153
aggregator.update(123)
149154
aggregator.take_checkpoint()
150155
record = MetricRecord(test_metric, self._key_labels, aggregator,)
151-
output_metrics = metrics_exporter.translate_to_collector([record])
156+
start_timestamp = Timestamp()
157+
output_metrics = metrics_exporter.translate_to_collector(
158+
[record], start_timestamp,
159+
)
152160
self.assertEqual(len(output_metrics), 1)
153161
self.assertIsInstance(output_metrics[0], metrics_pb2.Metric)
154162
self.assertEqual(output_metrics[0].metric_descriptor.name, "testname")
@@ -161,14 +169,20 @@ def test_translate_to_collector(self):
161169
metrics_pb2.MetricDescriptor.CUMULATIVE_INT64,
162170
)
163171
self.assertEqual(
164-
len(output_metrics[0].metric_descriptor.label_keys), 1
172+
len(output_metrics[0].metric_descriptor.label_keys), 2
165173
)
166174
self.assertEqual(
167175
output_metrics[0].metric_descriptor.label_keys[0].key,
168176
"environment",
169177
)
178+
self.assertEqual(
179+
output_metrics[0].metric_descriptor.label_keys[1].key, "number",
180+
)
170181
self.assertEqual(len(output_metrics[0].timeseries), 1)
171-
self.assertEqual(len(output_metrics[0].timeseries[0].label_values), 1)
182+
self.assertEqual(len(output_metrics[0].timeseries[0].label_values), 2)
183+
self.assertEqual(
184+
output_metrics[0].timeseries[0].start_timestamp, start_timestamp
185+
)
172186
self.assertEqual(
173187
output_metrics[0].timeseries[0].label_values[0].has_value, True
174188
)

0 commit comments

Comments
 (0)