diff --git a/middleware/middleware/settings.py b/middleware/middleware/settings.py index 1e8b396..6b94855 100644 --- a/middleware/middleware/settings.py +++ b/middleware/middleware/settings.py @@ -139,14 +139,18 @@ "class": "logging.StreamHandler", "formatter": "standard", }, + "otel": { + "class": "logging.StreamHandler", # OpenTelemetry logs + "formatter": "standard", + }, }, "root": { - "handlers": ["console"], + "handlers": ["console", "otel"], "level": "DEBUG", }, "loggers": { "django": { - "handlers": ["console"], + "handlers": ["console", "otel"], "level": "INFO", "propagate": True, }, @@ -186,7 +190,12 @@ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.resources import Resource from opentelemetry import trace - + from opentelemetry._logs import set_logger_provider + from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler + from opentelemetry.sdk._logs.export import BatchLogRecordProcessor + from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter + import logging + import atexit OTLP_ENDPOINT = os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT") OLTP_API_KEY = os.getenv("OLTP_API_KEY") @@ -203,3 +212,19 @@ # Apply OpenTelemetry Instrumentation DjangoInstrumentor().instrument() + + logger_provider = LoggerProvider(resource=resource) + set_logger_provider(logger_provider) + + log_exporter = OTLPLogExporter( + endpoint=f"{OTLP_ENDPOINT}/v1/logs", + headers={"api-key": OLTP_API_KEY} if OLTP_API_KEY else None, + ) + logger_provider.add_log_record_processor(BatchLogRecordProcessor(log_exporter)) + + otel_handler = LoggingHandler(logger_provider=logger_provider) + logging.getLogger().addHandler(otel_handler) + + # Ensure OpenTelemetry flushes logs before the app exits + atexit.register(logger_provider.shutdown) + atexit.register(tracer_provider.shutdown) diff --git a/requirements.txt b/requirements.txt index ec7d1e2..3950a3e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,5 @@ opentelemetry-api==1.30.0 opentelemetry-sdk==1.30.0 opentelemetry-exporter-otlp==1.30.0 opentelemetry-instrumentation-django==0.51b0 +opentelemetry-instrumentation-logging==0.51b0 +opentelemetry-exporter-otlp-proto-grpc==1.30.0 \ No newline at end of file