-
-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathdto.py
More file actions
45 lines (36 loc) · 1.54 KB
/
dto.py
File metadata and controls
45 lines (36 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from datetime import datetime, timezone
from json_logging import util
class RequestResponseDTOBase(dict):
"""
Data transfer object (DTO) for request instrumentation logging
Served as base class for any actual RequestResponseDTO implementation
"""
def __init__(self, request, **kwargs):
"""
invoked when request start, where to extract any necessary information from the request object
:param request: request object
"""
super().__init__(**kwargs)
self._request = request
def on_request_complete(self, response):
"""
invoked when request complete, update response information into this object, must be called before invoke request logging statement
:param response: response object
"""
self._response = response
class DefaultRequestResponseDTO(RequestResponseDTOBase):
"""
default implementation
"""
def __init__(self, request, **kwargs):
super().__init__(request, **kwargs)
utcnow = datetime.now(timezone.utc)
self._request_start = utcnow
self["request_received_at"] = util.iso_time_format(utcnow)
# noinspection PyAttributeOutsideInit
def on_request_complete(self, response):
super().on_request_complete(response)
utcnow = datetime.now(timezone.utc)
time_delta = utcnow - self._request_start
self["response_time_ms"] = int(time_delta.total_seconds()) * 1000 + int(time_delta.microseconds / 1000)
self["response_sent_at"] = util.iso_time_format(utcnow)