Skip to content

Commit c2ea4ba

Browse files
committed
add disable to flush
1 parent 7229bc4 commit c2ea4ba

File tree

5 files changed

+119
-115
lines changed

5 files changed

+119
-115
lines changed

aws_lambda_powertools/metrics/functions.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
import logging
4+
import os
35
from datetime import datetime
46

57
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import (
@@ -8,6 +10,9 @@
810
)
911
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties import MetricResolution, MetricUnit
1012
from aws_lambda_powertools.shared import constants
13+
from aws_lambda_powertools.shared.functions import resolve_truthy_env_var_choice
14+
15+
logger = logging.getLogger(__name__)
1116

1217

1318
def extract_cloudwatch_metric_resolution_value(metric_resolutions: list, resolution: int | MetricResolution) -> int:
@@ -134,3 +139,27 @@ def convert_timestamp_to_emf_format(timestamp: int | datetime) -> int:
134139
# Returning zero represents the initial date of epoch time,
135140
# which will be skipped by Amazon CloudWatch.
136141
return 0
142+
143+
144+
def is_metrics_disabled() -> bool:
145+
"""Checks if metrics have been disabled via POWERTOOLS_METRICS_DISABLED or POWERTOOLS_DEV
146+
147+
Returns:
148+
bool: True if metrics are disabled, False otherwise
149+
"""
150+
# First check POWERTOOLS_METRICS_DISABLED as it should take precedence
151+
if constants.METRICS_DISABLED_ENV in os.environ:
152+
env_value = os.getenv(constants.METRICS_DISABLED_ENV)
153+
is_disabled = resolve_truthy_env_var_choice(env=env_value or "false")
154+
if is_disabled:
155+
logger.debug("Metrics have been disabled via env var POWERTOOLS_METRICS_DISABLED")
156+
return bool(is_disabled)
157+
158+
# Then check if POWERTOOLS_DEV is enabled
159+
dev_mode_value = os.getenv(constants.POWERTOOLS_DEV_ENV)
160+
dev_mode = resolve_truthy_env_var_choice(env=dev_mode_value or "false")
161+
if dev_mode:
162+
logger.debug("Metrics have been disabled via env var POWERTOOLS_DEV")
163+
return True
164+
165+
return False

aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
convert_timestamp_to_emf_format,
1616
extract_cloudwatch_metric_resolution_value,
1717
extract_cloudwatch_metric_unit_value,
18+
is_metrics_disabled,
1819
validate_emf_timestamp,
1920
)
2021
from aws_lambda_powertools.metrics.provider.base import BaseProvider
2122
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.constants import MAX_DIMENSIONS, MAX_METRICS
2223
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties import MetricResolution, MetricUnit
2324
from aws_lambda_powertools.shared import constants
24-
from aws_lambda_powertools.shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
25+
from aws_lambda_powertools.shared.functions import resolve_env_var_choice
2526
from aws_lambda_powertools.warnings import PowertoolsUserWarning
2627

2728
if TYPE_CHECKING:
@@ -77,7 +78,7 @@ def __init__(
7778
self.default_dimensions = default_dimensions or {}
7879
self.namespace = resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
7980
self.service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV))
80-
self.metrics_disabled = self.is_metrics_disabled()
81+
self.metrics_disabled = is_metrics_disabled()
8182

8283
self.metadata_set = metadata_set if metadata_set is not None else {}
8384
self.timestamp: int | None = None
@@ -88,25 +89,7 @@ def __init__(
8889

8990
self.dimension_set.update(**self.default_dimensions)
9091

91-
@staticmethod
92-
def is_metrics_disabled() -> bool:
93-
"""Checks if metrics have been disabled via POWERTOOLS_METRICS_DISABLED or POWERTOOLS_DEV"""
94-
# First check POWERTOOLS_METRICS_DISABLED
95-
if constants.METRICS_DISABLED_ENV in os.environ:
96-
env_value = os.getenv(constants.METRICS_DISABLED_ENV)
97-
is_disabled = resolve_truthy_env_var_choice(env=env_value or "false")
98-
if is_disabled:
99-
logger.debug("Metrics have been disabled via env var POWERTOOLS_METRICS_DISABLED")
100-
return bool(is_disabled)
101-
102-
# Then check if POWERTOOLS_DEV is enabled
103-
dev_mode_value = os.getenv(constants.POWERTOOLS_DEV_ENV)
104-
dev_mode = resolve_truthy_env_var_choice(env=dev_mode_value or "false")
105-
if dev_mode:
106-
logger.debug("Metrics have been disabled via env var POWERTOOLS_DEV")
107-
return True
108-
109-
return False
92+
logger.info("im here")
11093

11194
def add_metric(
11295
self,
@@ -398,7 +381,7 @@ def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None:
398381
"If application metrics should never be empty, consider using 'raise_on_empty_metrics'",
399382
stacklevel=2,
400383
)
401-
else:
384+
elif not self.metrics_disabled:
402385
logger.debug("Flushing existing metrics")
403386
metrics = self.serialize_metric_set()
404387
print(json.dumps(metrics, separators=(",", ":")))

aws_lambda_powertools/metrics/provider/datadog/datadog.py

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
from typing import TYPE_CHECKING, Any
1111

1212
from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError
13+
from aws_lambda_powertools.metrics.functions import is_metrics_disabled
1314
from aws_lambda_powertools.metrics.provider import BaseProvider
1415
from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning
1516
from aws_lambda_powertools.shared import constants
16-
from aws_lambda_powertools.shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
17+
from aws_lambda_powertools.shared.functions import resolve_env_var_choice
1718

1819
if TYPE_CHECKING:
1920
from aws_lambda_powertools.shared.types import AnyCallableT
@@ -65,27 +66,7 @@ def __init__(
6566
)
6667
self.default_tags = default_tags or {}
6768
self.flush_to_log = resolve_env_var_choice(choice=flush_to_log, env=os.getenv(constants.DATADOG_FLUSH_TO_LOG))
68-
self.metrics_disabled = self.is_metrics_disabled()
69-
70-
@staticmethod
71-
def is_metrics_disabled() -> bool:
72-
"""Checks if metrics have been disabled via POWERTOOLS_METRICS_DISABLED or POWERTOOLS_DEV"""
73-
# First check if POWERTOOLS_DEV is enabled
74-
dev_mode_value = os.getenv(constants.POWERTOOLS_DEV_ENV)
75-
dev_mode = resolve_truthy_env_var_choice(env=dev_mode_value or "false")
76-
if dev_mode:
77-
logger.debug("Metrics have been disabled via env var POWERTOOLS_DEV")
78-
return True
79-
80-
# Then check POWERTOOLS_METRICS_DISABLED
81-
if constants.METRICS_DISABLED_ENV not in os.environ:
82-
return False
83-
84-
env_value = os.getenv(constants.METRICS_DISABLED_ENV)
85-
is_disabled = resolve_truthy_env_var_choice(env=env_value or "false")
86-
if is_disabled:
87-
logger.debug("Metrics have been disabled via env var POWERTOOLS_METRICS_DISABLED")
88-
return bool(is_disabled)
69+
self.metrics_disabled = is_metrics_disabled()
8970

9071
# adding name,value,timestamp,tags
9172
def add_metric(
@@ -221,7 +202,7 @@ def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None:
221202
timestamp=metric_item["e"],
222203
tags=metric_item["t"],
223204
)
224-
else:
205+
elif not self.metrics_disabled:
225206
# dd module not found: flush to log, this format can be recognized via datadog log forwarder
226207
# https://github.com/Datadog/datadog-lambda-python/blob/main/datadog_lambda/metric.py#L77
227208
for metric_item in metrics:

tests/functional/metrics/datadog/test_metrics_datadog.py

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -336,49 +336,68 @@ def test_namespace_env_var(monkeypatch):
336336
assert output[0]["m"] == f"{env_namespace}.item_sold"
337337

338338

339-
def test_metrics_disabled_with_env_var(monkeypatch):
339+
def test_metrics_disabled_with_env_var(monkeypatch, capsys):
340340
# GIVEN environment variable is set to disable metrics
341341
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true")
342342

343343
# WHEN metrics is initialized and adding metrics
344344
metrics = DatadogMetrics()
345345
metrics.add_metric(name="test_metric", value=1)
346+
metrics.flush_metrics()
346347

347-
# WHEN flushing metrics
348-
metrics_output = metrics.flush_metrics()
349-
350-
# THEN metrics output should be empty
351-
assert metrics_output is None
348+
# THEN no metrics should have been recorded
349+
captured = capsys.readouterr()
350+
assert not captured.out
352351

353352

354-
def test_metrics_disabled_persists_after_flush(monkeypatch):
353+
def test_metrics_disabled_persists_after_flush(monkeypatch, capsys):
355354
# GIVEN environment variable is set to disable metrics
356355
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true")
357356
metrics = DatadogMetrics()
358357

359358
# WHEN multiple operations are performed with flush in between
360-
metrics.add_metric(name="metric1", unit="Count", value=1)
361-
first_flush = metrics.flush_metrics()
359+
metrics.add_metric(name="metric1", value=1)
360+
metrics.flush_metrics()
361+
362+
# THEN first flush should not emit any metrics
363+
captured = capsys.readouterr()
364+
assert not captured.out
362365

363-
metrics.add_metric(name="metric2", unit="Count", value=2)
364-
second_flush = metrics.flush_metrics()
366+
# WHEN adding and flushing more metrics
367+
metrics.add_metric(name="metric2", value=2)
368+
metrics.flush_metrics()
365369

366-
# THEN all flush operations should return None
367-
assert first_flush is None
368-
assert second_flush is None
370+
# THEN second flush should also not emit any metrics
371+
captured = capsys.readouterr()
372+
assert not captured.out
369373

370374

371-
def test_metrics_disabled_with_namespace(monkeypatch):
375+
def test_metrics_disabled_with_namespace(monkeypatch, capsys):
372376
# GIVEN environment variable is set to disable metrics
373377
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true")
374378

375379
# WHEN metrics is initialized with namespace and service
376380
metrics = DatadogMetrics(namespace="test_namespace")
377381
metrics.add_metric(name="test_metric", value=1)
378-
metrics_output = metrics.flush_metrics()
382+
metrics.flush_metrics()
383+
384+
# THEN no metrics should have been recorded
385+
captured = capsys.readouterr()
386+
assert not captured.out
387+
388+
389+
def test_metrics_disabled_with_dev_mode_true(monkeypatch, capsys):
390+
# GIVEN dev mode is enabled
391+
monkeypatch.setenv("POWERTOOLS_DEV", "true")
392+
393+
# WHEN metrics is initialized
394+
metrics = DatadogMetrics(namespace="test")
395+
metrics.add_metric(name="test_metric", value=1)
396+
metrics.flush_metrics()
379397

380-
# THEN metrics should still be disabled
381-
assert metrics_output is None
398+
# THEN no metrics should have been recorded
399+
captured = capsys.readouterr()
400+
assert not captured.out
382401

383402

384403
def test_metrics_enabled_with_env_var_false(monkeypatch, capsys):
@@ -413,21 +432,6 @@ def test_metrics_enabled_with_env_var_not_set(monkeypatch, capsys):
413432
assert "test.test_metric" in metrics_output["m"]
414433

415434

416-
def test_metrics_disabled_with_dev_mode_true(monkeypatch, capsys):
417-
# GIVEN dev mode is enabled
418-
monkeypatch.setenv("POWERTOOLS_DEV", "true")
419-
420-
# WHEN metrics is initialized
421-
metrics = DatadogMetrics(namespace="test")
422-
metrics.add_metric(name="test_metric", value=1)
423-
424-
# AND flushing metrics
425-
metrics_output = metrics.flush_metrics()
426-
427-
# THEN metrics output should be empty
428-
assert metrics_output is None
429-
430-
431435
def test_metrics_enabled_with_dev_mode_false(monkeypatch, capsys):
432436
# GIVEN dev mode is disabled
433437
monkeypatch.setenv("POWERTOOLS_DEV", "false")
@@ -453,10 +457,12 @@ def test_metrics_disabled_dev_mode_overrides_metrics_disabled(monkeypatch, capsy
453457
metrics.add_metric(name="test_metric", value=1)
454458
metrics.flush_metrics()
455459

456-
# THEN metrics should be written to stdout (POWERTOOLS_METRICS_DISABLED takes precedence)
460+
# THEN metrics should be written to stdout since POWERTOOLS_METRICS_DISABLED is false
457461
output = capsys.readouterr().out
462+
assert output # First verify we have output
458463
metrics_output = json.loads(output)
459-
assert metrics_output
464+
assert metrics_output # Then verify it's valid JSON
465+
assert "test.test_metric" in metrics_output["m"] # Verify the metric is present
460466

461467

462468
def test_metrics_enabled_with_both_false(monkeypatch, capsys):
@@ -475,18 +481,16 @@ def test_metrics_enabled_with_both_false(monkeypatch, capsys):
475481
assert metrics_output
476482

477483

478-
def test_metrics_disabled_with_dev_mode_false_and_metrics_disabled_true(monkeypatch):
484+
def test_metrics_disabled_with_dev_mode_false_and_metrics_disabled_true(monkeypatch, capsys):
479485
# GIVEN dev mode is false but metrics disabled is true
480486
monkeypatch.setenv("POWERTOOLS_DEV", "false")
481487
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true")
482488

483489
# WHEN metrics is initialized
484490
metrics = DatadogMetrics(namespace="test")
485-
486491
metrics.add_metric(name="test_metric", value=1)
492+
metrics.flush_metrics()
487493

488-
# WHEN flushing metrics
489-
metrics_output = metrics.flush_metrics()
490-
491-
# THEN metrics output should be empty
492-
assert metrics_output is None
494+
# THEN no metrics should have been recorded
495+
captured = capsys.readouterr()
496+
assert not captured.out

0 commit comments

Comments
 (0)