AWS SDK 없이 CloudWatch 지표를 보고하는 방법

때때로 Lambda 함수를 작성할 때 CloudWatch Metrics에 a custom metric을 보내야 합니다. 이는 기술 메트릭(예: 외부 서비스에 대한 요청 시간) 또는 비즈니스 프로세스에 대한 메트릭(예: 사용자 로그인 수)일 수 있습니다. 이를 수행하는 확실한 방법은 putMetricData method from the AWS SDK을 사용하는 것입니다.

const AWS = require("aws-sdk");
const cloudwatch = new AWS.CloudWatch();

exports.handler = async () => {
  // business logic

  const metric = {
    Namespace: "Service1",
    MetricData: [
      {
        MetricName: "loginAttempts",
        Dimensions: [
          {
            Name: "tenant",
            Value: "client1",
          },
        ],
        Unit: "Count",
        Value: 1,
      },
    ],
  };

  await cloudwatch.putMetricData(metric).promise();

  // more business logic
};


이 솔루션은 때때로 이러한 메트릭을 보내는 경우에 충분합니다. 함수 코드의 다른 위치에서 많은 메트릭을 보내려는 경우 문제가 시작됩니다. AWS SDK에서 다른 메서드를 호출하는 것과 동일한 방식으로 putMetricData 메서드를 호출하면 함수의 실행 시간이 늘어나 비용이 증가합니다. 게다가 한 번의 호출로 40kB의 데이터만 보낼 수 있습니다.
2019년 말에 AWS는 AWS SDK를 사용하지 않고 지표 보고를 활성화했습니다.

포함된 메트릭 형식



이는 Embedded Metric Format 이라는 특정 형식으로 데이터를 stdout에 기록하여 수행할 수 있습니다. 예를 들어:

{
  "_aws": {
    "Timestamp": 1579211886742,
    "CloudWatchMetrics": [
      {
        "Dimensions": [["tenant"]],
        "Metrics": [
          {
            "Name": "loginAttempts",
            "Unit": "Count"
          }
        ],
        "Namespace": "Service1"
      }
    ]
  },
  "loginAttempts": 1,
  "tenant": "client1"
}


이러한 객체를 쉽게 생성할 수 있도록 AWS는 Node.js , Python , Java.NET 에 대한 라이브러리를 제공했습니다. 이제 AWS SDK를 사용하는 위의 예를 다음과 같이 작성할 수 있습니다.

const { createMetricsLogger, Unit } = require("aws-embedded-metrics");

exports.handler = async (event, context) => {
  // business logic

  const metrics = createMetricsLogger();
  metrics.setNamespace("Service1");
  metrics.putMetric("loginAttempts", 1, Unit.Count);
  metrics.setDimensions({ tenant: "client1" });
  await metrics.flush();

  // more business logic
};


관련된 AWS에 대한 네트워크 호출이 없으므로 함수 호출 시간이 증가하지 않습니다. 데이터는 stdout에 기록되고 나머지는 CloudWatch에서 처리하여 지표로 게시합니다. 또한 함수에는 cloudwatch:PutMetricData 권한이 필요하지 않습니다.
aws-embedded-metrics 라이브러리는 또한 flush() 메서드를 수동으로 호출할 필요가 없는 Lambda 함수용 래퍼를 제공합니다. 이를 통해 보고 메트릭을 코드 전체에 분산시킬 수 있으며 이를 stdout로 전송하면 Lambda 실행이 끝날 때 한 번만 발생합니다.

const { metricScope } = require("aws-embedded-metrics");

exports.handler = metricScope((metrics) => async () => {
  // business logic

  metrics.setNamespace("Service2");
  metrics.putMetric("loginAttempts", 1, Unit.Count);
  metrics.setDimensions({ tenant: "client2" });
  metrics.setProperty("RequestId", context.awsRequestId);

  // more business logic
});


또한 setProperty 메서드를 사용하여 나중에 CloudWatch Logs Insights에서 검색할 수 있는 선택적 파라미터를 추가할 수 있습니다.

요약하면 Embedded Metric Format을 사용하면 함수 기간을 연장하지 않고도 CloudWatch 서비스에 많은 사용자 지정 지표를 최적으로 보낼 수 있습니다.


로그를 파악하세요 🌩





서버리스 서비스 성능, 호출, 오류 등을 모니터링하기 위한 데스크탑 앱인 Cloudash을 소개합니다.

지난 주에 생산 사건이 발생했습니까? 아니면 20초 전? Cloudash를 사용하면 서버리스 로그 및 메트릭을 쉽게 검색, 필터링 및 탐색할 수 있습니다.

원할 때마다 원하는 것을 검색하십시오. Cloudash에는 필터링 기능이 내장되어 있어 그 어느 때보다 빠르게 문제를 해결할 수 있습니다.

시작하기here .

좋은 웹페이지 즐겨찾기