Skip to content

Commit d26f5d0

Browse files
authored
Merge pull request #64 from febus982/opentelemetry-metrics
Opentelemetry metrics
2 parents bf57538 + 2fff93b commit d26f5d0

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ containers:
99
dev:
1010
poetry run uvicorn http_app:create_app --host 0.0.0.0 --port 8000 --factory --reload
1111

12+
otel:
13+
OTEL_SERVICE_NAME=bootstrap-fastapi OTEL_TRACES_EXPORTER=none OTEL_METRICS_EXPORTER=none OTEL_LOGS_EXPORTER=none poetry run opentelemetry-instrument uvicorn http_app:create_app --host 0.0.0.0 --port 8000 --factory
14+
1215
run:
1316
poetry run uvicorn http_app:create_app --host 0.0.0.0 --port 8000 --factory
1417

config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class AppConfig(BaseSettings):
2828
DEBUG: bool = False
2929

3030

31-
def init_logger(config: AppConfig):
31+
def init_logger(config: AppConfig) -> None:
3232
"""
3333
Configure structlog and stdlib logging with shared handler and formatter.
3434
@@ -43,7 +43,7 @@ def init_logger(config: AppConfig):
4343
structlog.stdlib.PositionalArgumentsFormatter(),
4444
structlog.processors.add_log_level,
4545
structlog.processors.StackInfoRenderer(),
46-
add_logging_open_telemetry_spans,
46+
_add_logging_open_telemetry_spans,
4747
]
4848

4949
log_level = logging.DEBUG if config.DEBUG else logging.INFO
@@ -94,7 +94,7 @@ def init_logger(config: AppConfig):
9494
logging.getLogger(_log).propagate = True
9595

9696

97-
def add_logging_open_telemetry_spans(_, __, event_dict):
97+
def _add_logging_open_telemetry_spans(_, __, event_dict):
9898
span = trace.get_current_span()
9999
if not span.is_recording():
100100
event_dict["span"] = None

http_app/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Union
22

33
from fastapi import FastAPI, Request
4+
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
45
from starlette.responses import JSONResponse
56
from starlette_prometheus import PrometheusMiddleware, metrics
67
from structlog import get_logger
@@ -24,9 +25,20 @@ def create_app(
2425

2526
init_routes(app)
2627

28+
"""
29+
OpenTelemetry prometheus exporter does not work together with automatic
30+
instrumentation, for now we keep the prometheus middleware even if
31+
having 2 different middlewares will add overhead.
32+
"""
2733
app.add_middleware(PrometheusMiddleware)
2834
app.add_route("/metrics/", metrics)
2935

36+
"""
37+
OpenTelemetry middleware has to be the last one to make sure the
38+
tracing data handling is the outermost logic
39+
"""
40+
app.add_middleware(OpenTelemetryMiddleware)
41+
3042
return app
3143

3244

0 commit comments

Comments
 (0)