如何通过Lambda函数向AMP推送自定义明文指标?
Lambda明文推送指标到AMP的可行方案与问题解决
可以通过Lambda以明文形式向AMP推送指标,但需要满足AMP的远程写入规范并处理AWS SigV4签名认证——这也是你用prometheus-client失败的核心原因:默认的prometheus-client远程写入逻辑没有适配AWS的SigV4签名机制,导致请求被AMP拒绝。
关键要点与解决步骤
指标格式要求
AMP兼容Prometheus的远程写入协议,指标需要序列化为remote.WriteRequest的Protocol Buffers格式。你可以继续用prometheus-client生成指标,再转换为符合要求的PB格式,也可以直接构造PB数据。SigV4签名处理
AMP依赖AWS SigV4对请求进行身份验证,即使是明文传输的指标,请求本身必须带有合法的SigV4签名。Lambda运行时可以通过其执行角色自动获取权限,无需手动管理密钥,只需确保角色拥有aps:RemoteWrite权限(可直接关联AmazonPrometheusRemoteWriteAccess托管策略)。可行实现方式
方式一:适配第三方库(推荐)
使用支持SigV4的Prometheus远程写入客户端库,比如prometheus-remote-write,它可以自动处理SigV4签名,结合prometheus-client生成指标:
from prometheus_client import CollectorRegistry, Gauge from prometheus_remote_write import RemoteWriteClient, RemoteWriteConfig # 生成自定义指标 registry = CollectorRegistry() lambda_metric = Gauge('lambda_processing_duration', 'Duration of Lambda processing', registry=registry) lambda_metric.set(12.5) # 配置AMP远程写入客户端 config = RemoteWriteConfig( url='https://aps-workspaces.<你的区域>.amazonaws.com/workspaces/<你的工作区ID>/api/v1/remote_write', sigv4=True, sigv4_region='<你的区域>' ) client = RemoteWriteClient(config) # 推送指标到AMP client.push(registry)
方式二:手动构造请求
如果不想依赖第三方库,可以手动序列化指标为PB格式,并用boto3生成SigV4签名后发送HTTP请求:
import boto3 import requests from prometheus_client import CollectorRegistry, Gauge import prometheus_pb2 # 生成指标并转换为PB格式 registry = CollectorRegistry() g = Gauge('lambda_custom_count', 'Custom count metric', registry=registry) g.set(5) # 转换为RemoteWriteRequest write_request = prometheus_pb2.WriteRequest() for metric_family in registry.collect(): ts = prometheus_pb2.TimeSeries() # 添加标签 ts.labels.extend([prometheus_pb2.Label(name='__name__', value=metric_family.name)]) for label_name, label_value in metric_family.labels.items(): ts.labels.extend([prometheus_pb2.Label(name=label_name, value=label_value)]) # 添加样本数据 sample = metric_family.samples[0] ts.samples.extend([prometheus_pb2.Sample( value=sample.value, timestamp=int(sample.timestamp * 1000) )]) write_request.timeseries.append(ts) # SigV4签名请求 session = boto3.Session() signer = session.get_signer('v4') url = 'https://aps-workspaces.<你的区域>.amazonaws.com/workspaces/<你的工作区ID>/api/v1/remote_write' request = requests.Request('POST', url, data=write_request.SerializeToString()) signed_request = signer.sign( request, region_name='<你的区域>', service_name='aps' ) # 发送请求 response = requests.Session().send(signed_request.prepare()) response.raise_for_status()
注意事项
- 确认Lambda执行角色的权限:必须包含对目标AMP工作区的
aps:RemoteWrite动作。 - AMP的远程写入端点格式固定:
https://aps-workspaces.<region>.amazonaws.com/workspaces/<workspace-id>/api/v1/remote_write,替换其中的区域和工作区ID即可。 - 明文指标指的是请求体为未加密的PB格式,但请求本身通过HTTPS传输,确保数据传输安全。
内容的提问来源于stack exchange,提问作者Quân Vi
相关产品推荐
相关产品推荐

