Merge "Log request-id for each api call"
This commit is contained in:
commit
8a7bd461f4
@ -608,6 +608,30 @@ class Session(object):
|
|||||||
|
|
||||||
resp = send(**kwargs)
|
resp = send(**kwargs)
|
||||||
|
|
||||||
|
# log callee and caller request-id for each api call
|
||||||
|
if log:
|
||||||
|
# service_name should be fetched from endpoint_filter if it is not
|
||||||
|
# present then use service_type as service_name.
|
||||||
|
service_name = None
|
||||||
|
if endpoint_filter:
|
||||||
|
service_name = endpoint_filter.get('service_name')
|
||||||
|
if not service_name:
|
||||||
|
service_name = endpoint_filter.get('service_type')
|
||||||
|
|
||||||
|
# Nova uses 'x-compute-request-id' and other services like
|
||||||
|
# Glance, Cinder etc are using 'x-openstack-request-id' to store
|
||||||
|
# request-id in the header
|
||||||
|
request_id = (resp.headers.get('x-openstack-request-id') or
|
||||||
|
resp.headers.get('x-compute-request-id'))
|
||||||
|
if request_id:
|
||||||
|
logger.debug('%(method)s call to %(service_name)s for '
|
||||||
|
'%(url)s used request id '
|
||||||
|
'%(response_request_id)s',
|
||||||
|
{'method': resp.request.method,
|
||||||
|
'service_name': service_name,
|
||||||
|
'url': resp.url,
|
||||||
|
'response_request_id': request_id})
|
||||||
|
|
||||||
# handle getting a 401 Unauthorized response by invalidating the plugin
|
# handle getting a 401 Unauthorized response by invalidating the plugin
|
||||||
# and then retrying the request. This is only tried once.
|
# and then retrying the request. This is only tried once.
|
||||||
if resp.status_code == 401 and authenticated and allow_reauth:
|
if resp.status_code == 401 and authenticated and allow_reauth:
|
||||||
|
@ -219,6 +219,33 @@ class SessionTests(utils.TestCase):
|
|||||||
self.assertEqual(v, resp.headers[k])
|
self.assertEqual(v, resp.headers[k])
|
||||||
self.assertNotIn(v, self.logger.output)
|
self.assertNotIn(v, self.logger.output)
|
||||||
|
|
||||||
|
def test_session_debug_output_logs_openstack_request_id(self):
|
||||||
|
"""Test x-openstack-request-id is logged in debug logs."""
|
||||||
|
def get_response(log=True):
|
||||||
|
session = client_session.Session(verify=False)
|
||||||
|
endpoint_filter = {'service_name': 'Identity'}
|
||||||
|
headers = {'X-OpenStack-Request-Id': 'req-1234'}
|
||||||
|
body = 'BODYRESPONSE'
|
||||||
|
data = 'BODYDATA'
|
||||||
|
all_headers = dict(itertools.chain(headers.items()))
|
||||||
|
self.stub_url('POST', text=body, headers=all_headers)
|
||||||
|
resp = session.post(self.TEST_URL, endpoint_filter=endpoint_filter,
|
||||||
|
headers=all_headers, data=data, log=log)
|
||||||
|
return resp
|
||||||
|
|
||||||
|
# if log is disabled then request-id is not logged in debug logs
|
||||||
|
resp = get_response(log=False)
|
||||||
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
|
||||||
|
expected_log = ('POST call to Identity for %s used request '
|
||||||
|
'id req-1234' % self.TEST_URL)
|
||||||
|
self.assertNotIn(expected_log, self.logger.output)
|
||||||
|
|
||||||
|
# if log is enabled then request-id is logged in debug logs
|
||||||
|
resp = get_response()
|
||||||
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
self.assertIn(expected_log, self.logger.output)
|
||||||
|
|
||||||
def test_logs_failed_output(self):
|
def test_logs_failed_output(self):
|
||||||
"""Test that output is logged even for failed requests."""
|
"""Test that output is logged even for failed requests."""
|
||||||
session = client_session.Session()
|
session = client_session.Session()
|
||||||
|
Loading…
Reference in New Issue
Block a user