|
14 | 14 |
|
15 | 15 | from logging import getLogger
|
16 | 16 | from time import time
|
| 17 | +from typing import Callable |
| 18 | + |
| 19 | +from django.http import HttpRequest, HttpResponse |
17 | 20 |
|
18 | 21 | from opentelemetry.context import attach, detach
|
19 | 22 | from opentelemetry.instrumentation.django.version import __version__
|
|
24 | 27 | wsgi_getter,
|
25 | 28 | )
|
26 | 29 | from opentelemetry.propagate import extract
|
27 |
| -from opentelemetry.trace import SpanKind, get_tracer, use_span |
| 30 | +from opentelemetry.trace import Span, SpanKind, get_tracer, use_span |
28 | 31 | from opentelemetry.util.http import get_excluded_urls, get_traced_request_attrs
|
29 | 32 |
|
30 | 33 | try:
|
@@ -62,6 +65,11 @@ class _DjangoMiddleware(MiddlewareMixin):
|
62 | 65 | _traced_request_attrs = get_traced_request_attrs("DJANGO")
|
63 | 66 | _excluded_urls = get_excluded_urls("DJANGO")
|
64 | 67 |
|
| 68 | + _otel_request_hook: Callable[[Span, HttpRequest], None] = None |
| 69 | + _otel_response_hook: Callable[ |
| 70 | + [Span, HttpRequest, HttpResponse], None |
| 71 | + ] = None |
| 72 | + |
65 | 73 | @staticmethod
|
66 | 74 | def _get_span_name(request):
|
67 | 75 | try:
|
@@ -125,6 +133,11 @@ def process_request(self, request):
|
125 | 133 | request.META[self._environ_span_key] = span
|
126 | 134 | request.META[self._environ_token] = token
|
127 | 135 |
|
| 136 | + if _DjangoMiddleware._otel_request_hook: |
| 137 | + _DjangoMiddleware._otel_request_hook( # pylint: disable=not-callable |
| 138 | + span, request |
| 139 | + ) |
| 140 | + |
128 | 141 | # pylint: disable=unused-argument
|
129 | 142 | def process_view(self, request, view_func, *args, **kwargs):
|
130 | 143 | # Process view is executed before the view function, here we get the
|
@@ -156,30 +169,30 @@ def process_response(self, request, response):
|
156 | 169 | if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
|
157 | 170 | return response
|
158 | 171 |
|
159 |
| - if ( |
160 |
| - self._environ_activation_key in request.META.keys() |
161 |
| - and self._environ_span_key in request.META.keys() |
162 |
| - ): |
| 172 | + activation = request.META.pop(self._environ_activation_key, None) |
| 173 | + span = request.META.pop(self._environ_span_key, None) |
| 174 | + |
| 175 | + if activation and span: |
163 | 176 | add_response_attributes(
|
164 |
| - request.META[self._environ_span_key], |
| 177 | + span, |
165 | 178 | "{} {}".format(response.status_code, response.reason_phrase),
|
166 | 179 | response,
|
167 | 180 | )
|
168 | 181 |
|
169 |
| - request.META.pop(self._environ_span_key) |
170 |
| - |
171 | 182 | exception = request.META.pop(self._environ_exception_key, None)
|
| 183 | + if _DjangoMiddleware._otel_response_hook: |
| 184 | + _DjangoMiddleware._otel_response_hook( |
| 185 | + span, request, response |
| 186 | + ) # pylint: disable=not-callable |
| 187 | + |
172 | 188 | if exception:
|
173 |
| - request.META[self._environ_activation_key].__exit__( |
| 189 | + activation.__exit__( |
174 | 190 | type(exception),
|
175 | 191 | exception,
|
176 | 192 | getattr(exception, "__traceback__", None),
|
177 | 193 | )
|
178 | 194 | else:
|
179 |
| - request.META[self._environ_activation_key].__exit__( |
180 |
| - None, None, None |
181 |
| - ) |
182 |
| - request.META.pop(self._environ_activation_key) |
| 195 | + activation.__exit__(None, None, None) |
183 | 196 |
|
184 | 197 | if self._environ_token in request.META.keys():
|
185 | 198 | detach(request.environ.get(self._environ_token))
|
|
0 commit comments