Add support for generic OTEL_PYTHON_EXCLUDED_URLS variable (#790)

* Add support for generic OTEL_PYTHON_EXCLUDED_URLS variable

Use `OTEL_PYTHON_EXCLUDED_URLS` environment variable as a fallback of
`OTEL_PYTHON_{instrumentation}_EXCLUDED_URLS`.

* Only use generic variable when instrumentation-specific is not set

* Change wording on docs

Co-authored-by: Leighton Chen <lechen@microsoft.com>
This commit is contained in:
Michael Manganiello
2021-11-10 19:44:02 -03:00
committed by GitHub
parent 2f9bcb230a
commit d4ad8f57be
13 changed files with 108 additions and 18 deletions

View File

@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#793](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/793))
- `opentelemetry-instrumentation-pymysql` Add support for PyMySQL 1.x series
([#792](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/792))
- Add support for generic OTEL_PYTHON_EXCLUDED_URLS variable
([#790](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/790))
### Fixed

View File

@ -32,7 +32,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_DJANGO_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_DJANGO_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -21,7 +21,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FALCON_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FALCON_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,
@ -34,7 +35,7 @@ will exclude requests such as ``https://site/client/123/info`` and ``https://sit
Request attributes
********************
To extract certain attributes from Falcon's request object and use them as span attributes, set the environment variable ``OTEL_PYTHON_FALCON_TRACED_REQUEST_ATTRS`` to a comma
delimited list of request attribute names.
delimited list of request attribute names.
For example,

View File

@ -26,7 +26,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FALCON_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FALCON_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -34,7 +34,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FASTAPI_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FASTAPI_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -21,7 +21,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FLASK_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FLASK_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -48,7 +48,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FLASK_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_FLASK_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -79,7 +79,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_PYRAMID_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_PYRAMID_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -15,13 +15,14 @@ Installation
::
pip install opentelemetry-instrumentation-requests
Configuration
-------------
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_REQUESTS_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_REQUESTS_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -33,7 +33,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_REQUESTS_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_REQUESTS_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -36,7 +36,8 @@ Configuration
Exclude lists
*************
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_STARLETTE_EXCLUDED_URLS`` with comma delimited regexes representing which URLs to exclude.
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_STARLETTE_EXCLUDED_URLS``
(or ``OTEL_PYTHON_EXCLUDED_URLS`` as fallback) with comma delimited regexes representing which URLs to exclude.
For example,

View File

@ -15,13 +15,14 @@
from os import environ
from re import compile as re_compile
from re import search
from typing import Iterable
from urllib.parse import urlparse, urlunparse
class ExcludeList:
"""Class to exclude certain paths (given as a list of regexes) from tracing requests"""
def __init__(self, excluded_urls):
def __init__(self, excluded_urls: Iterable[str]):
self._excluded_urls = excluded_urls
if self._excluded_urls:
self._regex = re_compile("|".join(excluded_urls))
@ -47,24 +48,29 @@ def get_traced_request_attrs(instrumentation):
return traced_request_attrs
def get_excluded_urls(instrumentation):
def get_excluded_urls(instrumentation: str) -> ExcludeList:
# Get instrumentation-specific excluded URLs. If not set, retrieve them
# from generic variable.
excluded_urls = environ.get(
_root.format(f"{instrumentation}_EXCLUDED_URLS"), []
_root.format(f"{instrumentation}_EXCLUDED_URLS"),
environ.get(_root.format("EXCLUDED_URLS"), ""),
)
return parse_excluded_urls(excluded_urls)
def parse_excluded_urls(excluded_urls):
def parse_excluded_urls(excluded_urls: str) -> ExcludeList:
"""
Small helper to put an arbitrary url list inside of ExcludeList
"""
if excluded_urls:
excluded_urls = [
excluded_url_list = [
excluded_url.strip() for excluded_url in excluded_urls.split(",")
]
else:
excluded_url_list = []
return ExcludeList(excluded_urls)
return ExcludeList(excluded_url_list)
def remove_url_credentials(url: str) -> str:

View File

@ -0,0 +1,72 @@
# Copyright The OpenTelemetry Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest.mock import patch
from opentelemetry.test.test_base import TestBase
from opentelemetry.util.http import get_excluded_urls
class TestGetExcludedUrls(TestBase):
@patch.dict(
"os.environ",
{
"OTEL_PYTHON_DJANGO_EXCLUDED_URLS": "excluded_arg/123,excluded_noarg"
},
)
def test_config_from_instrumentation_env(self):
exclude_list = get_excluded_urls("DJANGO")
self.assertTrue(exclude_list.url_disabled("/excluded_arg/123"))
self.assertTrue(exclude_list.url_disabled("/excluded_noarg"))
self.assertFalse(exclude_list.url_disabled("/excluded_arg/125"))
@patch.dict(
"os.environ",
{"OTEL_PYTHON_EXCLUDED_URLS": "excluded_arg/123,excluded_noarg"},
)
def test_config_from_generic_env(self):
exclude_list = get_excluded_urls("DJANGO")
self.assertTrue(exclude_list.url_disabled("/excluded_arg/123"))
self.assertTrue(exclude_list.url_disabled("/excluded_noarg"))
self.assertFalse(exclude_list.url_disabled("/excluded_arg/125"))
@patch.dict(
"os.environ",
{
"OTEL_PYTHON_DJANGO_EXCLUDED_URLS": "excluded_arg/123,excluded_noarg",
"OTEL_PYTHON_EXCLUDED_URLS": "excluded_arg/125",
},
)
def test_config_from_instrumentation_env_takes_precedence(self):
exclude_list = get_excluded_urls("DJANGO")
self.assertTrue(exclude_list.url_disabled("/excluded_arg/123"))
self.assertTrue(exclude_list.url_disabled("/excluded_noarg"))
self.assertFalse(exclude_list.url_disabled("/excluded_arg/125"))
@patch.dict(
"os.environ",
{
"OTEL_PYTHON_DJANGO_EXCLUDED_URLS": "",
"OTEL_PYTHON_EXCLUDED_URLS": "excluded_arg/125",
},
)
def test_config_from_instrumentation_env_empty(self):
exclude_list = get_excluded_urls("DJANGO")
self.assertFalse(exclude_list.url_disabled("/excluded_arg/123"))
self.assertFalse(exclude_list.url_disabled("/excluded_noarg"))
self.assertFalse(exclude_list.url_disabled("/excluded_arg/125"))