Supported Technologiesedit
The Elastic APM Python Agent comes with support for the following frameworks:
For other frameworks and custom Python code, the agent exposes a set of APIs for integration.
Pythonedit
The following Python versions are supported:
- 3.6
- 3.7
- 3.8
- 3.9
- 3.10
- 3.11
Djangoedit
We support these Django versions:
- 1.11
- 2.0
- 2.1
- 2.2
- 3.0
- 3.1
- 3.2
- 4.0
For upcoming Django versions, we generally aim to ensure compatibility starting with the first Release Candidate.
we currently don’t support Django running in ASGI mode.
Flaskedit
We support these Flask versions:
- 0.10 (Deprecated)
- 0.11 (Deprecated)
- 0.12 (Deprecated)
- 1.0
- 1.1
- 2.0
Aiohttp Serveredit
We support these aiohttp versions:
- 3.0+
Tornadoedit
We support these tornado versions:
- 6.0+
Sanicedit
We support these sanic versions:
- 20.12.2+
Starlette/FastAPIedit
We support these Starlette versions:
- 0.13.0+
Any FastAPI version which uses a supported Starlette version should also be supported.
GRPCedit
We support these grpcio
versions:
- 1.24.0+
Automatic Instrumentationedit
The Python APM agent comes with automatic instrumentation of various 3rd party modules and standard library modules.
Schedulingedit
Celeryedit
We support these Celery versions:
- 3.x
- 4.x
Celery tasks will be recorded automatically with Django and Flask only.
Databasesedit
Elasticsearchedit
Instrumented methods:
-
elasticsearch.transport.Transport.perform_request
-
elasticsearch.connection.http_urllib3.Urllib3HttpConnection.perform_request
-
elasticsearch.connection.http_requests.RequestsHttpConnection.perform_request
-
elasticsearch._async.transport.AsyncTransport.perform_request
-
elasticsearch_async.connection.AIOHttpConnection.perform_request
Additionally, the instrumentation wraps the following methods of the Elasticsearch
client class:
-
elasticsearch.client.Elasticsearch.delete_by_query
-
elasticsearch.client.Elasticsearch.search
-
elasticsearch.client.Elasticsearch.count
-
elasticsearch.client.Elasticsearch.update
Collected trace data:
- the query string (if available)
-
the
query
element from the request body (if available) - the response status code
- the count of affected rows (if available)
We recommend using keyword arguments only with elasticsearch-py, as recommended by
the elasticsearch-py docs.
If you are using positional arguments, we will be unable to gather the query
element from the request body.
SQLiteedit
Instrumented methods:
-
sqlite3.connect
-
sqlite3.dbapi2.connect
-
pysqlite2.dbapi2.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
MySQLdbedit
Library: MySQLdb
Instrumented methods:
-
MySQLdb.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
mysql-connectoredit
Library: mysql-connector-python
Instrumented methods:
-
mysql.connector.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
pymysqledit
Library: pymysql
Instrumented methods:
-
pymysql.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
aiomysqledit
Library: aiomysql
Instrumented methods:
-
aiomysql.cursors.Cursor.execute
Collected trace data:
- parametrized SQL query
PostgreSQLedit
Library: psycopg2
, psycopg2-binary
(>=2.9
)
Instrumented methods:
-
psycopg2.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
aiopgedit
Library: aiopg
(>=1.0
)
Instrumented methods:
-
aiopg.cursor.Cursor.execute
-
aiopg.cursor.Cursor.callproc
Collected trace data:
- parametrized SQL query
asyncpgedit
Library: asyncpg
(>=0.20
)
Instrumented methods:
-
asyncpg.connection.Connection.execute
-
asyncpg.connection.Connection.executemany
Collected trace data:
- parametrized SQL query
PyODBCedit
Library: pyodbc
, (>=4.0
)
Instrumented methods:
-
pyodbc.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
MS-SQLedit
Library: pymssql
, (>=2.1.0
)
Instrumented methods:
-
pymssql.connect
The instrumented connect
method returns a wrapped connection/cursor which instruments the actual Cursor.execute
calls.
Collected trace data:
- parametrized SQL query
MongoDBedit
Library: pymongo
, >=2.9,<3.8
Instrumented methods:
-
pymongo.collection.Collection.aggregate
-
pymongo.collection.Collection.bulk_write
-
pymongo.collection.Collection.count
-
pymongo.collection.Collection.create_index
-
pymongo.collection.Collection.create_indexes
-
pymongo.collection.Collection.delete_many
-
pymongo.collection.Collection.delete_one
-
pymongo.collection.Collection.distinct
-
pymongo.collection.Collection.drop
-
pymongo.collection.Collection.drop_index
-
pymongo.collection.Collection.drop_indexes
-
pymongo.collection.Collection.ensure_index
-
pymongo.collection.Collection.find_and_modify
-
pymongo.collection.Collection.find_one
-
pymongo.collection.Collection.find_one_and_delete
-
pymongo.collection.Collection.find_one_and_replace
-
pymongo.collection.Collection.find_one_and_update
-
pymongo.collection.Collection.group
-
pymongo.collection.Collection.inline_map_reduce
-
pymongo.collection.Collection.insert
-
pymongo.collection.Collection.insert_many
-
pymongo.collection.Collection.insert_one
-
pymongo.collection.Collection.map_reduce
-
pymongo.collection.Collection.reindex
-
pymongo.collection.Collection.remove
-
pymongo.collection.Collection.rename
-
pymongo.collection.Collection.replace_one
-
pymongo.collection.Collection.save
-
pymongo.collection.Collection.update
-
pymongo.collection.Collection.update_many
-
pymongo.collection.Collection.update_one
Collected trace data:
- database name
- method name
Redisedit
Library: redis
(>=2.8
)
Instrumented methods:
-
redis.client.Redis.execute_command
-
redis.client.Pipeline.execute
Collected trace data:
- Redis command name
aioredisedit
Library: aioredis
(<2.0
)
Instrumented methods:
-
aioredis.pool.ConnectionsPool.execute
-
aioredis.commands.transaction.Pipeline.execute
-
aioredis.connection.RedisConnection.execute
Collected trace data:
- Redis command name
Cassandraedit
Library: cassandra-driver
(>=3.4,<4.0
)
Instrumented methods:
-
cassandra.cluster.Session.execute
-
cassandra.cluster.Cluster.connect
Collected trace data:
- CQL query
Python Memcacheedit
Library: python-memcached
(>=1.51
)
Instrumented methods:
-
memcache.Client.add
-
memcache.Client.append
-
memcache.Client.cas
-
memcache.Client.decr
-
memcache.Client.delete
-
memcache.Client.delete_multi
-
memcache.Client.disconnect_all
-
memcache.Client.flush_all
-
memcache.Client.get
-
memcache.Client.get_multi
-
memcache.Client.get_slabs
-
memcache.Client.get_stats
-
memcache.Client.gets
-
memcache.Client.incr
-
memcache.Client.prepend
-
memcache.Client.replace
-
memcache.Client.set
-
memcache.Client.set_multi
-
memcache.Client.touch
Collected trace data:
- Destination (address and port)
pymemcacheedit
Library: pymemcache
(>=3.0
)
Instrumented methods:
-
pymemcache.client.base.Client.add
-
pymemcache.client.base.Client.append
-
pymemcache.client.base.Client.cas
-
pymemcache.client.base.Client.decr
-
pymemcache.client.base.Client.delete
-
pymemcache.client.base.Client.delete_many
-
pymemcache.client.base.Client.delete_multi
-
pymemcache.client.base.Client.flush_all
-
pymemcache.client.base.Client.get
-
pymemcache.client.base.Client.get_many
-
pymemcache.client.base.Client.get_multi
-
pymemcache.client.base.Client.gets
-
pymemcache.client.base.Client.gets_many
-
pymemcache.client.base.Client.incr
-
pymemcache.client.base.Client.prepend
-
pymemcache.client.base.Client.quit
-
pymemcache.client.base.Client.replace
-
pymemcache.client.base.Client.set
-
pymemcache.client.base.Client.set_many
-
pymemcache.client.base.Client.set_multi
-
pymemcache.client.base.Client.stats
-
pymemcache.client.base.Client.touch
Collected trace data:
- Destination (address and port)
kafka-pythonedit
Library: kafka-python
(>=2.0
)
Instrumented methods:
-
kafka.KafkaProducer.send
, -
kafka.KafkaConsumer.poll
, -
kafka.KafkaConsumer.\__next__
Collected trace data:
- Destination (address and port)
- topic (if applicable)
External HTTP requestsedit
Standard libraryedit
Library: urllib2
(Python 2) / urllib.request
(Python 3)
Instrumented methods:
-
urllib2.AbstractHTTPHandler.do_open
/urllib.request.AbstractHTTPHandler.do_open
Collected trace data:
- HTTP method
- requested URL
urllib3edit
Library: urllib3
Instrumented methods:
-
urllib3.connectionpool.HTTPConnectionPool.urlopen
Additionally, we instrumented vendored instances of urllib3 in the following libraries:
-
requests
-
botocore
Both libraries have "unvendored" urllib3 in more recent versions, we recommend to use the newest versions.
Collected trace data:
- HTTP method
- requested URL
requestsedit
Instrumented methods:
-
requests.sessions.Session.send
Collected trace data:
- HTTP method
- requested URL
AIOHTTP Clientedit
Instrumented methods:
-
aiohttp.client.ClientSession._request
Collected trace data:
- HTTP method
- requested URL
httpxedit
Instrumented methods:
- `httpx.Client.send
Collected trace data:
- HTTP method
- requested URL
Servicesedit
AWS Boto3 / Botocoreedit
Library: boto3
(>=1.0
)
Instrumented methods:
-
botocore.client.BaseClient._make_api_call
Collected trace data for all services:
-
AWS region (e.g.
eu-central-1
) -
AWS service name (e.g.
s3
) -
operation name (e.g.
ListBuckets
)
Additionally, some services collect more specific data
AWS Aiobotocoreedit
Library: aiobotocore
(>=2.2.0
)
Instrumented methods:
-
aiobotocore.client.BaseClient._make_api_call
Collected trace data for all services:
-
AWS region (e.g.
eu-central-1
) -
AWS service name (e.g.
s3
) -
operation name (e.g.
ListBuckets
)
Additionally, some services collect more specific data
S3edit
- Bucket name
DynamoDBedit
- Table name
SNSedit
- Topic name
SQSedit
- Queue name
Template Enginesedit
Django Template Languageedit
Library: Django
(see Django for supported versions)
Instrumented methods:
-
django.template.Template.render
Collected trace data:
- template name
Jinja2edit
Library: jinja2
Instrumented methods:
-
jinja2.Template.render
Collected trace data:
- template name