Skip to content

Flask Auto Instrumentation dissapears on debug=True app reload #546

Open
@NathanielRN

Description

@NathanielRN

Describe your environment
python 3.9
flask~=1.0
opentelemetry-api==1.3.0
opentelemetry-sdk==1.3.0
opentelemetry-instrumentation==0.22b0
opentelemetry-instrumentation-flask==0.22b0

Steps to reproduce

I created a very simple flask app my_app.py with either debug=False or debug=True:

from flask import Flask
from opentelemetry import trace

# Setup Flask App

app = Flask(__name__)

@app.route("/my_endpoint")
def call_http():
    return '{{"traceId": "{}"}}'.format(
        trace.get_current_span().get_span_context().trace_id
    )


if __name__ == "__main__":
    app.run(**{"port": 8080, "debug": False})

I then use auto-instrumentation to instrument the app with the ConsoleExporter:

opentelemetry-instrument --trace-exporter console_span python3 my_app.py

What is the expected behavior?

If I use debug=False everything works fine.

Console output:

{
    "name": "/my_endpoint",
    "context": {
        "trace_id": "0x317a86be6e1cbe5fa913f003154f2a32",
        "span_id": "0x2aafb7284d6168ea",
        "trace_state": "[]"
    },
    "kind": "SpanKind.SERVER",
    "parent_id": null,
    "start_time": "2021-06-22T17:08:52.484880Z",
    "end_time": "2021-06-22T17:08:52.485936Z",
    "status": {
        "status_code": "UNSET"
    },
    "attributes": {
        "http.method": "GET",
        "http.server_name": "127.0.0.1",
        "http.scheme": "http",
        "net.host.port": 8080,
        "http.host": "localhost:8080",
        "http.target": "/my_endpoint",
        "net.peer.ip": "127.0.0.1",
        "http.user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Firefox/78.0",
        "net.peer.port": 49317,
        "http.flavor": "1.1",
        "http.route": "/my_endpoint",
        "http.status_code": 200
    },
    "events": [],
    "links": [],
    "resource": {
        "telemetry.sdk.language": "python",
        "telemetry.sdk.name": "opentelemetry",
        "telemetry.sdk.version": "1.3.0",
        "service.name": "unknown_service"
    }
}

Browser response is OK:

image

What is the actual behavior?

If I use debug=True it does not work

No console output:

image

No trace id that can be returned in the response:

image

Additional context

I used print statements to confirm that auto instrumentation does run and replace the right methods before the app starts. But when the Restarting with stat message appears it seems like the instrumentation is lost.

The fix might require investigating how auto reloader works and instrumenting some hidden "clean slate app" that the auto reloader replaces the currently running app with to restart the instrumentation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    backlogbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions