mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-08-06 14:59:11 +08:00
Add support for enabling Redis sanitization from environment variable (#1690)
* Add support for enabling Redis sanitization from environment variable * add sanitization environment variable docs * strip environment variable * update changelog * lint * lint * lint - hopefully the last time --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
This commit is contained in:
@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
- Add connection attributes to sqlalchemy connect span
|
||||
([#1608](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1608))
|
||||
- Add support for enabling Redis sanitization from environment variable
|
||||
([#1690](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1690))
|
||||
|
||||
### Fixed
|
||||
|
||||
|
@ -88,10 +88,27 @@ for example:
|
||||
client = redis.StrictRedis(host="localhost", port=6379)
|
||||
client.get("my-key")
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Query sanitization
|
||||
******************
|
||||
To enable query sanitization with an environment variable, set
|
||||
``OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS`` to "true".
|
||||
|
||||
For example,
|
||||
|
||||
::
|
||||
|
||||
export OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS="true"
|
||||
|
||||
will result in traced queries like "SET ? ?".
|
||||
|
||||
API
|
||||
---
|
||||
"""
|
||||
import typing
|
||||
from os import environ
|
||||
from typing import Any, Collection
|
||||
|
||||
import redis
|
||||
@ -99,6 +116,9 @@ from wrapt import wrap_function_wrapper
|
||||
|
||||
from opentelemetry import trace
|
||||
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
||||
from opentelemetry.instrumentation.redis.environment_variables import (
|
||||
OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS,
|
||||
)
|
||||
from opentelemetry.instrumentation.redis.package import _instruments
|
||||
from opentelemetry.instrumentation.redis.util import (
|
||||
_extract_conn_attributes,
|
||||
@ -287,7 +307,15 @@ class RedisInstrumentor(BaseInstrumentor):
|
||||
tracer,
|
||||
request_hook=kwargs.get("request_hook"),
|
||||
response_hook=kwargs.get("response_hook"),
|
||||
sanitize_query=kwargs.get("sanitize_query", False),
|
||||
sanitize_query=kwargs.get(
|
||||
"sanitize_query",
|
||||
environ.get(
|
||||
OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS, "false"
|
||||
)
|
||||
.lower()
|
||||
.strip()
|
||||
== "true",
|
||||
),
|
||||
)
|
||||
|
||||
def _uninstrument(self, **kwargs):
|
||||
|
@ -0,0 +1,17 @@
|
||||
# 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.
|
||||
|
||||
OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS = (
|
||||
"OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS"
|
||||
)
|
@ -168,6 +168,32 @@ class TestRedis(TestBase):
|
||||
span = spans[0]
|
||||
self.assertEqual(span.attributes.get("db.statement"), "SET ? ?")
|
||||
|
||||
def test_query_sanitizer_enabled_env(self):
|
||||
redis_client = redis.Redis()
|
||||
connection = redis.connection.Connection()
|
||||
redis_client.connection = connection
|
||||
|
||||
RedisInstrumentor().uninstrument()
|
||||
|
||||
env_patch = mock.patch.dict(
|
||||
"os.environ",
|
||||
{"OTEL_PYTHON_INSTRUMENTATION_SANITIZE_REDIS": "true"},
|
||||
)
|
||||
env_patch.start()
|
||||
RedisInstrumentor().instrument(
|
||||
tracer_provider=self.tracer_provider,
|
||||
)
|
||||
|
||||
with mock.patch.object(redis_client, "connection"):
|
||||
redis_client.set("key", "value")
|
||||
|
||||
spans = self.memory_exporter.get_finished_spans()
|
||||
self.assertEqual(len(spans), 1)
|
||||
|
||||
span = spans[0]
|
||||
self.assertEqual(span.attributes.get("db.statement"), "SET ? ?")
|
||||
env_patch.stop()
|
||||
|
||||
def test_query_sanitizer_disabled(self):
|
||||
redis_client = redis.Redis()
|
||||
connection = redis.connection.Connection()
|
||||
|
Reference in New Issue
Block a user