Skip to content

Commit bfdacec

Browse files
authored
Merge pull request #372 from Scale3-Labs/ali/patch-vertexai
Instrument `vertexai` package
2 parents 6e41c31 + 1276043 commit bfdacec

File tree

6 files changed

+144
-104
lines changed

6 files changed

+144
-104
lines changed

pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ dev = [
5757
"google-generativeai",
5858
"google-cloud-aiplatform",
5959
"mistralai",
60-
"embedchain",
61-
"typing-extensions",
60+
"embedchain"
6261
]
6362

6463
test = ["pytest", "pytest-vcr", "pytest-asyncio"]

src/langtrace_python_sdk/instrumentation/vertexai/instrumentation.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,24 @@
55
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
66
from opentelemetry.trace import get_tracer
77
from .patch import patch_vertexai
8+
from langtrace_python_sdk.utils import is_package_installed
89

910

1011
class VertexAIInstrumentation(BaseInstrumentor):
1112
def instrumentation_dependencies(self) -> Collection[str]:
13+
if is_package_installed("vertexai"):
14+
return ["vertexai >= 1.0.0"]
15+
1216
return ["google-cloud-aiplatform >= 1.0.0"]
1317

1418
def _instrument(self, **kwargs):
1519
trace_provider = kwargs.get("tracer_provider")
1620
tracer = get_tracer(__name__, "", trace_provider)
17-
version = v("google-cloud-aiplatform")
21+
version = (
22+
v("vertexai")
23+
if is_package_installed("vertexai")
24+
else v("google-cloud-aiplatform")
25+
)
1826

1927
for _, api_config in APIS.items():
2028

src/langtrace_python_sdk/instrumentation/vertexai/patch.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,27 +103,24 @@ def is_streaming_response(response):
103103

104104
def get_llm_model(instance):
105105
if hasattr(instance, "_model_name"):
106-
return instance._model_name.replace("models/", "")
106+
return instance._model_name.replace("publishers/google/models/", "")
107107
return getattr(instance, "_model_id", "unknown")
108108

109109

110110
def serialize_prompts(args, kwargs):
111-
prompt = ""
112-
if args is not None and len(args) > 0:
111+
if args and len(args) > 0:
112+
prompt_parts = []
113113
for arg in args:
114114
if isinstance(arg, str):
115-
prompt = f"{prompt}{arg}\n"
115+
prompt_parts.append(arg)
116116
elif isinstance(arg, list):
117117
for subarg in arg:
118118
if type(subarg).__name__ == "Part":
119-
prompt = f"{prompt}{json.dumps(subarg.to_dict())}\n"
119+
prompt_parts.append(json.dumps(subarg.to_dict()))
120120
else:
121-
prompt = f"{prompt}{subarg}\n"
121+
prompt_parts.append(str(subarg))
122+
123+
return [{"role": "user", "content": "\n".join(prompt_parts)}]
122124
else:
123-
prompt = [
124-
{
125-
"role": "user",
126-
"content": kwargs.get("prompt") or kwargs.get("message"),
127-
}
128-
]
129-
return prompt
125+
content = kwargs.get("prompt") or kwargs.get("message")
126+
return [{"role": "user", "content": content}] if content else []

src/langtrace_python_sdk/instrumentation/weaviate/instrumentation.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ def _instrument(self, **kwargs):
5252
generic_query_patch(api_name, version, tracer),
5353
)
5454
elif api_config.get("OPERATION") == "create":
55-
print(
56-
api_config["MODULE"],
57-
api_config["METHOD"],
58-
)
5955
wrap_function_wrapper(
6056
api_config["MODULE"],
6157
api_config["METHOD"],

src/langtrace_python_sdk/langtrace.py

Lines changed: 123 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
import os
1818
import sys
19-
from typing import Any, Optional
19+
import sentry_sdk
20+
import logging
21+
from typing import Dict, Optional, Any
2022
from colorama import Fore
2123
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME, SENTRY_DSN
2224
from opentelemetry import trace
@@ -57,74 +59,151 @@
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
6563
from langtrace_python_sdk.utils import (
6664
check_if_sdk_is_outdated,
6765
get_sdk_version,
6866
is_package_installed,
6967
validate_instrumentations,
7068
)
7169
from langtrace_python_sdk.utils.langtrace_sampler import LangtraceSampler
72-
import sentry_sdk
7370
from 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

76165
def 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

202242
def before_send(event: Event, hint: Hint):
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.3.27"
1+
__version__ = "2.3.28"

0 commit comments

Comments
 (0)