1717OpenTelemetry SDK Configurator for Easy Instrumentation with Distros
1818"""
1919
20+ import inspect
2021import logging
2122import os
2223from abc import ABC , abstractmethod
2324from os import environ
2425from typing import Callable , Dict , List , Optional , Sequence , Tuple , Type , Union
2526
27+ from grpc import ChannelCredentials # type: ignore
28+ from requests import Session
2629from typing_extensions import Literal
2730
2831from opentelemetry ._events import set_event_logger_provider
3942from opentelemetry .sdk ._logs .export import BatchLogRecordProcessor , LogExporter
4043from opentelemetry .sdk .environment_variables import (
4144 _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED ,
45+ OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER ,
4246 OTEL_EXPORTER_OTLP_LOGS_PROTOCOL ,
4347 OTEL_EXPORTER_OTLP_METRICS_PROTOCOL ,
4448 OTEL_EXPORTER_OTLP_PROTOCOL ,
9094_logger = logging .getLogger (__name__ )
9195
9296
97+ def _import_config_component (
98+ selected_component : str , entry_point_name : str
99+ ) -> object :
100+ return _import_config_components ([selected_component ], entry_point_name )[
101+ 0
102+ ][1 ]
103+
104+
93105def _import_config_components (
94106 selected_components : List [str ], entry_point_name : str
95107) -> Sequence [Tuple [str , object ]]:
@@ -189,11 +201,41 @@ def _get_exporter_names(
189201 ]
190202
191203
204+ def _init_exporter (
205+ exporter_class : Type [Union [SpanExporter , MetricExporter , LogExporter ]],
206+ otlp_credential_param : tuple [
207+ str , Union [ChannelCredentials | Session ]
208+ ] = None ,
209+ ) -> Union [SpanExporter , MetricExporter , LogExporter ]:
210+ if not otlp_credential_param :
211+ return exporter_class ()
212+ credential_key , credential = otlp_credential_param
213+ params = inspect .signature (exporter_class .__init__ ).parameters
214+ if (
215+ credential_key == "credentials"
216+ and "credentials" in params
217+ and isinstance (credential , params ["credentials" ].annotation )
218+ ):
219+ print ("initializing exporter with credentials." )
220+ return exporter_class (credentials = credential )
221+ if (
222+ credential_key == "session"
223+ and "session" in params
224+ and isinstance (credential , params ["session" ].annotation )
225+ ):
226+ print ("initializing exporter with session." )
227+ return exporter_class (session = credential )
228+ return exporter_class ()
229+
230+
192231def _init_tracing (
193232 exporters : Dict [str , Type [SpanExporter ]],
194233 id_generator : IdGenerator = None ,
195234 sampler : Sampler = None ,
196235 resource : Resource = None ,
236+ otlp_credential_param : tuple [
237+ str , Union [ChannelCredentials | Session ]
238+ ] = None ,
197239):
198240 provider = TracerProvider (
199241 id_generator = id_generator ,
@@ -203,9 +245,10 @@ def _init_tracing(
203245 set_tracer_provider (provider )
204246
205247 for _ , exporter_class in exporters .items ():
206- exporter_args = {}
207248 provider .add_span_processor (
208- BatchSpanProcessor (exporter_class (** exporter_args ))
249+ BatchSpanProcessor (
250+ _init_exporter (exporter_class , otlp_credential_param )
251+ )
209252 )
210253
211254
@@ -214,6 +257,9 @@ def _init_metrics(
214257 str , Union [Type [MetricExporter ], Type [MetricReader ]]
215258 ],
216259 resource : Resource = None ,
260+ otlp_credential_param : tuple [
261+ str , Union [ChannelCredentials | Session ]
262+ ] = None ,
217263):
218264 metric_readers = []
219265
@@ -225,7 +271,9 @@ def _init_metrics(
225271 else :
226272 metric_readers .append (
227273 PeriodicExportingMetricReader (
228- exporter_or_reader_class (** exporter_args )
274+ _init_exporter (
275+ exporter_or_reader_class , otlp_credential_param
276+ )
229277 )
230278 )
231279
@@ -237,14 +285,18 @@ def _init_logging(
237285 exporters : Dict [str , Type [LogExporter ]],
238286 resource : Resource = None ,
239287 setup_logging_handler : bool = True ,
288+ otlp_credential_param : dict [
289+ str , Union [ChannelCredentials | Session ]
290+ ] = None ,
240291):
241292 provider = LoggerProvider (resource = resource )
242293 set_logger_provider (provider )
243294
244295 for _ , exporter_class in exporters .items ():
245- exporter_args = {}
246296 provider .add_log_record_processor (
247- BatchLogRecordProcessor (exporter_class (** exporter_args ))
297+ BatchLogRecordProcessor (
298+ _init_exporter (exporter_class , otlp_credential_param )
299+ )
248300 )
249301
250302 event_logger_provider = EventLoggerProvider (logger_provider = provider )
@@ -397,13 +449,35 @@ def _initialize_components(
397449 # from the env variable else defaults to "unknown_service"
398450 resource = Resource .create (resource_attributes )
399451
452+ otlp_credential_param = None
453+ credential_env = os .getenv (OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER )
454+ print ("looking for creds" )
455+ if credential_env :
456+ credentials = _import_config_component (
457+ credential_env , "opentelemetry_otlp_credential_provider"
458+ )()
459+ if isinstance (credentials , ChannelCredentials ):
460+ print ("found channel creds" )
461+ otlp_credential_param = ("credentials" , credentials )
462+ elif isinstance (credentials , Session ):
463+ print ("found session" )
464+ otlp_credential_param = ("session" , credentials )
465+ else :
466+ raise RuntimeError (
467+ f"{ credential_env } is neither a ChannelCredentials or Session type."
468+ )
400469 _init_tracing (
401470 exporters = span_exporters ,
402471 id_generator = id_generator ,
403472 sampler = sampler ,
404473 resource = resource ,
474+ otlp_credential_param = otlp_credential_param ,
475+ )
476+ _init_metrics (
477+ metric_exporters ,
478+ resource ,
479+ otlp_credential_param = otlp_credential_param ,
405480 )
406- _init_metrics (metric_exporters , resource )
407481 if setup_logging_handler is None :
408482 setup_logging_handler = (
409483 os .getenv (
@@ -413,7 +487,12 @@ def _initialize_components(
413487 .lower ()
414488 == "true"
415489 )
416- _init_logging (log_exporters , resource , setup_logging_handler )
490+ _init_logging (
491+ log_exporters ,
492+ resource ,
493+ setup_logging_handler ,
494+ otlp_credential_param = otlp_credential_param ,
495+ )
417496
418497
419498class _BaseConfigurator (ABC ):
0 commit comments