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

オープン
#8,667 コメント 2 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@soujasK がすでに取り組んでいます。

2026年10月25日 から。

  • #8668 @soujasK による — オープン

評価

この issue はまだ評価されていません。

説明

bug metrics
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

主要言語
Python
スター
3.3k
フォーク
511
平均マージ
3日 4時間
マージ済み PR(30日)
98

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

aws-powertools/powertools-lambda-python のほかの issue

aws-powertools/powertools-lambda-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。