mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-08-01 09:13:23 +08:00
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
from ...compat import parse
|
|
from ...internal.logger import get_logger
|
|
|
|
log = get_logger(__name__)
|
|
|
|
|
|
def _resource_from_cache_prefix(resource, cache):
|
|
"""
|
|
Combine the resource name with the cache prefix (if any)
|
|
"""
|
|
if getattr(cache, 'key_prefix', None):
|
|
name = '{} {}'.format(resource, cache.key_prefix)
|
|
else:
|
|
name = resource
|
|
|
|
# enforce lowercase to make the output nicer to read
|
|
return name.lower()
|
|
|
|
|
|
def quantize_key_values(key):
|
|
"""
|
|
Used in the Django trace operation method, it ensures that if a dict
|
|
with values is used, we removes the values from the span meta
|
|
attributes. For example::
|
|
|
|
>>> quantize_key_values({'key', 'value'})
|
|
# returns ['key']
|
|
"""
|
|
if isinstance(key, dict):
|
|
return key.keys()
|
|
|
|
return key
|
|
|
|
|
|
def get_request_uri(request):
|
|
"""
|
|
Helper to rebuild the original request url
|
|
|
|
query string or fragments are not included.
|
|
"""
|
|
# DEV: We do this instead of `request.build_absolute_uri()` since
|
|
# an exception can get raised, we want to always build a url
|
|
# regardless of any exceptions raised from `request.get_host()`
|
|
host = None
|
|
try:
|
|
host = request.get_host() # this will include host:port
|
|
except Exception:
|
|
log.debug('Failed to get Django request host', exc_info=True)
|
|
|
|
if not host:
|
|
try:
|
|
# Try to build host how Django would have
|
|
# https://github.com/django/django/blob/e8d0d2a5efc8012dcc8bf1809dec065ebde64c81/django/http/request.py#L85-L102
|
|
if 'HTTP_HOST' in request.META:
|
|
host = request.META['HTTP_HOST']
|
|
else:
|
|
host = request.META['SERVER_NAME']
|
|
port = str(request.META['SERVER_PORT'])
|
|
if port != ('443' if request.is_secure() else '80'):
|
|
host = '{0}:{1}'.format(host, port)
|
|
except Exception:
|
|
# This really shouldn't ever happen, but lets guard here just in case
|
|
log.debug('Failed to build Django request host', exc_info=True)
|
|
host = 'unknown'
|
|
|
|
# Build request url from the information available
|
|
# DEV: We are explicitly omitting query strings since they may contain sensitive information
|
|
return parse.urlunparse(parse.ParseResult(
|
|
scheme=request.scheme,
|
|
netloc=host,
|
|
path=request.path,
|
|
params='',
|
|
query='',
|
|
fragment='',
|
|
))
|