File tree Expand file tree Collapse file tree 3 files changed +18
-3
lines changed Expand file tree Collapse file tree 3 files changed +18
-3
lines changed Original file line number Diff line number Diff line change @@ -9,6 +9,9 @@ containers:
9
9
dev :
10
10
poetry run uvicorn http_app:create_app --host 0.0.0.0 --port 8000 --factory --reload
11
11
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
+
12
15
run :
13
16
poetry run uvicorn http_app:create_app --host 0.0.0.0 --port 8000 --factory
14
17
Original file line number Diff line number Diff line change @@ -28,7 +28,7 @@ class AppConfig(BaseSettings):
28
28
DEBUG : bool = False
29
29
30
30
31
- def init_logger (config : AppConfig ):
31
+ def init_logger (config : AppConfig ) -> None :
32
32
"""
33
33
Configure structlog and stdlib logging with shared handler and formatter.
34
34
@@ -43,7 +43,7 @@ def init_logger(config: AppConfig):
43
43
structlog .stdlib .PositionalArgumentsFormatter (),
44
44
structlog .processors .add_log_level ,
45
45
structlog .processors .StackInfoRenderer (),
46
- add_logging_open_telemetry_spans ,
46
+ _add_logging_open_telemetry_spans ,
47
47
]
48
48
49
49
log_level = logging .DEBUG if config .DEBUG else logging .INFO
@@ -94,7 +94,7 @@ def init_logger(config: AppConfig):
94
94
logging .getLogger (_log ).propagate = True
95
95
96
96
97
- def add_logging_open_telemetry_spans (_ , __ , event_dict ):
97
+ def _add_logging_open_telemetry_spans (_ , __ , event_dict ):
98
98
span = trace .get_current_span ()
99
99
if not span .is_recording ():
100
100
event_dict ["span" ] = None
Original file line number Diff line number Diff line change 1
1
from typing import Union
2
2
3
3
from fastapi import FastAPI , Request
4
+ from opentelemetry .instrumentation .asgi import OpenTelemetryMiddleware
4
5
from starlette .responses import JSONResponse
5
6
from starlette_prometheus import PrometheusMiddleware , metrics
6
7
from structlog import get_logger
@@ -24,9 +25,20 @@ def create_app(
24
25
25
26
init_routes (app )
26
27
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
+ """
27
33
app .add_middleware (PrometheusMiddleware )
28
34
app .add_route ("/metrics/" , metrics )
29
35
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
+
30
42
return app
31
43
32
44
You can’t perform that action at this time.
0 commit comments