23
23
flask = None
24
24
25
25
from google .cloud .logging_v2 .handlers .middleware .request import _get_django_request
26
+ from google .logging .type .http_request_pb2 import HttpRequest
26
27
27
28
_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"
28
32
_FLASK_TRACE_HEADER = "X_CLOUD_TRACE_CONTEXT"
33
+ _PROTOCOL_HEADER = "SERVER_PROTOCOL"
29
34
30
35
31
36
def format_stackdriver_json (record , message ):
@@ -46,59 +51,86 @@ def format_stackdriver_json(record, message):
46
51
return json .dumps (payload )
47
52
48
53
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.
51
56
52
57
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.
54
61
"""
55
62
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
+ )
57
75
76
+ # find trace id
77
+ trace_id = None
58
78
header = flask .request .headers .get (_FLASK_TRACE_HEADER )
79
+ if header :
80
+ trace_id = header .split ("/" , 1 )[0 ]
59
81
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
66
83
67
84
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.
70
87
71
88
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.
73
92
"""
74
93
request = _get_django_request ()
75
94
76
95
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
+ )
78
107
108
+ # find trace id
109
+ trace_id = None
79
110
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 ]
84
113
85
- return trace_id
114
+ return http_request , trace_id
86
115
87
116
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).
90
120
91
121
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.
93
125
"""
94
126
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 ,
97
129
)
98
130
99
131
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
103
135
104
- return None
136
+ return None , None
0 commit comments