openlit 1.33.8__py3-none-any.whl → 1.33.10__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.
Files changed (92) hide show
  1. openlit/__helpers.py +88 -0
  2. openlit/__init__.py +4 -3
  3. openlit/instrumentation/ag2/ag2.py +5 -5
  4. openlit/instrumentation/ai21/__init__.py +4 -4
  5. openlit/instrumentation/ai21/ai21.py +370 -319
  6. openlit/instrumentation/ai21/async_ai21.py +371 -319
  7. openlit/instrumentation/anthropic/__init__.py +4 -4
  8. openlit/instrumentation/anthropic/anthropic.py +321 -189
  9. openlit/instrumentation/anthropic/async_anthropic.py +323 -190
  10. openlit/instrumentation/assemblyai/__init__.py +1 -1
  11. openlit/instrumentation/assemblyai/assemblyai.py +59 -43
  12. openlit/instrumentation/astra/astra.py +9 -9
  13. openlit/instrumentation/astra/async_astra.py +9 -9
  14. openlit/instrumentation/azure_ai_inference/__init__.py +4 -4
  15. openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +406 -252
  16. openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +406 -252
  17. openlit/instrumentation/bedrock/__init__.py +1 -1
  18. openlit/instrumentation/bedrock/bedrock.py +115 -58
  19. openlit/instrumentation/chroma/chroma.py +9 -9
  20. openlit/instrumentation/cohere/__init__.py +33 -10
  21. openlit/instrumentation/cohere/async_cohere.py +610 -0
  22. openlit/instrumentation/cohere/cohere.py +410 -219
  23. openlit/instrumentation/controlflow/controlflow.py +5 -5
  24. openlit/instrumentation/crawl4ai/async_crawl4ai.py +5 -5
  25. openlit/instrumentation/crawl4ai/crawl4ai.py +5 -5
  26. openlit/instrumentation/crewai/crewai.py +6 -4
  27. openlit/instrumentation/dynamiq/dynamiq.py +5 -5
  28. openlit/instrumentation/elevenlabs/async_elevenlabs.py +71 -46
  29. openlit/instrumentation/elevenlabs/elevenlabs.py +71 -51
  30. openlit/instrumentation/embedchain/embedchain.py +9 -9
  31. openlit/instrumentation/firecrawl/firecrawl.py +5 -5
  32. openlit/instrumentation/google_ai_studio/__init__.py +9 -9
  33. openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +183 -219
  34. openlit/instrumentation/google_ai_studio/google_ai_studio.py +183 -220
  35. openlit/instrumentation/gpt4all/__init__.py +2 -2
  36. openlit/instrumentation/gpt4all/gpt4all.py +345 -220
  37. openlit/instrumentation/gpu/__init__.py +5 -5
  38. openlit/instrumentation/groq/__init__.py +2 -2
  39. openlit/instrumentation/groq/async_groq.py +356 -240
  40. openlit/instrumentation/groq/groq.py +356 -240
  41. openlit/instrumentation/haystack/haystack.py +5 -5
  42. openlit/instrumentation/julep/async_julep.py +5 -5
  43. openlit/instrumentation/julep/julep.py +5 -5
  44. openlit/instrumentation/langchain/__init__.py +13 -7
  45. openlit/instrumentation/langchain/async_langchain.py +384 -0
  46. openlit/instrumentation/langchain/langchain.py +105 -492
  47. openlit/instrumentation/letta/letta.py +11 -9
  48. openlit/instrumentation/litellm/__init__.py +4 -5
  49. openlit/instrumentation/litellm/async_litellm.py +318 -247
  50. openlit/instrumentation/litellm/litellm.py +314 -243
  51. openlit/instrumentation/llamaindex/llamaindex.py +5 -5
  52. openlit/instrumentation/mem0/mem0.py +5 -5
  53. openlit/instrumentation/milvus/milvus.py +9 -9
  54. openlit/instrumentation/mistral/__init__.py +6 -6
  55. openlit/instrumentation/mistral/async_mistral.py +423 -250
  56. openlit/instrumentation/mistral/mistral.py +420 -246
  57. openlit/instrumentation/multion/async_multion.py +6 -4
  58. openlit/instrumentation/multion/multion.py +6 -4
  59. openlit/instrumentation/ollama/__init__.py +8 -30
  60. openlit/instrumentation/ollama/async_ollama.py +385 -417
  61. openlit/instrumentation/ollama/ollama.py +384 -417
  62. openlit/instrumentation/openai/__init__.py +11 -230
  63. openlit/instrumentation/openai/async_openai.py +433 -410
  64. openlit/instrumentation/openai/openai.py +414 -394
  65. openlit/instrumentation/phidata/phidata.py +6 -4
  66. openlit/instrumentation/pinecone/pinecone.py +9 -9
  67. openlit/instrumentation/premai/__init__.py +2 -2
  68. openlit/instrumentation/premai/premai.py +262 -213
  69. openlit/instrumentation/qdrant/async_qdrant.py +9 -9
  70. openlit/instrumentation/qdrant/qdrant.py +9 -9
  71. openlit/instrumentation/reka/__init__.py +2 -2
  72. openlit/instrumentation/reka/async_reka.py +90 -52
  73. openlit/instrumentation/reka/reka.py +90 -52
  74. openlit/instrumentation/together/__init__.py +4 -4
  75. openlit/instrumentation/together/async_together.py +278 -236
  76. openlit/instrumentation/together/together.py +278 -236
  77. openlit/instrumentation/transformers/__init__.py +1 -1
  78. openlit/instrumentation/transformers/transformers.py +76 -45
  79. openlit/instrumentation/vertexai/__init__.py +14 -64
  80. openlit/instrumentation/vertexai/async_vertexai.py +330 -987
  81. openlit/instrumentation/vertexai/vertexai.py +330 -987
  82. openlit/instrumentation/vllm/__init__.py +1 -1
  83. openlit/instrumentation/vllm/vllm.py +66 -36
  84. openlit/otel/metrics.py +98 -7
  85. openlit/semcov/__init__.py +113 -80
  86. {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/METADATA +1 -1
  87. openlit-1.33.10.dist-info/RECORD +122 -0
  88. {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/WHEEL +1 -1
  89. openlit/instrumentation/openai/async_azure_openai.py +0 -900
  90. openlit/instrumentation/openai/azure_openai.py +0 -898
  91. openlit-1.33.8.dist-info/RECORD +0 -122
  92. {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/LICENSE +0 -0
@@ -5,7 +5,7 @@ Module for monitoring controlflow.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import handle_exception
10
10
  from openlit.semcov import SemanticConvetion
11
11
 
@@ -64,12 +64,12 @@ def wrap_controlflow(gen_ai_endpoint, version, environment, application_name,
64
64
  gen_ai_endpoint)
65
65
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
66
66
  SemanticConvetion.GEN_AI_SYSTEM_CONTROLFLOW)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
67
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
68
68
  environment)
69
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
69
+ span.set_attribute(SERVICE_NAME,
70
70
  application_name)
71
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
72
- SemanticConvetion.GEN_AI_TYPE_AGENT)
71
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
72
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
73
73
 
74
74
  if gen_ai_endpoint == "controlflow.create_agent":
75
75
  span.set_attribute(SemanticConvetion.GEN_AI_AGENT_ROLE,
@@ -5,7 +5,7 @@ Module for monitoring Crawl4AI calls.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import (
10
10
  handle_exception,
11
11
  )
@@ -58,13 +58,13 @@ def async_wrap_crawl(gen_ai_endpoint, version, environment, application_name,
58
58
  span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
59
59
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
60
60
  SemanticConvetion.GEN_AI_SYSTEM_CRAWL4AI)
61
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
62
- SemanticConvetion.GEN_AI_TYPE_AGENT)
61
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
62
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
63
63
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
64
64
  gen_ai_endpoint)
65
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
65
+ span.set_attribute(SERVICE_NAME,
66
66
  application_name)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
67
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
68
68
  environment)
69
69
  span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
70
70
  SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
@@ -5,7 +5,7 @@ Module for monitoring Crawl4AI calls.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import (
10
10
  handle_exception,
11
11
  )
@@ -58,13 +58,13 @@ def wrap_crawl(gen_ai_endpoint, version, environment, application_name,
58
58
  span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
59
59
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
60
60
  SemanticConvetion.GEN_AI_SYSTEM_CRAWL4AI)
61
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
62
- SemanticConvetion.GEN_AI_TYPE_AGENT)
61
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
62
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
63
63
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
64
64
  gen_ai_endpoint)
65
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
65
+ span.set_attribute(SERVICE_NAME,
66
66
  application_name)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
67
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
68
68
  environment)
69
69
  span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
70
70
  SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
@@ -6,7 +6,7 @@ Module for monitoring LiteLLM calls.
6
6
  import logging
7
7
  import json
8
8
  from opentelemetry.trace import SpanKind, Status, StatusCode
9
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
9
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
10
10
  from openlit.__helpers import (
11
11
  handle_exception,
12
12
  )
@@ -71,12 +71,14 @@ def crew_wrap(gen_ai_endpoint, version, environment, application_name,
71
71
  span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
72
72
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
73
73
  SemanticConvetion.GEN_AI_SYSTEM_CREWAI)
74
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
75
- SemanticConvetion.GEN_AI_TYPE_AGENT)
74
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
75
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
76
76
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
77
77
  gen_ai_endpoint)
78
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
78
+ span.set_attribute(SERVICE_NAME,
79
79
  application_name)
80
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
81
+ environment)
80
82
 
81
83
  instance_class = instance.__class__.__name__
82
84
 
@@ -5,7 +5,7 @@ Module for monitoring Dynamiq calls.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import (
10
10
  handle_exception,
11
11
  )
@@ -58,13 +58,13 @@ def dynamiq_wrap(gen_ai_endpoint, version, environment, application_name,
58
58
  span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
59
59
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
60
60
  SemanticConvetion.GEN_AI_SYSTEM_DYNAMIQ)
61
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
62
- SemanticConvetion.GEN_AI_TYPE_AGENT)
61
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
62
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
63
63
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
64
64
  gen_ai_endpoint)
65
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
65
+ span.set_attribute(SERVICE_NAME,
66
66
  application_name)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
67
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
68
68
  environment)
69
69
 
70
70
  if gen_ai_endpoint == "dynamiq.agent_run":
@@ -1,13 +1,17 @@
1
- # pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment
2
1
  """
3
2
  Module for monitoring Ollama API calls.
4
3
  """
5
4
 
6
5
  import logging
6
+ import time
7
+ from urllib.parse import urlparse
7
8
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
9
- from openlit.__helpers import get_audio_model_cost
10
- from openlit.__helpers import handle_exception
9
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
10
+ from openlit.__helpers import (
11
+ get_audio_model_cost,
12
+ handle_exception,
13
+ create_metrics_attributes,
14
+ )
11
15
  from openlit.semcov import SemanticConvetion
12
16
 
13
17
  # Initialize logger for logging potential issues and operations
@@ -19,7 +23,6 @@ def async_generate(gen_ai_endpoint, version, environment, application_name,
19
23
  Generates a telemetry wrapper for creating speech audio to collect metrics.
20
24
 
21
25
  Args:
22
- gen_ai_endpoint: Endpoint identifier for logging and tracing.
23
26
  version: Version of the monitoring package.
24
27
  environment: Deployment environment (e.g., production, staging).
25
28
  application_name: Name of the application using the ElevenLabs API.
@@ -47,73 +50,95 @@ def async_generate(gen_ai_endpoint, version, environment, application_name,
47
50
  Returns:
48
51
  The response from the original 'generate' method.
49
52
  """
53
+ url = urlparse(instance._client_wrapper._base_url)
54
+ server_address, server_port = url.hostname, url.port or 443
55
+ request_model = kwargs.get('model', kwargs.get('model_id', 'eleven_multilingual_v2'))
50
56
 
51
- with tracer.start_as_current_span(gen_ai_endpoint, kind= SpanKind.CLIENT) as span:
57
+ span_name = f'{SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO} {request_model}'
58
+
59
+ with tracer.start_as_current_span(span_name, kind= SpanKind.CLIENT) as span:
60
+ start_time = time.time()
52
61
  response = await wrapped(*args, **kwargs)
62
+ end_time = time.time()
53
63
 
54
64
  try:
55
65
  # Calculate cost of the operation
56
- cost = get_audio_model_cost(kwargs.get("model", "eleven_multilingual_v2"),
57
- pricing_info, kwargs.get("text", ""))
66
+ cost = get_audio_model_cost(request_model,
67
+ pricing_info, kwargs.get('text', ''))
58
68
 
59
69
  # Set Span attributes
60
- span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
70
+ span.set_attribute(TELEMETRY_SDK_NAME, 'openlit')
71
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
72
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO)
61
73
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
62
- SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS)
63
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
64
- SemanticConvetion.GEN_AI_TYPE_AUDIO)
65
- span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
66
- gen_ai_endpoint)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
68
- environment)
69
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
70
- application_name)
74
+ SemanticConvetion.GEN_AI_SYSTEM_ASSEMBLYAI)
75
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
76
+ request_model)
77
+ span.set_attribute(SemanticConvetion.SERVER_ADDRESS,
78
+ server_address)
79
+ span.set_attribute(SemanticConvetion.SERVER_PORT,
80
+ server_port)
81
+ span.set_attribute(SemanticConvetion.GEN_AI_RESPONSE_MODEL,
82
+ request_model)
71
83
  span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
72
- kwargs.get("model", "eleven_multilingual_v2"))
73
- if isinstance(kwargs.get("voice", "Rachel"), str):
84
+ request_model)
85
+ span.set_attribute(SemanticConvetion.GEN_AI_OUTPUT_TYPE,
86
+ 'audio')
87
+
88
+ # Set Span attributes (Extras)
89
+ if gen_ai_endpoint == 'elevenlabs.generate':
90
+ if isinstance(kwargs.get('voice', 'Rachel'), str):
91
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
92
+ kwargs.get('voice', 'Rachel'))
93
+ else:
74
94
  span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
75
- kwargs.get("voice", "Rachel"))
76
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
77
- kwargs.get("output_format", "mp3"))
78
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
79
- str(kwargs.get("voice_settings", "")))
80
- span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
81
- cost)
95
+ kwargs.get('voice_id', ''))
96
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
97
+ kwargs.get('output_format', 'mp3'))
98
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
99
+ str(kwargs.get('voice_settings', '')))
100
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
101
+ environment)
102
+ span.set_attribute(SERVICE_NAME,
103
+ application_name)
104
+ span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
105
+ cost)
106
+ span.set_attribute(SemanticConvetion.GEN_AI_SDK_VERSION,
107
+ version)
82
108
  if trace_content:
83
109
  span.add_event(
84
110
  name=SemanticConvetion.GEN_AI_CONTENT_PROMPT_EVENT,
85
111
  attributes={
86
- SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get("text", "")),
112
+ SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get('text', '')),
87
113
  },
88
114
  )
89
115
 
90
116
  span.set_status(Status(StatusCode.OK))
91
117
 
92
118
  if disable_metrics is False:
93
- attributes = {
94
- TELEMETRY_SDK_NAME:
95
- "openlit",
96
- SemanticConvetion.GEN_AI_APPLICATION_NAME:
97
- application_name,
98
- SemanticConvetion.GEN_AI_SYSTEM:
99
- SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
100
- SemanticConvetion.GEN_AI_ENVIRONMENT:
101
- environment,
102
- SemanticConvetion.GEN_AI_TYPE:
103
- SemanticConvetion.GEN_AI_TYPE_AUDIO,
104
- SemanticConvetion.GEN_AI_REQUEST_MODEL:
105
- kwargs.get("model", "eleven_multilingual_v2")
106
- }
107
-
108
- metrics["genai_requests"].add(1, attributes)
109
- metrics["genai_cost"].record(cost, attributes)
119
+ attributes = create_metrics_attributes(
120
+ service_name=application_name,
121
+ deployment_environment=environment,
122
+ operation=SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO,
123
+ system=SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
124
+ request_model=request_model,
125
+ server_address=server_address,
126
+ server_port=server_port,
127
+ response_model=request_model,
128
+ )
129
+
130
+ metrics['genai_client_operation_duration'].record(
131
+ end_time - start_time, attributes
132
+ )
133
+ metrics['genai_requests'].add(1, attributes)
134
+ metrics['genai_cost'].record(cost, attributes)
110
135
 
111
136
  # Return original response
112
137
  return response
113
138
 
114
139
  except Exception as e:
115
140
  handle_exception(span, e)
116
- logger.error("Error in trace creation: %s", e)
141
+ logger.error('Error in trace creation: %s', e)
117
142
 
118
143
  # Return original response
119
144
  return response
@@ -1,13 +1,17 @@
1
- # pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment
2
1
  """
3
2
  Module for monitoring Ollama API calls.
4
3
  """
5
4
 
6
5
  import logging
6
+ import time
7
+ from urllib.parse import urlparse
7
8
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
9
- from openlit.__helpers import get_audio_model_cost
10
- from openlit.__helpers import handle_exception
9
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
10
+ from openlit.__helpers import (
11
+ get_audio_model_cost,
12
+ handle_exception,
13
+ create_metrics_attributes,
14
+ )
11
15
  from openlit.semcov import SemanticConvetion
12
16
 
13
17
  # Initialize logger for logging potential issues and operations
@@ -19,7 +23,6 @@ def generate(gen_ai_endpoint, version, environment, application_name,
19
23
  Generates a telemetry wrapper for creating speech audio to collect metrics.
20
24
 
21
25
  Args:
22
- gen_ai_endpoint: Endpoint identifier for logging and tracing.
23
26
  version: Version of the monitoring package.
24
27
  environment: Deployment environment (e.g., production, staging).
25
28
  application_name: Name of the application using the ElevenLabs API.
@@ -48,78 +51,95 @@ def generate(gen_ai_endpoint, version, environment, application_name,
48
51
  The response from the original 'generate' method.
49
52
  """
50
53
 
51
- with tracer.start_as_current_span(gen_ai_endpoint, kind= SpanKind.CLIENT) as span:
54
+ url = urlparse(instance._client_wrapper._base_url)
55
+ server_address, server_port = url.hostname, url.port or 443
56
+ request_model = kwargs.get('model', kwargs.get('model_id', 'eleven_multilingual_v2'))
57
+
58
+ span_name = f'{SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO} {request_model}'
59
+
60
+ with tracer.start_as_current_span(span_name, kind= SpanKind.CLIENT) as span:
61
+ start_time = time.time()
52
62
  response = wrapped(*args, **kwargs)
63
+ end_time = time.time()
53
64
 
54
65
  try:
55
66
  # Calculate cost of the operation
56
- cost = get_audio_model_cost(kwargs.get("model", "eleven_multilingual_v2"),
57
- pricing_info, kwargs.get("text", ""))
67
+ cost = get_audio_model_cost(request_model,
68
+ pricing_info, kwargs.get('text', ''))
58
69
 
59
70
  # Set Span attributes
60
- span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
71
+ span.set_attribute(TELEMETRY_SDK_NAME, 'openlit')
72
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
73
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO)
61
74
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
62
- SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS)
63
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
64
- SemanticConvetion.GEN_AI_TYPE_AUDIO)
65
- span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
66
- gen_ai_endpoint)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
68
- environment)
69
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
70
- application_name)
71
- if gen_ai_endpoint == "elevenlabs.generate":
72
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
73
- kwargs.get("model", "eleven_multilingual_v2"))
74
- if isinstance(kwargs.get("voice", "Rachel"), str):
75
+ SemanticConvetion.GEN_AI_SYSTEM_ASSEMBLYAI)
76
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
77
+ request_model)
78
+ span.set_attribute(SemanticConvetion.SERVER_ADDRESS,
79
+ server_address)
80
+ span.set_attribute(SemanticConvetion.SERVER_PORT,
81
+ server_port)
82
+ span.set_attribute(SemanticConvetion.GEN_AI_RESPONSE_MODEL,
83
+ request_model)
84
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
85
+ request_model)
86
+ span.set_attribute(SemanticConvetion.GEN_AI_OUTPUT_TYPE,
87
+ 'audio')
88
+
89
+ # Set Span attributes (Extras)
90
+ if gen_ai_endpoint == 'elevenlabs.generate':
91
+ if isinstance(kwargs.get('voice', 'Rachel'), str):
75
92
  span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
76
- kwargs.get("voice", "Rachel"))
93
+ kwargs.get('voice', 'Rachel'))
77
94
  else:
78
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
79
- kwargs.get("model_id", "eleven_multilingual_v2"))
80
95
  span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
81
- kwargs.get("voice_id", ""))
82
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
83
- kwargs.get("output_format", "mp3"))
84
- span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
85
- str(kwargs.get("voice_settings", "")))
86
- span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
87
- cost)
96
+ kwargs.get('voice_id', ''))
97
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
98
+ kwargs.get('output_format', 'mp3'))
99
+ span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
100
+ str(kwargs.get('voice_settings', '')))
101
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
102
+ environment)
103
+ span.set_attribute(SERVICE_NAME,
104
+ application_name)
105
+ span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
106
+ cost)
107
+ span.set_attribute(SemanticConvetion.GEN_AI_SDK_VERSION,
108
+ version)
88
109
  if trace_content:
89
110
  span.add_event(
90
111
  name=SemanticConvetion.GEN_AI_CONTENT_PROMPT_EVENT,
91
112
  attributes={
92
- SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get("text", "")),
113
+ SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get('text', '')),
93
114
  },
94
115
  )
95
116
 
96
117
  span.set_status(Status(StatusCode.OK))
97
118
 
98
119
  if disable_metrics is False:
99
- attributes = {
100
- TELEMETRY_SDK_NAME:
101
- "openlit",
102
- SemanticConvetion.GEN_AI_APPLICATION_NAME:
103
- application_name,
104
- SemanticConvetion.GEN_AI_SYSTEM:
105
- SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
106
- SemanticConvetion.GEN_AI_ENVIRONMENT:
107
- environment,
108
- SemanticConvetion.GEN_AI_TYPE:
109
- SemanticConvetion.GEN_AI_TYPE_AUDIO,
110
- SemanticConvetion.GEN_AI_REQUEST_MODEL:
111
- kwargs.get("model", "eleven_multilingual_v2")
112
- }
113
-
114
- metrics["genai_requests"].add(1, attributes)
115
- metrics["genai_cost"].record(cost, attributes)
120
+ attributes = create_metrics_attributes(
121
+ service_name=application_name,
122
+ deployment_environment=environment,
123
+ operation=SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO,
124
+ system=SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
125
+ request_model=request_model,
126
+ server_address=server_address,
127
+ server_port=server_port,
128
+ response_model=request_model,
129
+ )
130
+
131
+ metrics['genai_client_operation_duration'].record(
132
+ end_time - start_time, attributes
133
+ )
134
+ metrics['genai_requests'].add(1, attributes)
135
+ metrics['genai_cost'].record(cost, attributes)
116
136
 
117
137
  # Return original response
118
138
  return response
119
139
 
120
140
  except Exception as e:
121
141
  handle_exception(span, e)
122
- logger.error("Error in trace creation: %s", e)
142
+ logger.error('Error in trace creation: %s', e)
123
143
 
124
144
  # Return original response
125
145
  return response
@@ -5,7 +5,7 @@ Module for monitoring EmbedChain applications.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import handle_exception
10
10
  from openlit.semcov import SemanticConvetion
11
11
 
@@ -63,11 +63,11 @@ def evaluate(gen_ai_endpoint, version, environment, application_name,
63
63
  SemanticConvetion.GEN_AI_SYSTEM_EMBEDCHAIN)
64
64
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
65
65
  gen_ai_endpoint)
66
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
66
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
67
67
  environment)
68
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
69
- SemanticConvetion.GEN_AI_TYPE_FRAMEWORK)
70
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
68
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
69
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_FRAMEWORK)
70
+ span.set_attribute(SERVICE_NAME,
71
71
  application_name)
72
72
  span.set_attribute(SemanticConvetion.GEN_AI_EVAL_CONTEXT_RELEVANCY,
73
73
  response["context_relevancy"])
@@ -141,11 +141,11 @@ def get_data_sources(gen_ai_endpoint, version, environment, application_name,
141
141
  SemanticConvetion.GEN_AI_SYSTEM_EMBEDCHAIN)
142
142
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
143
143
  gen_ai_endpoint)
144
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
144
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
145
145
  environment)
146
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
147
- SemanticConvetion.GEN_AI_TYPE_FRAMEWORK)
148
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
146
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
147
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_FRAMEWORK)
148
+ span.set_attribute(SERVICE_NAME,
149
149
  application_name)
150
150
  span.set_attribute(SemanticConvetion.GEN_AI_DATA_SOURCES,
151
151
  len(response))
@@ -5,7 +5,7 @@ Module for monitoring FireCrawl calls.
5
5
 
6
6
  import logging
7
7
  from opentelemetry.trace import SpanKind, Status, StatusCode
8
- from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
9
  from openlit.__helpers import (
10
10
  handle_exception,
11
11
  )
@@ -58,13 +58,13 @@ def wrap_crawl(gen_ai_endpoint, version, environment, application_name,
58
58
  span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
59
59
  span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
60
60
  SemanticConvetion.GEN_AI_SYSTEM_FIRECRAWL)
61
- span.set_attribute(SemanticConvetion.GEN_AI_TYPE,
62
- SemanticConvetion.GEN_AI_TYPE_AGENT)
61
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
62
+ SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
63
63
  span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
64
64
  gen_ai_endpoint)
65
- span.set_attribute(SemanticConvetion.GEN_AI_APPLICATION_NAME,
65
+ span.set_attribute(SERVICE_NAME,
66
66
  application_name)
67
- span.set_attribute(SemanticConvetion.GEN_AI_ENVIRONMENT,
67
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT,
68
68
  environment)
69
69
  span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
70
70
  SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
@@ -14,11 +14,11 @@ from openlit.instrumentation.google_ai_studio.async_google_ai_studio import (
14
14
  async_generate
15
15
  )
16
16
 
17
- _instruments = ("google-generativeai >= 0.2.0",)
17
+ _instruments = ("google-genai >= 1.3.0",)
18
18
 
19
19
  class GoogleAIStudioInstrumentor(BaseInstrumentor):
20
20
  """
21
- An instrumentor for google-generativeai's client library.
21
+ An instrumentor for google-genai's client library.
22
22
  """
23
23
 
24
24
  def instrumentation_dependencies(self) -> Collection[str]:
@@ -32,21 +32,21 @@ class GoogleAIStudioInstrumentor(BaseInstrumentor):
32
32
  pricing_info = kwargs.get("pricing_info", {})
33
33
  trace_content = kwargs.get("trace_content", False)
34
34
  disable_metrics = kwargs.get("disable_metrics")
35
- version = importlib.metadata.version("google-generativeai")
35
+ version = importlib.metadata.version("google-genai")
36
36
 
37
37
  # sync generate
38
38
  wrap_function_wrapper(
39
- "google.generativeai.generative_models",
40
- "GenerativeModel.generate_content",
41
- generate("google_ai_studio.generate_content", version, environment, application_name,
39
+ "google.genai.models",
40
+ "Models.generate_content",
41
+ generate(version, environment, application_name,
42
42
  tracer, pricing_info, trace_content, metrics, disable_metrics),
43
43
  )
44
44
 
45
45
  # async generate
46
46
  wrap_function_wrapper(
47
- "google.generativeai.generative_models",
48
- "GenerativeModel.generate_content_async",
49
- async_generate("google_ai_studio.generate_content", version, environment,
47
+ "google.genai.models",
48
+ "AsyncModels.generate_content",
49
+ async_generate(version, environment,
50
50
  application_name, tracer, pricing_info, trace_content, metrics,
51
51
  disable_metrics),
52
52
  )