22
33import opentelemetry .trace
44import opentelemetry ._logs ._internal
5+ import opentelemetry ._events
56import opentelemetry .metrics ._internal
67from opentelemetry .util ._once import Once
78
1314 get_logger_provider ,
1415 set_logger_provider
1516)
17+ from opentelemetry ._events import (
18+ get_event_logger_provider ,
19+ set_event_logger_provider
20+ )
1621from opentelemetry .metrics import (
1722 get_meter_provider ,
1823 set_meter_provider
1924)
2025
26+ from opentelemetry .sdk ._events import EventLoggerProvider
2127from opentelemetry .sdk ._logs import LoggerProvider
2228from opentelemetry .sdk ._logs .export import SimpleLogRecordProcessor
23- from opentelemetry .sdk ._logs ._internal import SynchronousMultiLogRecordProcessor
24- from opentelemetry .sdk ._logs ._internal .export .in_memory_log_exporter import InMemoryLogExporter
29+ from opentelemetry .sdk ._logs .export import InMemoryLogExporter
2530from opentelemetry .sdk .metrics ._internal .export import InMemoryMetricReader
2631from opentelemetry .sdk .metrics import MeterProvider
2732from opentelemetry .sdk .trace .export .in_memory_span_exporter import InMemorySpanExporter
2833from opentelemetry .sdk .trace import TracerProvider
2934from opentelemetry .sdk .trace .export import SimpleSpanProcessor
3035
3136
37+
3238def _bypass_otel_once ():
3339 opentelemetry .trace ._TRACER_PROVIDER_SET_ONCE = Once ()
3440 opentelemetry ._logs ._internal ._LOGGER_PROVIDER_SET_ONCE = Once ()
41+ opentelemetry ._events ._EVENT_LOGGER_PROVIDER_SET_ONCE = Once ()
3542 opentelemetry .metrics ._internal ._METER_PROVIDER_SET_ONCE = Once ()
3643
3744
@@ -41,15 +48,70 @@ class OTelProviderSnapshot:
4148 def __init__ (self ):
4249 self ._tracer_provider = get_tracer_provider ()
4350 self ._logger_provider = get_logger_provider ()
51+ self ._event_logger_provider = get_event_logger_provider ()
4452 self ._meter_provider = get_meter_provider ()
4553
4654 def restore (self ):
4755 _bypass_otel_once ()
4856 set_tracer_provider (self ._tracer_provider )
4957 set_logger_provider (self ._logger_provider )
58+ set_event_logger_provider (self ._event_logger_provider )
5059 set_meter_provider (self ._meter_provider )
5160
5261
62+ class _LogWrapper :
63+
64+ def __init__ (self , log_data ):
65+ self ._log_data = log_data
66+
67+ @property
68+ def scope (self ):
69+ return self ._log_data .instrumentation_scope
70+
71+ @property
72+ def resource (self ):
73+ return self ._log_data .log_record .resource
74+
75+ @property
76+ def attributes (self ):
77+ return self ._log_data .log_record .attributes
78+
79+ @property
80+ def body (self ):
81+ return self ._log_data .log_record .body
82+
83+ def __str__ (self ):
84+ return self ._log_data .log_record .to_json ()
85+
86+
87+ class _MetricDataPointWrapper :
88+
89+ def __init__ (self , resource , scope , metric ):
90+ self ._resource = resource
91+ self ._scope = scope
92+ self ._metric = metric
93+
94+ @property
95+ def resource (self ):
96+ return self ._resource
97+
98+ @property
99+ def scope (self ):
100+ return self ._scope
101+
102+ @property
103+ def metric (self ):
104+ return self ._metric
105+
106+ @property
107+ def name (self ):
108+ return self ._metric .name
109+
110+ @property
111+ def data (self ):
112+ return self ._metric .data
113+
114+
53115class OTelMocker :
54116
55117 def __init__ (self ):
@@ -58,6 +120,8 @@ def __init__(self):
58120 self ._traces = InMemorySpanExporter ()
59121 self ._metrics = InMemoryMetricReader ()
60122 self ._spans = []
123+ self ._finished_logs = []
124+ self ._metrics_data = []
61125
62126 def install (self ):
63127 self ._snapshot = OTelProviderSnapshot ()
@@ -70,15 +134,26 @@ def uninstall(self):
70134 self ._snapshot .restore ()
71135
72136 def get_finished_logs (self ):
73- return self ._logs .get_finished_logs ()
74-
137+ for log_data in self ._logs .get_finished_logs ():
138+ self ._finished_logs .append (_LogWrapper (log_data ))
139+ return self ._finished_logs
140+
75141 def get_finished_spans (self ):
76142 for span in self ._traces .get_finished_spans ():
77143 self ._spans .append (span )
78144 return self ._spans
79145
80146 def get_metrics_data (self ):
81- return self ._metrics .get_metrics_data ()
147+ data = self ._metrics .get_metrics_data ()
148+ if data is not None :
149+ for resource_metric in data .resource_metrics :
150+ resource = resource_metric .resource
151+ for scope_metrics in resource_metric .scope_metrics :
152+ scope = scope_metrics .scope
153+ for metric in scope_metrics .metrics :
154+ wrapper = _MetricDataPointWrapper (resource , scope , metric )
155+ self ._metrics_data .append (wrapper )
156+ return self ._metrics_data
82157
83158 def get_span_named (self , name ):
84159 for span in self .get_finished_spans ():
@@ -91,11 +166,41 @@ def assert_has_span_named(self, name):
91166 finished_spans = self .get_finished_spans ()
92167 assert span is not None , 'Could not find span named "{}"; finished spans: {}' .format (name , finished_spans )
93168
169+ def get_event_named (self , event_name ):
170+ for event in self .get_finished_logs ():
171+ event_name_attr = event .attributes .get ('event.name' )
172+ if event_name_attr is None :
173+ continue
174+ if event_name_attr == event_name :
175+ return event
176+ return None
177+
178+ def assert_has_event_named (self , name ):
179+ event = self .get_event_named (name )
180+ finished_logs = self .get_finished_logs ()
181+ assert event is not None , 'Could not find event named "{}"; finished logs: {}' .format (name , finished_logs )
182+
183+ def assert_does_not_have_event_named (self , name ):
184+ event = self .get_event_named (name )
185+ assert event is None , 'Unexpected event: {}' .format (event )
186+
187+ def get_metrics_data_named (self , name ):
188+ results = []
189+ for entry in self .get_metrics_data ():
190+ if entry .name == name :
191+ results .append (entry )
192+ return results
193+
194+ def assert_has_metrics_data_named (self , name ):
195+ data = self .get_metrics_data_named (name )
196+ assert len (data ) > 0
197+
94198 def _install_logs (self ):
95- processor = SynchronousMultiLogRecordProcessor ()
96- processor .add_log_record_processor (SimpleLogRecordProcessor (self ._logs ))
97- provider = LoggerProvider (processor )
199+ provider = LoggerProvider ()
200+ provider .add_log_record_processor (SimpleLogRecordProcessor (self ._logs ))
98201 set_logger_provider (provider )
202+ event_provider = EventLoggerProvider (logger_provider = provider )
203+ set_event_logger_provider (event_provider )
99204
100205 def _install_metrics (self ):
101206 provider = MeterProvider (metric_readers = [self ._metrics ])
0 commit comments