Skip to content

aioredis instrumentation: AttributeError: 'str' object has no attribute 'decode' #1307

@Tayum

Description

@Tayum

Describe the bug
In some cases aioredis passes str commands to its aioredis.Redis.execute() method rather than bytes commands, like e.g. when executing aioredis.Redis.ping(), which is unacceptable by elastic-apm.

Current workaround
Disable aioredis instrumenting (set environment variable SKIP_INSTRUMENT_AIOREDIS="true") prior elasticapm.instrument() is called.

To Reproduce

import asyncio

import aioredis
import elasticapm

REDIS_URL = "redis://localhost:6379"


async def main():
    elasticapm.instrument()

    client = await aioredis.create_redis_pool(REDIS_URL)
    elastic_apm_client = elasticapm.Client()

    elastic_apm_client.begin_transaction("redis-ping")
    try:
        assert await client.ping() == b"PONG"
    finally:
        client.close()
        await client.wait_closed()
        elastic_apm_client.end_transaction("redis-ping")

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

Expected result
No exception is raised.

Actual result

Traceback (most recent call last):
  File "<...>/test.py", line 24, in <module>
    asyncio.run(main())
  File "/usr/local/lib/python3.8/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/local/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "<...>/test.py", line 17, in main
    assert await client.ping() == b"PONG"
  File "<...>/venv/lib/python3.8/site-packages/aioredis/commands/__init__.py", line 114, in ping
    return self.execute('PING', *args, encoding=encoding)
  File "<...>/venv/lib/python3.8/site-packages/aioredis/commands/__init__.py", line 51, in execute
    return self._pool_or_conn.execute(command, *args, **kwargs)
  File "<...>/venv/lib/python3.8/site-packages/elasticapm/instrumentation/packages/base.py", line 210, in call_if_sampling
    return self.call(module, method, wrapped, instance, args, kwargs)
  File "<...>/venv/lib/python3.8/site-packages/elasticapm/instrumentation/packages/asyncio/aioredis.py", line 46, in call
    wrapped_name = args[0].decode()
AttributeError: 'str' object has no attribute 'decode'

Environment

  • OS: Ubuntu 18.04.5 LTS
  • Python version: 3.8.9
  • Framework and version: aioredis==1.3.1
  • APM Server version: --
  • Agent version: elasticapm==6.3.3

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions