[{"data":1,"prerenderedAt":74},["ShallowReactive",2],{"snippet-tools-powertools-metrics":3},{"id":4,"title":5,"contributors":6,"description":5,"extension":10,"gitHub":11,"introBox":14,"languages":18,"meta":22,"resources":23,"services":34,"snippets":36,"stem":70,"tags":71,"type":72,"__hash__":73},"snippets\u002Fsnippets\u002Ftools-powertools-metrics.json","Standardize custom metrics with Powertools",[7,8,9],"content\u002Fcontributors\u002Fdavid-boyne.json","content\u002Fcontributors\u002Fjames-eastham.json","content\u002Fcontributors\u002Frahul-popat.json","json",{"template":12},{"repoURL":13},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-snippets\u002Ftree\u002Fmain\u002Ftools-powertools-metrics",{"headline":15,"text":16},"How it works",[17],"Metrics creates custom metrics asynchronously by logging metrics to standard output following Amazon CloudWatch Embedded Metric Format (EMF).",[19,20,21],"TypeScript",".NET","Java",{},{"bullets":24},[25,28,31],{"text":26,"link":27},"Metrics Homepage","https:\u002F\u002Fawslabs.github.io\u002Faws-lambda-powertools-typescript\u002Flatest\u002Fcore\u002Fmetrics\u002F",{"text":29,"link":30},"AWS Lambda PowerTools Repository","https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-lambda-powertools-typescript\u002Ftree\u002Fmain\u002Fexamples",{"text":32,"link":33},"Watch Serverless Office Hours: AWS Lambda - Lambda Powertools","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=tr7DZxn3qag&t=2038s",[35],"lambda",[37],{"title":38,"codeTabs":39},"Runtimes",[40,52,61],{"id":41,"title":42,"snippets":43},"Node.js","Using Powertools Metrics with TypeScript:",[44,48],{"title":45,"language":46,"code":47},"Install the library in your project:","Bash","npm install @aws-lambda-powertools\u002Fmetrics",{"description":49,"language":50,"code":51},"The Metrics utility must always be instantiated outside of the Lambda handler. In doing this, subsequent invocations processed by the same instance of your function can reuse these resources. This saves cost by reducing function run time. In addition, Metrics can track cold start and emit the appropriate metrics.","js","import { Metrics } from '@aws-lambda-powertools\u002Fmetrics';\n\nconst metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' });\n\nexport const handler = async (_event, _context): Promise&#60;void&#62; =&#62; {\n    \u002F\u002F ...\n};",{"id":20,"title":53,"snippets":54},"Using Powertools Metrics with .NET:",[55,57],{"title":45,"language":46,"code":56},"dotnet add package AWS.Lambda.Powertools.Metrics --prerelease",{"description":58,"language":59,"code":60},"The Metrics functionality requires two environment variables to be set; POWERTOOLS_SERVICE_NAME and POWERTOOLS_METRICS_NAMESPACE.","dotnet","﻿using Amazon.Lambda.Core;\nusing AWS.Lambda.Powertools.Metrics;\nusing System.Diagnostics;\n\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]\n\nnamespace ServerlessTestSamples\n{\n    public class Function\n    {\n        \u002F\u002F Powertools Metrics require two environment variables against your function\n        \u002F\u002F POWERTOOLS_SERVICE_NAME\n        \u002F\u002F POWERTOOLS_METRICS_NAMESPACE\n\n        \u002F\u002F Capture cold starts as a specific metric\n        [Metrics(CaptureColdStart = true)]\n        public void Handler(object request, ILambdaContext context)\n        {\n            \u002F\u002F Set default dimensions\n            Metrics.SetDefaultDimensions(new Dictionary&#60;string, string&#62;()\n            {\n                { \"Environment\", \"Prod\" }\n            });\n\n            var watch = Stopwatch.StartNew();\n\n            \u002F\u002F Using PushSingleMetric allows defaults to be overridden\n            Metrics.PushSingleMetric(\n                metricName: \"FunctionInvocation\",\n                value: 1,\n                unit: MetricUnit.Count,\n                service: \"lambda-powertools-metrics-example\",\n                defaultDimensions: new Dictionary&#60;string, string&#62;\n                {\n                { \"Metric Type\", \"Single\" }\n            });\n\n            watch.Stop();\n\n            \u002F\u002F Add Metric to capture the amount of time \n            \u002F\u002F Will use default dimensions if set\n            Metrics.AddMetric(\"ElapsedExecutionTime\", watch.ElapsedMilliseconds, MetricUnit.Milliseconds);\n        }\n    }\n}",{"id":21,"title":62,"snippets":63},"Using Powertools Metrics with Java:",[64,68],{"title":65,"language":66,"code":67},"Add maven or gradle dependencies to your project:","java","Add maven or gradle dependencies to your project as mentioned here - https:\u002F\u002Fawslabs.github.io\u002Faws-lambda-powertools-java",{"description":17,"language":66,"code":69},"package helloworld;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport com.amazonaws.services.lambda.runtime.Context;\nimport com.amazonaws.services.lambda.runtime.RequestHandler;\nimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;\nimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\nimport software.amazon.cloudwatchlogs.emf.model.DimensionSet;\nimport software.amazon.cloudwatchlogs.emf.model.Unit;\nimport software.amazon.lambda.powertools.metrics.Metrics;\nimport static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;\n\n\u002F**\n * Handler for requests to Lambda function.\n *\u002F\npublic class MetricsHandler implements RequestHandler&#60;APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent&#62; {\n    private final static Logger log = LogManager.getLogger(MetricsHandler.class);\n\n    @Metrics(namespace = \"ExampleApplication\", service = \"booking\", captureColdStart = true)\n    public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEvent input, final Context context) {\n        Map&#60;String, String&#62; headers = new HashMap&#60;&#62;();\n\n        headers.put(\"Content-Type\", \"application\u002Fjson\");\n        headers.put(\"X-Custom-Header\", \"application\u002Fjson\");\n\n        metricsLogger().putDimensions(DimensionSet.of(\"environment\", \"prod\"));\n        metricsLogger().putMetric(\"CustomMetric1\", 1, Unit.COUNT);\n\n        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()\n                .withHeaders(headers);\n        try {\n            final String pageContents = this.getPageContents(\"https:\u002F\u002Fcheckip.amazonaws.com\");\n            log.info(pageContents);\n            String output = String.format(\"{ \\\"message\\\": \\\"hello world\\\", \\\"location\\\": \\\"%s\\\" }\", pageContents);\n            log.info(\"After output\");\n            return response\n                    .withStatusCode(200)\n                    .withBody(output);\n        } catch (IOException | InterruptedException e) {\n            return response\n                    .withBody(\"{}\")\n                    .withStatusCode(500);\n        }\n    }\n\n    private String getPageContents(String address) throws IOException {\n        URL url = new URL(address);\n        putMetadata(\"getPageContents\", address);\n        try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {\n            return br.lines().collect(Collectors.joining(System.lineSeparator()));\n        }\n    }\n}\n","snippets\u002Ftools-powertools-metrics",[],"Tools","NvTdK5KC3nwh-nsNDJR936A1jwmwU6t2BBQDKtiq3bo",1791369307967]