Skip to content

Commit 056313c

Browse files
committed
Add integration tests
1 parent 02bdfa8 commit 056313c

File tree

1 file changed

+180
-0
lines changed

1 file changed

+180
-0
lines changed
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
import os
16+
from unittest import TestCase, mock
17+
18+
from opentelemetry import trace
19+
from opentelemetry.sdk.metrics import Exemplar, MeterProvider
20+
from opentelemetry.sdk.metrics.export import (
21+
AggregationTemporality,
22+
InMemoryMetricReader,
23+
Metric,
24+
NumberDataPoint,
25+
Sum,
26+
)
27+
from opentelemetry.trace import SpanContext, TraceFlags
28+
29+
30+
class TestExemplars(TestCase):
31+
TRACE_ID = int("d4cda95b652f4a1592b449d5929fda1b", 16)
32+
SPAN_ID = int("6e0c63257de34c92", 16)
33+
34+
@mock.patch.dict(os.environ, {"OTEL_METRICS_EXEMPLAR_FILTER": "always_on"})
35+
def test_always_on_exemplars(self):
36+
reader = InMemoryMetricReader()
37+
meter_provider = MeterProvider(
38+
metric_readers=[reader],
39+
)
40+
meter = meter_provider.get_meter("testmeter")
41+
counter = meter.create_counter("testcounter")
42+
counter.add(10, {"label": "value1"})
43+
data = reader.get_metrics_data()
44+
45+
metrics = data.resource_metrics[0].scope_metrics[0].metrics
46+
self.assertEqual(
47+
metrics,
48+
[
49+
Metric(
50+
name="testcounter",
51+
description="",
52+
unit="",
53+
data=Sum(
54+
data_points=[
55+
NumberDataPoint(
56+
attributes={"label": "value1"},
57+
start_time_unix_nano=mock.ANY,
58+
time_unix_nano=mock.ANY,
59+
value=10,
60+
exemplars=[
61+
Exemplar(
62+
filtered_attributes={},
63+
value=10,
64+
time_unix_nano=mock.ANY,
65+
span_id=None,
66+
trace_id=None,
67+
),
68+
],
69+
)
70+
],
71+
aggregation_temporality=AggregationTemporality.CUMULATIVE,
72+
is_monotonic=True,
73+
),
74+
)
75+
],
76+
)
77+
78+
@mock.patch.dict(
79+
os.environ, {"OTEL_METRICS_EXEMPLAR_FILTER": "trace_based"}
80+
)
81+
def test_trace_based_exemplars(self):
82+
span_context = SpanContext(
83+
trace_id=self.TRACE_ID,
84+
span_id=self.SPAN_ID,
85+
is_remote=False,
86+
trace_flags=TraceFlags(TraceFlags.SAMPLED),
87+
trace_state={},
88+
)
89+
span = trace.NonRecordingSpan(span_context)
90+
trace.set_span_in_context(span)
91+
92+
reader = InMemoryMetricReader()
93+
meter_provider = MeterProvider(
94+
metric_readers=[reader],
95+
)
96+
meter = meter_provider.get_meter("testmeter")
97+
counter = meter.create_counter("testcounter")
98+
counter.add(10, {"label": "value1"})
99+
data = reader.get_metrics_data()
100+
101+
metrics = data.resource_metrics[0].scope_metrics[0].metrics
102+
self.assertEqual(
103+
metrics,
104+
[
105+
Metric(
106+
name="testcounter",
107+
description="",
108+
unit="",
109+
data=Sum(
110+
data_points=[
111+
NumberDataPoint(
112+
attributes={"label": "value1"},
113+
start_time_unix_nano=mock.ANY,
114+
time_unix_nano=mock.ANY,
115+
value=10,
116+
exemplars=[
117+
Exemplar(
118+
filtered_attributes={},
119+
value=10,
120+
time_unix_nano=mock.ANY,
121+
span_id=self.SPAN_ID,
122+
trace_id=self.TRACE_ID,
123+
),
124+
],
125+
)
126+
],
127+
aggregation_temporality=AggregationTemporality.CUMULATIVE,
128+
is_monotonic=True,
129+
),
130+
)
131+
],
132+
)
133+
134+
@mock.patch.dict(
135+
os.environ, {"OTEL_METRICS_EXEMPLAR_FILTER": "always_off"}
136+
)
137+
def test_always_off_exemplars(self):
138+
span_context = SpanContext(
139+
trace_id=self.TRACE_ID,
140+
span_id=self.SPAN_ID,
141+
is_remote=False,
142+
trace_flags=TraceFlags(TraceFlags.SAMPLED),
143+
trace_state={},
144+
)
145+
span = trace.NonRecordingSpan(span_context)
146+
trace.set_span_in_context(span)
147+
148+
reader = InMemoryMetricReader()
149+
meter_provider = MeterProvider(
150+
metric_readers=[reader],
151+
)
152+
meter = meter_provider.get_meter("testmeter")
153+
counter = meter.create_counter("testcounter")
154+
counter.add(10, {"label": "value1"})
155+
data = reader.get_metrics_data()
156+
157+
metrics = data.resource_metrics[0].scope_metrics[0].metrics
158+
self.assertEqual(
159+
metrics,
160+
[
161+
Metric(
162+
name="testcounter",
163+
description="",
164+
unit="",
165+
data=Sum(
166+
data_points=[
167+
NumberDataPoint(
168+
attributes={"label": "value1"},
169+
start_time_unix_nano=mock.ANY,
170+
time_unix_nano=mock.ANY,
171+
value=10,
172+
exemplars=[],
173+
)
174+
],
175+
aggregation_temporality=AggregationTemporality.CUMULATIVE,
176+
is_monotonic=True,
177+
),
178+
)
179+
],
180+
)

0 commit comments

Comments
 (0)