Scopes and multithreading in python

How do I make tags and breadcrumbs captured by events sent from spawned threads?
I have some information that I’d like all events to be sent with, such as the entrypoint cmdline used to start my program, it’s version (not to be confused with release), and other process-wide context data. It appears that set_extra,set_tag,add_breadcrumb are all linked to the current thread (MainThread), but aren’t inherited by subthreads.

Hi @koreno

You would need to get Hub.current in the spawning thread and pass it to your child thread. In that thread, wrap your code with:

with Hub(hub_passed):
    # thread code goes here

Automatic inheritance is unfortunately not possible unless we monkeypatch threading.

1 Like

After digging around some I found sentry_sdk.hub.GLOBAL_HUB, which I configure its scope and affect the entire session:

    with sentry_sdk.hub.GLOBAL_HUB.configure_scope() as scope:
        scope.set_tag("cmd", cmd)

That’s the same hub as Hub.main. If you are calling the regular configure_scope() on the main thread it will have the same effect.

It doesn’t seem so. The end result was different - threads did not contain the scope configuration set in the MainThread.
It seems that when threads look for their thread-local hub, they copy this GLOBAL_HUB. The MainThread probably copies it as well, so modifying it does not modify the other threads.

Here is the implementation of Hub.main: https://github.com/getsentry/sentry-python/blob/40243091bf650371f06cf43f4e197d523fd74ef0/sentry_sdk/hub.py#L67-L70

Here is where Hub.current is set to GLOBAL_HUB in the thread that imported the SDK (which is likely the main thread): https://github.com/getsentry/sentry-python/blob/40243091bf650371f06cf43f4e197d523fd74ef0/sentry_sdk/hub.py#L321

if you see different behavior please file a bug