2323 flask = None
2424
2525from google .cloud .logging_v2 .handlers .middleware .request import _get_django_request
26+ from google .logging .type .http_request_pb2 import HttpRequest
2627
2728_DJANGO_TRACE_HEADER = "HTTP_X_CLOUD_TRACE_CONTEXT"
29+ _DJANGO_USERAGENT_HEADER = "HTTP_USER_AGENT"
30+ _DJANGO_REMOTE_ADDR_HEADER = "REMOTE_ADDR"
31+ _DJANGO_REFERER_HEADER = "HTTP_REFERER"
2832_FLASK_TRACE_HEADER = "X_CLOUD_TRACE_CONTEXT"
33+ _PROTOCOL_HEADER = "SERVER_PROTOCOL"
2934
3035
3136def format_stackdriver_json (record , message ):
@@ -46,59 +51,86 @@ def format_stackdriver_json(record, message):
4651 return json .dumps (payload )
4752
4853
49- def get_trace_id_from_flask ():
50- """Get trace_id from flask request headers.
54+ def get_request_data_from_flask ():
55+ """Get http_request and trace data from flask request headers.
5156
5257 Returns:
53- str: TraceID in HTTP request headers.
58+ Tuple[Optional[google.logging.type.http_request_pb2.HttpRequest], Optional[str]]:
59+ Data related to the current http request and the trace_id for the
60+ request. Both fields will be None if a flask request isn't found.
5461 """
5562 if flask is None or not flask .request :
56- return None
63+ return None , None
64+
65+ # build http_request
66+ http_request = HttpRequest (
67+ request_method = flask .request .method ,
68+ request_url = flask .request .url ,
69+ request_size = flask .request .content_length ,
70+ user_agent = flask .request .user_agent .string ,
71+ remote_ip = flask .request .remote_addr ,
72+ referer = flask .request .referrer ,
73+ protocol = flask .request .environ .get (_PROTOCOL_HEADER ),
74+ )
5775
76+ # find trace id
77+ trace_id = None
5878 header = flask .request .headers .get (_FLASK_TRACE_HEADER )
79+ if header :
80+ trace_id = header .split ("/" , 1 )[0 ]
5981
60- if header is None :
61- return None
62-
63- trace_id = header .split ("/" , 1 )[0 ]
64-
65- return trace_id
82+ return http_request , trace_id
6683
6784
68- def get_trace_id_from_django ():
69- """Get trace_id from django request headers.
85+ def get_request_data_from_django ():
86+ """Get http_request and trace data from django request headers.
7087
7188 Returns:
72- str: TraceID in HTTP request headers.
89+ Tuple[Optional[google.logging.type.http_request_pb2.HttpRequest], Optional[str]]:
90+ Data related to the current http request and the trace_id for the
91+ request. Both fields will be None if a django request isn't found.
7392 """
7493 request = _get_django_request ()
7594
7695 if request is None :
77- return None
96+ return None , None
97+ # build http_request
98+ http_request = HttpRequest (
99+ request_method = request .method ,
100+ request_url = request .build_absolute_uri (),
101+ request_size = len (request .body ),
102+ user_agent = request .META .get (_DJANGO_USERAGENT_HEADER ),
103+ remote_ip = request .META .get (_DJANGO_REMOTE_ADDR_HEADER ),
104+ referer = request .META .get (_DJANGO_REFERER_HEADER ),
105+ protocol = request .META .get (_PROTOCOL_HEADER ),
106+ )
78107
108+ # find trace id
109+ trace_id = None
79110 header = request .META .get (_DJANGO_TRACE_HEADER )
80- if header is None :
81- return None
82-
83- trace_id = header .split ("/" , 1 )[0 ]
111+ if header :
112+ trace_id = header .split ("/" , 1 )[0 ]
84113
85- return trace_id
114+ return http_request , trace_id
86115
87116
88- def get_trace_id ():
89- """Helper to get trace_id from web application request header.
117+ def get_request_data ():
118+ """Helper to get http_request and trace data from supported web
119+ frameworks (currently supported: Flask and Django).
90120
91121 Returns:
92- str: TraceID in HTTP request headers.
122+ Tuple[Optional[google.logging.type.http_request_pb2.HttpRequest], Optional[str]]:
123+ Data related to the current http request and the trace_id for the
124+ request. Both fields will be None if a supported web request isn't found.
93125 """
94126 checkers = (
95- get_trace_id_from_django ,
96- get_trace_id_from_flask ,
127+ get_request_data_from_django ,
128+ get_request_data_from_flask ,
97129 )
98130
99131 for checker in checkers :
100- trace_id = checker ()
101- if trace_id is not None :
102- return trace_id
132+ http_request , trace_id = checker ()
133+ if http_request is not None :
134+ return http_request , trace_id
103135
104- return None
136+ return None , None
0 commit comments