cassandra_opentracing 0.0.8
OpenTracing support for Cassandra Driver
License: Apache License 2.0

[![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov]


# opentracing-python-cassandra

Instrumentation tools to enable tracing for [cassandra-driver](https://github.com/datastax/python-driver).

```
pip install cassandra_opentracing
```

## Usage


```python
# set up your tracer
cluster = Cluster()
session = cluster.connect('my_keyspace')
QueryTracing(self.session)
```

This will automatically trace all your queries (except for `BatchStatement`, see Known Issues). The default span operation name is `execute` for all queries. Operation name are meant to be low cardinality and there's a standard tag for the query statement: `db.statement`.


### Using fixed span name

```python
QueryTracing(self.session, span_name='execute')
```

All the spans will be sent to the tracer with the name `execute`. Note the query string will still be sent in the tag `db.statement`.

### Using a prefix

```python
QueryTracing(self.session, prefix='Custom')
```

All the spans will contain a prefix and it will looke like: "Custom: SELECT * FROM..."

### Using query string as span name

```python
# set up your tracer
cluster = Cluster()
session = cluster.connect('my_keyspace')
QueryTracing(self.session, use_querystring_as_name=True)
```

If you query contains parameters, the query will include the `%s` or `?`. The span will be the query string, e.g: `SELECT * FROM test_table WHERE name = %s`.

When passing `use_querystring_as_name`, you can still use `prefix` but any value passed in `span_name` will be ignored.

### Adding more span tags

All you have to is:

```python
cluster = Cluster()
session = cluster.connect('my_keyspace')
QueryTracing(self.session, span_tags={'custom_tag': 'value'})
```

All queries will contain the custom tags.

### Using a custom tracer

You may pass a `tracer` argument to QueryTracing. If you don't, the default `opentracing.tracer` will be used.

## Tags

All traces will contain the following tags:

### OpenTracing standard tags:

- `db.type`: cassandra
- `component`: `cassandra-driver`
- `db.instance`: The execution keyspace except when the keyspace is overriden on the query string (see Known Issues).
- `db.statement`: The query string itself.
- `consistency_level`: If the query specified a consistency level, this tag will be present.
- `error`: In case of error, this will be set to True and a log will be issued with the error message.

### Tags added by this library

- `command`: This indicates the CQL operation, e.g: `SELECT`, `UPDATE`, `CREATE KEYSPACE`, etc.
- `paginated`: If the query is pagined, this will be set to True.
- `reported_duration`: The time taken to execute the query. Note that this time takes into account the network roundtrip as well.

## Known Issues

- BatchStatement are yet unsupported as there is no simple way to get the executed query strings.
- Queries that override the keyspace (`SELECT * FROM keyspace.table`) won't have the overriden keyspace sent to the tracer.

[ci-img]: https://travis-ci.org/opentracing-contrib/python-cassandra.svg?branch=master
[ci]: https://travis-ci.org/opentracing-contrib/python-cassandra
[cov-img]: https://codecov.io/gh/nicholasamorim/opentracing-python-cassandra/branch/master/graph/badge.svg
[cov]: https://codecov.io/gh/nicholasamorim/opentracing-python-cassandra