Prometheus接收器
此接收器连接器可用于通过Prometheus的远程写入接口,将数据写入与Prometheus兼容的存储中。
与Prometheus兼容的后端必须支持远程写入1.0标准API,并且远程写入端点必须已启用。
此连接器并非用于将Flink内部指标发送到Prometheus。若要发布Flink指标以监控Flink集群的健康状况和运行情况,应使用指标报告器。
要使用该连接器,请在项目中添加以下Maven依赖项:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-prometheus</artifactId>
<version>1.0.0-1.20</version>
</dependency>
用法
Prometheus接收器提供了一个构建器类,用于构建PrometheusSink
实例。以下代码片段展示了如何使用基本配置和可选的请求签名器构建PrometheusSink
。
PrometheusSink sink = PrometheusSink.builder()
.setPrometheusRemoteWriteUrl(prometheusRemoteWriteUrl)
.setRequestSigner(new AmazonManagedPrometheusWriteRequestSigner(prometheusRemoteWriteUrl, prometheusRegion)) // 可选
.build();
唯一必需的配置是prometheusRemoteWriteUrl
。其他所有配置都是可选的。
如果接收器的并行度大于1,则需要使用PrometheusTimeSeriesLabelsAndMetricNameKeySelector
键选择器对流进行键控,以确保同一时间序列的所有样本都在同一分区中,且顺序不会丢失。更多详细信息,请参阅“接收器并行度和键控流”。
输入数据对象
接收器期望以PrometheusTimeSeries
记录作为输入。在将输入数据发送到接收器之前,必须使用map
或flatMap
操作符将其转换为PrometheusTimeSeries
。
PrometheusTimeSeries
实例是不可变的,不能重复使用。可以使用构建器来创建并填充实例。
一个PrometheusTimeSeries
在发送到远程写入接口时代表单个时间序列记录。每个时间序列记录可能包含多个样本。
在Prometheus的语境中,“时间序列”这个术语有多重含义。它既指具有唯一一组标签的一系列样本(即底层时间序列数据库中的时间序列),也指发送到远程写入接口的记录。一个PrometheusTimeSeries
实例代表发送到该接口的一条记录。
这两个概念是相关的,因为具有相同标签集的时间序列“记录”会被发送到同一个“数据库时间序列”中。
每个PrometheusTimeSeries
记录包含:
- 一个
metricName
:一个字符串,会被转换为__name__
标签的值。 - 零个或多个
Label
条目。每个标签都有一个key
和一个value
,均为String
类型。标签代表样本的额外维度。不允许有重复的标签键。 - 一个或多个
Sample
。每个样本都有一个value
(double
类型)代表测量值,以及一个timestamp
(long
类型)代表测量时间,以从纪元开始的毫秒数表示。同一条记录中不允许有重复的时间戳。
以下伪代码表示PrometheusTimeSeries
记录的结构:
PrometheusTimeSeries
+ --> metricName <String>
+ --> Label [0..*]
+ name <String>
+ value <String>
+ --> Sample [1..*]
+ timestamp <long>
+ value <double>
标签集和metricName
是数据库时间序列的唯一标识符。所有标签和metricName
的组合也是在Flink应用程序内部和上游对数据进行分区时应使用的键,以确保每个时间序列的顺序得以保留。
填充Prometheus时间序列
PrometheusTimeSeries
提供了一个构建器接口。
PrometheusTimeSeries inputRecord =
PrometheusTimeSeries.builder()
.withMetricName(metricName)
.addLabel("DeviceID", instanceId)
.addLabel("RoomID", roomId)
.addSample(measurement1, time1)
.addSample(measurement2, time2)
.build();
每个PrometheusTimeSeries
实例可以包含多个样本。为每个样本调用.addSample(...)
方法。添加样本的顺序会被保留。每条记录中的最大样本数受maxBatchSizeInSamples
配置的限制。
将多个样本聚合到单个PrometheusTimeSeries
记录中可能会提高写入性能。
Prometheus远程写入约束
Prometheus对数据格式和顺序施加了严格的约束。任何包含违反这些约束的记录的写入请求都会被拒绝。
有关这些约束的详细信息,请参阅远程写入规范。
在实际应用中,将数据写入与Prometheus兼容的后端时的行为取决于Prometheus的实现和配置。在某些情况下,这些约束会放宽,违反远程写入规范的写入操作可能会被接受。
因此,此连接器不会直接强制执行任何数据约束。用户有责任将不违反Prometheus实际约束的数据发送到接收器。更多详细信息,请参阅“用户职责”。
顺序约束
远程写入规范要求满足多个顺序约束:
PrometheusTimeSeries
记录中的标签必须按key
的字典顺序排列。PrometheusTimeSeries
记录中的样本必须按timestamp
顺序排列,从旧到新。- 属于同一时间序