From f3ec6eb8009bc5b7c3dbc0884bf965ed5285f3cd Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Wed, 8 Aug 2018 12:08:16 -0400 Subject: [PATCH 01/19] Initial pass at trace decorator --- .../datadog_checks/data/agent_requirements.in | 1 + .../datadog_checks/utils/decorator.py | 12 ++++++++++++ openstack/datadog_checks/openstack/openstack.py | 2 ++ 3 files changed, 15 insertions(+) create mode 100644 datadog_checks_base/datadog_checks/utils/decorator.py diff --git a/datadog_checks_base/datadog_checks/data/agent_requirements.in b/datadog_checks_base/datadog_checks/data/agent_requirements.in index 645ab59ae6ec1..4437f272466ce 100644 --- a/datadog_checks_base/datadog_checks/data/agent_requirements.in +++ b/datadog_checks_base/datadog_checks/data/agent_requirements.in @@ -5,6 +5,7 @@ boto==2.46.1 cffi==1.11.5 cryptography==2.3 cx_oracle==6.0.1 +ddtrace==0.12.1 dnspython==1.12.0 enum34==1.1.6 gearman==2.0.2; sys_platform != 'win32' and python_version < '3.0' diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py new file mode 100644 index 0000000000000..b09042c31299b --- /dev/null +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -0,0 +1,12 @@ +# (C) Datadog, Inc. 2018 +# All rights reserved +# Licensed under Simplified BSD License (see LICENSE) + +from ddtrace import tracer +patch(requests=True) + +def trace_func(func): + def function_wrapper(*args, **kwargs): + with tracer.trace(func.__name__, service=args[0].__class__.__name__) as span: + return func(*args, **kwargs) + return function_wrapper \ No newline at end of file diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index 3e974d4c126a7..70ede1de4be86 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -12,6 +12,7 @@ import simplejson as json from datadog_checks.checks import AgentCheck +from datadog_checks.utils.decorator import trace_func try: # Agent >= 6.0: the check pushes tags invoking `set_external_tags` @@ -1174,6 +1175,7 @@ def ensure_auth_scope(self, instance): return instance_scope + @trace_func def check(self, instance): # have we been backed off if not self.should_run(instance): From 03de80c1f8835f1e2383c90d6130a92beb800dc1 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 20 Aug 2018 10:12:44 -0400 Subject: [PATCH 02/19] Fix merge conflict --- openstack/datadog_checks/openstack/openstack.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index 0c235ea5bf3bd..83e291fb4ef6e 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -12,6 +12,7 @@ import simplejson as json from datadog_checks.checks import AgentCheck +from datadog_checks.config import is_affirmative from datadog_checks.utils.decorator import trace_func try: From b2923534220d4c28d4bf88a4da7393017c08c870 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 20 Aug 2018 10:38:06 -0400 Subject: [PATCH 03/19] Put behind instance config flag --- datadog_checks_base/datadog_checks/utils/decorator.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index b09042c31299b..62f38cddd9498 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -2,11 +2,14 @@ # All rights reserved # Licensed under Simplified BSD License (see LICENSE) +from datadog_checks.config import is_affirmative from ddtrace import tracer -patch(requests=True) def trace_func(func): def function_wrapper(*args, **kwargs): - with tracer.trace(func.__name__, service=args[0].__class__.__name__) as span: + if is_affirmative(args[1].get('trace_check', False)): + with tracer.trace(func.__name__, service=args[0].__class__.__name__) as span: + return func(*args, **kwargs) + else: return func(*args, **kwargs) return function_wrapper \ No newline at end of file From d32c71e79062bd18ee94f4fd44335f393d1b02fd Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 20 Aug 2018 11:37:55 -0400 Subject: [PATCH 04/19] Add auto patching of requests --- datadog_checks_base/datadog_checks/utils/decorator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 62f38cddd9498..5e762f3b2caa1 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -5,6 +5,8 @@ from datadog_checks.config import is_affirmative from ddtrace import tracer +patch(requests=True) + def trace_func(func): def function_wrapper(*args, **kwargs): if is_affirmative(args[1].get('trace_check', False)): From a7929c0871c81da3c437128c8ddd75f1a2706756 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 20 Aug 2018 11:41:20 -0400 Subject: [PATCH 05/19] Import patch --- datadog_checks_base/datadog_checks/utils/decorator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 5e762f3b2caa1..ab8402242875a 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -3,7 +3,7 @@ # Licensed under Simplified BSD License (see LICENSE) from datadog_checks.config import is_affirmative -from ddtrace import tracer +from ddtrace import tracer, patch patch(requests=True) From bd5cda16b791f416ef6bc0e1375f9655e372d814 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 20 Aug 2018 12:12:38 -0400 Subject: [PATCH 06/19] Fix flake8 and add ddtrace to checks_base dep list --- datadog_checks_base/datadog_checks/utils/decorator.py | 4 ++-- datadog_checks_base/requirements.in | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index ab8402242875a..1340d1d7c97cb 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -10,8 +10,8 @@ def trace_func(func): def function_wrapper(*args, **kwargs): if is_affirmative(args[1].get('trace_check', False)): - with tracer.trace(func.__name__, service=args[0].__class__.__name__) as span: + with tracer.trace(func.__name__, service=args[0].__class__.__name__): return func(*args, **kwargs) else: return func(*args, **kwargs) - return function_wrapper \ No newline at end of file + return function_wrapper diff --git a/datadog_checks_base/requirements.in b/datadog_checks_base/requirements.in index 084d6cb959cca..ac410eff5ea01 100644 --- a/datadog_checks_base/requirements.in +++ b/datadog_checks_base/requirements.in @@ -1,3 +1,4 @@ +ddtrace==0.12.1 prometheus-client==0.3.0 requests==2.19.1 protobuf==3.5.1 From 3542d64d32b69b119cadcad34b6ab3e679f0c8e2 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Thu, 30 Aug 2018 17:30:07 -0400 Subject: [PATCH 07/19] Address review about patch and name scheme --- datadog_checks_base/datadog_checks/__init__.py | 3 +++ datadog_checks_base/datadog_checks/utils/decorator.py | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/datadog_checks_base/datadog_checks/__init__.py b/datadog_checks_base/datadog_checks/__init__.py index 99894e5e2fdc0..0eb8c0dd614e1 100644 --- a/datadog_checks_base/datadog_checks/__init__.py +++ b/datadog_checks_base/datadog_checks/__init__.py @@ -2,6 +2,9 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) from .__about__ import __version__ +from ddtrace import tracer, patch + +patch(requests=True) __all__ = [ '__version__' diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 1340d1d7c97cb..988eefa2e7dbf 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -3,15 +3,13 @@ # Licensed under Simplified BSD License (see LICENSE) from datadog_checks.config import is_affirmative -from ddtrace import tracer, patch - -patch(requests=True) +from functools import wraps def trace_func(func): + @wraps(func) def function_wrapper(*args, **kwargs): if is_affirmative(args[1].get('trace_check', False)): - with tracer.trace(func.__name__, service=args[0].__class__.__name__): + with tracer.trace('integration.check', service='IntegrationsTracing', resource=args[0].name): return func(*args, **kwargs) - else: - return func(*args, **kwargs) + return func(*args, **kwargs) return function_wrapper From 30ea20eb683dc46a2da3a59fe16e7032b06b1e7c Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Thu, 30 Aug 2018 17:55:18 -0400 Subject: [PATCH 08/19] Use getargspec and clean imports --- datadog_checks_base/datadog_checks/__init__.py | 2 +- datadog_checks_base/datadog_checks/utils/decorator.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/datadog_checks_base/datadog_checks/__init__.py b/datadog_checks_base/datadog_checks/__init__.py index 0eb8c0dd614e1..d3b2e70d93b72 100644 --- a/datadog_checks_base/datadog_checks/__init__.py +++ b/datadog_checks_base/datadog_checks/__init__.py @@ -2,7 +2,7 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) from .__about__ import __version__ -from ddtrace import tracer, patch +from ddtrace import patch patch(requests=True) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 988eefa2e7dbf..b7d4953bfb15a 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -3,12 +3,19 @@ # Licensed under Simplified BSD License (see LICENSE) from datadog_checks.config import is_affirmative +from ddtrace import tracer from functools import wraps +from inspect import getargspec def trace_func(func): @wraps(func) def function_wrapper(*args, **kwargs): - if is_affirmative(args[1].get('trace_check', False)): + # Get instance config to see if tracing is enabled + try: + instance_index = getargspec(func).args.index('instance') + except ValueError: + return func(*args, **kwargs) + if is_affirmative(args[instance_index].get('trace_check', False)): with tracer.trace('integration.check', service='IntegrationsTracing', resource=args[0].name): return func(*args, **kwargs) return func(*args, **kwargs) From 9c290e80a1a99fed61d443aef980e62e861c835c Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Thu, 30 Aug 2018 19:55:38 -0400 Subject: [PATCH 09/19] compile ddtrace dep --- datadog_checks_base/requirements.txt | 8 ++++++++ datadog_checks_tests_helper/requirements.in | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/datadog_checks_base/requirements.txt b/datadog_checks_base/requirements.txt index 0f2fc51938555..9761e512d8f44 100644 --- a/datadog_checks_base/requirements.txt +++ b/datadog_checks_base/requirements.txt @@ -12,10 +12,15 @@ chardet==3.0.4 \ --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \ --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 \ # via requests +ddtrace==0.12.1 \ + --hash=sha256:f77a7367c43e3d58cb106519a61b3a137d774835f37f768979726a47e18ba11c idna==2.7 \ --hash=sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e \ --hash=sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16 \ # via requests +msgpack-python==0.5.6 \ + --hash=sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b \ + # via ddtrace prometheus-client==0.3.0 \ --hash=sha256:69494dc1ac967c0f626c8193e439755c2b95dd4ed22ef31c277601778a50c7ff protobuf==3.5.1 \ @@ -42,3 +47,6 @@ urllib3==1.23 \ # via requests uuid==1.30 \ --hash=sha256:1f87cc004ac5120466f36c5beae48b4c48cc411968eed0eaecd3da82aa96193f +wrapt==1.10.11 \ + --hash=sha256:d4d560d479f2c21e1b5443bbd15fe7ec4b37fe7e53d335d3b9b0a7b1226fe3c6 \ + # via ddtrace diff --git a/datadog_checks_tests_helper/requirements.in b/datadog_checks_tests_helper/requirements.in index 8b137891791fe..e69de29bb2d1d 100644 --- a/datadog_checks_tests_helper/requirements.in +++ b/datadog_checks_tests_helper/requirements.in @@ -1 +0,0 @@ - From 5dc1d65686a3968e8fb17271265597a2c621489c Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Thu, 30 Aug 2018 20:02:05 -0400 Subject: [PATCH 10/19] Move patch --- datadog_checks_base/datadog_checks/__init__.py | 3 --- datadog_checks_base/datadog_checks/utils/__init__.py | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/datadog_checks_base/datadog_checks/__init__.py b/datadog_checks_base/datadog_checks/__init__.py index d3b2e70d93b72..99894e5e2fdc0 100644 --- a/datadog_checks_base/datadog_checks/__init__.py +++ b/datadog_checks_base/datadog_checks/__init__.py @@ -2,9 +2,6 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) from .__about__ import __version__ -from ddtrace import patch - -patch(requests=True) __all__ = [ '__version__' diff --git a/datadog_checks_base/datadog_checks/utils/__init__.py b/datadog_checks_base/datadog_checks/utils/__init__.py index a383179a005ed..b2fd24ac164f8 100644 --- a/datadog_checks_base/datadog_checks/utils/__init__.py +++ b/datadog_checks_base/datadog_checks/utils/__init__.py @@ -1,3 +1,6 @@ # (C) Datadog, Inc. 2018 # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) +from ddtrace import patch + +patch(requests=True) From 795a95554fade6408c234e8ffc21071d300a088a Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Fri, 7 Sep 2018 17:50:55 -0400 Subject: [PATCH 11/19] Address review --- datadog_checks_base/datadog_checks/utils/decorator.py | 2 +- datadog_checks_base/requirements.in | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index b7d4953bfb15a..5d0d8fb5673d7 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -16,7 +16,7 @@ def function_wrapper(*args, **kwargs): except ValueError: return func(*args, **kwargs) if is_affirmative(args[instance_index].get('trace_check', False)): - with tracer.trace('integration.check', service='IntegrationsTracing', resource=args[0].name): + with tracer.trace('integration.check', service='integrations-tracing', resource=args[0].name): return func(*args, **kwargs) return func(*args, **kwargs) return function_wrapper diff --git a/datadog_checks_base/requirements.in b/datadog_checks_base/requirements.in index ac410eff5ea01..c4fafd7ff7d7d 100644 --- a/datadog_checks_base/requirements.in +++ b/datadog_checks_base/requirements.in @@ -1,8 +1,8 @@ -ddtrace==0.12.1 +ddtrace==0.13.0 prometheus-client==0.3.0 -requests==2.19.1 protobuf==3.5.1 +requests==2.19.1 simplejson==3.6.5 +six==1.11.0 uptime==3.0.1 uuid==1.30 -six==1.11.0 From 67bd02bf1b035561aac516cf5b39b6b9a9de200e Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Fri, 14 Sep 2018 16:29:46 -0400 Subject: [PATCH 12/19] Use datadog_agent config --- datadog_checks_base/datadog_checks/utils/decorator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 5d0d8fb5673d7..26d7d40c3bf3a 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -6,6 +6,7 @@ from ddtrace import tracer from functools import wraps from inspect import getargspec +import datadog_agent def trace_func(func): @wraps(func) @@ -15,7 +16,7 @@ def function_wrapper(*args, **kwargs): instance_index = getargspec(func).args.index('instance') except ValueError: return func(*args, **kwargs) - if is_affirmative(args[instance_index].get('trace_check', False)): + if is_affirmative(args[instance_index].get('trace_check', False)) and datadog_agent.get_config('integration_tracing'): with tracer.trace('integration.check', service='integrations-tracing', resource=args[0].name): return func(*args, **kwargs) return func(*args, **kwargs) From 5dc4ae71eeba4518721f4cb153f3b53f6207a1bd Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Sat, 15 Sep 2018 14:08:29 -0400 Subject: [PATCH 13/19] Patch libraries behind a6 global config flag --- .../datadog_checks/data/agent_requirements.in | 2 +- datadog_checks_base/datadog_checks/utils/__init__.py | 10 ++++++++-- .../datadog_checks/utils/decorator.py | 12 ++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/datadog_checks_base/datadog_checks/data/agent_requirements.in b/datadog_checks_base/datadog_checks/data/agent_requirements.in index 4437f272466ce..5736e091d212e 100644 --- a/datadog_checks_base/datadog_checks/data/agent_requirements.in +++ b/datadog_checks_base/datadog_checks/data/agent_requirements.in @@ -5,7 +5,7 @@ boto==2.46.1 cffi==1.11.5 cryptography==2.3 cx_oracle==6.0.1 -ddtrace==0.12.1 +ddtrace==0.13.0 dnspython==1.12.0 enum34==1.1.6 gearman==2.0.2; sys_platform != 'win32' and python_version < '3.0' diff --git a/datadog_checks_base/datadog_checks/utils/__init__.py b/datadog_checks_base/datadog_checks/utils/__init__.py index b2fd24ac164f8..f929564dfb262 100644 --- a/datadog_checks_base/datadog_checks/utils/__init__.py +++ b/datadog_checks_base/datadog_checks/utils/__init__.py @@ -1,6 +1,12 @@ # (C) Datadog, Inc. 2018 # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -from ddtrace import patch -patch(requests=True) +from ddtrace import patch +try: + import datadog_agent + if datadog_agent.get_config('integration_tracing'): + patch(requests=True) +except ImportError: + # Tracing Integrations is only available with Agent 6 + pass diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 26d7d40c3bf3a..20ac6b2fecc11 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -6,17 +6,25 @@ from ddtrace import tracer from functools import wraps from inspect import getargspec -import datadog_agent + +try: + import datadog_agent +except ImportError: + # Integration Tracing is only available with Agent 6 + pass def trace_func(func): @wraps(func) def function_wrapper(*args, **kwargs): + if datadog_agent is None: + return func(*args, **kwargs) + # Get instance config to see if tracing is enabled try: instance_index = getargspec(func).args.index('instance') except ValueError: return func(*args, **kwargs) - if is_affirmative(args[instance_index].get('trace_check', False)) and datadog_agent.get_config('integration_tracing'): + if is_affirmative(args[instance_index].get('trace_check', False)) and datadog_agent.get_config('integration_tracing', False): with tracer.trace('integration.check', service='integrations-tracing', resource=args[0].name): return func(*args, **kwargs) return func(*args, **kwargs) From a4272b417f50385f23cddf7f4bdcf9c580af65dd Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Sat, 15 Sep 2018 19:39:13 -0400 Subject: [PATCH 14/19] Address review --- datadog_checks_base/datadog_checks/utils/__init__.py | 2 +- datadog_checks_base/datadog_checks/utils/decorator.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/__init__.py b/datadog_checks_base/datadog_checks/utils/__init__.py index f929564dfb262..912cbb07d39f8 100644 --- a/datadog_checks_base/datadog_checks/utils/__init__.py +++ b/datadog_checks_base/datadog_checks/utils/__init__.py @@ -2,10 +2,10 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -from ddtrace import patch try: import datadog_agent if datadog_agent.get_config('integration_tracing'): + from ddtrace import patch patch(requests=True) except ImportError: # Tracing Integrations is only available with Agent 6 diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 20ac6b2fecc11..d45c9d2e2b7ae 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -2,7 +2,7 @@ # All rights reserved # Licensed under Simplified BSD License (see LICENSE) -from datadog_checks.config import is_affirmative +from ..config import is_affirmative from ddtrace import tracer from functools import wraps from inspect import getargspec @@ -11,7 +11,7 @@ import datadog_agent except ImportError: # Integration Tracing is only available with Agent 6 - pass + datadog_agent = None def trace_func(func): @wraps(func) @@ -24,7 +24,10 @@ def function_wrapper(*args, **kwargs): instance_index = getargspec(func).args.index('instance') except ValueError: return func(*args, **kwargs) - if is_affirmative(args[instance_index].get('trace_check', False)) and datadog_agent.get_config('integration_tracing', False): + if ( + is_affirmative(args[instance_index].get('trace_check', False)) + and is_affirmative(datadog_agent.get_config('integration_tracing', False)) + ): with tracer.trace('integration.check', service='integrations-tracing', resource=args[0].name): return func(*args, **kwargs) return func(*args, **kwargs) From b78c054c56a7fae2b99774b8781b8dbbbd424c04 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 17 Sep 2018 11:46:04 -0400 Subject: [PATCH 15/19] Rename decorator --- datadog_checks_base/datadog_checks/utils/decorator.py | 2 +- openstack/datadog_checks/openstack/openstack.py | 4 ++-- openstack/tox.ini | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index d45c9d2e2b7ae..97006836bdc6a 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -13,7 +13,7 @@ # Integration Tracing is only available with Agent 6 datadog_agent = None -def trace_func(func): +def add_tracing(func): @wraps(func) def function_wrapper(*args, **kwargs): if datadog_agent is None: diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index 83e291fb4ef6e..b5620d2f9b61d 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -13,7 +13,7 @@ from datadog_checks.checks import AgentCheck from datadog_checks.config import is_affirmative -from datadog_checks.utils.decorator import trace_func +from datadog_checks.utils.decorator import add_tracing try: # Agent >= 6.0: the check pushes tags invoking `set_external_tags` @@ -1176,7 +1176,7 @@ def ensure_auth_scope(self, instance): return instance_scope - @trace_func + @add_tracing def check(self, instance): # have we been backed off if not self.should_run(instance): diff --git a/openstack/tox.ini b/openstack/tox.ini index 5f18ffddd410d..a9d983a85c8e8 100644 --- a/openstack/tox.ini +++ b/openstack/tox.ini @@ -10,7 +10,7 @@ platform = linux|darwin|win32 [testenv:openstack] deps = - ../datadog_checks_base + -e../datadog_checks_base -r../datadog_checks_base/requirements.in -rrequirements-dev.txt commands = From 278f38caf6c1b698f5bf58388171f7460d7a2eff Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Thu, 20 Sep 2018 11:33:29 -0400 Subject: [PATCH 16/19] Address review --- .../datadog_checks/utils/decorator.py | 37 ++++++++----------- .../datadog_checks/openstack/openstack.py | 4 +- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/decorator.py index 97006836bdc6a..d1349e7defcab 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/decorator.py @@ -4,8 +4,9 @@ from ..config import is_affirmative from ddtrace import tracer -from functools import wraps -from inspect import getargspec + +import wrapt + try: import datadog_agent @@ -13,22 +14,16 @@ # Integration Tracing is only available with Agent 6 datadog_agent = None -def add_tracing(func): - @wraps(func) - def function_wrapper(*args, **kwargs): - if datadog_agent is None: - return func(*args, **kwargs) - - # Get instance config to see if tracing is enabled - try: - instance_index = getargspec(func).args.index('instance') - except ValueError: - return func(*args, **kwargs) - if ( - is_affirmative(args[instance_index].get('trace_check', False)) - and is_affirmative(datadog_agent.get_config('integration_tracing', False)) - ): - with tracer.trace('integration.check', service='integrations-tracing', resource=args[0].name): - return func(*args, **kwargs) - return func(*args, **kwargs) - return function_wrapper +@wrapt.decorator +def traced(wrapped, instance, args, kwargs): + if datadog_agent is None: + return wrapped(*args, **kwargs) + + trace_check = any(t.get('trace_check') for t in args) + integration_tracing = is_affirmative(datadog_agent.get_config('integration_tracing')) + + if integration_tracing and trace_check: + with tracer.trace('integration.check', service='integrations-tracing', resource=instance.name): + return wrapped(*args, **kwargs) + + return wrapped(*args, **kwargs) diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index b5620d2f9b61d..1bd5fa64fbc2f 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -13,7 +13,7 @@ from datadog_checks.checks import AgentCheck from datadog_checks.config import is_affirmative -from datadog_checks.utils.decorator import add_tracing +from datadog_checks.utils.decorator import traced try: # Agent >= 6.0: the check pushes tags invoking `set_external_tags` @@ -1176,7 +1176,7 @@ def ensure_auth_scope(self, instance): return instance_scope - @add_tracing + @traced def check(self, instance): # have we been backed off if not self.should_run(instance): From 1a7945f306c758fb4d511e117a106e6a56ff8988 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Fri, 21 Sep 2018 10:50:28 -0400 Subject: [PATCH 17/19] Address review, cleanup names --- .../datadog_checks/utils/{decorator.py => tracing.py} | 9 +++++++-- openstack/datadog_checks/openstack/openstack.py | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) rename datadog_checks_base/datadog_checks/utils/{decorator.py => tracing.py} (84%) diff --git a/datadog_checks_base/datadog_checks/utils/decorator.py b/datadog_checks_base/datadog_checks/utils/tracing.py similarity index 84% rename from datadog_checks_base/datadog_checks/utils/decorator.py rename to datadog_checks_base/datadog_checks/utils/tracing.py index d1349e7defcab..d426cce708cd5 100644 --- a/datadog_checks_base/datadog_checks/utils/decorator.py +++ b/datadog_checks_base/datadog_checks/utils/tracing.py @@ -7,19 +7,24 @@ import wrapt - try: import datadog_agent except ImportError: # Integration Tracing is only available with Agent 6 datadog_agent = None + +_tracing_config = set() + +def add_trace_check(check_object): + _tracing_config.add(check_object) + @wrapt.decorator def traced(wrapped, instance, args, kwargs): if datadog_agent is None: return wrapped(*args, **kwargs) - trace_check = any(t.get('trace_check') for t in args) + trace_check = instance in _tracing_config integration_tracing = is_affirmative(datadog_agent.get_config('integration_tracing')) if integration_tracing and trace_check: diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index 1bd5fa64fbc2f..ff3d19be57769 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -13,7 +13,7 @@ from datadog_checks.checks import AgentCheck from datadog_checks.config import is_affirmative -from datadog_checks.utils.decorator import traced +from datadog_checks.utils.tracing import traced, add_trace_check try: # Agent >= 6.0: the check pushes tags invoking `set_external_tags` @@ -531,6 +531,9 @@ class OpenStackCheck(AgentCheck): def __init__(self, name, init_config, agentConfig, instances=None): AgentCheck.__init__(self, name, init_config, agentConfig, instances) + if init_config.get('trace_check', False): + add_trace_check(self) + self._ssl_verify = is_affirmative(init_config.get("ssl_verify", True)) self.keystone_server_url = init_config.get("keystone_server_url") self._hypervisor_name_cache = {} From e827bd50373cdd81eb1eb08840064455b05a9869 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Fri, 21 Sep 2018 18:38:20 -0400 Subject: [PATCH 18/19] fix flake --- datadog_checks_base/datadog_checks/utils/tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadog_checks_base/datadog_checks/utils/tracing.py b/datadog_checks_base/datadog_checks/utils/tracing.py index d426cce708cd5..c7dbb41456249 100644 --- a/datadog_checks_base/datadog_checks/utils/tracing.py +++ b/datadog_checks_base/datadog_checks/utils/tracing.py @@ -24,7 +24,7 @@ def traced(wrapped, instance, args, kwargs): if datadog_agent is None: return wrapped(*args, **kwargs) - trace_check = instance in _tracing_config + trace_check = instance in _tracing_config integration_tracing = is_affirmative(datadog_agent.get_config('integration_tracing')) if integration_tracing and trace_check: From 55e85e5a8577f9cfbfe6934a24e8269ac277fcb2 Mon Sep 17 00:00:00 2001 From: Nicholas Muesch Date: Mon, 24 Sep 2018 20:12:51 -0400 Subject: [PATCH 19/19] Remove openstack Tracing --- openstack/datadog_checks/openstack/openstack.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openstack/datadog_checks/openstack/openstack.py b/openstack/datadog_checks/openstack/openstack.py index ff3d19be57769..ce196065b8ff1 100644 --- a/openstack/datadog_checks/openstack/openstack.py +++ b/openstack/datadog_checks/openstack/openstack.py @@ -13,7 +13,7 @@ from datadog_checks.checks import AgentCheck from datadog_checks.config import is_affirmative -from datadog_checks.utils.tracing import traced, add_trace_check + try: # Agent >= 6.0: the check pushes tags invoking `set_external_tags` @@ -531,9 +531,6 @@ class OpenStackCheck(AgentCheck): def __init__(self, name, init_config, agentConfig, instances=None): AgentCheck.__init__(self, name, init_config, agentConfig, instances) - if init_config.get('trace_check', False): - add_trace_check(self) - self._ssl_verify = is_affirmative(init_config.get("ssl_verify", True)) self.keystone_server_url = init_config.get("keystone_server_url") self._hypervisor_name_cache = {} @@ -1179,7 +1176,6 @@ def ensure_auth_scope(self, instance): return instance_scope - @traced def check(self, instance): # have we been backed off if not self.should_run(instance):