awslabs/aws-embedded-metrics-python

Using create_metrics_logger() directly?

Opened this issue · 1 comments

Hello!

I'm wondering what happens if I use create_metrics_logger() directly to create a MetricsLogger and put a metric.

The problem I am trying to solve is below.

Within my lambda, I have a function below that I call thousands of times to validate thousands of data points, and log violation if validation fails.

    @metric_scope
    def apply_validation_and_log_violation(
        self,
        value: Any,
        default_value: Any,
        validation_func: Callable,
        metrics: MetricsLogger
    ):
        if validation_func(value):
            return value
          
        metrics.put_metric("ValidationFailed", 1, "Count")

But calling a function, wrapped with @metric_scope decorator, thousands of times is flooding my cloudwatch log. It seems like for each function call, below is getting logged:

{"LogGroup": "test", "ServiceName": "test", "ServiceType": "AWS::Lambda::Function", "executionEnvironment": "AWS_Lambda_python3.8", "memorySize": "512", "functionVersion": "$LATEST", "logStreamId": "2021/09/09/[$LATEST]83e2421e4e5dbf0e84c58c4d0876b3fd", "traceId": "Root=1-dc99d00f-c079a84d433534434534ef0d;Parent=91ed514f1e5c03b2;Sampled=1", "_aws": {"Timestamp": 1631212956097, "CloudWatchMetrics": [{"Dimensions": [["LogGroup", "ServiceName", "ServiceType"]], "Metrics": [], "Namespace": "aws-embedded-metrics"}]}}

So I am wondering if I can create a MetricsLogger object with create_metrics_logger function and pass that object around.

Thanks!

I'm a little confused. Are you decorating your Lambda function handler with @metric_scope, and invoking the Lambda function many times, or decorating a function that you call from your Lambda function handler? If it's the latter, I'd recommend moving @metric_scope to decorate your Lambda function handler, and passing the same MetricsLogger into this function.

It does make sense to me that create_metrics_logger should be exposed in the top-level package.