77import logging
88from importlib .metadata import version
99
10+ import opentelemetry .metrics as metrics_api
11+ import opentelemetry .sdk .metrics as metrics_sdk
1012import opentelemetry .trace as trace_api
1113from opentelemetry import propagate
1214from opentelemetry .baggage .propagation import W3CBaggagePropagator
1315from opentelemetry .propagators .composite import CompositePropagator
16+ from opentelemetry .sdk .metrics .export import ConsoleMetricExporter , PeriodicExportingMetricReader
1417from opentelemetry .sdk .resources import Resource
1518from opentelemetry .sdk .trace import TracerProvider as SDKTracerProvider
1619from opentelemetry .sdk .trace .export import BatchSpanProcessor , ConsoleSpanExporter , SimpleSpanProcessor
@@ -65,6 +68,9 @@ class StrandsTelemetry:
6568 >>> telemetry.setup_console_exporter()
6669 >>> telemetry.setup_otlp_exporter()
6770
71+ To setup global meter provider
72+ >>> telemetry.setup_meter(enable_console_exporter=True, enable_otlp_exporter=True) # default are False
73+
6874 Note:
6975 - The tracer provider is automatically initialized upon instantiation
7076 - When no tracer_provider is provided, the instance sets itself as the global provider
@@ -86,15 +92,15 @@ def __init__(
8692 The instance is ready to use immediately after initialization, though
8793 trace exporters must be configured separately using the setup methods.
8894 """
95+ self .resource = get_otel_resource ()
8996 if tracer_provider :
9097 self .tracer_provider = tracer_provider
9198 else :
92- self .resource = get_otel_resource ()
9399 self ._initialize_tracer ()
94100
95101 def _initialize_tracer (self ) -> None :
96102 """Initialize the OpenTelemetry tracer."""
97- logger .info ("initializing tracer" )
103+ logger .info ("Initializing tracer" )
98104
99105 # Create tracer provider
100106 self .tracer_provider = SDKTracerProvider (resource = self .resource )
@@ -115,7 +121,7 @@ def _initialize_tracer(self) -> None:
115121 def setup_console_exporter (self ) -> "StrandsTelemetry" :
116122 """Set up console exporter for the tracer provider."""
117123 try :
118- logger .info ("enabling console export" )
124+ logger .info ("Enabling console export" )
119125 console_processor = SimpleSpanProcessor (ConsoleSpanExporter ())
120126 self .tracer_provider .add_span_processor (console_processor )
121127 except Exception as e :
@@ -134,3 +140,30 @@ def setup_otlp_exporter(self) -> "StrandsTelemetry":
134140 except Exception as e :
135141 logger .exception ("error=<%s> | Failed to configure OTLP exporter" , e )
136142 return self
143+
144+ def setup_meter (
145+ self , enable_console_exporter : bool = False , enable_otlp_exporter : bool = False
146+ ) -> "StrandsTelemetry" :
147+ """Initialize the OpenTelemetry Meter."""
148+ logger .info ("Initializing meter" )
149+ metrics_readers = []
150+ try :
151+ if enable_console_exporter :
152+ logger .info ("Enabling console metrics exporter" )
153+ console_reader = PeriodicExportingMetricReader (ConsoleMetricExporter ())
154+ metrics_readers .append (console_reader )
155+ if enable_otlp_exporter :
156+ logger .info ("Enabling OTLP metrics exporter" )
157+ from opentelemetry .exporter .otlp .proto .http .metric_exporter import OTLPMetricExporter
158+
159+ otlp_reader = PeriodicExportingMetricReader (OTLPMetricExporter ())
160+ metrics_readers .append (otlp_reader )
161+ except Exception as e :
162+ logger .exception ("error=<%s> | Failed to configure OTLP metrics exporter" , e )
163+
164+ self .meter_provider = metrics_sdk .MeterProvider (resource = self .resource , metric_readers = metrics_readers )
165+
166+ # Set as global tracer provider
167+ metrics_api .set_meter_provider (self .meter_provider )
168+ logger .info ("Strands Meter configured" )
169+ return self
0 commit comments