Skip to content

Commit 240205f

Browse files
committed
Update telemetry handler to set context and feature flags
1 parent 8cd221f commit 240205f

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

msgraph/core/middleware/telemetry.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
1+
import http
2+
import json
13
import platform
24

35
import httpx
4-
from kiota_http.middleware.middleware import BaseMiddleware
6+
from kiota_http.middleware import AsyncKiotaTransport, BaseMiddleware, RedirectHandler, RetryHandler
57
from urllib3.util import parse_url
68

79
from .._constants import SDK_VERSION
8-
from .._enums import NationalClouds
9-
from .middleware import GraphRequest
10+
from .._enums import FeatureUsageFlag, NationalClouds
11+
from .request_context import GraphRequestContext
12+
13+
14+
class GraphRequest(httpx.Request):
15+
context: GraphRequestContext
1016

1117

1218
class GraphTelemetryHandler(BaseMiddleware):
1319
"""Middleware component that attaches metadata to a Graph request in order to help
1420
the SDK team improve the developer experience.
1521
"""
1622

17-
async def send(
18-
self, request: GraphRequest, transport: httpx.AsyncBaseTransport
19-
) -> httpx.Response:
23+
async def send(self, request: GraphRequest, transport: AsyncKiotaTransport):
2024
"""Adds telemetry headers and sends the http request.
2125
"""
26+
self.set_request_context_and_feature_usage(request, transport)
27+
2228
if self.is_graph_url(request.url):
2329
self._add_client_request_id_header(request)
2430
self._append_sdk_version_header(request)
@@ -28,6 +34,27 @@ async def send(
2834
response = await super().send(request, transport)
2935
return response
3036

37+
def set_request_context_and_feature_usage(
38+
self, request: GraphRequest, transport: AsyncKiotaTransport
39+
) -> GraphRequest:
40+
41+
request_options = {}
42+
options = request.headers.pop('request_options', None)
43+
if options:
44+
request_options = json.loads(options)
45+
46+
request.context = GraphRequestContext(request_options, request.headers)
47+
middleware = transport.pipeline._first_middleware
48+
while middleware:
49+
if isinstance(middleware, RedirectHandler):
50+
request.context.feature_usage = FeatureUsageFlag.REDIRECT_HANDLER_ENABLED
51+
if isinstance(middleware, RetryHandler):
52+
request.context.feature_usage = FeatureUsageFlag.RETRY_HANDLER_ENABLED
53+
54+
middleware = middleware.next
55+
56+
return request
57+
3158
def is_graph_url(self, url):
3259
"""Check if the request is made to a graph endpoint. We do not add telemetry headers to
3360
non-graph endpoints"""

0 commit comments

Comments
 (0)