summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Dague <sean@dague.net>2017-05-14 07:14:25 -0400
committerSean Dague <sean@dague.net>2017-05-23 10:22:34 -0400
commitec7cdc4cc560150673f14c84a326f6a72d43d3e1 (patch)
treefa536aaad817159eb090f8823863be5c3fc72883
parent68b0476999cb240a450e3cb6289e1eb9caa7b063 (diff)
downloadoslo-context-ec7cdc4cc560150673f14c84a326f6a72d43d3e1.tar.gz
Add global_request_id to context
This provides the facility to have a global_request_id which is different from the service level request_id that we've been using. Includes basic testing. Change-Id: I1521188ae627fa2e7d35aa2ffffbcb620c527765
-rw-r--r--doc/source/usage.rst9
-rw-r--r--oslo_context/context.py7
-rw-r--r--oslo_context/tests/test_context.py14
3 files changed, 26 insertions, 4 deletions
diff --git a/doc/source/usage.rst b/doc/source/usage.rst
index 8c84163..6674613 100644
--- a/doc/source/usage.rst
+++ b/doc/source/usage.rst
@@ -26,8 +26,8 @@ Source: :ref:`example_usage_simple.py`
2016-01-20 21:56:29.283 8428 INFO __main__ [-] Message without context
2016-01-20 21:56:29.284 8428 INFO __main__ [req-929d23e9-f50e-46ae-a8a7-02bc8c3fd2c8 - - - - -] Message with context
-The format of these log records are defined by the
-`logging_default_format_string`_ and `logging_context_format_string`_
+The format of these log records are defined by the
+`logging_default_format_string`_ and `logging_context_format_string`_
configuration options respectively. The `logging_user_identity_format`_ option
also provides further context aware definition flexibility.
@@ -39,9 +39,12 @@ also provides further context aware definition flexibility.
Context Variables
-----------------
-The oslo.context variables used in the **logging_context_format_string** and
+The oslo.context variables used in the **logging_context_format_string** and
**logging_user_identity_format** configuration options include:
+* global_request_id - A request id
+ (e.g. req-9f2c484a-b504-4fd9-b44c-4357544cca50) which may have been
+ sent in from another service to indicate this is part of a chain of requests.
* request_id - A request id (e.g. req-9f2c484a-b504-4fd9-b44c-4357544cca50)
* user - A user id (e.g. e5bc7033e6b7473c9fe8ee1bd4df79a3)
* tenant - A tenant/project id (e.g. 79e338475db84f7c91ee4e86b79b34c1)
diff --git a/oslo_context/context.py b/oslo_context/context.py
index 945cb82..c253b32 100644
--- a/oslo_context/context.py
+++ b/oslo_context/context.py
@@ -55,6 +55,7 @@ _ENVIRON_HEADERS = {
'user_domain_name': ['HTTP_X_USER_DOMAIN_NAME'],
'project_domain_name': ['HTTP_X_PROJECT_DOMAIN_NAME'],
'request_id': ['openstack.request_id'],
+ 'global_request_id': ['openstack.global_request_id'],
'service_token': ['HTTP_X_SERVICE_TOKEN'],
@@ -208,7 +209,8 @@ class RequestContext(object):
service_project_name=None,
service_project_domain_id=None,
service_project_domain_name=None,
- service_roles=None):
+ service_roles=None,
+ global_request_id=None):
"""Initialize the RequestContext
:param overwrite: Set to False to ensure that the greenthread local
@@ -252,6 +254,7 @@ class RequestContext(object):
if not request_id:
request_id = generate_request_id()
self.request_id = request_id
+ self.global_request_id = global_request_id
if overwrite or not get_current():
self.update_store()
@@ -326,6 +329,7 @@ class RequestContext(object):
'show_deleted': self.show_deleted,
'auth_token': self.auth_token,
'request_id': self.request_id,
+ 'global_request_id': self.global_request_id,
'resource_uuid': self.resource_uuid,
'roles': self.roles,
'user_identity': user_idt,
@@ -354,6 +358,7 @@ class RequestContext(object):
kwargs.setdefault('read_only', values.get('read_only', False))
kwargs.setdefault('show_deleted', values.get('show_deleted', False))
kwargs.setdefault('request_id', values.get('request_id'))
+ kwargs.setdefault('global_request_id', values.get('global_request_id'))
kwargs.setdefault('resource_uuid', values.get('resource_uuid'))
kwargs.setdefault('roles', values.get('roles'))
kwargs.setdefault('user_name', values.get('user_name'))
diff --git a/oslo_context/tests/test_context.py b/oslo_context/tests/test_context.py
index f6486b7..b1d30d8 100644
--- a/oslo_context/tests/test_context.py
+++ b/oslo_context/tests/test_context.py
@@ -123,6 +123,7 @@ class ContextTest(test_base.BaseTestCase):
"read_only": True,
"show_deleted": True,
"request_id": "request1",
+ "global_request_id": "req-uuid",
"resource_uuid": "instance1",
"extra_data": "foo"
}
@@ -137,6 +138,7 @@ class ContextTest(test_base.BaseTestCase):
self.assertTrue(ctx.read_only)
self.assertTrue(ctx.show_deleted)
self.assertEqual(dct['request_id'], ctx.request_id)
+ self.assertEqual(dct['global_request_id'], ctx.global_request_id)
self.assertEqual(dct['resource_uuid'], ctx.resource_uuid)
self.assertEqual(dct['user_name'], ctx.user_name)
self.assertEqual(dct['project_name'], ctx.project_name)
@@ -200,6 +202,7 @@ class ContextTest(test_base.BaseTestCase):
project_domain_id = generate_id(project_domain_name)
roles = [uuid.uuid4().hex, uuid.uuid4().hex, uuid.uuid4().hex]
request_id = uuid.uuid4().hex
+ global_request_id = uuid.uuid4().hex
service_token = uuid.uuid4().hex
service_user_id = uuid.uuid4().hex
service_user_name = uuid.uuid4().hex
@@ -233,6 +236,7 @@ class ContextTest(test_base.BaseTestCase):
'HTTP_X_SERVICE_PROJECT_DOMAIN_NAME': service_project_domain_name,
'HTTP_X_SERVICE_ROLES': ','.join(service_roles),
'openstack.request_id': request_id,
+ 'openstack.global_request_id': global_request_id,
}
ctx = context.RequestContext.from_environ(environ)
@@ -248,6 +252,7 @@ class ContextTest(test_base.BaseTestCase):
self.assertEqual(project_domain_name, ctx.project_domain_name)
self.assertEqual(roles, ctx.roles)
self.assertEqual(request_id, ctx.request_id)
+ self.assertEqual(global_request_id, ctx.global_request_id)
self.assertEqual(service_token, ctx.service_token)
self.assertEqual(service_user_id, ctx.service_user_id)
self.assertEqual(service_user_name, ctx.service_user_name)
@@ -382,6 +387,7 @@ class ContextTest(test_base.BaseTestCase):
read_only = True
show_deleted = True
request_id = "id1"
+ global_request_id = "req-id1"
resource_uuid = "uuid1"
ctx = context.RequestContext(auth_token=auth_token,
@@ -399,6 +405,7 @@ class ContextTest(test_base.BaseTestCase):
read_only=read_only,
show_deleted=show_deleted,
request_id=request_id,
+ global_request_id=global_request_id,
resource_uuid=resource_uuid)
self.assertEqual(auth_token, ctx.auth_token)
self.assertEqual(user_id, ctx.user_id)
@@ -463,6 +470,7 @@ class ContextTest(test_base.BaseTestCase):
self.assertIn('read_only', d)
self.assertIn('show_deleted', d)
self.assertIn('request_id', d)
+ self.assertIn('global_request_id', d)
self.assertIn('resource_uuid', d)
self.assertIn('user_identity', d)
self.assertIn('roles', d)
@@ -492,6 +500,12 @@ class ContextTest(test_base.BaseTestCase):
id2 = context.generate_request_id()
self.assertNotEqual(id1, id2)
+ def test_no_global_id_by_default(self):
+ ctx = context.RequestContext()
+ self.assertIsNone(ctx.global_request_id)
+ d = ctx.to_dict()
+ self.assertIsNone(d['global_request_id'])
+
def test_policy_dict(self):
user = uuid.uuid4().hex
user_domain = uuid.uuid4().hex