diff options
author | Sean Dague <sean@dague.net> | 2017-05-14 07:14:25 -0400 |
---|---|---|
committer | Sean Dague <sean@dague.net> | 2017-05-23 10:22:34 -0400 |
commit | ec7cdc4cc560150673f14c84a326f6a72d43d3e1 (patch) | |
tree | fa536aaad817159eb090f8823863be5c3fc72883 | |
parent | 68b0476999cb240a450e3cb6289e1eb9caa7b063 (diff) | |
download | oslo-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.rst | 9 | ||||
-rw-r--r-- | oslo_context/context.py | 7 | ||||
-rw-r--r-- | oslo_context/tests/test_context.py | 14 |
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 |