Skip to content

Commit 433cf25

Browse files
alrexmauriciovasquezbernal
authored andcommitted
testing: add in-memory metrics exporter (open-telemetry#653)
Adding InMemoryMetricsExporter to help with unit-tests, as part of the change i'm also adding meter_provider and memory_metrics_exporter to TestBase Co-authored-by: Mauricio Vásquez <[email protected]>
1 parent c3f163f commit 433cf25

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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 threading
16+
from typing import Sequence
17+
18+
from . import MetricRecord, MetricsExporter, MetricsExportResult
19+
20+
21+
class InMemoryMetricsExporter(MetricsExporter):
22+
"""Implementation of `MetricsExporter` that stores metrics in memory.
23+
24+
This class can be used for testing purposes. It stores exported metrics
25+
in a list in memory that can be retrieved using the
26+
:func:`.get_exported_metrics` method.
27+
"""
28+
29+
def __init__(self):
30+
self._exported_metrics = []
31+
self._stopped = False
32+
self._lock = threading.Lock()
33+
34+
def clear(self):
35+
"""Clear list of collected metrics."""
36+
with self._lock:
37+
self._exported_metrics.clear()
38+
39+
def export(
40+
self, metric_records: Sequence[MetricRecord]
41+
) -> MetricsExportResult:
42+
if self._stopped:
43+
return MetricsExportResult.FAILURE
44+
with self._lock:
45+
self._exported_metrics.extend(metric_records)
46+
return MetricsExportResult.SUCCESS
47+
48+
def get_exported_metrics(self):
49+
"""Get list of collected metrics."""
50+
with self._lock:
51+
return tuple(self._exported_metrics)
52+
53+
def shutdown(self) -> None:
54+
"""Shuts down the exporter.
55+
56+
Called when the SDK is shut down.
57+
"""
58+
self._stopped = True

tests/util/src/opentelemetry/test/test_base.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@
1616
import unittest
1717
from contextlib import contextmanager
1818

19+
from opentelemetry import metrics as metrics_api
1920
from opentelemetry import trace as trace_api
21+
from opentelemetry.sdk.metrics import MeterProvider
22+
from opentelemetry.sdk.metrics.export.in_memory_metrics_exporter import (
23+
InMemoryMetricsExporter,
24+
)
2025
from opentelemetry.sdk.trace import TracerProvider, export
2126
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
2227
InMemorySpanExporter,
@@ -26,14 +31,19 @@
2631
class TestBase(unittest.TestCase):
2732
@classmethod
2833
def setUpClass(cls):
29-
cls.original_provider = trace_api.get_tracer_provider()
34+
cls.original_tracer_provider = trace_api.get_tracer_provider()
3035
result = cls.create_tracer_provider()
3136
cls.tracer_provider, cls.memory_exporter = result
3237
trace_api.set_tracer_provider(cls.tracer_provider)
38+
cls.original_meter_provider = metrics_api.get_meter_provider()
39+
result = cls.create_meter_provider()
40+
cls.meter_provider, cls.memory_metrics_exporter = result
41+
metrics_api.set_meter_provider(cls.meter_provider)
3342

3443
@classmethod
3544
def tearDownClass(cls):
36-
trace_api.set_tracer_provider(cls.original_provider)
45+
trace_api.set_tracer_provider(cls.original_tracer_provider)
46+
metrics_api.set_meter_provider(cls.original_meter_provider)
3747

3848
def setUp(self):
3949
self.memory_exporter.clear()
@@ -53,7 +63,7 @@ def create_tracer_provider(**kwargs):
5363
5464
Returns:
5565
A list with the tracer provider in the first element and the
56-
memory exporter in the second.
66+
in-memory span exporter in the second.
5767
"""
5868
tracer_provider = TracerProvider(**kwargs)
5969
memory_exporter = InMemorySpanExporter()
@@ -62,6 +72,20 @@ def create_tracer_provider(**kwargs):
6272

6373
return tracer_provider, memory_exporter
6474

75+
@staticmethod
76+
def create_meter_provider(**kwargs):
77+
"""Helper to create a configured meter provider
78+
79+
Creates a `MeterProvider` and an `InMemoryMetricsExporter`.
80+
81+
Returns:
82+
A list with the meter provider in the first element and the
83+
in-memory metrics exporter in the second
84+
"""
85+
meter_provider = MeterProvider(**kwargs)
86+
memory_exporter = InMemoryMetricsExporter()
87+
return meter_provider, memory_exporter
88+
6589
@staticmethod
6690
@contextmanager
6791
def disable_logging(highest_level=logging.CRITICAL):

0 commit comments

Comments
 (0)