Beispiel #1
0
def test_eventbridge_trigger(tracer_and_invocation_support, handler,
                             mock_eventbridge_event, mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    assert lambda_event_utils.get_lambda_event_type(
        mock_eventbridge_event,
        mock_context) == lambda_event_utils.LambdaEventType.EventBridge
    handler(mock_eventbridge_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['MESSAGING']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['EVENTBRIDGE']
    assert span.get_tag(constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
        'EC2 Command Status-change Notification'
    ]

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['MESSAGING']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['EVENTBRIDGE']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
            'EC2 Command Status-change Notification'
        ]

    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == ["51c0891d-0e34-45b1-83d6-95db273d1602"]
Beispiel #2
0
def test_s3_trigger(tracer_and_invocation_support, handler, mock_s3_event,
                    mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    assert lambda_event_utils.get_lambda_event_type(
        mock_s3_event, mock_context) == lambda_event_utils.LambdaEventType.S3
    handler(mock_s3_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['STORAGE']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == constants.ClassNames['S3']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['example-bucket']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['STORAGE']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == constants.ClassNames['S3']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['example-bucket']

    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == ["EXAMPLE123456789"]
Beispiel #3
0
def test_lambda_trigger(tracer_and_invocation_support, handler, mock_event,
                        mock_lambda_context):
    thundra, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    assert lambda_event_utils.get_lambda_event_type(
        mock_event,
        mock_lambda_context) == lambda_event_utils.LambdaEventType.Lambda
    handler(mock_event, mock_lambda_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['API']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['LAMBDA']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['Sample Context']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['API']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['LAMBDA']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['Sample Context']

    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == ["aws_request_id"]
Beispiel #4
0
def test_cloudwatch_schedule_trigger(tracer_and_invocation_support, handler,
                                     mock_cloudwatch_schedule_event,
                                     mock_context):
    _, handler = handler
    tracer, invocation_support, _ = tracer_and_invocation_support
    handler(mock_cloudwatch_schedule_event, mock_context)

    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]
    event_type = lambda_event_utils.get_lambda_event_type(
        mock_cloudwatch_schedule_event, mock_context)
    assert event_type == lambda_event_utils.LambdaEventType.CloudWatchSchedule

    assert span.get_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'Schedule'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudWatch-Schedule'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['ExampleRule']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'Schedule'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudWatch-Schedule'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['ExampleRule']
Beispiel #5
0
def test_apigateway_trigger(tracer_and_invocation_support, handler,
                            mock_apigateway_event, mock_context):
    _, handler = handler
    tracer, invocation_support, _ = tracer_and_invocation_support
    handler(mock_apigateway_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_apigateway_event,
        mock_context) == lambda_event_utils.LambdaEventType.APIGateway

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'API'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-APIGateway'
    assert span.get_tag(constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
        'random.execute-api.us-west-2.amazonaws.com/dev{}'
    ]

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'API'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-APIGateway'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
            'random.execute-api.us-west-2.amazonaws.com/dev{}'
        ]
Beispiel #6
0
def test_firehose_trigger(tracer_and_invocation_support, handler,
                          mock_firehose_event, mock_context):
    thundra, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    assert lambda_event_utils.get_lambda_event_type(
        mock_firehose_event,
        mock_context) == lambda_event_utils.LambdaEventType.Firehose
    handler(mock_firehose_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['STREAM']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['FIREHOSE']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['exampleStream']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['STREAM']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['FIREHOSE']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['exampleStream']

    links = [
        "eu-west-2:exampleStream:1495072948:75c5afa1146857f64e92e6bb6e561ded",
        "eu-west-2:exampleStream:1495072949:75c5afa1146857f64e92e6bb6e561ded",
        "eu-west-2:exampleStream:1495072950:75c5afa1146857f64e92e6bb6e561ded",
    ]
    assert sorted(invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks')) == sorted(links)
Beispiel #7
0
def test_cloudwatch_logs_trigger(tracer_and_invocation_support, handler,
                                 mock_cloudwatch_logs_event, mock_context):
    _, handler = handler
    tracer, invocation_support, _ = tracer_and_invocation_support
    handler(mock_cloudwatch_logs_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_cloudwatch_logs_event,
        mock_context) == lambda_event_utils.LambdaEventType.CloudWatchLogs

    compressed_data = base64.b64decode(
        mock_cloudwatch_logs_event['awslogs']['data'])
    decompressed_data = json.loads(
        str(GzipFile(fileobj=BytesIO(compressed_data)).read(), 'utf-8'))

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'Log'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudWatch-Log'
    assert span.get_tag(constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
        decompressed_data['logGroup']
    ]

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'Log'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudWatch-Log'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
            decompressed_data['logGroup']
        ]
Beispiel #8
0
def test_kinesis_trigger(tracer_and_invocation_support, handler,
                         mock_kinesis_event, mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support

    handler(mock_kinesis_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_kinesis_event,
        mock_context) == lambda_event_utils.LambdaEventType.Kinesis

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['STREAM']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['KINESIS']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['example_stream']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['STREAM']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['KINESIS']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['example_stream']

    links = [
        "eu-west-2:example_stream:shardId-000000000000:49545115243490985018280067714973144582180062593244200961"
    ]
    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == links
Beispiel #9
0
def test_sns_trigger(tracer_and_invocation_support, handler, mock_sns_event,
                     mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    handler(mock_sns_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]
    assert lambda_event_utils.get_lambda_event_type(
        mock_sns_event, mock_context) == lambda_event_utils.LambdaEventType.SNS

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['MESSAGING']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['SNS']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['ExampleTopic']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['MESSAGING']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['SNS']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['ExampleTopic']

    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == ["95df01b4-ee98-5cb9-9903-4c221d41eb5e"]
Beispiel #10
0
def test_sqs_trigger(tracer_and_invocation_support, handler, mock_sqs_event,
                     mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support

    handler(mock_sqs_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_sqs_event, mock_context) == lambda_event_utils.LambdaEventType.SQS

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['MESSAGING']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['SQS']
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['MyQueue']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['MESSAGING']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['SQS']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['MyQueue']

    assert invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks') == ["19dd0b57-b21e-4ac1-bd88-01bbb068cb78"]
Beispiel #11
0
def inject_trigger_tags(span, original_event, original_context):
    try:
        lambda_event_utils.extract_trace_link_from_event(original_event)
        lambda_event_type = lambda_event_utils.get_lambda_event_type(original_event, original_context)

        if lambda_event_type == lambda_event_utils.LambdaEventType.Kinesis:
            lambda_event_utils.inject_trigger_tags_for_kinesis(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.Firehose:
            lambda_event_utils.inject_trigger_tags_for_firehose(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.DynamoDB:
            lambda_event_utils.inject_trigger_tags_for_dynamodb(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.SNS:
            lambda_event_utils.inject_trigger_tags_for_sns(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.SQS:
            lambda_event_utils.inject_trigger_tags_for_sqs(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.S3:
            lambda_event_utils.inject_trigger_tags_for_s3(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.CloudWatchSchedule:
            lambda_event_utils.inject_trigger_tags_for_cloudwatch_schedule(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.CloudWatchLogs:
            lambda_event_utils.inject_trigger_tags_for_cloudwatch_logs(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.CloudFront:
            lambda_event_utils.inject_trigger_tags_for_cloudfront(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.APIGatewayProxy:
            lambda_event_utils.inject_trigger_tags_for_api_gateway_proxy(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.APIGateway:
            lambda_event_utils.inject_trigger_tags_for_api_gateway(span, original_event)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.Lambda:
            lambda_event_utils.inject_trigger_tags_for_lambda(span, original_context)
        elif lambda_event_type == lambda_event_utils.LambdaEventType.EventBridge:
            lambda_event_utils.inject_trigger_tags_for_eventbridge(span, original_event)
    except Exception as e:
        debug_logger("Cannot inject trigger tags. " + str(e))
Beispiel #12
0
def test_dynamodb_trigger(tracer_and_invocation_support, handler,
                          mock_dynamodb_event, mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    handler(mock_dynamodb_event, mock_context)

    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]
    assert lambda_event_utils.get_lambda_event_type(
        mock_dynamodb_event,
        mock_context) == lambda_event_utils.LambdaEventType.DynamoDB

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['DB']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['DYNAMODB']
    assert span.get_tag(constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
        'ExampleTableWithStream'
    ]

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['DB']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['DYNAMODB']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
            'ExampleTableWithStream'
        ]

    md5_key = hashlib.md5("Id={N: 101}".encode()).hexdigest()
    md5_image_1 = hashlib.md5(
        "Id={N: 101}, Message={S: New item!}".encode()).hexdigest()
    md5_image_2 = hashlib.md5(
        "Id={N: 101}, Message={S: This item has changed}".encode()).hexdigest(
        )
    region = 'eu-west-2'
    table_name = 'ExampleTableWithStream'
    timestamp = 1480642019

    links = [
        region + ':' + table_name + ':' + str(timestamp) + ':' + 'SAVE' + ':' +
        md5_key, region + ':' + table_name + ':' + str(timestamp + 1) + ':' +
        'SAVE' + ':' + md5_key, region + ':' + table_name + ':' +
        str(timestamp + 2) + ':' + 'SAVE' + ':' + md5_key, region + ':' +
        table_name + ':' + str(timestamp) + ':' + 'SAVE' + ':' + md5_image_1,
        region + ':' + table_name + ':' + str(timestamp + 1) + ':' + 'SAVE' +
        ':' + md5_image_1, region + ':' + table_name + ':' +
        str(timestamp + 2) + ':' + 'SAVE' + ':' + md5_image_1, region + ':' +
        table_name + ':' + str(timestamp) + ':' + 'SAVE' + ':' + md5_image_2,
        region + ':' + table_name + ':' + str(timestamp + 1) + ':' + 'SAVE' +
        ':' + md5_image_2, region + ':' + table_name + ':' +
        str(timestamp + 2) + ':' + 'SAVE' + ':' + md5_image_2
    ]

    assert sorted(invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks')) == sorted(links)
Beispiel #13
0
def test_dynamodb_trigger_trace_injected(tracer_and_invocation_support,
                                         handler,
                                         mock_dynamodb_event_trace_injected,
                                         mock_context):
    _, handler = handler
    tracer, invocation_support, invocation_trace_support = tracer_and_invocation_support
    handler(mock_dynamodb_event_trace_injected, mock_context)

    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_dynamodb_event_trace_injected,
        mock_context) == lambda_event_utils.LambdaEventType.DynamoDB

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']
                        ) == constants.DomainNames['DB']
    assert span.get_tag(constants.SpanTags['TRIGGER_CLASS_NAME']
                        ) == constants.ClassNames['DYNAMODB']
    assert span.get_tag(constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
        'ExampleTableWithStream'
    ]

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']
    ) == constants.DomainNames['DB']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']
    ) == constants.ClassNames['DYNAMODB']
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == [
            'ExampleTableWithStream'
        ]

    assert sorted(invocation_trace_support.get_incoming_trace_links().get(
        'incomingTraceLinks')) == sorted(
            ['SAVE:test_id1', 'SAVE:test_id2', 'DELETE:test_id3'])
Beispiel #14
0
def test_cloudfront_event_trigger(tracer_and_invocation_support, handler,
                                  mock_cloudfront_event, mock_context):
    _, handler = handler
    tracer, invocation_support, _ = tracer_and_invocation_support
    handler(mock_cloudfront_event, mock_context)
    execution_context = ExecutionContextManager.get()
    span = execution_context.recorder.get_spans()[0]

    assert lambda_event_utils.get_lambda_event_type(
        mock_cloudfront_event,
        mock_context) == lambda_event_utils.LambdaEventType.CloudFront

    assert span.get_tag(constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'CDN'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudFront'
    assert span.get_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['/test']

    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_DOMAIN_NAME']) == 'CDN'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_CLASS_NAME']) == 'AWS-CloudFront'
    assert invocation_support.get_agent_tag(
        constants.SpanTags['TRIGGER_OPERATION_NAMES']) == ['/test']