55import json
66import logging
77import os
8+ import platform
89import random
910import stat
1011import time
1718from opentelemetry .trace import SpanKind as OTelSpanKind
1819
1920from ..instrumentation .registry import install_hooks
21+ from ..version import SDK_VERSION
2022from .communication .communicator import CommunicatorConfig , ProtobufCommunicator
2123from .communication .types import MockRequestInput , MockResponseOutput
2224from .config import TuskConfig , TuskFileConfig , load_tusk_config
23- from .logger import LogLevel , configure_logger
25+ from .logger import LogLevel , configure_logger , get_log_level
2426from .sampling import should_sample , validate_sampling_rate
2527from .trace_blocking_manager import TraceBlockingManager , should_block_span
2628from .tracing import TdSpanAttributes , TdSpanExporter , TdSpanExporterConfig
@@ -99,13 +101,40 @@ def _log_rust_core_startup_status() -> None:
99101 logger .info ("Rust core path enabled at startup (env=%s, reason=%s)." , env_display , status ["reason" ])
100102 return
101103
102- logger .warning (
103- "Rust core path requested but binding unavailable; falling back to Python path (env=%s, reason=%s, error=%s)." ,
104+ logger .info (
105+ "Rust core path unavailable at startup; using Python path instead (env=%s, reason=%s, error=%s)." ,
104106 env_display ,
105107 status ["reason" ],
106108 status ["binding_error" ],
107109 )
108110
111+ def _log_startup_summary (self , env : str , use_remote_export : bool ) -> None :
112+ service_name = (
113+ self .file_config .service .name
114+ if self .file_config and self .file_config .service and self .file_config .service .name
115+ else "unknown"
116+ )
117+ service_id = (
118+ self .file_config .service .id
119+ if self .file_config and self .file_config .service and self .file_config .service .id
120+ else "<unset>"
121+ )
122+
123+ logger .info (
124+ "SDK initialized successfully (version=%s, mode=%s, env=%s, service=%s, serviceId=%s, exportSpans=%s, samplingRate=%s, logLevel=%s, runtime=python %s, platform=%s/%s)." ,
125+ SDK_VERSION ,
126+ self .mode ,
127+ env ,
128+ service_name ,
129+ service_id ,
130+ use_remote_export ,
131+ self ._sampling_rate ,
132+ get_log_level (),
133+ platform .python_version (),
134+ platform .system ().lower (),
135+ platform .machine ().lower (),
136+ )
137+
109138 @classmethod
110139 def initialize (
111140 cls ,
@@ -216,8 +245,6 @@ def initialize(
216245 export_spans_enabled and effective_api_key is not None and effective_observable_service_id is not None
217246 )
218247
219- from ..version import SDK_VERSION as sdk_version
220-
221248 exporter_config = TdSpanExporterConfig (
222249 base_directory = base_dir ,
223250 mode = instance .mode ,
@@ -226,7 +253,7 @@ def initialize(
226253 api_key = effective_api_key ,
227254 tusk_backend_base_url = effective_backend_url ,
228255 environment = env ,
229- sdk_version = sdk_version ,
256+ sdk_version = SDK_VERSION ,
230257 sdk_instance_id = instance ._sdk_instance_id ,
231258 )
232259 instance .span_exporter = TdSpanExporter (exporter_config )
@@ -236,7 +263,7 @@ def initialize(
236263 resource = Resource .create (
237264 {
238265 "service.name" : service_name ,
239- "service.version" : sdk_version ,
266+ "service.version" : SDK_VERSION ,
240267 "deployment.environment" : env ,
241268 }
242269 )
@@ -281,7 +308,7 @@ def initialize(
281308 atexit .register (instance .shutdown )
282309
283310 cls ._initialized = True
284- logger . info ( "SDK initialized in %s mode" , instance . mode )
311+ instance . _log_startup_summary ( env = env , use_remote_export = use_remote_export )
285312
286313 return instance
287314
0 commit comments