openlit 1.11.0__py3-none-any.whl → 1.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openlit/__init__.py +217 -32
- openlit/instrumentation/groq/async_groq.py +1 -1
- openlit/instrumentation/groq/groq.py +1 -1
- openlit/instrumentation/openai/async_azure_openai.py +2 -2
- openlit/instrumentation/openai/async_openai.py +1 -1
- openlit/instrumentation/openai/azure_openai.py +2 -2
- openlit/instrumentation/openai/openai.py +1 -1
- openlit/instrumentation/transformers/transformers.py +1 -1
- openlit/semcov/__init__.py +3 -3
- {openlit-1.11.0.dist-info → openlit-1.13.0.dist-info}/METADATA +7 -5
- {openlit-1.11.0.dist-info → openlit-1.13.0.dist-info}/RECORD +13 -13
- {openlit-1.11.0.dist-info → openlit-1.13.0.dist-info}/LICENSE +0 -0
- {openlit-1.11.0.dist-info → openlit-1.13.0.dist-info}/WHEEL +0 -0
openlit/__init__.py
CHANGED
@@ -1,17 +1,26 @@
|
|
1
|
+
# pylint: disable=broad-exception-caught
|
1
2
|
"""
|
2
3
|
The __init__.py module for the openLIT package.
|
3
4
|
This module sets up the openLIT configuration and instrumentation for various
|
4
5
|
large language models (LLMs).
|
5
6
|
"""
|
7
|
+
|
6
8
|
from typing import Dict
|
7
9
|
import logging
|
8
10
|
from importlib.util import find_spec
|
11
|
+
from functools import wraps
|
12
|
+
from contextlib import contextmanager
|
13
|
+
|
9
14
|
|
10
15
|
# Import internal modules for setting up tracing and fetching pricing info.
|
16
|
+
from opentelemetry import trace as t
|
17
|
+
from opentelemetry.trace import SpanKind, Status, StatusCode, Span
|
18
|
+
from openlit.semcov import SemanticConvetion
|
11
19
|
from openlit.otel.tracing import setup_tracing
|
12
20
|
from openlit.otel.metrics import setup_meter
|
13
21
|
from openlit.__helpers import fetch_pricing_info
|
14
22
|
|
23
|
+
|
15
24
|
# Instrumentors for various large language models.
|
16
25
|
from openlit.instrumentation.openai import OpenAIInstrumentor
|
17
26
|
from openlit.instrumentation.anthropic import AnthropicInstrumentor
|
@@ -35,13 +44,14 @@ from openlit.instrumentation.transformers import TransformersInstrumentor
|
|
35
44
|
# Set up logging for error and information messages.
|
36
45
|
logger = logging.getLogger(__name__)
|
37
46
|
|
47
|
+
|
38
48
|
class OpenlitConfig:
|
39
49
|
"""
|
40
50
|
A Singleton Configuration class for openLIT.
|
41
|
-
|
51
|
+
|
42
52
|
This class maintains a single instance of configuration settings including
|
43
53
|
environment details, application name, and tracing information throughout the openLIT package.
|
44
|
-
|
54
|
+
|
45
55
|
Attributes:
|
46
56
|
environment (str): Deployment environment of the application.
|
47
57
|
application_name (str): Name of the application using openLIT.
|
@@ -52,6 +62,7 @@ class OpenlitConfig:
|
|
52
62
|
disable_batch (bool): Flag to disable batch span processing in tracing.
|
53
63
|
trace_content (bool): Flag to enable or disable tracing of content.
|
54
64
|
"""
|
65
|
+
|
55
66
|
_instance = None
|
56
67
|
|
57
68
|
def __new__(cls):
|
@@ -76,9 +87,19 @@ class OpenlitConfig:
|
|
76
87
|
cls.disable_metrics = False
|
77
88
|
|
78
89
|
@classmethod
|
79
|
-
def update_config(
|
80
|
-
|
81
|
-
|
90
|
+
def update_config(
|
91
|
+
cls,
|
92
|
+
environment,
|
93
|
+
application_name,
|
94
|
+
tracer,
|
95
|
+
otlp_endpoint,
|
96
|
+
otlp_headers,
|
97
|
+
disable_batch,
|
98
|
+
trace_content,
|
99
|
+
metrics_dict,
|
100
|
+
disable_metrics,
|
101
|
+
pricing_json,
|
102
|
+
):
|
82
103
|
"""
|
83
104
|
Updates the configuration based on provided parameters.
|
84
105
|
|
@@ -104,8 +125,14 @@ class OpenlitConfig:
|
|
104
125
|
cls.trace_content = trace_content
|
105
126
|
cls.disable_metrics = disable_metrics
|
106
127
|
|
107
|
-
|
108
|
-
|
128
|
+
|
129
|
+
def instrument_if_available(
|
130
|
+
instrumentor_name,
|
131
|
+
instrumentor_instance,
|
132
|
+
config,
|
133
|
+
disabled_instrumentors,
|
134
|
+
module_name_map,
|
135
|
+
):
|
109
136
|
"""Instruments the specified instrumentor if its library is available."""
|
110
137
|
if instrumentor_name in disabled_instrumentors:
|
111
138
|
return
|
@@ -121,22 +148,33 @@ def instrument_if_available(instrumentor_name, instrumentor_instance, config,
|
|
121
148
|
pricing_info=config.pricing_info,
|
122
149
|
trace_content=config.trace_content,
|
123
150
|
metrics_dict=config.metrics_dict,
|
124
|
-
disable_metrics=config.disable_metrics
|
151
|
+
disable_metrics=config.disable_metrics,
|
125
152
|
)
|
126
153
|
|
127
154
|
# pylint: disable=broad-exception-caught
|
128
155
|
except Exception as e:
|
129
156
|
logger.error("Failed to instrument %s: %s", instrumentor_name, e)
|
130
157
|
|
131
|
-
|
132
|
-
|
133
|
-
|
158
|
+
|
159
|
+
def init(
|
160
|
+
environment="default",
|
161
|
+
application_name="default",
|
162
|
+
tracer=None,
|
163
|
+
otlp_endpoint=None,
|
164
|
+
otlp_headers=None,
|
165
|
+
disable_batch=False,
|
166
|
+
trace_content=True,
|
167
|
+
disabled_instrumentors=None,
|
168
|
+
meter=None,
|
169
|
+
disable_metrics=False,
|
170
|
+
pricing_json=None,
|
171
|
+
):
|
134
172
|
"""
|
135
173
|
Initializes the openLIT configuration and setups tracing.
|
136
|
-
|
137
|
-
This function sets up the openLIT environment with provided configurations
|
174
|
+
|
175
|
+
This function sets up the openLIT environment with provided configurations
|
138
176
|
and initializes instrumentors for tracing.
|
139
|
-
|
177
|
+
|
140
178
|
Args:
|
141
179
|
environment (str): Deployment environment.
|
142
180
|
application_name (str): Application name.
|
@@ -155,8 +193,8 @@ def init(environment="default", application_name="default", tracer=None, otlp_en
|
|
155
193
|
|
156
194
|
module_name_map = {
|
157
195
|
"openai": "openai",
|
158
|
-
"anthropic": "anthropic",
|
159
|
-
"cohere": "cohere",
|
196
|
+
"anthropic": "anthropic",
|
197
|
+
"cohere": "cohere",
|
160
198
|
"mistral": "mistralai",
|
161
199
|
"bedrock": "boto3",
|
162
200
|
"vertexai": "vertexai",
|
@@ -171,12 +209,16 @@ def init(environment="default", application_name="default", tracer=None, otlp_en
|
|
171
209
|
"pinecone": "pinecone",
|
172
210
|
"qdrant": "qdrant_client",
|
173
211
|
"milvus": "pymilvus",
|
174
|
-
"transformers": "transformers"
|
212
|
+
"transformers": "transformers",
|
175
213
|
}
|
176
214
|
|
177
|
-
invalid_instrumentors = [
|
215
|
+
invalid_instrumentors = [
|
216
|
+
name for name in disabled_instrumentors if name not in module_name_map
|
217
|
+
]
|
178
218
|
for invalid_name in invalid_instrumentors:
|
179
|
-
logger.warning(
|
219
|
+
logger.warning(
|
220
|
+
"Invalid instrumentor name detected and ignored: '%s'", invalid_name
|
221
|
+
)
|
180
222
|
|
181
223
|
try:
|
182
224
|
# Retrieve or create the single configuration instance.
|
@@ -185,9 +227,11 @@ def init(environment="default", application_name="default", tracer=None, otlp_en
|
|
185
227
|
# Setup tracing based on the provided or default configuration.
|
186
228
|
tracer = setup_tracing(
|
187
229
|
application_name=application_name,
|
188
|
-
environment=environment,
|
189
|
-
|
190
|
-
|
230
|
+
environment=environment,
|
231
|
+
tracer=tracer,
|
232
|
+
otlp_endpoint=otlp_endpoint,
|
233
|
+
otlp_headers=otlp_headers,
|
234
|
+
disable_batch=disable_batch,
|
191
235
|
)
|
192
236
|
|
193
237
|
if not tracer:
|
@@ -195,18 +239,31 @@ def init(environment="default", application_name="default", tracer=None, otlp_en
|
|
195
239
|
return
|
196
240
|
|
197
241
|
# Setup meter and receive metrics_dict instead of meter
|
198
|
-
metrics_dict = setup_meter(
|
199
|
-
|
200
|
-
|
242
|
+
metrics_dict = setup_meter(
|
243
|
+
application_name=application_name,
|
244
|
+
environment=environment,
|
245
|
+
meter=meter,
|
246
|
+
otlp_endpoint=otlp_endpoint,
|
247
|
+
otlp_headers=otlp_headers,
|
248
|
+
)
|
201
249
|
|
202
250
|
if not metrics_dict:
|
203
251
|
logger.error("openLIT metrics setup failed. Metrics will not be available.")
|
204
252
|
return
|
205
253
|
|
206
254
|
# Update global configuration with the provided settings.
|
207
|
-
config.update_config(
|
208
|
-
|
209
|
-
|
255
|
+
config.update_config(
|
256
|
+
environment,
|
257
|
+
application_name,
|
258
|
+
tracer,
|
259
|
+
otlp_endpoint,
|
260
|
+
otlp_headers,
|
261
|
+
disable_batch,
|
262
|
+
trace_content,
|
263
|
+
metrics_dict,
|
264
|
+
disable_metrics,
|
265
|
+
pricing_json,
|
266
|
+
)
|
210
267
|
|
211
268
|
# Map instrumentor names to their instances
|
212
269
|
instrumentor_instances = {
|
@@ -227,14 +284,142 @@ def init(environment="default", application_name="default", tracer=None, otlp_en
|
|
227
284
|
"pinecone": PineconeInstrumentor(),
|
228
285
|
"qdrant": QdrantInstrumentor(),
|
229
286
|
"milvus": MilvusInstrumentor(),
|
230
|
-
"transformers": TransformersInstrumentor()
|
287
|
+
"transformers": TransformersInstrumentor(),
|
231
288
|
}
|
232
289
|
|
233
290
|
# Initialize and instrument only the enabled instrumentors
|
234
291
|
for name, instrumentor in instrumentor_instances.items():
|
235
|
-
instrument_if_available(
|
236
|
-
|
292
|
+
instrument_if_available(
|
293
|
+
name, instrumentor, config, disabled_instrumentors, module_name_map
|
294
|
+
)
|
237
295
|
|
238
|
-
# pylint: disable=broad-exception-caught
|
239
296
|
except Exception as e:
|
240
297
|
logger.error("Error during openLIT initialization: %s", e)
|
298
|
+
|
299
|
+
|
300
|
+
def trace(wrapped):
|
301
|
+
"""
|
302
|
+
Generates a telemetry wrapper for messages to collect metrics.
|
303
|
+
"""
|
304
|
+
|
305
|
+
@wraps(wrapped)
|
306
|
+
def wrapper(*args, **kwargs):
|
307
|
+
__trace = t.get_tracer_provider()
|
308
|
+
with __trace.get_tracer(__name__).start_as_current_span(
|
309
|
+
name=wrapped.__name__,
|
310
|
+
kind=SpanKind.CLIENT,
|
311
|
+
) as span:
|
312
|
+
try:
|
313
|
+
response = wrapped(*args, **kwargs)
|
314
|
+
span.set_attribute(
|
315
|
+
SemanticConvetion.GEN_AI_CONTENT_COMPLETION, response
|
316
|
+
)
|
317
|
+
span.set_status(Status(StatusCode.OK))
|
318
|
+
|
319
|
+
except Exception as e:
|
320
|
+
response = None
|
321
|
+
span.record_exception(e)
|
322
|
+
span.set_status(status=Status(StatusCode.ERROR), description=e)
|
323
|
+
logging.error("Error in %s: %s", wrapped.__name__, e, exc_info=True)
|
324
|
+
|
325
|
+
# Adding function arguments as metadata
|
326
|
+
try:
|
327
|
+
span.set_attribute("function.args", str(args))
|
328
|
+
span.set_attribute("function.kwargs", str(kwargs))
|
329
|
+
span.set_attribute(
|
330
|
+
SemanticConvetion.GEN_AI_APPLICATION_NAME,
|
331
|
+
OpenlitConfig.application_name,
|
332
|
+
)
|
333
|
+
span.set_attribute(
|
334
|
+
SemanticConvetion.GEN_AI_ENVIRONMENT, OpenlitConfig.environment
|
335
|
+
)
|
336
|
+
|
337
|
+
except Exception as meta_exception:
|
338
|
+
logging.error(
|
339
|
+
"Failed to set metadata for %s: %s",
|
340
|
+
wrapped.__name__,
|
341
|
+
meta_exception,
|
342
|
+
exc_info=True,
|
343
|
+
)
|
344
|
+
|
345
|
+
return response
|
346
|
+
|
347
|
+
return wrapper
|
348
|
+
|
349
|
+
|
350
|
+
class TracedSpan:
|
351
|
+
"""
|
352
|
+
A wrapper class for an OpenTelemetry span that provides helper methods
|
353
|
+
for setting result and metadata attributes on the span.
|
354
|
+
|
355
|
+
Attributes:
|
356
|
+
_span (Span): The underlying OpenTelemetry span.
|
357
|
+
"""
|
358
|
+
|
359
|
+
def __init__(self, span):
|
360
|
+
"""
|
361
|
+
Initializes the TracedSpan with the given span.
|
362
|
+
|
363
|
+
Params:
|
364
|
+
span (Span): The OpenTelemetry span to be wrapped.
|
365
|
+
"""
|
366
|
+
|
367
|
+
self._span: Span = span
|
368
|
+
|
369
|
+
def set_result(self, result):
|
370
|
+
"""
|
371
|
+
Sets the result attribute on the underlying span.
|
372
|
+
|
373
|
+
Params:
|
374
|
+
result: The result to be set as an attribute on the span.
|
375
|
+
"""
|
376
|
+
|
377
|
+
self._span.set_attribute(SemanticConvetion.GEN_AI_CONTENT_COMPLETION, result)
|
378
|
+
|
379
|
+
def set_metadata(self, metadata: Dict):
|
380
|
+
"""
|
381
|
+
Sets multiple attributes on the underlying span.
|
382
|
+
|
383
|
+
Params:
|
384
|
+
metadata (Dict): A dictionary of attributes to be set on the span.
|
385
|
+
"""
|
386
|
+
|
387
|
+
self._span.set_attributes(attributes=metadata)
|
388
|
+
|
389
|
+
def __enter__(self):
|
390
|
+
"""
|
391
|
+
Enters the context of the TracedSpan, returning itself.
|
392
|
+
|
393
|
+
Returns:
|
394
|
+
TracedSpan: The instance of TracedSpan.
|
395
|
+
"""
|
396
|
+
|
397
|
+
return self
|
398
|
+
|
399
|
+
def __exit__(self, _exc_type, _exc_val, _exc_tb):
|
400
|
+
"""
|
401
|
+
Exits the context of the TracedSpan by ending the underlying span.
|
402
|
+
"""
|
403
|
+
|
404
|
+
self._span.end()
|
405
|
+
|
406
|
+
|
407
|
+
@contextmanager
|
408
|
+
def start_trace(name: str):
|
409
|
+
"""
|
410
|
+
A context manager that starts a new trace and provides a TracedSpan
|
411
|
+
for usage within the context.
|
412
|
+
|
413
|
+
Params:
|
414
|
+
name (str): The name of the span.
|
415
|
+
|
416
|
+
Yields:
|
417
|
+
TracedSpan: The wrapped span for trace operations.
|
418
|
+
"""
|
419
|
+
|
420
|
+
__trace = t.get_tracer_provider()
|
421
|
+
with __trace.get_tracer(__name__).start_as_current_span(
|
422
|
+
name,
|
423
|
+
kind=SpanKind.CLIENT,
|
424
|
+
) as span:
|
425
|
+
yield TracedSpan(span)
|
@@ -268,7 +268,7 @@ def async_chat(gen_ai_endpoint, version, environment, application_name,
|
|
268
268
|
else:
|
269
269
|
i = 0
|
270
270
|
while i < kwargs["n"] and trace_content is True:
|
271
|
-
attribute_name = f"gen_ai.
|
271
|
+
attribute_name = f"gen_ai.completion.{i}"
|
272
272
|
span.set_attribute(attribute_name,
|
273
273
|
response.choices[i].message.content)
|
274
274
|
i += 1
|
@@ -268,7 +268,7 @@ def chat(gen_ai_endpoint, version, environment, application_name,
|
|
268
268
|
else:
|
269
269
|
i = 0
|
270
270
|
while i < kwargs["n"] and trace_content is True:
|
271
|
-
attribute_name = f"gen_ai.
|
271
|
+
attribute_name = f"gen_ai.completion.{i}"
|
272
272
|
span.set_attribute(attribute_name,
|
273
273
|
response.choices[i].message.content)
|
274
274
|
i += 1
|
@@ -269,7 +269,7 @@ def azure_async_chat_completions(gen_ai_endpoint, version, environment, applicat
|
|
269
269
|
else:
|
270
270
|
i = 0
|
271
271
|
while i < kwargs["n"] and trace_content is True:
|
272
|
-
attribute_name = f"gen_ai.
|
272
|
+
attribute_name = f"gen_ai.completion.{i}"
|
273
273
|
span.set_attribute(attribute_name,
|
274
274
|
response.choices[i].message.content)
|
275
275
|
i += 1
|
@@ -550,7 +550,7 @@ def azure_async_completions(gen_ai_endpoint, version, environment, application_n
|
|
550
550
|
else:
|
551
551
|
i = 0
|
552
552
|
while i < kwargs["n"] and trace_content is True:
|
553
|
-
attribute_name = f"gen_ai.
|
553
|
+
attribute_name = f"gen_ai.completion.{i}"
|
554
554
|
span.set_attribute(attribute_name,
|
555
555
|
response.choices[i].text)
|
556
556
|
i += 1
|
@@ -273,7 +273,7 @@ def async_chat_completions(gen_ai_endpoint, version, environment, application_na
|
|
273
273
|
else:
|
274
274
|
i = 0
|
275
275
|
while i < kwargs["n"] and trace_content is True:
|
276
|
-
attribute_name = f"gen_ai.
|
276
|
+
attribute_name = f"gen_ai.completion.{i}"
|
277
277
|
span.set_attribute(attribute_name,
|
278
278
|
response.choices[i].message.content)
|
279
279
|
i += 1
|
@@ -269,7 +269,7 @@ def azure_chat_completions(gen_ai_endpoint, version, environment, application_na
|
|
269
269
|
else:
|
270
270
|
i = 0
|
271
271
|
while i < kwargs["n"] and trace_content is True:
|
272
|
-
attribute_name = f"gen_ai.
|
272
|
+
attribute_name = f"gen_ai.completion.{i}"
|
273
273
|
span.set_attribute(attribute_name,
|
274
274
|
response.choices[i].message.content)
|
275
275
|
i += 1
|
@@ -548,7 +548,7 @@ def azure_completions(gen_ai_endpoint, version, environment, application_name,
|
|
548
548
|
else:
|
549
549
|
i = 0
|
550
550
|
while i < kwargs["n"] and trace_content is True:
|
551
|
-
attribute_name = f"gen_ai.
|
551
|
+
attribute_name = f"gen_ai.completion.{i}"
|
552
552
|
span.set_attribute(attribute_name,
|
553
553
|
response.choices[i].text)
|
554
554
|
i += 1
|
@@ -272,7 +272,7 @@ def chat_completions(gen_ai_endpoint, version, environment, application_name,
|
|
272
272
|
else:
|
273
273
|
i = 0
|
274
274
|
while i < kwargs["n"] and trace_content is True:
|
275
|
-
attribute_name = f"gen_ai.
|
275
|
+
attribute_name = f"gen_ai.completion.{i}"
|
276
276
|
span.set_attribute(attribute_name,
|
277
277
|
response.choices[i].message.content)
|
278
278
|
i += 1
|
@@ -98,7 +98,7 @@ def text_wrap(gen_ai_endpoint, version, environment, application_name,
|
|
98
98
|
completion_tokens = 0
|
99
99
|
for completion in response:
|
100
100
|
if len(response) > 1:
|
101
|
-
attribute_name = f"gen_ai.
|
101
|
+
attribute_name = f"gen_ai.completion.{i}"
|
102
102
|
else:
|
103
103
|
attribute_name = SemanticConvetion.GEN_AI_CONTENT_COMPLETION
|
104
104
|
if i == 0:
|
openlit/semcov/__init__.py
CHANGED
@@ -21,7 +21,7 @@ class SemanticConvetion:
|
|
21
21
|
GEN_AI_SYSTEM = "gen_ai.system"
|
22
22
|
GEN_AI_ENVIRONMENT = "gen_ai.environment"
|
23
23
|
GEN_AI_APPLICATION_NAME = "gen_ai.application_name"
|
24
|
-
GEN_AI_TYPE = "gen_ai.
|
24
|
+
GEN_AI_TYPE = "gen_ai.operation.name"
|
25
25
|
GEN_AI_HUB_OWNER = "gen_ai.hub.owner"
|
26
26
|
GEN_AI_HUB_REPO = "gen_ai.hub.repo"
|
27
27
|
GEN_AI_RETRIEVAL_SOURCE = "gen_ai.retrieval.source"
|
@@ -68,8 +68,8 @@ class SemanticConvetion:
|
|
68
68
|
GEN_AI_RESPONSE_IMAGE_STYLE = "gen_ai.request.image_style"
|
69
69
|
|
70
70
|
# GenAI Content
|
71
|
-
GEN_AI_CONTENT_PROMPT = "gen_ai.
|
72
|
-
GEN_AI_CONTENT_COMPLETION = "gen_ai.
|
71
|
+
GEN_AI_CONTENT_PROMPT = "gen_ai.prompt"
|
72
|
+
GEN_AI_CONTENT_COMPLETION = "gen_ai.completion"
|
73
73
|
GEN_AI_CONTENT_REVISED_PROMPT = "gen_ai.content.revised_prompt"
|
74
74
|
|
75
75
|
# GenAI Evaluation Metrics
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: openlit
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.13.0
|
4
4
|
Summary: OpenTelemetry-native Auto instrumentation library for monitoring LLM Applications, facilitating the integration of observability into your GenAI-driven projects
|
5
5
|
Home-page: https://github.com/openlit/openlit/tree/main/openlit/python
|
6
6
|
Keywords: OpenTelemetry,otel,otlp,llm,tracing,openai,anthropic,claude,cohere,llm monitoring,observability,monitoring,gpt,Generative AI,chatGPT
|
@@ -36,7 +36,8 @@ OpenTelemetry Auto-Instrumentation for GenAI & LLM Applications</h1>
|
|
36
36
|
[](https://github.com/openlit/openlit/graphs/contributors)
|
37
37
|
|
38
38
|
[](https://join.slack.com/t/openlit/shared_invite/zt-2etnfttwg-TjP_7BZXfYg84oAukY8QRQ)
|
39
|
-
[](https://discord.gg/rjvTm6zd)
|
40
|
+
[](https://twitter.com/openlit_io)
|
40
41
|
|
41
42
|

|
42
43
|
|
@@ -70,8 +71,9 @@ This project adheres to the [Semantic Conventions](https://github.com/open-telem
|
|
70
71
|
- [✅ Prometheus + Tempo](https://docs.openlit.io/latest/connections/prometheus-tempo)
|
71
72
|
- [✅ Prometheus + Jaeger](https://docs.openlit.io/latest/connections/prometheus-jaeger)
|
72
73
|
- [✅ Grafana Cloud](https://docs.openlit.io/latest/connections/grafanacloud)
|
73
|
-
- [✅ DataDog](https://docs.openlit.io/latest/connections/datadog)
|
74
74
|
- [✅ New Relic](https://docs.openlit.io/latest/connections/new-relic)
|
75
|
+
- [✅ Elastic](https://docs.openlit.io/latest/connections/elastic)
|
76
|
+
- [✅ DataDog](https://docs.openlit.io/latest/connections/datadog)
|
75
77
|
- [✅ SigNoz](https://docs.openlit.io/latest/connections/signoz)
|
76
78
|
- [✅ Dynatrace](https://docs.openlit.io/latest/connections/dynatrace)
|
77
79
|
- [✅ OpenObserve](https://docs.openlit.io/latest/connections/openobserve)
|
@@ -190,7 +192,7 @@ Whether it's big or small, we love contributions 💚. Check out our [Contributi
|
|
190
192
|
|
191
193
|
Unsure where to start? Here are a few ways to get involved:
|
192
194
|
|
193
|
-
- Join our [Slack
|
195
|
+
- Join our [Slack](https://join.slack.com/t/openlit/shared_invite/zt-2etnfttwg-TjP_7BZXfYg84oAukY8QRQ) or [Discord](https://discord.gg/rjvTm6zd) community to discuss ideas, share feedback, and connect with both our team and the wider OpenLIT community.
|
194
196
|
|
195
197
|
Your input helps us grow and improve, and we're here to support you every step of the way.
|
196
198
|
|
@@ -199,7 +201,7 @@ Your input helps us grow and improve, and we're here to support you every step o
|
|
199
201
|
Connect with the OpenLIT community and maintainers for support, discussions, and updates:
|
200
202
|
|
201
203
|
- 🌟 If you like it, Leave a star on our [GitHub](https://github.com/openlit/openlit/)
|
202
|
-
- 🌍 Join our [Slack](https://join.slack.com/t/openlit/shared_invite/zt-2etnfttwg-TjP_7BZXfYg84oAukY8QRQ)
|
204
|
+
- 🌍 Join our [Slack](https://join.slack.com/t/openlit/shared_invite/zt-2etnfttwg-TjP_7BZXfYg84oAukY8QRQ) or [Discord](https://discord.gg/rjvTm6zd) community for live interactions and questions.
|
203
205
|
- 🐞 Report bugs on our [GitHub Issues](https://github.com/openlit/openlit/issues) to help us improve OpenLIT.
|
204
206
|
- 𝕏 Follow us on [X](https://x.com/openlit_io) for the latest updates and news.
|
205
207
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
openlit/__helpers.py,sha256=lrn4PBs9owDudiCY2NBoVbAi7AU_HtUpyOj0oqPBsPY,5545
|
2
|
-
openlit/__init__.py,sha256=
|
2
|
+
openlit/__init__.py,sha256=ZkXQbO0l2trFv-DqljF5ZLCCBJqjqOMIxmE6Tcafabg,14452
|
3
3
|
openlit/instrumentation/anthropic/__init__.py,sha256=oaU53BOPyfUKbEzYvLr1DPymDluurSnwo4Hernf2XdU,1955
|
4
4
|
openlit/instrumentation/anthropic/anthropic.py,sha256=CYBui5eEfWdSfFF0xtCQjh1xO-gCVJc_V9Hli0szVZE,16026
|
5
5
|
openlit/instrumentation/anthropic/async_anthropic.py,sha256=NW84kTQ3BkUx1zZuMRps_J7zTYkmq5BxOrqSjqWInBs,16068
|
@@ -14,8 +14,8 @@ openlit/instrumentation/embedchain/embedchain.py,sha256=SLlr7qieT3kp4M6OYSRy8FaV
|
|
14
14
|
openlit/instrumentation/gpt4all/__init__.py,sha256=-59CP2B3-HGZJ_vC-fI9Dt-0BuQXRhSCWCjnaGeU15Q,1802
|
15
15
|
openlit/instrumentation/gpt4all/gpt4all.py,sha256=iDu8CAat4j5VPAlhIdkGOclZvhFPG-u7zKwadsKeJps,17948
|
16
16
|
openlit/instrumentation/groq/__init__.py,sha256=uW_0G6HSanQyK2dIXYhzR604pDiyPQfybzc37DsfSew,1911
|
17
|
-
openlit/instrumentation/groq/async_groq.py,sha256=
|
18
|
-
openlit/instrumentation/groq/groq.py,sha256=
|
17
|
+
openlit/instrumentation/groq/async_groq.py,sha256=aOwgoUrEqIgLSlnAtJnaGIF8T_LUlpTnOzPNBIUwez4,19076
|
18
|
+
openlit/instrumentation/groq/groq.py,sha256=iMh4TPwBEJ7Eg6Gi4x6KYpELtQKDXIsgLrh6kQHVkHc,19040
|
19
19
|
openlit/instrumentation/haystack/__init__.py,sha256=QK6XxxZUHX8vMv2Crk7rNBOc64iOOBLhJGL_lPlAZ8s,1758
|
20
20
|
openlit/instrumentation/haystack/haystack.py,sha256=oQIZiDhdp3gnJnhYQ1OouJMc9YT0pQ-_31cmNuopa68,3891
|
21
21
|
openlit/instrumentation/langchain/__init__.py,sha256=TW1ZR7I1i9Oig-wDWp3j1gmtQFO76jNBXQRBGGKzoOo,2531
|
@@ -31,23 +31,23 @@ openlit/instrumentation/ollama/__init__.py,sha256=cOax8PiypDuo_FC4WvDCYBRo7lH5nV
|
|
31
31
|
openlit/instrumentation/ollama/async_ollama.py,sha256=ESk1zZTj2hPmkWIH5F2owuoo0apleDSSx5VORlO3e3w,28991
|
32
32
|
openlit/instrumentation/ollama/ollama.py,sha256=PLGF9RB3TRNZ9GSGqeGVvKFBtgUK8Hc8xwvk-3NPeGI,28901
|
33
33
|
openlit/instrumentation/openai/__init__.py,sha256=AZ2cPr3TMKkgGdMl_yXMeSi7bWhtmMqOW1iHdzHHGHA,16265
|
34
|
-
openlit/instrumentation/openai/async_azure_openai.py,sha256=
|
35
|
-
openlit/instrumentation/openai/async_openai.py,sha256=
|
36
|
-
openlit/instrumentation/openai/azure_openai.py,sha256=
|
37
|
-
openlit/instrumentation/openai/openai.py,sha256=
|
34
|
+
openlit/instrumentation/openai/async_azure_openai.py,sha256=Lkclj_EraztqBpuYldDMwhqApa0iUb1s5gcUlgkwMkA,46281
|
35
|
+
openlit/instrumentation/openai/async_openai.py,sha256=KtY_nGbUjDXE4jU3udGT51XbV-FVJwPMj8uoHfiAvi8,45833
|
36
|
+
openlit/instrumentation/openai/azure_openai.py,sha256=q1o2tnxOY5Abm3YV7cNqkgLJPNzIxlETZ2gET6FRdxI,46075
|
37
|
+
openlit/instrumentation/openai/openai.py,sha256=kTGe7BjByIVRSWEALwFc1D3ZYLioTmKlZ4m76luupoQ,46514
|
38
38
|
openlit/instrumentation/pinecone/__init__.py,sha256=Mv9bElqNs07_JQkYyNnO0wOM3hdbprmw7sttdMeKC7g,2526
|
39
39
|
openlit/instrumentation/pinecone/pinecone.py,sha256=0EhLmtOuvwWVvAKh3e56wyd8wzQq1oaLOmF15SVHxVE,8765
|
40
40
|
openlit/instrumentation/qdrant/__init__.py,sha256=OJIg17-IGmBEvBYVKjCHcJ0hFXuEL7XV_jzUTqkolN8,4799
|
41
41
|
openlit/instrumentation/qdrant/qdrant.py,sha256=4uHKYGvWQtRAEVLUWo3o4joJw7hFm2NxVuBu5YKZKiI,14456
|
42
42
|
openlit/instrumentation/transformers/__init__.py,sha256=9-KLjq-aPTh13gTBYsWltV6hokGwt3mP4759SwsaaCk,1478
|
43
|
-
openlit/instrumentation/transformers/transformers.py,sha256=
|
43
|
+
openlit/instrumentation/transformers/transformers.py,sha256=Kh7WlEDT4ZNGQTMO8V-eYCc45nj-OPrkXXN-Ss4V5no,7584
|
44
44
|
openlit/instrumentation/vertexai/__init__.py,sha256=N3E9HtzefD-zC0fvmfGYiDmSqssoavp_i59wfuYLyMw,6079
|
45
45
|
openlit/instrumentation/vertexai/async_vertexai.py,sha256=PMHYyLf1J4gZpC_-KZ_ZVx1xIHhZDJSNa7mrjNXZ5M0,52372
|
46
46
|
openlit/instrumentation/vertexai/vertexai.py,sha256=UvpNKBHPoV9idVMfGigZnmWuEQiyqSwZn0zK9-U7Lzw,52125
|
47
47
|
openlit/otel/metrics.py,sha256=O7NoaDz0bY19mqpE4-0PcKwEe-B-iJFRgOCaanAuZAc,4291
|
48
48
|
openlit/otel/tracing.py,sha256=vL1ifMbARPBpqK--yXYsCM6y5dSu5LFIKqkhZXtYmUc,3712
|
49
|
-
openlit/semcov/__init__.py,sha256=
|
50
|
-
openlit-1.
|
51
|
-
openlit-1.
|
52
|
-
openlit-1.
|
53
|
-
openlit-1.
|
49
|
+
openlit/semcov/__init__.py,sha256=fZve0UdvbZCcXBBiYhQhwm6gFe9JPkZznyr8W3wiI68,6681
|
50
|
+
openlit-1.13.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
51
|
+
openlit-1.13.0.dist-info/METADATA,sha256=d_S0Eqcq8Oh0i9yPN21bc6yDFpdxhFuZ97Rv8sQByoc,13329
|
52
|
+
openlit-1.13.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
53
|
+
openlit-1.13.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|