| 
14 | 14 | from datadog import api  | 
15 | 15 | from datadog.threadstats import ThreadStats  | 
16 | 16 | from datadog_lambda import __version__  | 
 | 17 | +from datadog_lambda.cold_start import get_cold_start_tag  | 
 | 18 | +from datadog_lambda.tags import parse_lambda_tags_from_arn  | 
 | 19 | + | 
 | 20 | + | 
 | 21 | +ENHANCED_METRICS_NAMESPACE_PREFIX = "aws.lambda.enhanced"  | 
17 | 22 | 
 
  | 
18 | 23 | logger = logging.getLogger(__name__)  | 
19 | 24 | 
 
  | 
@@ -54,39 +59,71 @@ def lambda_metric(metric_name, value, timestamp=None, tags=None):  | 
54 | 59 |     background thread.  | 
55 | 60 |     """  | 
56 | 61 |     tags = _tag_dd_lambda_layer(tags)  | 
57 |  | -    if os.environ.get('DD_FLUSH_TO_LOG', '').lower() == 'true':  | 
58 |  | -        logger.debug('Sending metric %s to Datadog via log forwarder', metric_name)  | 
59 |  | -        print(json.dumps({  | 
60 |  | -            'm': metric_name,  | 
61 |  | -            'v': value,  | 
62 |  | -            'e': timestamp or int(time.time()),  | 
63 |  | -            't': tags  | 
64 |  | -        }))  | 
65 |  | -    else:  | 
66 |  | -        logger.debug('Sending metric %s to Datadog via lambda layer', metric_name)  | 
67 |  | -        lambda_stats.distribution(  | 
68 |  | -            metric_name, value, timestamp=timestamp, tags=tags  | 
 | 62 | +    if os.environ.get("DD_FLUSH_TO_LOG", "").lower() == "true":  | 
 | 63 | +        logger.debug("Sending metric %s to Datadog via log forwarder", metric_name)  | 
 | 64 | +        print(  | 
 | 65 | +            json.dumps(  | 
 | 66 | +                {  | 
 | 67 | +                    "m": metric_name,  | 
 | 68 | +                    "v": value,  | 
 | 69 | +                    "e": timestamp or int(time.time()),  | 
 | 70 | +                    "t": tags,  | 
 | 71 | +                }  | 
 | 72 | +            )  | 
69 | 73 |         )  | 
 | 74 | +    else:  | 
 | 75 | +        logger.debug("Sending metric %s to Datadog via lambda layer", metric_name)  | 
 | 76 | +        lambda_stats.distribution(metric_name, value, timestamp=timestamp, tags=tags)  | 
 | 77 | + | 
 | 78 | + | 
 | 79 | +def are_enhanced_metrics_enabled():  | 
 | 80 | +    """Check env var to find if enhanced metrics should be submitted  | 
 | 81 | +    """  | 
 | 82 | +    return os.environ.get("DD_ENHANCED_METRICS", "false").lower() == "true"  | 
 | 83 | + | 
 | 84 | + | 
 | 85 | +def submit_invocations_metric(lambda_arn):  | 
 | 86 | +    """Increment aws.lambda.enhanced.invocations by 1  | 
 | 87 | +    """  | 
 | 88 | +    if not are_enhanced_metrics_enabled():  | 
 | 89 | +        return  | 
 | 90 | + | 
 | 91 | +    lambda_metric(  | 
 | 92 | +        "{}.invocations".format(ENHANCED_METRICS_NAMESPACE_PREFIX),  | 
 | 93 | +        1,  | 
 | 94 | +        tags=parse_lambda_tags_from_arn(lambda_arn) + [get_cold_start_tag()],  | 
 | 95 | +    )  | 
 | 96 | + | 
 | 97 | + | 
 | 98 | +def submit_errors_metric(lambda_arn):  | 
 | 99 | +    """Increment aws.lambda.enhanced.errors by 1  | 
 | 100 | +    """  | 
 | 101 | +    if not are_enhanced_metrics_enabled():  | 
 | 102 | +        return  | 
 | 103 | + | 
 | 104 | +    lambda_metric(  | 
 | 105 | +        "{}.errors".format(ENHANCED_METRICS_NAMESPACE_PREFIX),  | 
 | 106 | +        1,  | 
 | 107 | +        tags=parse_lambda_tags_from_arn(lambda_arn) + [get_cold_start_tag()],  | 
 | 108 | +    )  | 
70 | 109 | 
 
  | 
71 | 110 | 
 
  | 
72 | 111 | # Decrypt code should run once and variables stored outside of the function  | 
73 | 112 | # handler so that these are decrypted once per container  | 
74 |  | -DD_KMS_API_KEY = os.environ.get('DD_KMS_API_KEY', '')  | 
 | 113 | +DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "")  | 
75 | 114 | if DD_KMS_API_KEY:  | 
76 |  | -    DD_KMS_API_KEY = boto3.client('kms').decrypt(  | 
 | 115 | +    DD_KMS_API_KEY = boto3.client("kms").decrypt(  | 
77 | 116 |         CiphertextBlob=base64.b64decode(DD_KMS_API_KEY)  | 
78 |  | -    )['Plaintext']  | 
 | 117 | +    )["Plaintext"]  | 
79 | 118 | 
 
  | 
80 | 119 | # Set API Key and Host in the module, so they only set once per container  | 
81 | 120 | api._api_key = os.environ.get(  | 
82 |  | -    'DATADOG_API_KEY',  | 
83 |  | -    os.environ.get('DD_API_KEY', DD_KMS_API_KEY),  | 
 | 121 | +    "DATADOG_API_KEY", os.environ.get("DD_API_KEY", DD_KMS_API_KEY)  | 
84 | 122 | )  | 
85 |  | -logger.debug('Setting DATADOG_API_KEY of length %d', len(api._api_key))  | 
 | 123 | +logger.debug("Setting DATADOG_API_KEY of length %d", len(api._api_key))  | 
86 | 124 | 
 
  | 
87 | 125 | # Set DATADOG_HOST, to send data to a non-default Datadog datacenter  | 
88 | 126 | api._api_host = os.environ.get(  | 
89 |  | -    'DATADOG_HOST',  | 
90 |  | -    'https://api.' + os.environ.get('DD_SITE', 'datadoghq.com')  | 
 | 127 | +    "DATADOG_HOST", "https://api." + os.environ.get("DD_SITE", "datadoghq.com")  | 
91 | 128 | )  | 
92 |  | -logger.debug('Setting DATADOG_HOST to %s', api._api_host)  | 
 | 129 | +logger.debug("Setting DATADOG_HOST to %s", api._api_host)  | 
0 commit comments