Example #1
0
def test_trace_requests_span_extractor(monkeypatch):
    resp = Response()
    resp.status_code = 200
    resp.url = "http://example.com/"

    recorder = Recorder()
    t = BasicTracer(recorder=recorder)
    t.register_required_propagators()
    opentracing.tracer = t

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    def span_extractor(*args, **kwargs):
        return top_span

    trace_requests(span_extractor=span_extractor)

    monkeypatch.setattr(
        'opentracing_utils.libs._requests.__requests_http_send',
        assert_send_request_mock(resp))
    # disable getting the span from stack
    monkeypatch.setattr('opentracing_utils.span.inspect_span_from_stack',
                        lambda: None)

    response = requests.get("http://example.com/")

    top_span.finish()

    assert len(recorder.spans) == 2
    assert recorder.spans[0].context.trace_id == top_span.context.trace_id
    assert recorder.spans[0].parent_id == recorder.spans[1].context.span_id
    assert recorder.spans[0].operation_name == 'http_send_get'
    assert recorder.spans[-1].operation_name == 'top_span'
    assert response.status_code == resp.status_code
Example #2
0
def test_trace_requests_no_error_tag(monkeypatch):
    resp = Response()
    resp.status_code = 400
    resp.url = URL

    trace_requests(set_error_tag=False)

    monkeypatch.setattr('opentracing_utils.libs._requests.__requests_http_send', assert_send_request_mock(resp))

    recorder = Recorder()
    t = BasicTracer(recorder=recorder)
    t.register_required_propagators()
    opentracing.tracer = t

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        response = requests.get(URL, headers={CUSTOM_HEADER: CUSTOM_HEADER_VALUE})

    assert len(recorder.spans) == 2

    assert recorder.spans[0].context.trace_id == top_span.context.trace_id
    assert recorder.spans[0].parent_id == recorder.spans[-1].context.span_id

    assert response.status_code == resp.status_code
    assert recorder.spans[0].tags[tags.HTTP_STATUS_CODE] == resp.status_code
    assert recorder.spans[0].tags[tags.HTTP_URL] == URL
    assert recorder.spans[0].tags[tags.HTTP_METHOD] == 'GET'
    assert recorder.spans[0].tags[tags.SPAN_KIND] == tags.SPAN_KIND_RPC_CLIENT
    assert recorder.spans[0].tags[tags.PEER_HOSTNAME] == 'example.com'
    assert recorder.spans[0].tags['timeout'] is None
    assert recorder.spans[0].tags[tags.COMPONENT] == 'requests'
    assert recorder.spans[0].operation_name == '{}_get'.format(OPERATION_NAME_PREFIX)
    assert 'error' not in recorder.spans[0].tags
Example #3
0
def test_trace_requests_with_ignore_url_pattern_prune_kwargs(monkeypatch):
    """ In case there is a parent span already, the ignore url pattern must
    still be respected """
    resp = Response()
    resp.status_code = 200
    resp.url = URL

    trace_requests(ignore_url_patterns=[r".*{}.*".format(URL)])

    monkeypatch.setattr('opentracing_utils.libs._requests.__requests_http_send',
                        assert_send_request_mock_no_traces(resp))

    @trace()
    def f1():
        pass

    recorder = Recorder()
    t = BasicTracer(recorder=recorder)
    t.register_required_propagators()
    opentracing.tracer = t

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        response = requests.get(URL, headers={CUSTOM_HEADER: CUSTOM_HEADER_VALUE})
        f1()

    # Top span, and  @trace for f1() create spans. With the ignore pattern
    # in place, the call to requests.get should not add a span
    assert len(recorder.spans) == 2

    assert recorder.spans[0].context.trace_id == top_span.context.trace_id
    assert recorder.spans[0].operation_name == 'f1'
    assert recorder.spans[1].operation_name == 'top_span'
    assert response.status_code == resp.status_code
Example #4
0
def test_trace_requests_do_not_ignore_if_no_match(monkeypatch):
    resp = Response()
    resp.status_code = 200
    resp.url = URL

    trace_requests(ignore_url_patterns=[r".*{}.*".format(URL)])

    monkeypatch.setattr('opentracing_utils.libs._requests.__requests_http_send', assert_send_request_mock(resp))

    response = requests.get("http://I-do-not-match.com", headers={CUSTOM_HEADER: CUSTOM_HEADER_VALUE})
    assert response.status_code == resp.status_code
Example #5
0
def test_trace_requests_with_tags(monkeypatch):
    resp = Response()
    resp.status_code = 200
    resp.url = URL

    trace_requests(default_tags={'tag1': 'value1'})

    monkeypatch.setattr('opentracing_utils.libs._requests.__requests_http_send', assert_send_request_mock(resp))

    @trace()
    def f1():
        pass

    recorder = Recorder()
    t = BasicTracer(recorder=recorder)
    t.register_required_propagators()
    opentracing.tracer = t

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        response = requests.get(URL, headers={CUSTOM_HEADER: CUSTOM_HEADER_VALUE})

        f1()

    assert len(recorder.spans) == 3

    assert recorder.spans[0].context.trace_id == top_span.context.trace_id
    assert recorder.spans[0].parent_id == recorder.spans[-1].context.span_id

    assert recorder.spans[-1].operation_name == 'top_span'
    # ``requests`` default tags do not leak to other unrelated spans!
    assert recorder.spans[1].tags == {}
    assert recorder.spans[1].operation_name == 'f1'

    assert response.status_code == resp.status_code
    assert recorder.spans[0].tags[tags.HTTP_STATUS_CODE] == resp.status_code
    assert recorder.spans[0].tags[tags.HTTP_URL] == URL
    assert recorder.spans[0].tags[tags.HTTP_METHOD] == 'GET'
    assert recorder.spans[0].tags[tags.SPAN_KIND] == tags.SPAN_KIND_RPC_CLIENT
    assert recorder.spans[0].tags[tags.PEER_HOSTNAME] == 'example.com'
    assert recorder.spans[0].tags['timeout'] is None
    assert recorder.spans[0].tags[tags.COMPONENT] == 'requests'
    assert recorder.spans[0].operation_name == '{}_get'.format(OPERATION_NAME_PREFIX)
    assert recorder.spans[0].tags['tag1'] == 'value1'
Example #6
0
def test_trace_requests_with_use_scope_manager(monkeypatch):
    resp = Response()
    resp.status_code = 200
    resp.url = URL

    recorder = Recorder()
    t = BasicTracer(recorder=recorder)
    t.register_required_propagators()
    opentracing.tracer = t

    trace_requests(use_scope_manager=True)

    monkeypatch.setattr(
        'opentracing_utils.libs._requests.__requests_http_send',
        assert_send_request_mock_scope_active(resp)
    )

    response = requests.get(URL, headers={CUSTOM_HEADER: CUSTOM_HEADER_VALUE})
    assert response.status_code == resp.status_code

    assert len(recorder.spans) == 1
Example #7
0
from opentracing_utils import trace_requests
trace_requests()  # noqa

import os
import sys
import time
import argparse
import logging
import json
import traceback

import requests
import tokens
import opentracing

from zmon_cli.client import Zmon, compare_entities

from opentracing_utils import init_opentracing_tracer, trace, extract_span_from_kwargs

# TODO: Load dynamically
from zmon_agent.discovery.kubernetes import get_discovery_agent_class

BUILTIN_DISCOVERY = ('kubernetes', )

AGENT_TYPE = 'zmon-agent'

logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s')
logger = logging.getLogger(__name__)
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
logger.setLevel(logging.INFO)
class GbcMachineLearningService(Resource):
    from api import api

    logger = loggerElk(__name__, True)
    nlp = None

    machineLearningService = api.model('MachineLearningService', {
        'source': fields.String(required=True, description='Source of the data (PLAINTEXT | FILE | IMAGE | S3)'),
        'data': fields.String(required=True, description='Repo resource identifier (url)'),
        'domain': fields.String(required=True, description='Repo resource identifier (domain name)'),
        'model': fields.String(required=True, description='Source of classifier '
                                                          '(BAGGING | BOOSTING_ADA | BOOSTING_SGD '
                                                          '| DECISION_TREE | EXTRA_TREES | NAIVE_BAYES_MULTI '
                                                          '| NAIVE_BAYES_COMPLEMENT | RANDOM_FOREST | VOTING '
                                                          '| CNN_NETWORK)'),
        'lang': fields.String(required=True, description='Language (es, en)'),
    })

    def __init__(self, *args, **kwargs):
        # start - JAEGER
        config = Config(config={'sampler': {'type': 'const', 'param': 1},
                                'logging': True
                                },
                        service_name=__name__)
        config.initialize_tracer()
        super().__init__(*args, **kwargs)

    trace_requests()  # noqa

    # end - JAEGER
    @api.doc(
        description='Machine Learning Service',
        responses={
            200: 'OK',
            400: 'Invalid Argument',
            500: 'Internal Error'})
    @api.expect(machineLearningService)
    def post(self):
        root_span = None
        try:
            self.logger.Information('GbcMachineLearningService::POST - init')
            # start - JAEGER
            root_span = opentracing.tracer.start_span(operation_name=inspect.currentframe().f_code.co_name)
            # end - JAEGER

            request_payload = request.get_json()
            # self.logger.LogInput('GbcMachineLearningService::POST: ', request_payload)

            source = request_payload['source']
            data = request_payload['data']
            domain = request_payload['domain']
            model = request_payload['model']
            lang = request_payload['lang']

            if source == 'PLAINTEXT':
                response = 'PLAINTEXT'
            elif source == 'FILE':
                response = 'FILE'
            elif source == 'IMAGE':
                response = 'IMAGE'
            elif source == 'S3':
                s3 = self.getS3Session()
                return {'result': 'not implemented'}
            else:
                response = ''
                raise Exception('No valid source provided')

            res = {
                'result': 'ok',
                'response': response
            }

            return jsonify(res)

        except Exception as e:
            self.logger.Error('ERROR - GbcMachineLearningService::POST' + str(e.args), sys.exc_info())
            return {'message': 'Something went wrong: ' + str(e)}, 500

        finally:
            root_span.finish()

    class Student(object):
        def __init__(self, first_name: str, last_name: str):
            self.first_name = first_name
            self.last_name = last_name

    @classmethod
    def getS3Session(cls):
        session = boto3.Session(
            aws_access_key_id=os.environ['ENV_ACCESS_KEY_ID'],
            aws_secret_access_key=os.environ['ENV_SECRET_ACCESS_KEY']
        )
        s3 = session.client(u's3')
        return s3
Example #9
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse
import logging
import json

from opentracing_utils import init_opentracing_tracer, trace_requests, trace, extract_span_from_kwargs

from zmon_aws_agent import elastigroup

trace_requests()  # noqa
import opentracing

import requests
import tokens
import os
import traceback

from zmon_cli.client import Zmon, compare_entities

import zmon_aws_agent.aws as aws
import zmon_aws_agent.postgresql as postgresql

from zmon_aws_agent.common import get_user_agent


logging.getLogger('urllib3.connectionpool').setLevel(logging.WARN)
logging.getLogger('requests.packages.urllib3.connectionpool').setLevel(logging.WARN)
logging.getLogger('botocore.vendored.requests.packages').setLevel(logging.WARN)