Syntax
newrelic.agent.datastore_trace(product, target, operation)Used to instrument calls to datastores.
Description
datastore_trace is used to add more detail to your transaction traces in the form of additional segments. Any calls reported with datastore_trace will appear on the APM Databases page. datastore_trace returns a partial of DatastoreTraceWrapper that can be used as a decorator for a function to time calls to your datastore.
The datastore_trace decorator can be used on generators and coroutines with agent version 2.102.0.85 or higher. Timing of these objects begins when consumption starts, and ends when the object is exhausted or goes out of scope. This is a change from earlier versions where the metric represented the time taken to create the generator or coroutine object itself.
If you cannot use the decorator in your application, you can use one of these other call formats:
- The context manager: The context manager form is
DatastoreTrace. - The wrapper: The wrapper form is
DatastoreTraceWrapper. It can be used to return a wrapped function without the use of a decorator. - The path-based wrapper: The path-based wrapper form is
wrap_datastore_trace. This applies theDatastoreTraceWrapperto a given object through monkey patching. This takes the same parameters as the decorator plus an additionalmoduleandobject_pathparameter.
For an explanation of the uses of these different call formats, see Different call formats. See Examples for call examples.
Parameters
Parameters for decorator
newrelic.agent.datastore_trace(product, target, operation)This call includes these parameters:
Parameter | Description |
|---|---|
string | Required. The name of the vendor. Example: |
string | Required. The name of the collection or table. If there is no target, |
string | Required. The name of the datastore operation. Examples: |
Parameters for context manager
newrelic.agent.DatastoreTrace(product, target, operation, host=None, port_path_or_id=None, database_name=None)Parameters for the context manager includes all of the parameters from datastore_trace plus the additional host, port_path_or_id, and database_name parameters.
Parameter | Description |
|---|---|
string | Optional. The hostname or IP of the datastore server. |
string | Optional. The port used to connect to the datastore server. If connecting with a unix socket, this can be the path to the socket. |
string | Optional. The name of the database. |
Wrapper parameters
newrelic.agent.DatastoreTraceWrapper(wrapped, product, target, operation)Parameters for the wrapper include all parameters for datastore_trace and a wrapped parameter:
Parameter | Description |
|---|---|
function | Required. The function being wrapped. |
Path-based wrapping parameters
newrelic.agent.wrap_datastore_trace(module, object_path, product, target, operation)Parameters include all parameters for datastore_trace and these parameters:
Parameter | Description |
|---|---|
object | Required. The module containing the function to be instrumented. |
string | Required. The path to the location of the function. |
Return values
datastore_trace returns a DatastoreTraceWrapper() partial.
Examples
datastore_trace example
An example of using the datastore_trace decorator:
import newrelic.agent
class _Database(UserDict.DictMixin):
...
@newrelic.agent.datastore_trace('Redis', None, 'get') def _get(self, key): ...An example of using the datastore_trace decorator with native coroutines:
import newrelic.agent
class _Database(UserDict.DictMixin):
...
@newrelic.agent.datastore_trace('Redis', None, 'get') async def _get(self, key): ...Context manager example
An example of using the DatastoreTrace context manager: This will give timings for how long it takes to do `custom_action`.
import newrelic.agent
def complex_query(a, b, c): with Connection(host, port, db) as conn: with newrelic.agent.DatastoreTrace( product="Custom Product", target=None, operation="custom", host=host, port_path_or_id=port, database_name=db, ):
conn.custom_action()Wrapper example
An example of using the DatastoreTraceWrapper:
import newrelic.agent
class _Database(UserDict.DictMixin):
...
def _get(self, key): ...
_Database._get = newrelic.agent.DatastoreTraceWrapper( _Database._get, "Redis", None, "get")