open-telemetry / open-telemetry/opentelemetry-python-contrib

Flaky sqlalchemy test with pypy

Open
#2,526 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Python
Stars
1.1k
Forks
1.1k
Avg merge
4d 15h
Merged PRs (30d)
16

Description

Describe your environment

Steps to reproduce

tox -e pypy3-test-instrumentation-sqlalchemy-1

What is the expected behavior?

Tests pass

What is the actual behavior?

=================================== FAILURES ===================================
______ TestSqlalchemyMetricsInstrumentation.test_metrics_two_connections _______

self = <tests.test_sqlalchemy_metrics.TestSqlalchemyMetricsInstrumentation testMethod=test_metrics_two_connections>

    def tearDown(self):
        super().tearDown()
>       SQLAlchemyInstrumentor().uninstrument()

instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy_metrics.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
opentelemetry-instrumentation/src/opentelemetry/instrumentation/instrumentor.py:128: in uninstrument
    result = self._uninstrument(**kwargs)
instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py:229: in _uninstrument
    EngineTracer.remove_all_event_listeners()
instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py:187: in remove_all_event_listeners
    remove(weak_ref_target(), identifier, func)
.tox/pypy3-test-instrumentation-sqlalchemy-1/lib/pypy3.8/site-packages/sqlalchemy/event/api.py:213: in remove
    _event_key(target, identifier, fn).remove()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

target = None, identifier = 'handle_error'
fn = <function _handle_error at 0x00007fb2bec93100>

    def _event_key(target, identifier, fn):
        for evt_cls in _registrars[identifier]:
            tgt = evt_cls._accept_with(target)
            if tgt is not None:
                return _EventKey(target, identifier, fn, tgt)
        else:
>           raise exc.InvalidRequestError(
                "No such event '%s' for target '%s'" % (identifier, target)
            )
E           sqlalchemy.exc.InvalidRequestError: No such event 'handle_error' for target 'None'

.tox/pypy3-test-instrumentation-sqlalchemy-1/lib/pypy3.8/site-packages/sqlalchemy/event/api.py:29: InvalidRequestError
_____ TestSqlalchemyMetricsInstrumentation.test_metrics_without_pool_name ______

self = <tests.test_sqlalchemy_metrics.TestSqlalchemyMetricsInstrumentation testMethod=test_metrics_without_pool_name>

    def test_metrics_without_pool_name(self):
        pool_name = "pool_test_name"
        engine = sqlalchemy.create_engine(
            "sqlite:///:memory:",
            pool_size=5,
            poolclass=QueuePool,
            pool_logging_name=pool_name,
        )
    
        self.assertIsNone(self.memory_metrics_reader.get_metrics_data())
    
        with engine.connect():
>           self.assert_pool_idle_used_expected(
                pool_name=pool_name, idle=0, used=1
            )

instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy_metrics.py:83: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy_metrics.py:34: in assert_pool_idle_used_expected
    metrics = self.get_sorted_metrics()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <tests.test_sqlalchemy_metrics.TestSqlalchemyMetricsInstrumentation testMethod=test_metrics_without_pool_name>

    def get_sorted_metrics(self):
        resource_metrics = (
>           self.memory_metrics_reader.get_metrics_data().resource_metrics
        )
E       AttributeError: 'NoneType' object has no attribute 'resource_metrics'

.tox/pypy3-test-instrumentation-sqlalchemy-1/lib/pypy3.8/site-packages/opentelemetry/test/test_base.py:148: AttributeError
------------------------------ Captured log call -------------------------------
WARNING  opentelemetry.instrumentation.instrumentor:instrumentor.py:100 Attempting to instrument while already instrumented

Additional context
Add any other context about the problem here.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running tox -e pypy3-test-instrumentation-sqlalchemy-1 and inspect instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy_metrics.py. Trace EngineTracer.remove_all_event_listeners and the metrics reader setup against the reported failures. Done means the SQLAlchemy instrumentation tests pass reliably under PyPy, including teardown and pool metrics assertions.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, sqlalchemy
Domain
backend, observability, testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.