33import typing
44
55from lite_bootstrap .instruments .base import BaseInstrument
6+ from lite_bootstrap .service_config import ServiceConfig
7+ from lite_bootstrap .types import ApplicationT
68
79
810with contextlib .suppress (ImportError ):
911 from opentelemetry .exporter .otlp .proto .grpc .trace_exporter import OTLPSpanExporter
1012 from opentelemetry .instrumentation .instrumentor import BaseInstrumentor # type: ignore[attr-defined]
1113 from opentelemetry .sdk import resources
1214 from opentelemetry .sdk .trace import TracerProvider
13- from opentelemetry .sdk .trace .export import BatchSpanProcessor
15+ from opentelemetry .sdk .trace .export import BatchSpanProcessor , SpanExporter
1416
1517
1618@dataclasses .dataclass (kw_only = True , slots = True , frozen = True )
@@ -21,37 +23,24 @@ class InstrumentorWithParams:
2123
2224@dataclasses .dataclass (kw_only = True , slots = True )
2325class OpenTelemetryInstrument (BaseInstrument ):
24- service_version : str = "1.0.0"
25- service_name : str | None = None
2626 container_name : str | None = None
2727 endpoint : str | None = None
2828 namespace : str | None = None
2929 insecure : bool = True
3030 instrumentors : list [InstrumentorWithParams | BaseInstrumentor ] = dataclasses .field (default_factory = list )
31+ span_exporter : SpanExporter | None = None
3132
3233 tracer_provider : TracerProvider = dataclasses .field (init = False )
3334
3435 def is_ready (self ) -> bool :
35- return all (
36- (
37- self .endpoint ,
38- self .service_name ,
39- ),
40- )
41-
42- def teardown (self ) -> None :
43- for one_instrumentor in self .instrumentors :
44- if isinstance (one_instrumentor , InstrumentorWithParams ):
45- one_instrumentor .instrumentor .uninstrument (** one_instrumentor .additional_params )
46- else :
47- one_instrumentor .uninstrument ()
36+ return bool (self .endpoint )
4837
49- def bootstrap (self ) -> None :
38+ def bootstrap (self , service_config : ServiceConfig , _ : ApplicationT | None = None ) -> None :
5039 attributes = {
51- resources .SERVICE_NAME : self .service_name ,
40+ resources .SERVICE_NAME : service_config .service_name ,
5241 resources .TELEMETRY_SDK_LANGUAGE : "python" ,
5342 resources .SERVICE_NAMESPACE : self .namespace ,
54- resources .SERVICE_VERSION : self .service_version ,
43+ resources .SERVICE_VERSION : service_config .service_version ,
5544 resources .CONTAINER_NAME : self .container_name ,
5645 }
5746 resource : typing .Final = resources .Resource .create (
@@ -60,7 +49,8 @@ def bootstrap(self) -> None:
6049 self .tracer_provider = TracerProvider (resource = resource )
6150 self .tracer_provider .add_span_processor (
6251 BatchSpanProcessor (
63- OTLPSpanExporter (
52+ self .span_exporter
53+ or OTLPSpanExporter (
6454 endpoint = self .endpoint ,
6555 insecure = self .insecure ,
6656 ),
@@ -74,3 +64,10 @@ def bootstrap(self) -> None:
7464 )
7565 else :
7666 one_instrumentor .instrument (tracer_provider = self .tracer_provider )
67+
68+ def teardown (self , _ : ApplicationT | None = None ) -> None :
69+ for one_instrumentor in self .instrumentors :
70+ if isinstance (one_instrumentor , InstrumentorWithParams ):
71+ one_instrumentor .instrumentor .uninstrument (** one_instrumentor .additional_params )
72+ else :
73+ one_instrumentor .uninstrument ()
0 commit comments