Skip to content

Instantly share code, notes, and snippets.

@adamf
Created March 24, 2023 16:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adamf/e254a2e5cda0550b15cbbb639abf1d00 to your computer and use it in GitHub Desktop.
Save adamf/e254a2e5cda0550b15cbbb639abf1d00 to your computer and use it in GitHub Desktop.
Add datadog span & event information to structured logs in a Django app
import logging
from typing import Any, Dict
import ddtrace
from ddtrace import tracer
def datadog_context(
logger: logging.Logger, log_method: Any, event_dict: Dict[Any, Any]
) -> Dict[Any, Any]:
# ...
# Add datadog information
span = tracer.current_span()
trace_id, span_id = (span.trace_id, span.span_id) if span else (None, None)
event_dict["dd.trace_id"] = str(trace_id or 0)
event_dict["dd.span_id"] = str(span_id or 0)
event_dict["dd.env"] = ddtrace.config.env or ""
event_dict["dd.service"] = ddtrace.config.service or ""
event_dict["dd.version"] = ddtrace.config.version or ""
return event_dict
# ... usual django stuff
import structlog
from ddtrace import config as ddtrace_config
from ddtrace import filters, tracer
from django_structlog.processors import inject_context_dict
from .extra_logging import datadog_context
# ...
# structlog chain
process_base = [
structlog.processors.TimeStamper(fmt="iso"),
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
datadog_context,
]
process_foreign_pre_chain = [inject_context_dict] + process_base
process_structlog = (
[structlog.stdlib.filter_by_level]
+ process_base
+ [structlog.stdlib.ProcessorFormatter.wrap_for_formatter]
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment