|
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