Beispiel #1
0
def test_if_thundra_is_disabled(mock_reporter, handler, mock_event,
                                mock_context):
    ConfigProvider.set(config_names.THUNDRA_TRACE_DISABLE, 'true')
    _, handler = handler

    handler(mock_event, mock_context)

    assert not mock_reporter.add_report.called
    assert not mock_reporter.send_reports.called
Beispiel #2
0
def thundra_with_request_response_skip(monkeypatch):
    monkeypatch.setitem(os.environ, constants.AWS_REGION, 'region')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_ID, '[]test')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_VERSION, 'version')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')
    ConfigProvider.set(config_names.THUNDRA_TRACE_REQUEST_SKIP, 'true')
    ConfigProvider.set(config_names.THUNDRA_TRACE_RESPONSE_SKIP, 'true')
    thundra = Thundra('api key', disable_metric=True)
    return thundra
Beispiel #3
0
def test_if_enable_trace_plugin_from_environment_variable_is_prior():
    ConfigProvider.set(config_names.THUNDRA_TRACE_DISABLE, 'false')
    thundra = Thundra('api key', disable_trace=True)

    trace_exist = False
    for plugin in thundra.plugins:
        if isinstance(plugin, TracePlugin):
            trace_exist = True

    assert trace_exist is True
Beispiel #4
0
def test_invocation_support_error_set(handler_with_user_error, mock_context, mock_event):
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')
    thundra, handler = handler_with_user_error

    handler(mock_event, mock_context)
    execution_context = ExecutionContextManager.get()

    assert execution_context.invocation_data['erroneous'] is True
    assert execution_context.invocation_data['errorType'] == 'Exception'
    assert execution_context.invocation_data['errorMessage'] == 'test'
Beispiel #5
0
def test_prepare_report_json_batch(mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '1')

    reporter = Reporter('api key')

    batched_reports = reporter.prepare_report_json([mock_report] * 2)
    assert len(batched_reports) == 2

    reports = json.loads(batched_reports[0])
    assert len(reports) == 1
Beispiel #6
0
    def test_mongo_command_masked():
        ConfigProvider.set(
            config_names.THUNDRA_TRACE_INTEGRATIONS_MONGODB_COMMAND_MASK,
            'true')
        client = MongoClient('localhost', 27017)
        db = client.test
        db.list_collection_names()

        tracer = ThundraTracer.get_instance()
        span = tracer.get_spans()[1]
        assert span.get_tag(constants.MongoDBTags['MONGODB_COMMAND']) is None
Beispiel #7
0
def test_send_report_to_url_async(mock_requests, mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_CLOUDWATCH_ENABLE, 'true')

    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)

    responses = reporter.send_reports([mock_report])

    reporter.session.post.assert_not_called()
    assert responses == []
Beispiel #8
0
def test_create_empty_span_listener(empty_span_listener):
    sl_env_var = to_json(empty_span_listener)
    ConfigProvider.set(config_names.THUNDRA_TRACE_SPAN_LISTENERCONFIG,
                       sl_env_var)

    trace_support._parse_span_listeners()

    sl = trace_support.get_span_listeners()[0]

    assert type(sl) is FilteringSpanListener
    assert type(sl.listener) is ErrorInjectorSpanListener
    assert type(sl.filterer) is StandardSpanFilterer
Beispiel #9
0
def test_if_error_is_added_to_report(handler_with_exception, mock_context, mock_event):
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')
    thundra, handler = handler_with_exception

    try:
        handler(mock_event, mock_context)
    except Exception:
        pass

    execution_context = ExecutionContextManager.get()
    assert execution_context.invocation_data['erroneous'] is True
    assert execution_context.invocation_data['errorType'] == 'Exception'
    assert execution_context.invocation_data['errorMessage'] == 'hello'
Beispiel #10
0
def test_coldstarts(handler, mock_context, mock_event):
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')

    thundra, handler = handler
    handler(mock_event, mock_context)
    execution_context = ExecutionContextManager.get()
    assert execution_context.invocation_data['coldStart'] is True
    assert execution_context.invocation_data['tags']['aws.lambda.invocation.coldstart'] is True

    handler(mock_event, mock_context)
    execution_context = ExecutionContextManager.get()
    assert execution_context.invocation_data['coldStart'] is False
    assert execution_context.invocation_data['tags']['aws.lambda.invocation.coldstart'] is False
Beispiel #11
0
def test_mask_body():
    ConfigProvider.set(
        config_names.THUNDRA_TRACE_INTEGRATIONS_ELASTICSEARCH_BODY_MASK,
        'true')
    try:
        es = Elasticsearch([{'host': 'test', 'port': 3737}], max_retries=0)
        author1 = {"name": "Sidney Sheldon", "novels_count": 18}
        es.index(index='authors', doc_type='authors', body=author1, id=1)
    except ElasticsearchException:
        pass
    finally:
        tracer = ThundraTracer.get_instance()
        span = tracer.get_spans()[1]

        assert span.get_tag(constants.ESTags['ES_BODY']) is None
Beispiel #12
0
def test_prepare_composite_report_json(mock_report, mock_invocation_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '2')
    reporter = Reporter('api key')
    batched_reports = reporter.prepare_composite_report_json([mock_invocation_report, mock_report, mock_report])
    composite_report = json.loads(batched_reports[0])

    assert composite_report["type"] == "Composite"
    assert composite_report["apiKey"] == "api key"
    assert len(composite_report["data"]["allMonitoringData"]) == 2

    composite_report = json.loads(batched_reports[1])

    assert composite_report["type"] == "Composite"
    assert composite_report["apiKey"] == "api key"
    assert len(composite_report["data"]["allMonitoringData"]) == 1
Beispiel #13
0
def test_create_span_listener_with_only_listener(
        span_listener_with_one_listener):
    sl_env_var = to_json(span_listener_with_one_listener)
    ConfigProvider.set(config_names.THUNDRA_TRACE_SPAN_LISTENERCONFIG,
                       sl_env_var)

    trace_support._parse_span_listeners()

    sl = trace_support.get_span_listeners()[0]

    assert type(sl) is FilteringSpanListener
    assert type(sl.listener) is ErrorInjectorSpanListener
    assert sl.listener.error_type is NameError
    assert sl.listener.error_message == 'foo'
    assert type(sl.filterer) is StandardSpanFilterer
Beispiel #14
0
def test_create_span_listener_with_only_filterer(
        span_listener_with_one_filterer):
    sl_env_var = to_json(span_listener_with_one_filterer)
    ConfigProvider.set(config_names.THUNDRA_TRACE_SPAN_LISTENERCONFIG,
                       sl_env_var)

    trace_support._parse_span_listeners()

    sl = trace_support.get_span_listeners()[0]
    f = sl.filterer.span_filters[0]

    assert type(sl) is FilteringSpanListener
    assert sl.listener is None
    assert f.class_name == 'AWS-SQS'
    assert f.domain_name == 'Messaging'
    assert f.tags == {'foo': 'bar'}
Beispiel #15
0
def test_send_report_to_url(mock_requests, mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_ENABLE, 'false')
    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)
    responses = reporter.send_reports([mock_report])

    post_url = 'different_url/api/monitoring-data'
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'ApiKey api key'
    }

    reporter.session.post.assert_called_once_with(post_url, data=to_json([mock_report], separators=(',', ':')),
                                                  headers=headers, timeout=constants.DEFAULT_REPORT_TIMEOUT)
    reporter.session.post.return_value.status_code = 200
    for response in responses:
        assert response.status_code == 200
Beispiel #16
0
def test_create_span_listener_with_filterer_and_listener(
        span_listener_with_filterer_and_listener):
    sl_env_var = to_json(span_listener_with_filterer_and_listener)
    ConfigProvider.set(config_names.THUNDRA_TRACE_SPAN_LISTENERCONFIG,
                       sl_env_var)

    trace_support._parse_span_listeners()

    sl = trace_support.get_span_listeners()[0]
    f = sl.filterer.span_filters[0]

    assert type(sl) is FilteringSpanListener
    assert type(sl.listener) is ErrorInjectorSpanListener
    assert sl.listener.error_type is NameError
    assert sl.listener.error_message == 'foo'
    assert sl.listener.inject_on_finish
    assert sl.listener.inject_count_freq

    assert f.class_name == 'AWS-SQS'
    assert f.domain_name == 'Messaging'
    assert f.tags == {'foo': 'bar'}
Beispiel #17
0
def test_aws_related_tags(handler_with_profile, mock_context, mock_event, monkeypatch):
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')
    monkeypatch.setitem(os.environ, "_X_AMZN_TRACE_ID",
                        "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1")
    thundra, handler = handler_with_profile

    try:
        handler(mock_event, mock_context)
    except Exception:
        pass

    execution_context = ExecutionContextManager.get()
    assert execution_context.invocation_data['tags'][
               'aws.lambda.arn'] == 'arn:aws:lambda:us-west-2:123456789123:function:test'
    assert execution_context.invocation_data['tags']['aws.account_no'] == '123456789123'
    assert execution_context.invocation_data['tags']['aws.lambda.memory_limit'] == 128
    assert execution_context.invocation_data['tags']['aws.lambda.log_group_name'] == 'log_group_name'
    assert execution_context.invocation_data['tags']['aws.lambda.log_stream_name'] == 'log_stream_name[]id'
    assert execution_context.invocation_data['tags']['aws.lambda.invocation.request_id'] == 'aws_request_id'
    assert execution_context.invocation_data['tags']['aws.xray.trace.id'] == '1-5759e988-bd862e3fe1be46a994272793'
    assert execution_context.invocation_data['tags']['aws.xray.segment.id'] == '53995c3f42cd8ad8'
Beispiel #18
0
def test_get_mask_command():
    ConfigProvider.set(config_names.THUNDRA_TRACE_INTEGRATIONS_REDIS_COMMAND_MASK, 'true')

    try:
        r = redis.Redis(host="test", port="12345", password="******")
        r.get('foo')
    except:
        pass
    finally:
        tracer = ThundraTracer.get_instance()
        span = tracer.get_spans()[1]
        assert span.class_name == 'Redis'
        assert span.domain_name == 'Cache'
        assert span.operation_name == 'test'
        assert span.get_tag(constants.DBTags['DB_TYPE']) == 'redis'
        assert span.get_tag(constants.DBTags['DB_INSTANCE']) == 'test'
        assert span.get_tag(constants.DBTags['DB_STATEMENT_TYPE']) == 'READ'
        assert span.get_tag(constants.RedisTags['REDIS_HOST']) == 'test'
        assert span.get_tag(constants.RedisTags['REDIS_COMMAND_TYPE']) == 'GET'
        assert span.get_tag(constants.DBTags['DB_STATEMENT']) is None
        assert span.get_tag(constants.RedisTags['REDIS_COMMAND']) is None
        tracer.clear()
Beispiel #19
0
def thundra_with_profile(reporter, monkeypatch):
    monkeypatch.setitem(os.environ, constants.AWS_REGION, 'region')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_ID, '[]test')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_VERSION, 'version')
    ConfigProvider.set(config_names.THUNDRA_APPLICATION_STAGE, 'dev')

    thundra = Thundra('api key', disable_metric=True)
    thundra.reporter = reporter
    return thundra
Beispiel #20
0
def test_send_report_to_url_composite(mock_requests, mock_report, mock_invocation_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_ENABLE, 'true')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '1')

    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)

    responses = reporter.send_reports([mock_invocation_report, mock_report])
    assert reporter.session.post.call_count == 2

    reporter.session.post.return_value.status_code = 200
    for response in responses:
        assert response.status_code == 200
Beispiel #21
0
def test_if_api_key_is_retrieved_from_env_var():
    ConfigProvider.set(config_names.THUNDRA_APIKEY, 'api key')
    thundra = Thundra()
    assert thundra.api_key == 'api key'
Beispiel #22
0
 def test_retrieving_trace_args():
     ConfigProvider.set(config_names.THUNDRA_TRACE_INSTRUMENT_TRACEABLECONFIG, \
             "{}.{}*{}".format(target_module_name ,target_function_prefix, target_trace_arguments))
     patcher = ImportPatcher()
     for arg in patcher.get_trace_arguments(target_module_name):
         assert arg in target_trace_arguments_list
Beispiel #23
0
def test_freq_from_env():
    time_freq = 37
    ConfigProvider.set(config_names.THUNDRA_SAMPLER_TIMEAWARE_TIMEFREQ, '{}'.format(time_freq))
    tams = TimeAwareSampler()

    assert tams.time_freq == time_freq