Skip to main content

Python library for tracing graphql calls with Datadog

Project description


===============
ddtrace-graphql
===============


.. image:: https://travis-ci.org/beezz/ddtrace-graphql.svg?branch=master
:target: https://travis-ci.org/beezz/ddtrace-graphql

.. image:: https://codecov.io/gh/beezz/ddtrace-graphql/branch/master/graph/badge.svg
:target: https://codecov.io/gh/beezz/ddtrace-graphql

.. image:: https://pyup.io/repos/github/beezz/ddtrace-graphql/shield.svg
:target: https://pyup.io/repos/github/beezz/ddtrace-graphql/


.. image:: https://badge.fury.io/py/ddtrace-graphql.svg
:target: https://badge.fury.io/py/ddtrace-graphql


Python library to trace graphql calls with Datadog.

* `graphql-core <https://github.com/graphql-python/graphql-core>`_

* `Datadog APM (Tracing) <https://docs.datadoghq.com/tracing/>`_

* `Datadog Trace Client <http://pypi.datadoghq.com/trace/docs/>`_


Compatibility
-------------

``ddtrace-graphql`` is tested with:

* Python versions: 3.5, 3.6, nightly
* graphql-core: 2.0, 1.1.0, latest
* ddtrace: 0.11.1, 0.10.1, latest

*Screenshots for pyramid app serving GraphQL with tracing enabled:*

.. figure:: screenshots/service.png
:scale: 80%

GraphQL service detail.


.. figure:: screenshots/query.png
:scale: 80%

GraphQL query detail.



Installation
============

Using pip
---------

.. code-block:: bash

pipinstallddtracegraphqlFromsource..codeblock::bash git clone https://github.com/beezz/ddtrace-graphql.git
Misplaced & export DDTRACE_GRAPHQL_SERVICE=foobar.graphql


span_kwargs
===========

Default arguments passed to the tracing context manager can be updated using
``span_kwargs`` argument of ``ddtrace_graphql.patch`` or
``ddtrace_graphql.traced_graphql`` functions.

Default values:

:name: Wrapped resource name. Default ``graphql.graphql``.
:span_type: Span type. Default ``graphql``.
:service: Service name. Defaults to ``DDTRACE_GRAPHQL_SERVICE`` environment variable if present, else ``graphql``.
:resource: Processed resource. Defaults to query / mutation signature.

For more information visit `ddtrace.Tracer.trace <http://pypi.datadoghq.com/trace/docs/#ddtrace.Tracer.trace>`_ documentation.


.. code-block:: python

from ddtrace_graphql import patch
patch(span_kwargs=dict(service='foo.graphql'))


.. code-block:: python

from ddtrace_graphql import traced_graphql
traced_graphql(schema, query, span_kwargs=dict(resource='bar.resource'))



span_callback
=============

In case you want to postprocess trace span you may use ``span_callback``
argument. ``span_callback`` must be function with signature ``def callback(result=result, span=span)``
where ``result`` is graphql execution result or ``None`` in case of fatal error and span is trace span object
(`ddtrace.span.Span <https://github.com/DataDog/dd-trace-py/blob/master/ddtrace/span.py>`_).

What is it good for? Unfortunately one cannot filter/alarm on span metrics resp.
meta information even if those are numeric (why Datadog?) so you can use it to
send metrics based on span, result attributes.

.. code-block:: python

from datadog import statsd
from ddtrace_graphql import patch, CLIENT_ERROR, INVALID

def callback(result, span):
tags = ['resource:{}'.format(span.resource.replace(' ', '_'))]
statsd.increment('{}.request'.format(span.service), tags=tags)
if span.error:
statsd.increment('{}.error'.format(span.service), tags=tags)
elif span.get_metric(CLIENT_ERROR):
statsd.increment('{}.{}'.format(span.service, CLIENT_ERROR), tags=tags)
if span.get_metric(INVALID):
statsd.increment('{}.{}'.format(span.service, INVALID), tags=tags)

patch(span_callback=callback)


ignore_exceptions
=================

Some frameworks use exceptions to handle 404s etc. you may want to ignore some
exceptions resp. not consider them server error. To do this you can supply
`ignore_exceptions` argument as list of exception classes to ignore.
`ignore_exceptions` will be used in python's `isinstance` thus you can ignore
also using base classes.


.. code-block:: python

from ddtrace_graphql import patch
patch(ignore_exceptions=(ObjectNotFound, PermissionsDenied))


.. code-block:: python

from ddtrace_graphql import traced_graphql
traced_graphql(
schema, query,
ignore_exceptions=(ObjectNotFound, PermissionsDenied))


Development
===========

Install from source in development mode
---------------------------------------

.. code-block:: bash

gitclonehttps://github.com/beezz/ddtracegraphql.git pip install --editable ddtrace-graphql[test]


Run tests
---------

.. code-block:: bash

cdddtracegraphql tox


Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page