Skip to content

Commit d307f3e

Browse files
authored
Implement better LLM tracing with llmetetry OpenAI instrumentation (#1319)
* Add Otel openai wrapper, bump other deps * Add instrumentation to OpenAI SDK directly instead of relying on httpx bindings * Patch httpx transports for openai * Revert azure keyvault changes * Revert crypto and msal upgrades * Revert other package updates * Async transport chain * roll back http client traces * Bump instrumentation version * Patch opentelemetry to latest
1 parent a9617cd commit d307f3e

File tree

3 files changed

+37
-24
lines changed

3 files changed

+37
-24
lines changed

app/backend/app.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
from openai import AsyncAzureOpenAI, AsyncOpenAI
2020
from opentelemetry.instrumentation.aiohttp_client import AioHttpClientInstrumentor
2121
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
22-
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
22+
from opentelemetry.instrumentation.httpx import (
23+
HTTPXClientInstrumentor,
24+
)
25+
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
2326
from quart import (
2427
Blueprint,
2528
Quart,
@@ -312,7 +315,10 @@ async def setup_clients():
312315
azure_ad_token_provider=token_provider,
313316
)
314317
elif OPENAI_HOST == "local":
315-
openai_client = AsyncOpenAI(base_url=os.environ["OPENAI_BASE_URL"], api_key="no-key-required")
318+
openai_client = AsyncOpenAI(
319+
base_url=os.environ["OPENAI_BASE_URL"],
320+
api_key="no-key-required",
321+
)
316322
else:
317323
openai_client = AsyncOpenAI(
318324
api_key=OPENAI_API_KEY,
@@ -345,7 +351,6 @@ async def setup_clients():
345351
)
346352

347353
if USE_GPT4V:
348-
349354
token_provider = get_bearer_token_provider(azure_credential, "https://cognitiveservices.azure.com/.default")
350355

351356
current_app.config[CONFIG_ASK_VISION_APPROACH] = RetrieveThenReadVisionApproach(
@@ -411,8 +416,10 @@ def create_app():
411416
configure_azure_monitor()
412417
# This tracks HTTP requests made by aiohttp:
413418
AioHttpClientInstrumentor().instrument()
414-
# This tracks HTTP requests made by httpx/openai:
419+
# This tracks HTTP requests made by httpx:
415420
HTTPXClientInstrumentor().instrument()
421+
# This tracks OpenAI SDK requests:
422+
OpenAIInstrumentor().instrument()
416423
# This middleware tracks app route requests:
417424
app.asgi_app = OpenTelemetryMiddleware(app.asgi_app) # type: ignore[method-assign]
418425

app/backend/requirements.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ opentelemetry-instrumentation-asgi
1313
opentelemetry-instrumentation-httpx
1414
opentelemetry-instrumentation-requests
1515
opentelemetry-instrumentation-aiohttp-client
16+
opentelemetry-instrumentation-openai
1617
msal
1718
azure-keyvault-secrets
1819
cryptography

app/backend/requirements.txt

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ asgiref==3.7.2
2121
attrs==23.2.0
2222
# via aiohttp
2323
azure-common==1.1.28
24-
# via
25-
# azure-keyvault-secrets
26-
# azure-search-documents
24+
# via azure-search-documents
2725
azure-core==1.30.0
2826
# via
2927
# azure-core-tracing-opentelemetry
@@ -156,7 +154,7 @@ oauthlib==3.2.2
156154
# via requests-oauthlib
157155
openai[datalib]==1.12.0
158156
# via -r requirements.in
159-
opentelemetry-api==1.22.0
157+
opentelemetry-api==1.23.0
160158
# via
161159
# azure-core-tracing-opentelemetry
162160
# azure-monitor-opentelemetry-exporter
@@ -168,13 +166,14 @@ opentelemetry-api==1.22.0
168166
# opentelemetry-instrumentation-fastapi
169167
# opentelemetry-instrumentation-flask
170168
# opentelemetry-instrumentation-httpx
169+
# opentelemetry-instrumentation-openai
171170
# opentelemetry-instrumentation-psycopg2
172171
# opentelemetry-instrumentation-requests
173172
# opentelemetry-instrumentation-urllib
174173
# opentelemetry-instrumentation-urllib3
175174
# opentelemetry-instrumentation-wsgi
176175
# opentelemetry-sdk
177-
opentelemetry-instrumentation==0.43b0
176+
opentelemetry-instrumentation==0.44b0
178177
# via
179178
# opentelemetry-instrumentation-aiohttp-client
180179
# opentelemetry-instrumentation-asgi
@@ -183,48 +182,51 @@ opentelemetry-instrumentation==0.43b0
183182
# opentelemetry-instrumentation-fastapi
184183
# opentelemetry-instrumentation-flask
185184
# opentelemetry-instrumentation-httpx
185+
# opentelemetry-instrumentation-openai
186186
# opentelemetry-instrumentation-psycopg2
187187
# opentelemetry-instrumentation-requests
188188
# opentelemetry-instrumentation-urllib
189189
# opentelemetry-instrumentation-urllib3
190190
# opentelemetry-instrumentation-wsgi
191-
opentelemetry-instrumentation-aiohttp-client==0.43b0
191+
opentelemetry-instrumentation-aiohttp-client==0.44b0
192192
# via -r requirements.in
193-
opentelemetry-instrumentation-asgi==0.43b0
193+
opentelemetry-instrumentation-asgi==0.44b0
194194
# via
195195
# -r requirements.in
196196
# opentelemetry-instrumentation-fastapi
197-
opentelemetry-instrumentation-dbapi==0.43b0
197+
opentelemetry-instrumentation-dbapi==0.44b0
198198
# via opentelemetry-instrumentation-psycopg2
199-
opentelemetry-instrumentation-django==0.43b0
199+
opentelemetry-instrumentation-django==0.44b0
200200
# via azure-monitor-opentelemetry
201-
opentelemetry-instrumentation-fastapi==0.43b0
201+
opentelemetry-instrumentation-fastapi==0.44b0
202202
# via azure-monitor-opentelemetry
203-
opentelemetry-instrumentation-flask==0.43b0
203+
opentelemetry-instrumentation-flask==0.44b0
204204
# via azure-monitor-opentelemetry
205-
opentelemetry-instrumentation-httpx==0.43b0
205+
opentelemetry-instrumentation-httpx==0.44b0
206206
# via -r requirements.in
207-
opentelemetry-instrumentation-psycopg2==0.43b0
207+
opentelemetry-instrumentation-openai==0.12.5
208+
# via -r requirements.in
209+
opentelemetry-instrumentation-psycopg2==0.44b0
208210
# via azure-monitor-opentelemetry
209-
opentelemetry-instrumentation-requests==0.43b0
211+
opentelemetry-instrumentation-requests==0.44b0
210212
# via
211213
# -r requirements.in
212214
# azure-monitor-opentelemetry
213-
opentelemetry-instrumentation-urllib==0.43b0
215+
opentelemetry-instrumentation-urllib==0.44b0
214216
# via azure-monitor-opentelemetry
215-
opentelemetry-instrumentation-urllib3==0.43b0
217+
opentelemetry-instrumentation-urllib3==0.44b0
216218
# via azure-monitor-opentelemetry
217-
opentelemetry-instrumentation-wsgi==0.43b0
219+
opentelemetry-instrumentation-wsgi==0.44b0
218220
# via
219221
# opentelemetry-instrumentation-django
220222
# opentelemetry-instrumentation-flask
221223
opentelemetry-resource-detector-azure==0.1.3
222224
# via azure-monitor-opentelemetry
223-
opentelemetry-sdk==1.22.0
225+
opentelemetry-sdk==1.23.0
224226
# via
225227
# azure-monitor-opentelemetry-exporter
226228
# opentelemetry-resource-detector-azure
227-
opentelemetry-semantic-conventions==0.43b0
229+
opentelemetry-semantic-conventions==0.44b0
228230
# via
229231
# opentelemetry-instrumentation-aiohttp-client
230232
# opentelemetry-instrumentation-asgi
@@ -238,13 +240,16 @@ opentelemetry-semantic-conventions==0.43b0
238240
# opentelemetry-instrumentation-urllib3
239241
# opentelemetry-instrumentation-wsgi
240242
# opentelemetry-sdk
241-
opentelemetry-util-http==0.43b0
243+
opentelemetry-semantic-conventions-ai==0.0.20
244+
# via opentelemetry-instrumentation-openai
245+
opentelemetry-util-http==0.44b0
242246
# via
243247
# opentelemetry-instrumentation-aiohttp-client
244248
# opentelemetry-instrumentation-asgi
245249
# opentelemetry-instrumentation-django
246250
# opentelemetry-instrumentation-fastapi
247251
# opentelemetry-instrumentation-flask
252+
# opentelemetry-instrumentation-httpx
248253
# opentelemetry-instrumentation-requests
249254
# opentelemetry-instrumentation-urllib
250255
# opentelemetry-instrumentation-urllib3

0 commit comments

Comments
 (0)