Skip to content

Commit 62651ce

Browse files
committed
feat(telemetry): capture opentelemtry traces and metrics for fast API
1 parent 658fb2c commit 62651ce

File tree

4 files changed

+138
-13
lines changed

4 files changed

+138
-13
lines changed

llama_stack/core/server/server.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
from llama_stack.providers.inline.telemetry.meta_reference.config import TelemetryConfig
6262
from llama_stack.providers.inline.telemetry.meta_reference.telemetry import (
6363
TelemetryAdapter,
64+
fastapi_telemetry_middleware,
6465
)
6566
from llama_stack.providers.utils.telemetry.tracing import (
6667
CURRENT_TRACE_CONTEXT,
@@ -69,7 +70,6 @@
6970

7071
from .auth import AuthenticationMiddleware
7172
from .quota import QuotaMiddleware
72-
from .tracing import TracingMiddleware
7373

7474
REPO_ROOT = Path(__file__).parent.parent.parent.parent
7575

@@ -452,6 +452,7 @@ def create_app() -> StackApp:
452452

453453
if config.telemetry.enabled:
454454
setup_logger(impls[Api.telemetry])
455+
fastapi_telemetry_middleware(app)
455456
else:
456457
setup_logger(TelemetryAdapter(TelemetryConfig(), {}))
457458

@@ -511,8 +512,6 @@ def create_app() -> StackApp:
511512
app.exception_handler(RequestValidationError)(global_exception_handler)
512513
app.exception_handler(Exception)(global_exception_handler)
513514

514-
app.add_middleware(TracingMiddleware, impls=impls, external_apis=external_apis)
515-
516515
return app
517516

518517

llama_stack/providers/inline/telemetry/meta_reference/telemetry.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
import threading
99
from typing import Any
1010

11+
from fastapi import FastAPI
1112
from opentelemetry import metrics, trace
1213
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
1314
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
15+
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
1416
from opentelemetry.sdk.metrics import MeterProvider
1517
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
1618
from opentelemetry.sdk.trace import TracerProvider
@@ -250,3 +252,10 @@ def _log_structured(self, event: StructuredLogEvent, ttl_seconds: int) -> None:
250252
_GLOBAL_STORAGE["active_spans"].pop(span_id, None)
251253
else:
252254
raise ValueError(f"Unknown structured log event: {event}")
255+
256+
257+
def fastapi_telemetry_middleware(app: FastAPI):
258+
"""
259+
Instrument the FastAPI app with OpenTelemetry.
260+
"""
261+
FastAPIInstrumentor.instrument_app(app)

pyproject.toml

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,31 @@ classifiers = [
2525
]
2626
dependencies = [
2727
"aiohttp",
28-
"fastapi>=0.115.0,<1.0", # server
29-
"fire", # for MCP in LLS client
28+
"fastapi>=0.115.0,<1.0", # server
29+
"fire", # for MCP in LLS client
3030
"httpx",
3131
"jinja2>=3.1.6",
3232
"jsonschema",
3333
"llama-stack-client>=0.3.0",
34-
"openai>=1.107", # for expires_after support
34+
"openai>=1.107", # for expires_after support
3535
"prompt-toolkit",
3636
"python-dotenv",
37-
"pyjwt[crypto]>=2.10.0", # Pull crypto to support RS256 for jwt. Requires 2.10.0+ for ssl_context support.
37+
"pyjwt[crypto]>=2.10.0", # Pull crypto to support RS256 for jwt. Requires 2.10.0+ for ssl_context support.
3838
"pydantic>=2.11.9",
3939
"rich",
4040
"starlette",
4141
"termcolor",
4242
"tiktoken",
4343
"pillow",
4444
"h11>=0.16.0",
45-
"python-multipart>=0.0.20", # For fastapi Form
46-
"uvicorn>=0.34.0", # server
47-
"opentelemetry-sdk>=1.30.0", # server
45+
"python-multipart>=0.0.20", # For fastapi Form
46+
"uvicorn>=0.34.0", # server
47+
"opentelemetry-sdk>=1.30.0", # server
4848
"opentelemetry-exporter-otlp-proto-http>=1.30.0", # server
49-
"aiosqlite>=0.21.0", # server - for metadata store
50-
"asyncpg", # for metadata store
51-
"sqlalchemy[asyncio]>=2.0.41", # server - for conversations
49+
"aiosqlite>=0.21.0", # server - for metadata store
50+
"asyncpg", # for metadata store
51+
"sqlalchemy[asyncio]>=2.0.41", # server - for conversations
52+
"opentelemetry-instrumentation-fastapi>=0.57b0",
5253
]
5354

5455
[project.optional-dependencies]

0 commit comments

Comments
 (0)