Skip to content

Commit fdf4824

Browse files
yukatybzaczynski
andauthored
Add materials for FastAPI OpenTelemetry tutorial (#791)
* Add materials for FastAPI OpenTelemetry tutorial * Sync with tutorial after TR * Fix README formatting and update tutorial link * Organize imports --------- Co-authored-by: Bartosz Zaczyński <bartosz.zaczynski@gmail.com>
1 parent 9d69c03 commit fdf4824

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

fastapi-opentelemetry/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# How to Integrate OpenTelemetry With a FastAPI App
2+
3+
This folder contains sample code for the Real Python tutorial [How to Integrate OpenTelemetry With a FastAPI App]([https://realpython.com/](https://realpython.com/fastapi-opentelemetry/)).

fastapi-opentelemetry/main.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logging
2+
3+
from fastapi import FastAPI
4+
from opentelemetry import trace
5+
6+
app = FastAPI()
7+
tracer = trace.get_tracer(__name__)
8+
9+
logging.basicConfig(level=logging.INFO)
10+
logger = logging.getLogger(__name__)
11+
12+
13+
def simulate_db_query(user_id: int):
14+
with tracer.start_as_current_span("db_query") as span:
15+
span.set_attribute("db.system", "postgresql")
16+
span.set_attribute("user.id", user_id)
17+
18+
trace_id = format(span.get_span_context().trace_id, "032x")
19+
span_id = format(span.get_span_context().span_id, "016x")
20+
21+
if user_id == 999:
22+
logger.error(
23+
"DB query failed for user %s. trace_id=%s, span_id=%s",
24+
user_id,
25+
trace_id,
26+
span_id,
27+
)
28+
raise ValueError("Database connection lost!")
29+
30+
logger.info(
31+
"Executing DB query for user %s. trace_id=%s, span_id=%s",
32+
user_id,
33+
trace_id,
34+
span_id,
35+
)
36+
return {"name": "Demo User", "role": "admin"}
37+
38+
39+
@app.get("/users/{user_id}")
40+
def get_user(user_id: int):
41+
logger.info("Received request for user %s", user_id)
42+
try:
43+
data = simulate_db_query(user_id)
44+
return {"status": "success", "data": data}
45+
except ValueError:
46+
return {"status": "error", "message": "Failed to fetch user"}
47+
48+
49+
@app.get("/")
50+
def read_root():
51+
return {"message": "Hello, OpenTelemetry!"}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
annotated-doc==0.0.4
2+
annotated-types==0.7.0
3+
anyio==4.14.0
4+
asgiref==3.11.1
5+
certifi==2026.6.17
6+
charset-normalizer==3.4.7
7+
click==8.4.1
8+
fastapi==0.138.0
9+
googleapis-common-protos==1.75.0
10+
grpcio==1.81.1
11+
h11==0.16.0
12+
idna==3.18
13+
opentelemetry-api==1.42.1
14+
opentelemetry-distro==0.63b1
15+
opentelemetry-exporter-otlp==1.42.1
16+
opentelemetry-exporter-otlp-proto-common==1.42.1
17+
opentelemetry-exporter-otlp-proto-grpc==1.42.1
18+
opentelemetry-exporter-otlp-proto-http==1.42.1
19+
opentelemetry-instrumentation==0.63b1
20+
opentelemetry-instrumentation-asgi==0.63b1
21+
opentelemetry-instrumentation-fastapi==0.63b1
22+
opentelemetry-proto==1.42.1
23+
opentelemetry-sdk==1.42.1
24+
opentelemetry-semantic-conventions==0.63b1
25+
opentelemetry-util-http==0.63b1
26+
packaging==26.2
27+
protobuf==6.33.6
28+
pydantic==2.13.4
29+
pydantic_core==2.46.4
30+
requests==2.34.2
31+
starlette==1.3.1
32+
typing-inspection==0.4.2
33+
typing_extensions==4.15.0
34+
urllib3==2.7.0
35+
uvicorn==0.49.0
36+
wrapt==2.2.2

0 commit comments

Comments
 (0)