1414from opentelemetry .propagators .textmap import Getter
1515from opentelemetry .semconv .metrics import MetricInstruments
1616from opentelemetry .semconv .trace import SpanAttributes
17- from opentelemetry .trace import Status , StatusCode , Tracer , TracerProvider
17+ from opentelemetry .trace import Status , Tracer , TracerProvider
1818
1919from asgi_monitor .metrics import get_latest_metrics
2020from asgi_monitor .metrics .config import BaseMetricsConfig
2121from asgi_monitor .metrics .manager import MetricsManager , build_metrics_manager
2222
2323__all__ = (
2424 "MetricsConfig" ,
25- "build_metrics_middleware" ,
2625 "get_metrics" ,
2726 "setup_metrics" ,
2827 "TracingConfig" ,
2928 "setup_tracing" ,
3029)
3130
3231
33- OTEL_SCHEMA = "https://opentelemetry.io/schemas/1.11.0"
32+ _OTEL_SCHEMA = "https://opentelemetry.io/schemas/1.11.0"
3433
35- _duration_attrs = [
34+
35+ _DURATION_ATTRS = [
3636 SpanAttributes .HTTP_METHOD ,
3737 SpanAttributes .HTTP_HOST ,
3838 SpanAttributes .HTTP_SCHEME ,
4444 SpanAttributes .HTTP_ROUTE ,
4545]
4646
47- _active_requests_count_attrs = [
47+ _ACTIVE_REQUESTS_COUNT_ATTRS = [
4848 SpanAttributes .HTTP_METHOD ,
4949 SpanAttributes .HTTP_HOST ,
5050 SpanAttributes .HTTP_SCHEME ,
@@ -64,39 +64,35 @@ def keys(self, carrier: dict) -> list:
6464 return list (carrier .keys ())
6565
6666
67- getter = AiohttpGetter ()
68-
69-
7067def _get_tracer (tracer_provider : TracerProvider | None = None ) -> Tracer :
7168 return trace .get_tracer (
7269 __name__ ,
7370 tracer_provider = tracer_provider ,
74- schema_url = OTEL_SCHEMA ,
71+ schema_url = _OTEL_SCHEMA ,
7572 )
7673
7774
78- def get_meter (
75+ def _get_meter (
7976 name : str ,
80- version : str = "" ,
8177 meter_provider : MeterProvider | None = None ,
8278 schema_url : str | None = None ,
8379) -> Meter :
8480 if meter_provider is None :
8581 meter_provider = get_meter_provider ()
86- return meter_provider .get_meter (name , version , schema_url )
82+ return meter_provider .get_meter (name = name , schema_url = schema_url )
8783
8884
8985def _parse_duration_attrs (req_attrs : dict [str , Any ]) -> dict [str , Any ]:
9086 duration_attrs = {}
91- for attr_key in _duration_attrs :
87+ for attr_key in _DURATION_ATTRS :
9288 if req_attrs .get (attr_key ) is not None :
9389 duration_attrs [attr_key ] = req_attrs [attr_key ]
9490 return duration_attrs
9591
9692
9793def _parse_active_request_count_attrs (req_attrs : dict [str , Any ]) -> dict [str , Any ]:
9894 active_requests_count_attrs = {}
99- for attr_key in _active_requests_count_attrs :
95+ for attr_key in _ACTIVE_REQUESTS_COUNT_ATTRS :
10096 if req_attrs .get (attr_key ) is not None :
10197 active_requests_count_attrs [attr_key ] = req_attrs [attr_key ]
10298 return active_requests_count_attrs
@@ -107,19 +103,10 @@ def _get_default_span_details(request: Request) -> tuple[str, dict]:
107103 return span_name , {}
108104
109105
110- def set_status_code (span : trace .Span , status_code : int ) -> None :
111- try :
112- status_code = int (status_code )
113- except ValueError :
114- span .set_status (
115- Status (
116- StatusCode .ERROR ,
117- "Non-integer HTTP status: " + repr (status_code ),
118- )
119- )
120- else :
121- span .set_attribute (SpanAttributes .HTTP_STATUS_CODE , status_code )
122- span .set_status (Status (http_status_to_status_code (status_code , server_span = True )))
106+ def _set_status_code (span : trace .Span , status_code : int ) -> None :
107+ status_code = int (status_code )
108+ span .set_attribute (SpanAttributes .HTTP_STATUS_CODE , status_code )
109+ span .set_status (Status (http_status_to_status_code (status_code , server_span = True )))
123110
124111
125112@dataclass (slots = True , frozen = True )
@@ -144,12 +131,11 @@ class TracingConfig:
144131 https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/asgi/asgi.html
145132 """
146133
147- exclude_urls_env_key : str = "AIOHTTP"
134+ scope_span_details_extractor : Callable [[ Request ], tuple [ str , dict [ str , Any ]]] = _get_default_span_details
148135 """
149- Key to use when checking whether a list of excluded urls is passed via ENV.
150- OpenTelemetry supports excluding urls by passing an env in the format '{exclude_urls_env_key}_EXCLUDED_URLS' .
136+ Callback which should return a string and a tuple, representing the desired default span name and a dictionary
137+ with any additional span attributes to set .
151138 """
152- scope_span_details_extractor : Callable [[Request ], tuple [str , dict [str , Any ]]] = _get_default_span_details
153139
154140 meter_provider : MeterProvider | None = field (default = None )
155141 """Optional meter provider to use."""
@@ -186,6 +172,7 @@ async def metrics_middleware(request: Request, handler: Callable) -> Any:
186172 else :
187173 after_time = time .perf_counter ()
188174 status_code = response .status
175+
189176 exemplar : dict [str , str ] | None = None
190177
191178 if include_trace_exemplar :
@@ -210,22 +197,22 @@ async def metrics_middleware(request: Request, handler: Callable) -> Any:
210197
211198def build_tracing_middleware (config : TracingConfig ) -> Callable [..., Coroutine ]:
212199 tracer = _get_tracer (config .tracer_provider )
213- meter = get_meter (
214- name = "AIOHTTP " ,
200+ meter = _get_meter (
201+ name = "aiohttp " ,
215202 meter_provider = config .meter_provider ,
216- schema_url = OTEL_SCHEMA ,
203+ schema_url = _OTEL_SCHEMA ,
217204 )
218205 duration_histogram = meter .create_histogram (
219206 name = MetricInstruments .HTTP_SERVER_DURATION ,
220207 unit = "ms" ,
221208 description = "Measures the duration of inbound HTTP requests." ,
222209 )
223-
224210 active_requests_counter = meter .create_up_down_counter (
225211 name = MetricInstruments .HTTP_SERVER_ACTIVE_REQUESTS ,
226212 unit = "requests" ,
227213 description = "measures the number of concurrent HTTP requests those are currently in flight" ,
228214 )
215+ getter = AiohttpGetter ()
229216
230217 @middleware
231218 async def tracing_middleware (request : Request , handler : Callable ) -> Any :
@@ -247,9 +234,9 @@ async def tracing_middleware(request: Request, handler: Callable) -> Any:
247234 active_requests_counter .add (1 , active_requests_count_attrs )
248235 try :
249236 resp = await handler (request )
250- set_status_code (span , resp .status )
237+ _set_status_code (span , resp .status )
251238 except HTTPException as ex :
252- set_status_code (span , ex .status_code )
239+ _set_status_code (span , ex .status_code )
253240 raise
254241 finally :
255242 duration = max ((default_timer () - start ) * 1000 , 0 )
@@ -278,13 +265,13 @@ def setup_metrics(app: Application, config: MetricsConfig) -> None:
278265 metrics_middleware = build_metrics_middleware (
279266 metrics_manager = metrics , include_trace_exemplar = config .include_trace_exemplar
280267 )
281- app ._middlewares .append (metrics_middleware ) # noqa: SLF001
268+ app .middlewares .append (metrics_middleware )
282269
283270 if config .include_metrics_endpoint :
284271 app .metrics_registry = config .registry
285272 app .openmetrics_format = config .openmetrics_format
286- app .router .add_get (path = "/metrics" , handler = get_metrics , name = "Get_Prometheus_metrics" )
273+ app .router .add_get (path = "/metrics" , handler = get_metrics )
287274
288275
289276def setup_tracing (app : Application , config : TracingConfig ) -> None :
290- app ._middlewares .append (build_tracing_middleware (config )) # noqa: SLF001
277+ app .middlewares .append (build_tracing_middleware (config ))
0 commit comments