opentelemetry-python icon indicating copy to clipboard operation
opentelemetry-python copied to clipboard

Logging Instrumentation gives Exception: Invalid type when an exception is passed directly to logging handler

Open meldsza opened this issue 1 year ago • 2 comments

Describe your environment

OS: Mac and RHEL 9 Python version: python 3.12 Package version: 0.47b0 env:

 OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/protobuf 
 OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true

What happened?

The Opentelemetry Logging instrumentation gives an exception when logging an exception directly.

Steps to Reproduce

Provided below is a minimal example to reproduce this issue

import logging
import sys

from opentelemetry import trace

tracer = trace.get_tracer_provider().get_tracer(__name__)


# Trace context correlation
with tracer.start_as_current_span("foo"):
    # Do something
    current_span = trace.get_current_span()
    current_span.add_event("This is a span event")
    logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
    logging.getLogger().error(ValueError("Test"))

Run this using opentelemetry-instrument --traces_exporter none --logs_exporter otlp python example.py

Expected Result

No exception is raised and the log is transported successfully to the otel collector.

Actual Result

An exception is raised and the log is not transported to the collector

otel-logs-py3.12meldsza@MacBook-Pro otel-logs % opentelemetry-instrument --traces_exporter none --logs_exporter otlp python example.py
Test
Exception while exporting logs.
Traceback (most recent call last):
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/sdk/_logs/_internal/export/__init__.py", line 311, in _export_batch
    self._exporter.export(self._log_records[:idx])  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py", line 138, in export
    serialized_data = encode_logs(batch).SerializeToString()
                      ^^^^^^^^^^^^^^^^^^
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 38, in encode_logs
    return ExportLogsServiceRequest(resource_logs=_encode_resource_logs(batch))
                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 72, in _encode_resource_logs
    pb2_log = _encode_log(sdk_log)
              ^^^^^^^^^^^^^^^^^^^^
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 58, in _encode_log
    body=_encode_value(log_data.log_record.body),
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/meldsza/Desktop/work/repos/otel-logs/.venv/lib/python3.12/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py", line 88, in _encode_value
    raise Exception(f"Invalid type {type(value)} of value {value}")
Exception: Invalid type <class 'ValueError'> of value Test

Additional context

No response

Would you like to implement a fix?

None

meldsza avatar Aug 01 '24 08:08 meldsza

hey @meldsza, just interested in it. I didn't reproduce this issue on my local side, any other steps I need? just have the "Test" printed in my console without any exception raised.

FraserYu avatar Aug 06 '24 08:08 FraserYu

Sorry @FraserYu , you are right, I missed one environment variable to make this reproducible: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true Updated in issue description as well

meldsza avatar Aug 06 '24 08:08 meldsza

Similar issue, but with pymongo logger.

Invalid type <class 'pymongo.logger.LogMessage'> of value {"clientId": {"$oid": "67666ced1dd73ce5e9db9649"}, "message": "Connection ready", "serverHost": "localtest.me", "serverPort": 27017, "driverConnectionId": 5, "durationMS": 0.33134291786700487}
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/sdk/_logs/_internal/export/__init__.py", line 307, in _export_batch
    self._exporter.export(self._log_records[:idx])  # type: ignore
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py", line 159, in export
    serialized_data = encode_logs(batch).SerializeToString()
                      ~~~~~~~~~~~^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 37, in encode_logs
    return ExportLogsServiceRequest(resource_logs=_encode_resource_logs(batch))
                                                  ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 72, in _encode_resource_logs
    pb2_log = _encode_log(sdk_log)
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py", line 58, in _encode_log
    body=_encode_value(body) if body is not None else None,
         ~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.13/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py", line 90, in _encode_value
    raise Exception(f"Invalid type {type(value)} of value {value}")
Exception: Invalid type <class 'pymongo.logger.LogMessage'> of value {"clientId": {"$oid": "67666ced1dd73ce5e9db9649"}, "message": "Connection ready", "serverHost": "localtest.me", "serverPort": 27017, "driverConnectionId": 5, "durationMS": 0.33134291786700487}

aborigeth avatar Dec 21 '24 07:12 aborigeth

Looks like this has been already fixed.

xrmx avatar Jun 03 '25 15:06 xrmx