1616
1717import os
1818import sys
19- from typing import Any , Optional
19+ import sentry_sdk
20+ import logging
21+ from typing import Dict , Optional , Any
2022from colorama import Fore
2123from langtrace_python_sdk .constants import LANGTRACE_SDK_NAME , SENTRY_DSN
2224from opentelemetry import trace
5759 VertexAIInstrumentation ,
5860 WeaviateInstrumentation ,
5961)
60- from langtrace_python_sdk .types import (
61- DisableInstrumentations ,
62- InstrumentationMethods ,
63- InstrumentationType ,
64- )
62+ from langtrace_python_sdk .types import DisableInstrumentations , InstrumentationMethods
6563from langtrace_python_sdk .utils import (
6664 check_if_sdk_is_outdated ,
6765 get_sdk_version ,
6866 is_package_installed ,
6967 validate_instrumentations ,
7068)
7169from langtrace_python_sdk .utils .langtrace_sampler import LangtraceSampler
72- import sentry_sdk
7370from sentry_sdk .types import Event , Hint
7471
72+ logging .disable (level = logging .INFO )
73+
74+
75+ class LangtraceConfig :
76+ def __init__ (self , ** kwargs ):
77+ self .api_key = kwargs .get ("api_key" )
78+ self .batch = kwargs .get ("batch" , True )
79+ self .write_spans_to_console = kwargs .get ("write_spans_to_console" , False )
80+ self .custom_remote_exporter = kwargs .get ("custom_remote_exporter" )
81+ self .api_host = kwargs .get ("api_host" , LANGTRACE_REMOTE_URL )
82+ self .disable_instrumentations = kwargs .get ("disable_instrumentations" )
83+ self .disable_tracing_for_functions = kwargs .get ("disable_tracing_for_functions" )
84+ self .service_name = kwargs .get ("service_name" )
85+ self .disable_logging = kwargs .get ("disable_logging" , False )
86+ self .headers = kwargs .get ("headers" , {})
87+
88+
89+ def get_host (config : LangtraceConfig ) -> str :
90+ return (
91+ os .environ .get ("LANGTRACE_API_HOST" )
92+ or os .environ .get ("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" )
93+ or os .environ .get ("OTEL_EXPORTER_OTLP_ENDPOINT" )
94+ or config .api_host
95+ or LANGTRACE_REMOTE_URL
96+ )
97+
98+
99+ def setup_tracer_provider (config : LangtraceConfig , host : str ) -> TracerProvider :
100+ sampler = LangtraceSampler (disabled_methods = config .disable_tracing_for_functions )
101+ resource = Resource .create (
102+ attributes = {
103+ SERVICE_NAME : os .environ .get ("OTEL_SERVICE_NAME" )
104+ or config .service_name
105+ or sys .argv [0 ]
106+ }
107+ )
108+ return TracerProvider (resource = resource , sampler = sampler )
109+
110+
111+ def get_exporter (config : LangtraceConfig , host : str ):
112+ if config .custom_remote_exporter :
113+ return config .custom_remote_exporter
114+
115+ return LangTraceExporter (host , config .api_key , config .disable_logging )
116+
117+
118+ def add_span_processor (provider : TracerProvider , config : LangtraceConfig , exporter ):
119+ if config .write_spans_to_console :
120+ provider .add_span_processor (SimpleSpanProcessor (ConsoleSpanExporter ()))
121+ print (Fore .BLUE + "Writing spans to console" + Fore .RESET )
122+
123+ elif config .custom_remote_exporter or get_host (config ) != LANGTRACE_REMOTE_URL :
124+ processor = (
125+ BatchSpanProcessor (exporter )
126+ if config .batch
127+ else SimpleSpanProcessor (exporter )
128+ )
129+ provider .add_span_processor (processor )
130+ print (
131+ Fore .BLUE
132+ + f"Exporting spans to custom host: { get_host (config )} .."
133+ + Fore .RESET
134+ )
135+ else :
136+ provider .add_span_processor (BatchSpanProcessor (exporter ))
137+ print (Fore .BLUE + "Exporting spans to Langtrace cloud.." + Fore .RESET )
138+
139+
140+ def init_sentry (config : LangtraceConfig , host : str ):
141+ if os .environ .get ("LANGTRACE_ERROR_REPORTING" , "True" ) == "True" :
142+ sentry_sdk .init (
143+ dsn = SENTRY_DSN ,
144+ traces_sample_rate = 1.0 ,
145+ profiles_sample_rate = 1.0 ,
146+ before_send = before_send ,
147+ )
148+ sdk_options = {
149+ "service_name" : os .environ .get ("OTEL_SERVICE_NAME" )
150+ or config .service_name
151+ or sys .argv [0 ],
152+ "disable_logging" : config .disable_logging ,
153+ "disable_instrumentations" : config .disable_instrumentations ,
154+ "disable_tracing_for_functions" : config .disable_tracing_for_functions ,
155+ "batch" : config .batch ,
156+ "write_spans_to_console" : config .write_spans_to_console ,
157+ "custom_remote_exporter" : config .custom_remote_exporter ,
158+ "sdk_name" : LANGTRACE_SDK_NAME ,
159+ "sdk_version" : get_sdk_version (),
160+ "api_host" : host ,
161+ }
162+ sentry_sdk .set_context ("sdk_init_options" , sdk_options )
163+
75164
76165def init (
77- api_key : str = None ,
166+ api_key : Optional [ str ] = None ,
78167 batch : bool = True ,
79168 write_spans_to_console : bool = False ,
80- custom_remote_exporter = None ,
169+ custom_remote_exporter : Optional [ Any ] = None ,
81170 api_host : Optional [str ] = LANGTRACE_REMOTE_URL ,
82171 disable_instrumentations : Optional [DisableInstrumentations ] = None ,
83172 disable_tracing_for_functions : Optional [InstrumentationMethods ] = None ,
84173 service_name : Optional [str ] = None ,
85- disable_logging = False ,
174+ disable_logging : bool = False ,
175+ headers : Dict [str , str ] = {},
86176):
87- if disable_logging :
177+ logging .disable (level = logging .INFO )
178+ check_if_sdk_is_outdated ()
179+ config = LangtraceConfig (
180+ api_key = api_key ,
181+ batch = batch ,
182+ write_spans_to_console = write_spans_to_console ,
183+ custom_remote_exporter = custom_remote_exporter ,
184+ api_host = api_host ,
185+ disable_instrumentations = disable_instrumentations ,
186+ disable_tracing_for_functions = disable_tracing_for_functions ,
187+ service_name = service_name ,
188+ disable_logging = disable_logging ,
189+ headers = headers ,
190+ )
191+
192+ if config .disable_logging :
88193 sys .stdout = open (os .devnull , "w" )
89194
90- host = (
91- os .environ .get ("LANGTRACE_API_HOST" , None )
92- or os .environ .get ("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" , None )
93- or os .environ .get ("OTEL_EXPORTER_OTLP_ENDPOINT" , None )
94- or api_host
95- or LANGTRACE_REMOTE_URL
96- )
97- check_if_sdk_is_outdated ()
195+ host = get_host (config )
98196 print (Fore .GREEN + "Initializing Langtrace SDK.." + Fore .RESET )
99197 print (
100198 Fore .WHITE
101199 + "⭐ Leave our github a star to stay on top of our updates - https://github.com/Scale3-Labs/langtrace"
102200 + Fore .RESET
103201 )
104- sampler = LangtraceSampler (disabled_methods = disable_tracing_for_functions )
105- resource = Resource .create (
106- attributes = {
107- SERVICE_NAME : os .environ .get ("OTEL_SERVICE_NAME" )
108- or service_name
109- or sys .argv [0 ]
110- }
111- )
112- provider = TracerProvider (resource = resource , sampler = sampler )
113202
114- remote_write_exporter = (
115- LangTraceExporter (
116- api_key = api_key , api_host = host , disable_logging = disable_logging
117- )
118- if custom_remote_exporter is None
119- else custom_remote_exporter
120- )
121- console_exporter = ConsoleSpanExporter ()
122- batch_processor_remote = BatchSpanProcessor (remote_write_exporter )
123- simple_processor_remote = SimpleSpanProcessor (remote_write_exporter )
124- simple_processor_console = SimpleSpanProcessor (console_exporter )
203+ provider = setup_tracer_provider (config , host )
204+ exporter = get_exporter (config , host )
125205
126206 os .environ ["LANGTRACE_API_HOST" ] = host .replace ("/api/trace" , "" )
127- # Initialize tracer
128207 trace .set_tracer_provider (provider )
129208 all_instrumentations = {
130209 "openai" : OpenAIInstrumentation (),
@@ -146,57 +225,18 @@ def init(
146225 "ollama" : OllamaInstrumentor (),
147226 "dspy-ai" : DspyInstrumentation (),
148227 "crewai" : CrewAIInstrumentation (),
228+ "vertexai" : VertexAIInstrumentation (),
149229 "google-cloud-aiplatform" : VertexAIInstrumentation (),
150230 "google-generativeai" : GeminiInstrumentation (),
151231 "mistralai" : MistralInstrumentation (),
152232 "autogen" : AutogenInstrumentation (),
153233 }
154234
155- init_instrumentations (disable_instrumentations , all_instrumentations )
156- if write_spans_to_console :
157- print (Fore .BLUE + "Writing spans to console" + Fore .RESET )
158- provider .add_span_processor (simple_processor_console )
159-
160- elif custom_remote_exporter is not None :
161- print (Fore .BLUE + "Exporting spans to custom remote exporter.." + Fore .RESET )
162- if batch :
163- provider .add_span_processor (batch_processor_remote )
164- else :
165- provider .add_span_processor (simple_processor_remote )
166-
167- elif host != LANGTRACE_REMOTE_URL :
168- print (Fore .BLUE + f"Exporting spans to custom host: { host } .." + Fore .RESET )
169- if batch :
170- provider .add_span_processor (batch_processor_remote )
171- else :
172- provider .add_span_processor (simple_processor_remote )
173- else :
174- print (Fore .BLUE + "Exporting spans to Langtrace cloud.." + Fore .RESET )
175- provider .add_span_processor (batch_processor_remote )
235+ init_instrumentations (config .disable_instrumentations , all_instrumentations )
236+ add_span_processor (provider , config , exporter )
176237
177238 sys .stdout = sys .__stdout__
178- if os .environ .get ("LANGTRACE_ERROR_REPORTING" , "True" ) == "True" :
179- sentry_sdk .init (
180- dsn = SENTRY_DSN ,
181- traces_sample_rate = 1.0 ,
182- profiles_sample_rate = 1.0 ,
183- before_send = before_send ,
184- )
185- sdk_options = {
186- "service_name" : os .environ .get ("OTEL_SERVICE_NAME" )
187- or service_name
188- or sys .argv [0 ],
189- "disable_logging" : disable_logging ,
190- "disable_instrumentations" : disable_instrumentations ,
191- "disable_tracing_for_functions" : disable_tracing_for_functions ,
192- "batch" : batch ,
193- "write_spans_to_console" : write_spans_to_console ,
194- "custom_remote_exporter" : custom_remote_exporter ,
195- "sdk_name" : LANGTRACE_SDK_NAME ,
196- "sdk_version" : get_sdk_version (),
197- "api_host" : host ,
198- }
199- sentry_sdk .set_context ("sdk_init_options" , sdk_options )
239+ init_sentry (config , host )
200240
201241
202242def before_send (event : Event , hint : Hint ):
0 commit comments