如何用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中指标分析与可视化
- 查看指标:进入CloudWatch控制台的「指标」页面,找到自定义的
Lambda/ServiceB命名空间,即可查看TotalCalls、CallLatency、ErrorCalls三个指标。 - 计算错误率:通过CloudWatch的「数学表达式」功能,输入
ErrorCalls / TotalCalls * 100生成错误率百分比指标。 - 创建仪表盘:将核心指标(含错误率)添加到自定义仪表盘,实现实时监控。
- 设置告警:针对错误率、延迟阈值配置SNS告警,触发条件满足时自动通知相关人员。
注意事项
- 埋点代码需轻量化,避免影响主业务性能;上报失败时仅记录日志,不要抛出异常。
- CloudWatch自定义指标会产生费用,需控制上报频率;批量上报可降低成本,但Lambda单次调用后上报是最常用的方式。
- X-Ray追踪有额外费用,若仅需基础指标,自定义埋点即可满足需求。
内容的提问来源于stack exchange,提问作者Michał Piotr Stankiewicz
相关产品推荐
相关产品推荐

