Skip to content

Commit e7b7aa9

Browse files
committed
Complete metric exporter format and update OTLP exporter
1 parent 2a7e3fc commit e7b7aa9

6 files changed

Lines changed: 83 additions & 73 deletions

File tree

exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_metric_exporter/__init__.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
from opentelemetry.sdk.environment_variables import (
3434
OTEL_EXPORTER_OTLP_METRICS_INSECURE,
3535
)
36-
from opentelemetry.sdk._metrics.data import (
37-
MetricData,
36+
from opentelemetry.sdk._metrics.point import (
37+
Metric,
3838
)
3939

4040
from opentelemetry.sdk._metrics.export import (
@@ -45,9 +45,7 @@
4545

4646
class OTLPMetricExporter(
4747
MetricExporter,
48-
OTLPExporterMixin[
49-
MetricData, ExportMetricsServiceRequest, MetricExportResult
50-
],
48+
OTLPExporterMixin[Metric, ExportMetricsServiceRequest, MetricExportResult],
5149
):
5250
_result = MetricExportResult
5351
_stub = MetricsServiceStub
@@ -79,13 +77,13 @@ def __init__(
7977
)
8078

8179
def _translate_data(
82-
self, data: Sequence[MetricData]
80+
self, data: Sequence[Metric]
8381
) -> ExportMetricsServiceRequest:
8482
sdk_resource_instrumentation_library_metrics = {}
8583
self._collector_metric_kwargs = {}
8684

87-
for metric_data in data:
88-
resource = metric_data.metric.resource
85+
for metric in data:
86+
resource = metric.resource
8987
instrumentation_library_map = (
9088
sdk_resource_instrumentation_library_metrics.get(resource, {})
9189
)
@@ -95,26 +93,26 @@ def _translate_data(
9593
] = instrumentation_library_map
9694

9795
instrumentation_library_metrics = instrumentation_library_map.get(
98-
metric_data.instrumentation_info
96+
metric.instrumentation_info
9997
)
10098

10199
if not instrumentation_library_metrics:
102-
if metric_data.instrumentation_info is not None:
100+
if metric.instrumentation_info is not None:
103101
instrumentation_library_map[
104-
metric_data.instrumentation_info
102+
metric.instrumentation_info
105103
] = InstrumentationLibraryMetrics(
106104
instrumentation_library=InstrumentationLibrary(
107-
name=metric_data.instrumentation_info.name,
108-
version=metric_data.instrumentation_info.version,
105+
name=metric.instrumentation_info.name,
106+
version=metric.instrumentation_info.version,
109107
)
110108
)
111109
else:
112110
instrumentation_library_map[
113-
metric_data.instrumentation_info
111+
metric.instrumentation_info
114112
] = InstrumentationLibraryMetrics()
115113

116114
instrumentation_library_metrics = instrumentation_library_map.get(
117-
metric_data.instrumentation_info
115+
metric.instrumentation_info
118116
)
119117

120118
instrumentation_library_metrics.metrics.append(
@@ -128,7 +126,8 @@ def _translate_data(
128126
)
129127
)
130128

131-
def export(self, metrics: Sequence[MetricData]) -> MetricExportResult:
129+
def export(self, metrics: Sequence[Metric]) -> MetricExportResult:
130+
print("Got metrics!!!\n", metrics)
132131
return self._export(metrics)
133132

134133
def shutdown(self):

exporter/opentelemetry-exporter-otlp-proto-grpc/tests/metrics/test_otlp_metrics_exporter.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@
3030
MetricsServiceServicer,
3131
add_MetricsServiceServicer_to_server,
3232
)
33-
from opentelemetry.sdk._metrics.data import Metric, MetricData
3433
from opentelemetry.sdk._metrics.export import MetricExportResult
34+
from opentelemetry.sdk._metrics.point import (
35+
AggregationTemporality,
36+
Metric,
37+
Sum,
38+
)
3539
from opentelemetry.sdk.environment_variables import (
3640
OTEL_EXPORTER_OTLP_METRICS_INSECURE,
3741
)
@@ -96,13 +100,22 @@ def setUp(self):
96100

97101
self.server.start()
98102

99-
self.metric_data_1 = MetricData(
100-
metric=Metric(
101-
resource=SDKResource({"key": "value"}),
102-
),
103+
self.metric_data_1 = Metric(
104+
resource=SDKResource({"key": "value"}),
103105
instrumentation_info=InstrumentationInfo(
104106
"first_name", "first_version"
105107
),
108+
attributes={},
109+
description="foo",
110+
name="foometric",
111+
unit="s",
112+
point=Sum(
113+
aggregation_temporality=AggregationTemporality.CUMULATIVE,
114+
is_monotonic=True,
115+
start_time_unix_nano=1641946015139533244,
116+
time_unix_nano=1641946016139533244,
117+
value=33,
118+
),
106119
)
107120

108121
def tearDown(self):

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/aggregation.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,21 @@
1414

1515
from abc import ABC, abstractmethod
1616
from collections import OrderedDict
17-
from enum import IntEnum
1817
from logging import getLogger
1918
from math import inf
2019
from threading import Lock
2120
from typing import Generic, Optional, Sequence, TypeVar
2221

2322
from opentelemetry.sdk._metrics.measurement import Measurement
24-
from opentelemetry.sdk._metrics.point import Gauge, Histogram, PointT, Sum
23+
from opentelemetry.sdk._metrics.point import (
24+
AggregationTemporality,
25+
Gauge,
26+
Histogram,
27+
PointT,
28+
Sum,
29+
)
2530
from opentelemetry.util._time import _time_ns
2631

27-
28-
class AggregationTemporality(IntEnum):
29-
UNSPECIFIED = 0
30-
DELTA = 1
31-
CUMULATIVE = 2
32-
33-
3432
_PointVarT = TypeVar("_PointVarT", bound=PointT)
3533

3634
_logger = getLogger(__name__)

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/data.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/export/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from sys import stdout
1919
from typing import IO, Callable, Sequence
2020

21-
from opentelemetry.sdk._metrics.data import Metric, MetricData
21+
from opentelemetry.sdk._metrics.point import Metric
2222

2323

2424
class MetricExportResult(Enum):
@@ -33,7 +33,8 @@ class MetricExporter(ABC):
3333
in their own format.
3434
"""
3535

36-
def export(self, metrics: Sequence[MetricData]) -> "MetricExportResult":
36+
@abstractmethod
37+
def export(self, metrics: Sequence[Metric]) -> "MetricExportResult":
3738
"""Exports a batch of telemetry data.
3839
3940
Args:
@@ -68,9 +69,9 @@ def __init__(
6869
self.out = out
6970
self.formatter = formatter
7071

71-
def export(self, metrics: Sequence[MetricData]) -> MetricExportResult:
72-
for data in metrics:
73-
self.out.write(self.formatter(data.metric))
72+
def export(self, metrics: Sequence[Metric]) -> MetricExportResult:
73+
for metric in metrics:
74+
self.out.write(self.formatter(metric))
7475
self.out.flush()
7576
return MetricExportResult.SUCCESS
7677

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/point.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,27 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from dataclasses import dataclass
15+
import json
16+
from dataclasses import asdict, dataclass
17+
from enum import IntEnum
1618
from typing import Sequence, Union
1719

20+
from opentelemetry.sdk.resources import Attributes, Resource
21+
from opentelemetry.sdk.util.instrumentation import InstrumentationInfo
22+
23+
24+
class AggregationTemporality(IntEnum):
25+
UNSPECIFIED = 0
26+
DELTA = 1
27+
CUMULATIVE = 2
28+
1829

1930
@dataclass(frozen=True)
2031
class Sum:
2132
start_time_unix_nano: int
2233
time_unix_nano: int
2334
value: Union[int, float]
24-
aggregation_temporality: int
35+
aggregation_temporality: AggregationTemporality
2536
is_monotonic: bool
2637

2738

@@ -37,7 +48,30 @@ class Histogram:
3748
time_unix_nano: int
3849
bucket_counts: Sequence[int]
3950
explicit_bounds: Sequence[float]
40-
aggregation_temporality: int
51+
aggregation_temporality: AggregationTemporality
4152

4253

4354
PointT = Union[Sum, Gauge, Histogram]
55+
56+
57+
@dataclass(frozen=True)
58+
class Metric:
59+
"""Represents a metric point in the OpenTelemetry data model to be exported
60+
61+
Concrete metric types contain all the information as in the OTLP proto definitions
62+
(https://tinyurl.com/7h6yx24v) but are flattened as much as possible.
63+
"""
64+
65+
# common fields to all metric kinds
66+
attributes: Attributes
67+
description: str
68+
instrumentation_info: InstrumentationInfo
69+
name: str
70+
resource: Resource
71+
unit: str
72+
73+
point: PointT
74+
"""Contains non-common fields for the given metric"""
75+
76+
def to_json(self) -> str:
77+
return json.dumps(asdict(self))

0 commit comments

Comments
 (0)