def test_only_one_wrapper_in_use(self):
        patcher = patch("datadog_lambda.wrapper.submit_invocations_metric")
        self.mock_submit_invocations_metric = patcher.start()
        self.addCleanup(patcher.stop)

        @datadog_lambda_wrapper
        def lambda_handler(event, context):
            lambda_metric("test.metric", 100)

        # Turn off _force_wrap to emulate the nested wrapper scenario,
        # the second @datadog_lambda_wrapper should actually be no-op.
        datadog_lambda_wrapper._force_wrap = False

        lambda_handler_double_wrapped = datadog_lambda_wrapper(lambda_handler)

        lambda_event = {}

        lambda_handler_double_wrapped(lambda_event, get_mock_context())

        self.mock_patch_all.assert_called_once()
        self.mock_wrapper_lambda_stats.flush.assert_called_once()
        self.mock_submit_invocations_metric.assert_called_once()
        invoke_additional_target_lambdas(event)

    metrics, logs, trace_payloads = split(enrich(parse(event, context)))

    if DD_FORWARD_LOG:
        forward_logs(logs)

    forward_metrics(metrics)

    if len(trace_payloads) > 0:
        forward_traces(trace_payloads)

    parse_and_submit_enhanced_metrics(logs)


lambda_handler = datadog_lambda_wrapper(datadog_forwarder)


def forward_logs(logs):
    """Forward logs to Datadog"""
    if logger.isEnabledFor(logging.DEBUG):
        logger.debug(f"Forwarding {len(logs)} logs")
    logs_to_forward = filter_logs(list(map(json.dumps, logs)))
    scrubber = DatadogScrubber(SCRUBBING_RULE_CONFIGS)
    if DD_USE_TCP:
        batcher = DatadogBatcher(256 * 1000, 256 * 1000, 1)
        cli = DatadogTCPClient(DD_URL, DD_PORT, DD_NO_SSL, DD_API_KEY,
                               scrubber)
    else:
        batcher = DatadogBatcher(256 * 1000, 4 * 1000 * 1000, 400)
        cli = DatadogHTTPClient(DD_URL, DD_PORT, DD_NO_SSL,
Exemplo n.º 3
0
# Unless explicitly stated otherwise all files in this repository are licensed
# under the Apache License Version 2.0.
# This product includes software developed at Datadog (https://www.datadoghq.com/).
# Copyright 2020 Datadog, Inc.

from __future__ import absolute_import
from importlib import import_module

import os
from datadog_lambda.wrapper import datadog_lambda_wrapper


class HandlerError(Exception):
    pass


path = os.environ.get("DD_LAMBDA_HANDLER", None)
if path is None:
    raise HandlerError(
        "DD_LAMBDA_HANDLER is not defined. Can't use prebuilt datadog handler")
parts = path.rsplit(".", 1)
if len(parts) != 2:
    raise HandlerError("Value %s for DD_LAMBDA_HANDLER has invalid format." %
                       path)

(mod_name, handler_name) = parts
handler_module = import_module(mod_name)
handler = datadog_lambda_wrapper(getattr(handler_module, handler_name))