You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CloudWatch监控AWS Lambda A与服务B的调用指标?

如何通过CloudWatch监控AWS Lambda(A)与外部服务(B)的调用指标

针对你的需求,以下是基于CloudWatch实现监控的具体方案,覆盖三种不同类型的服务B场景:

一、核心实现:Python Lambda自定义埋点

要精准获取Lambda A调用服务B的延迟、调用次数和错误率,最通用的方式是在代码中埋点,通过CloudWatch API上报自定义指标。

通用埋点代码示例

import boto3
import time
from botocore.exceptions import ClientError

# 初始化CloudWatch客户端
cloudwatch = boto3.client('cloudwatch')

def report_service_b_metrics(is_success, latency_ms):
    """上报服务B的调用指标到CloudWatch"""
    try:
        cloudwatch.put_metric_data(
            Namespace='Lambda/ServiceB',  # 自定义命名空间,方便后续过滤
            MetricData=[
                # 调用次数:每次调用计数+1
                {
                    'MetricName': 'TotalCalls',
                    'Value': 1,
                    'Unit': 'Count'
                },
                # 调用延迟:记录单次调用耗时(毫秒)
                {
                    'MetricName': 'CallLatency',
                    'Value': latency_ms,
                    'Unit': 'Milliseconds'
                },
                # 错误次数:失败时计数+1,成功时为0
                {
                    'MetricName': 'ErrorCalls',
                    'Value': 0 if is_success else 1,
                    'Unit': 'Count'
                }
            ]
        )
    except ClientError as e:
        # 避免埋点异常影响主业务逻辑
        print(f"Metrics report failed: {str(e)}")

def invoke_service_b():
    """调用服务B的业务逻辑,包含埋点"""
    start_time = time.time()
    success_flag = True
    
    try:
        # 替换为实际调用服务B的代码
        # 示例1:调用同账户Lambda
        # lambda_client = boto3.client('lambda')
        # lambda_client.invoke(FunctionName='ServiceB-Lambda-Name')
        
        # 示例2:调用S3服务
        # s3_client = boto3.client('s3')
        # s3_client.get_object(Bucket='your-bucket', Key='your-key')
        
        # 示例3:调用跨账户互联网服务
        # import requests
        # requests.get('https://service-b.example.com/api/endpoint')
        pass
    except Exception as e:
        success_flag = False
        print(f"Service B call failed: {str(e)}")
    finally:
        # 计算耗时并上报指标
        elapsed_ms = (time.time() - start_time) * 1000
        report_service_b_metrics(success_flag, elapsed_ms)
    
    return success_flag

二、分场景优化方案

1. 服务B是同账户下的另一个Lambda

除了自定义埋点,还可以利用AWS原生工具简化监控:

  • 启用X-Ray追踪:在Lambda A的配置中开启X-Ray,系统会自动追踪到对ServiceB的调用链路。在CloudWatch的AWS/X-Ray命名空间下,可直接查看TraceDuration(延迟)、ErrorCount(错误数)等指标,通过服务名过滤即可关联到A的调用。
  • Lambda原生指标辅助:ServiceB自身的Invocations和Errors指标可作为参考,但如果ServiceB有其他调用来源,自定义埋点的指标更精准。

2. 服务B是其他AWS服务(如S3、Verified Permissions)

这类服务自带CloudWatch集成,可结合两种方式监控:

  • 服务端指标参考:直接查看对应服务的CloudWatch指标(如S3的GetRequests、Verified Permissions的PolicyEvaluationRequests),但这些指标包含所有调用者的请求,无法单独过滤Lambda A的调用。
  • X-Ray追踪增强:调用AWS服务时,boto3客户端会自动继承Lambda的X-Ray配置,通过X-Ray可查看Lambda A到该服务的调用详情,相关数据会同步到CloudWatch指标。

3. 服务B是跨账户互联网服务

此类场景无AWS原生集成,只能依赖自定义埋点:

  • 捕获所有调用异常(网络超时、HTTP错误码等),确保错误次数统计准确。
  • 可扩展指标:比如新增Http4xxCount、Http5xxCount等细分错误指标,便于定位问题。

三、CloudWatch中指标分析与可视化

  1. 查看指标:进入CloudWatch控制台的「指标」页面,找到自定义的Lambda/ServiceB命名空间,即可查看TotalCalls、CallLatency、ErrorCalls三个指标。
  2. 计算错误率:通过CloudWatch的「数学表达式」功能,输入ErrorCalls / TotalCalls * 100生成错误率百分比指标。
  3. 创建仪表盘:将核心指标(含错误率)添加到自定义仪表盘,实现实时监控。
  4. 设置告警:针对错误率、延迟阈值配置SNS告警,触发条件满足时自动通知相关人员。

注意事项

  • 埋点代码需轻量化,避免影响主业务性能;上报失败时仅记录日志,不要抛出异常。
  • CloudWatch自定义指标会产生费用,需控制上报频率;批量上报可降低成本,但Lambda单次调用后上报是最常用的方式。
  • X-Ray追踪有额外费用,若仅需基础指标,自定义埋点即可满足需求。

内容的提问来源于stack exchange,提问作者Michał Piotr Stankiewicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:16:03