Skip to content

Commit bc88791

Browse files
Release (#382)
* remove logs * remove requirements * Bump version * Squash * Fix missing instrumentation types (#377) * add instrumentation types * bump version * fix * Migrate to `oTel` exporters (#381) * migrate to otel exporters + litellm example * bump version * abstract exporter headers and `service_name` --------- Co-authored-by: Ali Waleed <[email protected]>
1 parent 76e3ff4 commit bc88791

File tree

5 files changed

+86
-17
lines changed

5 files changed

+86
-17
lines changed

src/examples/litellm_example/basic.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from langtrace_python_sdk import with_langtrace_root_span, langtrace
21
from dotenv import load_dotenv
32
from litellm import completion, acompletion
43
import litellm
@@ -8,11 +7,9 @@
87

98

109
litellm.success_callback = ["langtrace"]
11-
langtrace.init()
1210
litellm.set_verbose = False
1311

1412

15-
@with_langtrace_root_span("Litellm Example OpenAI")
1613
def openAI(streaming=False):
1714
response = completion(
1815
model="gpt-3.5-turbo",
@@ -56,7 +53,6 @@ def anthropic(streaming=False):
5653
print("ERORRRR", e)
5754

5855

59-
# @with_langtrace_root_span("Litellm Example OpenAI Async Streaming")
6056
async def async_anthropic(streaming=False):
6157
response = await acompletion(
6258
model="claude-2.1",
@@ -93,6 +89,6 @@ def cohere(streaming=False):
9389

9490
if __name__ == "__main__":
9591
# openAI()
96-
anthropic(streaming=False)
92+
# anthropic(streaming=False)
9793
cohere(streaming=True)
9894
# asyncio.run(async_anthropic(streaming=True))
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
model_list:
2+
- model_name: "gpt-4" # all requests where model not in your config go to this deployment
3+
litellm_params:
4+
model: openai/gpt-4 # set `openai/` to use the openai route
5+
6+
litellm_settings:
7+
success_callback: ["langtrace"]
8+
9+
environment_variables:
10+
LANGTRACE_API_KEY: "fake-api-key"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import openai
2+
from dotenv import load_dotenv
3+
4+
load_dotenv()
5+
6+
client = openai.OpenAI(base_url="http://0.0.0.0:4000")
7+
8+
# request sent to model set on litellm proxy, `litellm --model`
9+
response = client.chat.completions.create(
10+
model="gpt-4",
11+
messages=[
12+
{"role": "user", "content": "this is a test request, write a short poem"}
13+
],
14+
)
15+
16+
print(response)

src/langtrace_python_sdk/langtrace.py

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,15 @@
3131
SimpleSpanProcessor,
3232
)
3333

34+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
35+
OTLPSpanExporter as GRPCExporter,
36+
)
37+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
38+
OTLPSpanExporter as HTTPExporter,
39+
)
3440
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
3541
LANGTRACE_REMOTE_URL,
3642
)
37-
from langtrace_python_sdk.extensions.langtrace_exporter import LangTraceExporter
3843
from langtrace_python_sdk.instrumentation import (
3944
AnthropicInstrumentation,
4045
ChromaInstrumentation,
@@ -59,6 +64,8 @@
5964
VertexAIInstrumentation,
6065
WeaviateInstrumentation,
6166
)
67+
from opentelemetry.util.re import parse_env_headers
68+
6269
from langtrace_python_sdk.types import DisableInstrumentations, InstrumentationMethods
6370
from langtrace_python_sdk.utils import (
6471
check_if_sdk_is_outdated,
@@ -74,7 +81,7 @@
7481

7582
class LangtraceConfig:
7683
def __init__(self, **kwargs):
77-
self.api_key = kwargs.get("api_key")
84+
self.api_key = kwargs.get("api_key") or os.environ.get("LANGTRACE_API_KEY")
7885
self.batch = kwargs.get("batch", True)
7986
self.write_spans_to_console = kwargs.get("write_spans_to_console", False)
8087
self.custom_remote_exporter = kwargs.get("custom_remote_exporter")
@@ -83,7 +90,11 @@ def __init__(self, **kwargs):
8390
self.disable_tracing_for_functions = kwargs.get("disable_tracing_for_functions")
8491
self.service_name = kwargs.get("service_name")
8592
self.disable_logging = kwargs.get("disable_logging", False)
86-
self.headers = kwargs.get("headers", {})
93+
self.headers = (
94+
kwargs.get("headers")
95+
or os.environ.get("LANGTRACE_HEADERS")
96+
or os.environ.get("OTEL_EXPORTER_OTLP_HEADERS")
97+
)
8798

8899

89100
def get_host(config: LangtraceConfig) -> str:
@@ -96,23 +107,50 @@ def get_host(config: LangtraceConfig) -> str:
96107
)
97108

98109

110+
def get_service_name(config: LangtraceConfig):
111+
service_name = os.environ.get("OTEL_SERVICE_NAME")
112+
if service_name:
113+
return service_name
114+
115+
resource_attributes = os.environ.get("OTEL_RESOURCE_ATTRIBUTES")
116+
if resource_attributes:
117+
attrs = dict(attr.split("=") for attr in resource_attributes.split(","))
118+
if "service.name" in attrs:
119+
return attrs["service.name"]
120+
121+
if config.service_name:
122+
return config.service_name
123+
124+
return sys.argv[0]
125+
126+
99127
def setup_tracer_provider(config: LangtraceConfig, host: str) -> TracerProvider:
100128
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-
)
129+
resource = Resource.create(attributes={SERVICE_NAME: get_service_name(config)})
108130
return TracerProvider(resource=resource, sampler=sampler)
109131

110132

133+
def get_headers(config: LangtraceConfig):
134+
if not config.headers:
135+
return {
136+
"x-api-key": config.api_key,
137+
}
138+
139+
if isinstance(config.headers, str):
140+
return parse_env_headers(config.headers, liberal=True)
141+
142+
return config.headers
143+
144+
111145
def get_exporter(config: LangtraceConfig, host: str):
112146
if config.custom_remote_exporter:
113147
return config.custom_remote_exporter
114148

115-
return LangTraceExporter(host, config.api_key, config.disable_logging)
149+
headers = get_headers(config)
150+
if "http" in host.lower() or "https" in host.lower():
151+
return HTTPExporter(endpoint=host, headers=headers)
152+
else:
153+
return GRPCExporter(endpoint=host, headers=headers)
116154

117155

118156
def add_span_processor(provider: TracerProvider, config: LangtraceConfig, exporter):
@@ -200,6 +238,15 @@ def init(
200238
+ Fore.RESET
201239
)
202240

241+
if host == LANGTRACE_REMOTE_URL and not config.api_key:
242+
print(Fore.RED)
243+
print(
244+
"Missing Langtrace API key, proceed to https://langtrace.ai to create one"
245+
)
246+
print("Set the API key as an environment variable LANGTRACE_API_KEY")
247+
print(Fore.RESET)
248+
return
249+
203250
provider = setup_tracer_provider(config, host)
204251
exporter = get_exporter(config, host)
205252

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "3.0.2"
1+
__version__ = "3.1.0"

0 commit comments

Comments
 (0)