Skip to content

google_genai and pydantic init_logger unconditionally called during auto_instrument #168

@viadezo1er

Description

span = current_span()                                                                                                                                                    
  if span == NOOP_SPAN:                                                                                                                                                    
      init_logger(project=project_name, ...)

There's almost never an active span at initialization time, so this always fires — overwriting whatever logger the user already set up.

With this list of installed pkg (empty venv + pip install braintrust):
attrs==26.1.0
braintrust==0.11.0
certifi==2026.2.25
charset-normalizer==3.4.6
chevron==0.14.0
exceptiongroup==1.3.1
gitdb==4.0.12
gitpython==3.1.46
idna==3.11
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
packaging==26.0
pip==26.0.1
python-dotenv==1.2.2
python-slugify==8.0.4
referencing==0.37.0
requests==2.33.0
rpds-py==0.30.0
smmap==5.0.3
sseclient-py==1.9.0
text-unidecode==1.3
tqdm==4.67.3
typing-extensions==4.15.0
urllib3==2.6.3
wrapt==2.1.2

and this demo file:

import braintrust
from braintrust import logger as bt_logger
import braintrust.wrappers.pydantic_ai as pai_mod
import inspect

original_init = bt_logger.init_logger

def traced_init(*args, **kwargs):
    print(f"\ninit_logger(project={kwargs.get('project')!r}) called from:")
    for frame_info in inspect.stack()[1:6]:
        frame = frame_info.frame
        local_vars = frame.f_locals
        relevant = {k: v for k, v in local_vars.items()
            if k in ('project', 'project_name', 'api_key', 'project_id')}
        print(f"  {frame_info.filename}:{frame_info.lineno} in {frame_info.function}")
        if relevant:
            print(f"    locals: {relevant}")
    return original_init(*args, **kwargs)

bt_logger.init_logger = traced_init
pai_mod.init_logger = traced_init

bt_logger.init_logger(project="my-project")
braintrust.auto_instrument()

python demo.py:

init_logger(project='my-project') called from:
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/demo-logger2.py:23 in <module>

init_logger(project=None) called from:
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/wrappers/pydantic_ai.py:38 in setup_pydantic_ai
    locals: {'api_key': None, 'project_id': None, 'project_name': None}
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/auto.py:155 in _instrument_pydantic_ai
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/auto.py:114 in auto_instrument
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/demo-logger2.py:24 in <module>

init_logger(project=None) called from:
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/wrappers/google_genai/__init__.py:36 in setup_genai
    locals: {'api_key': None, 'project_id': None, 'project_name': None}
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/auto.py:163 in _instrument_google_genai
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/venv/lib/python3.13/site-packages/braintrust/auto.py:116 in auto_instrument
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/demo-logger2.py:24 in <module>

Where we can see init_logger(project=None) being called from setup_genai and from pydantic_ai during auto_instrument(), overriding init_logger(project="my-project").

When executing the same file with braintrust.auto_instrument(google_genai=False), we get a normal trace:

init_logger(project='my-project', pydantic_ai=False) called from:
  /Users/cedric@braintrustdata.com/repos/braintrust-sdk-python/demo-logger2.py:21 in <module>

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions