def test_tracing(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False, prefix='Prod007')

        mock_perform_req.return_value = {'hits': []}

        main_span = DummySpan()
        set_active_span(main_span)
        enable_tracing()

        body = {"any": "data", "timestamp": datetime.datetime.now()}
        res = self.es.index(index='test-index', doc_type='tweet', id=1,
                            body=body, params={'refresh': True})
        self.assertEqual(mock_perform_req.return_value, res)
        self.assertEqual(1, len(self.tracer.spans))
        self.assertEqual(self.tracer.spans[0].operation_name, 'Prod007/test-index/tweet/1')
        self.assertEqual(self.tracer.spans[0].is_finished, True)
        self.assertEqual(self.tracer.spans[0].child_of, main_span)
        self.assertEqual(self.tracer.spans[0].tags, {
            'component': 'elasticsearch-py',
            'db.type': 'elasticsearch',
            'db.statement': body,
            'span.kind': 'client',
            'elasticsearch.url': '/test-index/tweet/1',
            'elasticsearch.method': 'PUT',
            'elasticsearch.params': {'refresh': True},
        })
    def test_trace_none(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        set_active_span(DummySpan())

        self.es.get(index='test-index', doc_type='tweet', id=3)
        self.assertEqual(0, len(self.tracer.spans))
    def test_trace_bool_payload(self, mock_perform_req):
        init_tracing(self.tracer)

        # Some operations, as creating an index, return a bool value.
        mock_perform_req.return_value = False

        mapping = "{'properties': {'body': {}}}"
        res = self.es.indices.create('test-index', body=mapping)
        self.assertFalse(res)
        self.assertEqual(1, len(self.tracer.spans))
        self.assertEqual(self.tracer.spans[0].is_finished, True)
    def test_disable_tracing(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        enable_tracing()
        disable_tracing()
        self.assertEqual(0, len(self.tracer.spans))

        self.es.get(index='test-index', doc_type='tweet', id=1)
        self.assertEqual(0, len(self.tracer.spans))

        disable_tracing() # shouldn't cause a problem
    def test_clear_span(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        enable_tracing()

        set_active_span(DummySpan())
        clear_active_span()

        self.es.get(index='test-index', doc_type='tweet', id=1)
        self.assertEqual(1, len(self.tracer.spans))
        self.assertEqual(None, self.tracer.spans[0].child_of)
    def test_trace_all_requests_span(self, mock_perform_req):
        init_tracing(self.tracer)

        main_span = DummySpan()
        set_active_span(main_span)

        for i in range(3):
            self.es.get(index='test-index', doc_type='tweet', id=i)

        self.assertEqual(3, len(self.tracer.spans))
        self.assertTrue(all(map(lambda x: x.is_finished, self.tracer.spans)))
        self.assertTrue(all(map(lambda x: x.child_of == main_span, self.tracer.spans)))
    def test_trace_result_tags(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        mock_perform_req.return_value = {
            'found': False,
            'timed_out': True,
            'took': 7
        }
        enable_tracing()
        self.es.get(index='test-index', doc_type='tweet', id=1)

        self.assertEqual(1, len(self.tracer.spans))
        self.assertTrue(all(map(lambda x: x.is_finished, self.tracer.spans)))
        self.assertEqual('False', self.tracer.spans[0].tags['elasticsearch.found'])
        self.assertEqual('True', self.tracer.spans[0].tags['elasticsearch.timed_out'])
        self.assertEqual('7', self.tracer.spans[0].tags['elasticsearch.took'])
    def test_trace_all_requests(self, mock_perform_req):
        init_tracing(self.tracer)

        for i in range(3):
            self.es.get(index='test-index', doc_type='tweet', id=i)

        self.assertEqual(3, len(self.tracer.spans))
        self.assertTrue(all(map(lambda x: x.is_finished, self.tracer.spans)))

        enable_tracing()
        disable_tracing() # Shouldnt prevent further tracing
        self.es.get(index='test-index', doc_type='tweet', id=4)

        self.assertEqual(4, len(self.tracer.spans))
        self.assertTrue(all(map(lambda x: x.is_finished, self.tracer.spans)))
        self.assertTrue(all(map(lambda x: x.child_of is None, self.tracer.spans)))
    def test_trace_after_error(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        enable_tracing()
        mock_perform_req.side_effect = RuntimeError()

        try:
            self.es.get(index='test-index', doc_type='tweet', id=1)
        except RuntimeError as exc:
            pass

        self.tracer.clear()

        # Should not cause any further tracing
        mock_perform_req.side_effect = None
        self.es.get(index='test-index', doc_type='tweet', id=1)
        self.assertEqual(0, len(self.tracer.spans))
예제 #10
0
    def test_disable_tracing_span(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        main_span = DummySpan()
        set_active_span(main_span)

        # Make sure the active span was preserved
        enable_tracing()
        disable_tracing()
        self.assertEqual(main_span, get_active_span())

        # Make sure it was preserved, by tracing.
        enable_tracing()

        self.es.get(index='test-index', doc_type='tweet', id=1)
        self.assertEqual(1, len(self.tracer.spans))
        self.assertEqual(main_span, self.tracer.spans[0].child_of)
예제 #11
0
    def test_trace_error(self, mock_perform_req):
        init_tracing(self.tracer, trace_all_requests=False)

        main_span = DummySpan()
        set_active_span(main_span)
        enable_tracing()
        mock_perform_req.side_effect = RuntimeError()

        try:
            self.es.get(index='test-index', doc_type='tweet', id=1)
        except RuntimeError as exc:
            catched_exc = exc

        self.assertEqual(1, len(self.tracer.spans))
        self.assertEqual(True, self.tracer.spans[0].is_finished)
        self.assertEqual(main_span, self.tracer.spans[0].child_of)
        self.assertEqual('true', self.tracer.spans[0].tags['error'])
        self.assertEqual(catched_exc, self.tracer.spans[0].tags['error.object'])
def instrument(tracer=None):
    """
    Elasticsearch auto-instrumentation works by hooking a __new__ proxy for a TracingTransport
    instance upon elasticsearch.transports.Transport initialization to trigger proper inheritance.
    """
    elasticsearch = utils.get_module('elasticsearch')
    if utils.is_instrumented(elasticsearch):
        return

    from elasticsearch_opentracing import init_tracing, TracingTransport

    _tracer = tracer or config.tracer or opentracing.tracer
    init_tracing(_tracer, trace_all_requests=True, prefix=config.prefix)

    _transport_new[0] = elasticsearch.transport.Transport.__new__
    _tracing_transport_new[0] = TracingTransport.__new__

    TracingTransport.__new__ = tracing_transport_new.__get__(TracingTransport)
    elasticsearch.transport.Transport.__new__ = transport_new.__get__(
        elasticsearch.transport.Transport)

    utils.mark_instrumented(elasticsearch)
예제 #13
0
    def test_multithreading(self, mock_perform_req):
        init_tracing(self.tracer)
        ev = threading.Event()

        # 1. Start tracing from thread-1; make thread-2 wait
        # 2. Trace something from thread-2, make thread-1 before finishing.
        # 3. Check the spans got different parents, and are in the expected order.
        def target1():
            set_active_span(DummySpan())
            enable_tracing()
            self.es.get(index='test-index', doc_type='tweet', id=1)

            ev.set()
            ev.wait()

            disable_tracing()

        def target2():
            ev.wait()

            enable_tracing()
            self.es.get(index='test-index', doc_type='tweet', id=2)

            ev.set()
            disable_tracing()

        t1 = threading.Thread(target=target1)
        t2 = threading.Thread(target=target2)
        
        t1.start()
        t2.start()

        t1.join()
        t2.join()

        self.assertEqual(2, len(self.tracer.spans))
        self.assertTrue(all(map(lambda x: x.is_finished, self.tracer.spans)))
        self.assertEqual([False, True], map(lambda x: x.child_of is None, self.tracer.spans))
#!/usr/bin/env python3

# https://github.com/opentracing-contrib/python-elasticsearch

import elasticsearch_opentracing

elasticsearch_opentracing.init_tracing(
    tracer)  # An OpenTracing compatible tracer.
es = Elasticsearch(transport_class=elasticsearch_opentracing.TracingTransport)

elasticsearch_opentracing.set_active_span(main_span)  # Optional.

es.index(index='test-index',
         doc_type='tweet',
         id=99,
         body={
             'author': 'linus',
             'text': 'Hello there',
             'timestamp': datetime.now(),
         })
res = es.get(index='test-index', doc_type='tweet', id=99)

elasticsearch_opentracing.clear_active_span()
예제 #15
0
    def test_init_trace_prefix(self):
        init_tracing(DummyTracer(), prefix='Prod007')
        self.assertEqual('Prod007', elasticsearch_opentracing.g_trace_prefix)

        init_tracing(DummyTracer(), prefix='')
        self.assertEqual('', elasticsearch_opentracing.g_trace_prefix)
예제 #16
0
 def test_init(self):
     tracer = DummyTracer()
     init_tracing(tracer)
     self.assertEqual(tracer, elasticsearch_opentracing.g_tracer)
     self.assertEqual(True, elasticsearch_opentracing.g_trace_all_requests)
     self.assertEqual('Elasticsearch', elasticsearch_opentracing.g_trace_prefix)
예제 #17
0
tracer = lightstep.Tracer(component_name='elasticsearch-map',
                          access_token='{your_lightstep_token}')


class Article(DocType):
    title = Text(analyzer='snowball', fields={'raw': Keyword()})
    body = Text(analyzer='snowball')
    tags = Keyword()
    published_from = Date()

    class Meta:
        index = 'test-index'


if __name__ == '__main__':
    elasticsearch_opentracing.init_tracing(tracer)

    connections.create_connection(
        hosts=['127.0.0.1'],
        transport_class=elasticsearch_opentracing.TracingTransport)

    Article.init()

    # Have a master span only for the ingestion/get.
    with tracer.start_span('main span') as span:
        elasticsearch_opentracing.set_active_span(span)

        article = Article(meta={'id': 7},
                          title='About searching',
                          body='A few words here, a few words there',
                          tags=['elastic', 'search'],
예제 #18
0
from datetime import datetime
from elasticsearch import Elasticsearch

import lightstep
import elasticsearch_opentracing

tracer = lightstep.Tracer(component_name='elasticsearch-explicit',
                          access_token='{your_lightstep_token}')

if __name__ == '__main__':
    elasticsearch_opentracing.init_tracing(tracer, trace_all_requests=False)

    es = Elasticsearch(
        '127.0.0.1',
        transport_class=elasticsearch_opentracing.TracingTransport)

    # We want to trace only the creation of the document, not the
    # index creation not checking the document was actually created.

    with tracer.start_span('main span') as main_span:
        elasticsearch_opentracing.set_active_span(main_span)

        es.indices.create('test-index', ignore=400)

        doc = {
            'author': 'john',
            'text': 'Find me if you can',
            'timestamp': datetime.now(),
        }

        elasticsearch_opentracing.enable_tracing()
예제 #19
0
    def test_init_trace_all_requests(self):
        init_tracing(DummyTracer(), trace_all_requests=False)
        self.assertEqual(False, elasticsearch_opentracing.g_trace_all_requests)

        init_tracing(DummyTracer(), trace_all_requests=True)
        self.assertEqual(True, elasticsearch_opentracing.g_trace_all_requests)