Skip to content

Bug: POWERTOOLS_METRICS_DISABLED is ignored by single_metric, the cold start metric, add_metric auto-flush and Datadog's lambda_metric #8667

Open

Description

@soujasK

Expected Behaviour

With POWERTOOLS_METRICS_DISABLED=true (or POWERTOOLS_DEV=true without POWERTOOLS_METRICS_DISABLED), nothing is emitted, as documented ("Disables all metrics emitted by Powertools", for both the CloudWatch and Datadog providers, per #6046).

Current Behaviour

flush_metrics() checks is_metrics_disabled(), but three other emission paths don't:

  1. single_metric (metrics/base.py) always prints in its finally block. This is also how the CloudWatch provider emits the ColdStart metric, so @metrics.log_metrics(capture_cold_start_metric=True) still prints a ColdStart EMF line while the application metrics are correctly suppressed.
  2. The CloudWatch add_metric auto-flush: when the metric set reaches 100 metrics, or a metric reaches 100 values, AmazonCloudWatchEMFProvider.add_metric prints the EMF blob directly.
  3. Datadog with the datadog_lambda package installed: DatadogProvider.flush_metrics calls lambda_metric(...) without checking is_metrics_disabled(); only the flush-to-log branch checks it.

In Lambda the EMF lines in 1 and 2 are ingested as real CloudWatch metrics, so metrics are published even though they're disabled.

While there: if the body of a with single_metric(...) block raises, metric_set is still None in the finally block and a literal null line is printed to stdout.

Code snippet

import os
from types import SimpleNamespace

os.environ["POWERTOOLS_METRICS_DISABLED"] = "true"

from aws_lambda_powertools import Metrics
from aws_lambda_powertools.metrics import single_metric

metrics = Metrics(namespace="ns", service="svc")


@metrics.log_metrics(capture_cold_start_metric=True)
def handler(event, context):
    metrics.add_metric(name="Booking", unit="Count", value=1)  # correctly not emitted


context = SimpleNamespace(function_name="fn", memory_limit_in_mb=128, invoked_function_arn="arn", aws_request_id="id")
handler({}, context)  # prints the ColdStart EMF line

with single_metric(name="Single", unit="Count", value=1, namespace="ns"):
    pass  # prints the EMF line

for i in range(100):
    metrics.add_metric(name=f"metric_{i}", unit="Count", value=1)  # auto-flush prints the EMF blob

Output (develop @ 5785377, Python 3.11):

{"_aws":{"Timestamp":...,"CloudWatchMetrics":[{"Namespace":"ns","Dimensions":[["function_name","service"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"function_name":"fn","service":"svc","ColdStart":[1.0]}
{"_aws":{"Timestamp":...,"CloudWatchMetrics":[{"Namespace":"ns","Dimensions":[[]],"Metrics":[{"Name":"Single","Unit":"Count"}]}]},"Single":[1.0]}
{"_aws": {"Timestamp": ..., "CloudWatchMetrics": [{"Namespace": "ns", "Dimensions": [["service"]], "Metrics": [{"Name": "metric_0", "Unit": "Count"}, ...

Possible Solution

Check is_metrics_disabled() at each of those points, like flush_metrics() does:

  • single_metric: only print when metric_set is not None and not is_metrics_disabled() (which also stops the null line).
  • CloudWatch add_metric: skip the print on auto-flush when disabled, but still clear metric_set as today.
  • Datadog: skip the lambda_metric submission when disabled.

Happy to send a PR with tests for each path.

Steps to Reproduce

Run the snippet above.

Powertools for AWS Lambda (Python) version

latest (develop @ 5785377)

AWS Lambda function runtime

3.11

Packaging format used

PyPi

Debugging logs

No response

Activity

  1. leandrodamascena commented on Oct 25, 2026

    @leandrodamascena
    Contributor

    Thanks @soujasK, confirmed on develop: with POWERTOOLS_METRICS_DISABLED=true the ColdStart line, single_metric and the 100-metric auto-flush all still print, and in Lambda those become real metrics. Checking is_metrics_disabled() at each of those points, plus not printing null when the single_metric body raises, is the right fix. It's yours, one test per path please. This goes into 3.40.0.

  2. added this to the 3.40.0 milestone on Oct 25, 2026
  3. soujasK commented on Oct 25, 2026

    @soujasK
    Author

    Thanks @leandrodamascena! PR #8668 is up with one test per path (single_metric, cold start via log_metrics, the 100-metric auto-flush, Datadog lambda_metric), plus the null case and a POWERTOOLS_DEV check for single_metric.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingmetrics

Type

No type

Projects

Relationships

None yet

Development

No branches or pull requests

Issue actions