diff options
-rw-r--r-- | osprofiler/drivers/jaeger.py | 11 | ||||
-rw-r--r-- | osprofiler/opts.py | 27 | ||||
-rw-r--r-- | osprofiler/tests/unit/drivers/test_jaeger.py | 34 | ||||
-rw-r--r-- | releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml | 5 | ||||
-rw-r--r-- | releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml | 5 | ||||
-rw-r--r-- | setup.cfg | 8 |
6 files changed, 82 insertions, 8 deletions
diff --git a/osprofiler/drivers/jaeger.py b/osprofiler/drivers/jaeger.py index 3f263b2..67e75c3 100644 --- a/osprofiler/drivers/jaeger.py +++ b/osprofiler/drivers/jaeger.py @@ -49,16 +49,23 @@ class Jaeger(base.Driver): "local_agent": { "reporting_host": parsed_url.hostname, "reporting_port": parsed_url.port, - } + }, + "tags": conf.profiler_jaeger.process_tags } # Initialize tracer for each profiler - service_name = "{}-{}".format(project, service) + service_name = self._get_service_name(conf, project, service) config = jaeger_client.Config(cfg, service_name=service_name) self.tracer = config.initialize_tracer() self.spans = collections.deque() + def _get_service_name(self, conf, project, service): + prefix = conf.profiler_jaeger.service_name_prefix + if prefix: + return "{}-{}-{}".format(prefix, project, service) + return "{}-{}".format(project, service) + @classmethod def get_name(cls): return "jaeger" diff --git a/osprofiler/opts.py b/osprofiler/opts.py index 612a6c8..58d5806 100644 --- a/osprofiler/opts.py +++ b/osprofiler/opts.py @@ -170,6 +170,30 @@ _PROFILER_OPTS = [ cfg.CONF.register_opts(_PROFILER_OPTS, group=_profiler_opt_group) +_jaegerprofiler_opt_group = cfg.OptGroup( + "profiler_jaeger", + title="Jaeger's profiler driver related options") + +_service_name_prefix = cfg.StrOpt( + "service_name_prefix", + help=""" +Set service name prefix to Jaeger service name. +""") + +_process_tags = cfg.DictOpt( + "process_tags", + default={}, + help=""" +Set process tracer tags. +""") + +_JAEGER_OPTS = [ + _service_name_prefix, + _process_tags +] + +cfg.CONF.register_opts(_JAEGER_OPTS, group=_jaegerprofiler_opt_group) + def set_defaults(conf, enabled=None, trace_sqlalchemy=None, hmac_keys=None, connection_string=None, es_doc_type=None, @@ -239,4 +263,5 @@ def disable_web_trace(conf=None): def list_opts(): - return [(_profiler_opt_group.name, _PROFILER_OPTS)] + return [(_profiler_opt_group.name, _PROFILER_OPTS), + (_jaegerprofiler_opt_group, _JAEGER_OPTS)] diff --git a/osprofiler/tests/unit/drivers/test_jaeger.py b/osprofiler/tests/unit/drivers/test_jaeger.py index e59e69b..128d8aa 100644 --- a/osprofiler/tests/unit/drivers/test_jaeger.py +++ b/osprofiler/tests/unit/drivers/test_jaeger.py @@ -15,14 +15,24 @@ from unittest import mock +from oslo_config import cfg + from osprofiler.drivers import jaeger +from osprofiler import opts from osprofiler.tests import test +from jaeger_client import Config + class JaegerTestCase(test.TestCase): def setUp(self): super(JaegerTestCase, self).setUp() + + opts.set_defaults(cfg.CONF) + cfg.CONF.set_default( + "process_tags", "k1:v1,k2:v2", "profiler_jaeger") + self.payload_start = { "name": "api-start", "base_id": "4e3e0ec6-2938-40b1-8504-09eb1d4b0dee", @@ -48,8 +58,12 @@ class JaegerTestCase(test.TestCase): } } + # Force to False as if already initialized, tracer will be None. + # see: jaeger_client/config.py#L374 + Config._initialized = False self.driver = jaeger.Jaeger("jaeger://127.0.0.1:6831", - project="nova", service="api") + project="nova", service="api", + conf=cfg.CONF) @mock.patch("osprofiler._utils.shorten_id") def test_notify_start(self, mock_shorten_id): @@ -76,3 +90,21 @@ class JaegerTestCase(test.TestCase): mock_time.reset_mock() span.finish.assert_called_once_with(finish_time=fake_time) + + def test_service_name_default(self): + self.assertEqual("pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_service_name_prefix(self): + cfg.CONF.set_default( + "service_name_prefix", "prx1", "profiler_jaeger") + self.assertEqual("prx1-pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_process_tags(self): + tags = self.driver.tracer.tags + # Let's remove variable tags generated by Jaeger client + del tags['hostname'] + del tags['jaeger.version'] + del tags['ip'] + self.assertEqual({'k1': 'v1', 'k2': 'v2'}, tags) diff --git a/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml b/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml new file mode 100644 index 0000000..383f7b5 --- /dev/null +++ b/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add ability to set tracer process tags to Jaeger via a + configuration option introduced, `profiler_jaeger/process_tags`. diff --git a/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml b/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml new file mode 100644 index 0000000..d71abee --- /dev/null +++ b/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Introduces service name prefix for Jaeger driver. Please consider + using option `profiler_jaeger/service_name_prefix` to set it. @@ -1,12 +1,12 @@ [metadata] name = osprofiler summary = OpenStack Profiler Library -description-file = +description_file = README.rst author = OpenStack -author-email = openstack-discuss@lists.openstack.org -home-page = https://docs.openstack.org/osprofiler/latest/ -python-requires = >=3.8 +author_email = openstack-discuss@lists.openstack.org +home_page = https://docs.openstack.org/osprofiler/latest/ +python_requires = >=3.8 classifier = Environment :: OpenStack Intended Audience :: Developers |