Skip to content

AsyncioIntegration breaks tracing inside ThreadPoolExecutor #4508

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

    No fields configured for issues without a type.

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions