我创建了一个将数据从IoT Core传输到AMP(Amazon Managed Service for Prometheus)的Lambda函数
如果能够将IoT数据放入Prometheus,并通过Grafana进行观测,我觉得会很时尚。虽然没有理由。
然而
IoT Core的规则动作中没有Prumetheus(哭)。
2022年4月3日目前可指定的操作如下。

如果没有的话,我决定使用Lambda云计算来创建,并且这就是我创建的。
组成如下。

我会把完成所需进行的各种调查结果作为日志记录下来。
Prometheus采用了拉模型
Prometheus 採用了定期從伺服器端獲取指標的拉取模型。

来源:https://prometheus.io/docs/introduction/overview/
出处:https://prometheus.io/docs/introduction/overview/
FAQ中提到了”Why do you pull rather than push?”,翻译为: “为什么你选择拉而不是推呢?”
当您进行HTTP拉取时,有几个好处。
您可以在笔记本电脑上进行监视,以便在开发更改时进行监视。
您可以更轻松地辨别目标是否已经宕机。
您可以手动访问目标并使用Web浏览器来检查目标的状态。整体而言,我认为拉取略优于推送,但在考虑监控系统时,不应将其视为重要因素。
为了满足需要进行推送的情况,我们提供了PushGateway。
虽然提供了PushGateway,但由于需要设置服务器中继,Lambda本身无法实现。
Prometheus具备远程写入的功能。
Prometheus会通过Pull方式收集指标,同时还提供了remote write功能用于将收集到的指标转发到另一个Prometheus。
远程写入的开发经过在这里详细说明(不知何故在Grafana的博客上)。
链接:https://grafana.com/blog/2021/05/26/the-future-of-prometheus-remote-write/

文章来源:https://grafana.com/blog/2021/05/26/prometheus-remote-write的未来展望。
AWS文档中有关远程写入API的说明。
AWS提供了Prometheus的托管服务,称为Amazon Managed Service for Prometheus(简称AMP)。在AMP的文档中有关于远程写入API的描述。
很抱歉,Boto3目前没有实现与Prometheus兼容的API。你需要通过调用其他API来实现此功能。
再进一步,
请注意
有关请求体语法,请参阅协议缓冲定义,链接地址为:https://github.com/prometheus/prometheus/blob/1c624c58ca934f618be737b4995e22051f5724c1/prompb/remote.pb.go#L64。
什么鬼,Protocol Buffer 是什么东西,以前 AWS 的 API 不都是只发 JSON 的吗?我还不懂 Go 语言。。
首次使用的协议缓冲
在不了解Protocol Buffer是什么的情况下,经过一番调查,我得出了以下的结论,并设法实现了它。
-
- protocol bufferにはスキーマ定義があり、Prometheusのスキーマ定義が先程のリンク先にあるようだ
-
- スキーマ定義をコンパイルして使用するようだ
-
- スキーマ定義はGo言語で書かれているが、他の言語向けにもコンパイルできるようだ
- ネット上にほとんど情報がないが、GitHubに1件だけ情報発見!
git clone --depth 1 https://github.com/prometheus/prometheus.git
cd prometheus/prompb
curl -L --create-dirs https://raw.githubusercontent.com/gogo/protobuf/master/gogoproto/gogo.proto -o gogoproto/gogo.proto
protoc --python_out=/workspace ./*.proto gogoproto/*.proto
以下是使用提供的模式代码。(感谢robskillington先生的贡献。)
需要进行SigV4认证。
因为无法使用Boto3,所以需要自己实施AWS的SigV4认证(虽然自己实施也要依赖库的支持)。
使用requests-aws4auth和botocore实现以下操作后,成功将数据remote write到AMP。
auth = requests_aws4auth.AWS4Auth(
refreshable_credentials=botocore.session.Session().get_credentials(),
region=region, service=service)
response = requests.post(endpoint, headers=headers, auth=auth, data=body)
这是一场漫长的战斗。

如果你方便的话,请随意使用。
顺便提一句
如果不坚持使用Prometheus,我认为可以通过IoT Core -> CloudWatch Metrics -> Grafana 的路径实现,而不需要创建Lambda。