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

如何通过Lambda函数向AMP推送自定义明文指标?

Lambda明文推送指标到AMP的可行方案与问题解决

可以通过Lambda以明文形式向AMP推送指标,但需要满足AMP的远程写入规范并处理AWS SigV4签名认证——这也是你用prometheus-client失败的核心原因:默认的prometheus-client远程写入逻辑没有适配AWS的SigV4签名机制,导致请求被AMP拒绝。

关键要点与解决步骤

  1. 指标格式要求
    AMP兼容Prometheus的远程写入协议,指标需要序列化为remote.WriteRequest的Protocol Buffers格式。你可以继续用prometheus-client生成指标,再转换为符合要求的PB格式,也可以直接构造PB数据。

  2. SigV4签名处理
    AMP依赖AWS SigV4对请求进行身份验证,即使是明文传输的指标,请求本身必须带有合法的SigV4签名。Lambda运行时可以通过其执行角色自动获取权限,无需手动管理密钥,只需确保角色拥有aps:RemoteWrite权限(可直接关联AmazonPrometheusRemoteWriteAccess托管策略)。

  3. 可行实现方式

方式一:适配第三方库(推荐)

使用支持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:58:25