diff --git a/elasticapm/instrumentation/packages/base.py b/elasticapm/instrumentation/packages/base.py index b95b58c3a..7826921a9 100644 --- a/elasticapm/instrumentation/packages/base.py +++ b/elasticapm/instrumentation/packages/base.py @@ -1,5 +1,6 @@ import functools import logging +import os from elasticapm.traces import get_transaction from elasticapm.utils import wrapt @@ -169,6 +170,11 @@ def instrument(self): if self.instrumented: return + skip_env_var = 'SKIP_INSTRUMENT_' + str(self.name.upper()) + if skip_env_var in os.environ: + logger.debug("Skipping instrumentation of %s. %s is set.", + self.name, skip_env_var) + return try: instrument_list = self.get_instrument_list() skipped_modules = set() diff --git a/tests/instrumentation/base_tests.py b/tests/instrumentation/base_tests.py index ece5ec6ea..89f1b02d0 100644 --- a/tests/instrumentation/base_tests.py +++ b/tests/instrumentation/base_tests.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import types +import mock import pytest from elasticapm.instrumentation.packages.base import (AbstractInstrumentedModule, @@ -71,3 +72,10 @@ def test_uninstrument_py3(): instrumentation.uninstrument() assert Dummy.dummy is original assert not isinstance(Dummy.dummy, OriginalNamesBoundFunctionWrapper) + + +def test_skip_instrument_env_var(): + instrumentation = _TestDummyInstrumentation() + with mock.patch.dict('os.environ', {'SKIP_INSTRUMENT_TEST_DUMMY_INSTRUMENT': 'foo'}): + instrumentation.instrument() + assert not instrumentation.instrumented