Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 21 additions & 17 deletions aws_lambda_powertools/metrics/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,21 +91,14 @@ def __init__(
provider: AmazonCloudWatchEMFProvider | None = None,
function_name: str | None = None,
):
self.metric_set = self._metrics
self.metadata_set = self._metadata
self.default_dimensions = self._default_dimensions
self.dimension_set = self._dimensions

self.dimension_set.update(**self._default_dimensions)

if provider is None:
self.provider = AmazonCloudWatchEMFProvider(
namespace=namespace,
service=service,
metric_set=self.metric_set,
dimension_set=self.dimension_set,
metadata_set=self.metadata_set,
default_dimensions=self._default_dimensions,
metric_set=Metrics._metrics,
dimension_set=Metrics._dimensions,
metadata_set=Metrics._metadata,
default_dimensions=Metrics._default_dimensions,
function_name=function_name,
)
else:
Expand Down Expand Up @@ -174,7 +167,6 @@ def log_metrics(
)

def set_default_dimensions(self, **dimensions) -> None:
self.provider.set_default_dimensions(**dimensions)
"""Persist dimensions across Lambda invocations
Parameters
Expand All @@ -195,14 +187,10 @@ def set_default_dimensions(self, **dimensions) -> None:
def lambda_handler():
return True
"""
for name, value in dimensions.items():
self.add_dimension(name, value)

self.default_dimensions.update(**dimensions)
self.provider.set_default_dimensions(**dimensions)

def clear_default_dimensions(self) -> None:
self.provider.default_dimensions.clear()
self.default_dimensions.clear()

def clear_metrics(self) -> None:
self.provider.clear_metrics()
Expand All @@ -227,6 +215,22 @@ def service(self):
def service(self, service):
self.provider.service = service

@property
def metric_set(self):
return self.provider.metric_set

@property
def dimension_set(self):
return self.provider.dimension_set

@property
def metadata_set(self):
return self.provider.metadata_set

@property
def default_dimensions(self):
return self.provider.default_dimensions


# Maintenance: until v3, we can't afford to break customers.
# AmazonCloudWatchEMFProvider has the exact same functionality (non-singleton)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def __init__(
):
self.metric_set = metric_set if metric_set is not None else {}
self.dimension_set = dimension_set if dimension_set is not None else {}
self.default_dimensions = default_dimensions or {}
self.default_dimensions = default_dimensions if default_dimensions is not None else {}
self.namespace = resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
self.service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV))
self.function_name = function_name
Expand Down Expand Up @@ -453,7 +453,8 @@ def clear_metrics(self) -> None:
self.dimension_set.clear()
self.dimension_sets.clear()
self.metadata_set.clear()
self.set_default_dimensions(**self.default_dimensions)
# Initialize dimension_set as in __init__
self.dimension_set.update(**self.default_dimensions)

def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None:
"""Manually flushes the metrics. This is normally not necessary,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1221,6 +1221,28 @@ def lambda_handler(evt, ctx):
assert "environment" in second_invocation


def test_flush_metrics_with_default_dimensions(capsys, metrics, dimensions, namespace):
# GIVEN a Metrics is initialized
my_metrics = Metrics(namespace=namespace)
my_metrics.set_default_dimensions(environment="test", log_group="/lambda/test")

# WHEN we add_metric and flush_metrics
# THEN we should have no warnings
with warnings.catch_warnings(record=True) as w:
for metric in metrics:
my_metrics.add_metric(**metric)
assert not w

with warnings.catch_warnings(record=True) as w:
my_metrics.flush_metrics()
assert not w

# THEN we should have default dimensions in output
output = capture_metrics_output(capsys)
assert "environment" in output
assert "log_group" in output


def test_metrics_reuse_dimension_set(metric, dimension, namespace):
# GIVEN Metrics is initialized with a metric and dimension
my_metrics = Metrics(namespace=namespace)
Expand Down