Skip to content

AsyncioIntegration breaks tracing inside ThreadPoolExecutor #4508

@ollipa

Description

@ollipa

How do you use Sentry?

Sentry Saas (sentry.io)

Version

2.30.0

Steps to Reproduce

  1. Init Sentry with AsyncioIntegration.
  2. Create ThreadPoolExecutor
  3. Create async task using asyncio.create_task
  4. Inside the task call loop.run_in_executor

Code to reproduce the issue:

import asyncio
import threading
from concurrent.futures import ThreadPoolExecutor
from time import sleep
import sentry_sdk
from sentry_sdk.integrations.asyncio import AsyncioIntegration


def init_sentry():
    sentry_sdk.init(
        dsn="",
        traces_sample_rate=1.0,
        integrations=[
            AsyncioIntegration(),
        ],
    )

@sentry_sdk.trace
def task_1():
    print(f"Task 1 thread ID: {threading.get_ident()}")
    sleep(0.5)

async def main():
    init_sentry()    
    print(f"Main thread ID: {threading.get_ident()}")    
    executor = ThreadPoolExecutor()
    for i in range(3):
        task = asyncio.create_task(worker_task(executor, i))
        await task

async def worker_task(executor: ThreadPoolExecutor, i: int):
    with sentry_sdk.start_transaction(
        op="function", name="main_thread"
    ):
        print(f"\nWorker task {i} thread ID: {threading.get_ident()}")
        loop = asyncio.get_event_loop()
        await loop.run_in_executor(executor, task_1)


if __name__ == "__main__":
    asyncio.run(main()) 

Expected Result

Spans created in tasks that run in a ThreadPoolExecutor should be included in the transactions sent to Sentry when AsyncioIntegration is enabled.

Actual Result

Spans created in tasks that run in a ThreadPoolExecutor are missing from the transactions sent to Sentry.

Only the first execution contains all the spans:
Image

Subsequent executions are missing spans created inside executor:
Image

Removing AsyncioIntegration integration solves the issue but then many automatic async related spans are missing. Our application uses asyncio but executes many CPU intensive blocking tasks inside executor.

I also tried Sentry 3.0.0a2 and it has the same issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions