Skip to content

GeneratorExit sets span status to ERROR #4484

Closed
@harupy

Description

@harupy

Related to #4406. The following code sets the span status to ERROR in opentelemetry-api==1.31.0 and opentelemetry-sdk==1.31.0:

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
    BatchSpanProcessor,
    ConsoleSpanExporter,
)

provider = TracerProvider()
processor = BatchSpanProcessor(ConsoleSpanExporter())
provider.add_span_processor(processor)

trace.set_tracer_provider(provider)
tracer = trace.get_tracer("my.tracer.name")


def f():
    span = tracer.start_span("test")
    with trace.use_span(span, end_on_exit=True):
        yield


g = f()
next(g)
g.close()

Output:

{
    "name": "test",
    "context": {
        "trace_id": "0xe1dd99a7ddbd4521416321571fa37d42",
        "span_id": "0x3d01a4fbfdad0508",
        "trace_state": "[]"
    },
    "kind": "SpanKind.INTERNAL",
    "parent_id": null,
    "start_time": "2025-03-13T11:47:07.138186Z",
    "end_time": "2025-03-13T11:47:07.138437Z",
    "status": {
        "status_code": "ERROR",
        "description": "GeneratorExit: "
    },
    "attributes": {},
    "events": [
        {
            "name": "exception",
            "timestamp": "2025-03-13T11:47:07.138431Z",
            "attributes": {
                "exception.type": "GeneratorExit",
                "exception.message": "",
                "exception.stacktrace": "Traceback (most recent call last):\n  File \"/Users/harutaka.kawamura/.pyenv/versions/miniconda3-latest/envs/mlflow/lib/python3.9/site-packages/opentelemetry/trace/__init__.py\", line 587, in use_span\n    yield span\n  File \"/Users/harutaka.kawamura/Desktop/repositories/mlflow/b.py\", line 19, in f\n    yield\nGeneratorExit\n",
                "exception.escaped": "False"
            }
        }
    ],
    "links": [],
    "resource": {
        "attributes": {
            "telemetry.sdk.language": "python",
            "telemetry.sdk.name": "opentelemetry",
            "telemetry.sdk.version": "1.31.0",
            "service.name": "unknown_service"
        },
        "schema_url": ""
    }
}

The same code doesn't set the span status to ERROR in opentelemetry-api==1.30.0 and opentelemetry-sdk==1.30.0:

{
    "name": "test",
    "context": {
        "trace_id": "0xc9f3585ec669a8e7c3f3fd64538d582f",
        "span_id": "0x7e5e006dae5a6345",
        "trace_state": "[]"
    },
    "kind": "SpanKind.INTERNAL",
    "parent_id": null,
    "start_time": "2025-03-13T15:19:56.265241Z",
    "end_time": "2025-03-13T15:19:56.265253Z",
    "status": {
        "status_code": "UNSET"
    },
    "attributes": {},
    "events": [],
    "links": [],
    "resource": {
        "attributes": {
            "telemetry.sdk.language": "python",
            "telemetry.sdk.name": "opentelemetry",
            "telemetry.sdk.version": "1.30.0",
            "service.name": "unknown_service"
        },
        "schema_url": ""
    }
}

Is this intended?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions