Single log line

Viewed 79

As a developer, I want a single log line with OpenTelemetry Logs. Using the following example I am able to use Otel _logs, but they are emitted on several lines, which makes correlating difficult.

common.py

import logging

from opentelemetry.sdk._logs import (
    LogEmitterProvider,
    LoggingHandler,
    set_log_emitter_provider,
)
from opentelemetry.sdk._logs.export import BatchLogProcessor, ConsoleLogExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.semconv.resource import ResourceAttributes

from local_machine_resource_detector import LocalMachineResourceDetector


def configure_logger(name, version):
    local_resource = LocalMachineResourceDetector().detect()
    resource = local_resource.merge(
        Resource.create(
            {
                ResourceAttributes.SERVICE_NAME: name,
                ResourceAttributes.SERVICE_VERSION: version,
            }
        )
    )
    provider = LogEmitterProvider(resource=resource)
    set_log_emitter_provider(provider)
    exporter = ConsoleLogExporter()
    provider.add_log_processor(BatchLogProcessor(exporter))
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    handler = LoggingHandler()
    logger.addHandler(handler)
    return logger

common_runner.py

from common import configure_logger

logger = configure_logger("common_runner", "6.6.6")

logger.debug(
    "common_runner.py module has been run",
    extra={
        "username": "Sid Vicous",
    },
)

Here's the output:

{
    "body": "common_runner.py module has been run",
    "severity_number": "<SeverityNumber.DEBUG: 5>",
    "severity_text": "DEBUG",
    "attributes": {
        "username": "Sid Vicous"
    },
    "timestamp": "2022-07-13T14:40:08.595698Z",
    "trace_id": "0x00000000000000000000000000000000",
    "span_id": "0x0000000000000000",
    "trace_flags": 0,
    "resource": "BoundedAttributes({'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.11.1', 'net.host.name': 'Doug.Ramirez', 'net.host.ip': '127.0.0.1', 'service.name': 'common_runner', 'service.version': '6.6.6'}, maxlen=None)"
}

Here's what I would like to see in my APM platform (Datadog):

{"body": "common_runner.py module has been run", "severity_number": "<SeverityNumber.DEBUG: 5>", "severity_text": "DEBUG", "attributes": {"username": "Sid Vicous"}, "timestamp": "2022-07-13T14:40:08.595698Z",    "trace_id": "0x00000000000000000000000000000000", "span_id": "0x0000000000000000", "trace_flags": 0,    "resource": "BoundedAttributes({'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.11.1', 'net.host.name': 'Doug.Ramirez', 'net.host.ip': '127.0.0.1', 'service.name': 'common_runner', 'service.version': '6.6.6'}, maxlen=None)"}
1 Answers

You can use a combination of stringifying and replacing your log, like so!

log_as_str = str(log)
print(log_as_str.replace("\n", ""))

If your log is a dict(), it should work fine. In case, you can use json.dumps(log)

Related