9个稳定版本
1.7.1 | 2023年11月17日 |
---|---|
1.6.1 | 2023年1月22日 |
1.6.0 | 2022年9月26日 |
1.5.1 | 2022年7月11日 |
1.1.0 | 2021年10月25日 |
#81 在 认证 中
每月 23次下载
65KB
1K SLoC
Gravel Gateway
Gravel Gateway是一个FAAS应用程序的Prometheus推送网关。特别是,它允许通过传入的指标来控制聚合,从而为您的指标可以遵循的语义提供了更大的灵活性。一般来说,Gravel Gateway作为一个标准的聚合推送网关运行 - 默认情况下,除了Gauges之外的所有内容都是 sum
,例如,如果您推送了三次,那么Prometheus将抓取
# TYPE value_total counter
value_total 1
# TYPE value2 gauge
value2 1
...
# TYPE value_total counter
value_total 3
# TYPE value2 gauge
value2 1
Gravel Gateway的不同之处在于,它允许您指定特殊的 clearmode
标签来指定指标是如何聚合的。
我们目前支持三个不同的 clearmode
值 - aggregate
(非Gauges的默认值),replace
(Gauges的默认值),以及提供诸如语义之类的信息的 family
。作为一个实际例子,如果我们推送
# TYPE value_total counter
value_total 1
# TYPE value2 gauge
value2{clearmode="aggregate"} 1
# TYPE version gauge
version{version="0.0.1",clearmode="family"} 1
然后
# TYPE value_total counter
value_total 3
# TYPE value2 gauge
value2{clearmode="aggregate"} 1
# TYPE version gauge
version{version="0.0.2",clearmode="family"} 1
(注意已更改的版本标签),Prometheus将抓取
# TYPE version gauge
version{version="0.0.2"} 1
# TYPE value2 gauge
value2 2
# TYPE value_total counter
value_total 4
计数器的值将被替换,仪表的值将被累加,版本值将完全替换旧版本。您还会注意到,clearmode标签被网关移除 - 它不包括在Prometheus抓取的指标中。因此,此聚合过程对Prometheus来说是完全透明的。
使用方法
Prometheus Gravel Gateway
USAGE:
gravel-gateway [FLAGS] [OPTIONS]
FLAGS:
--cluster-enabled
Whether or not to enable clustering
-h, --help
Prints help information
-V, --version
Prints version information
OPTIONS:
--basic-auth-file <basic-auth-file>
The file to use for basic authentication validation.
This should be a path to a file of bcrypt hashes, one per line,
with each line being an allowed hash.
-l <listen>
The address/port to listen on [default: localhost:4278]
--peer <peers>...
The address/port of a peer to connect to
--peers-file <peers-file>
The SRV record to look up to discover peers
--peers-srv <peers-srv>
The SRV record to look up to discover peers
--tls-cert <tls-cert>
The certificate file to use with TLS
--tls-key <tls-key>
The private key file to use with TLS
要使用,运行网关
gravel-gateway
然后您可以对 /metrics 发送POST请求以推送指标
echo '# TYPE value_total counter
value_total{clearmode="replace"} 3
# TYPE value2 gauge
value2{clearmode="aggregate"} 1
# TYPE version gauge
version{version="0.0.2",clearmode="family"} 1' | curl --data-binary @- localhost:4278/metrics
并将Prometheus指向它以抓取
global:
scrape_interval: 15s
evaluation_interval: 30s
scrape_configs:
- job_name: prometheus
honor_labels: true
static_configs:
- targets: ["127.0.0.1:4278"]
认证
Gravel Gateway支持(伪)基本认证(具有auth功能)。要使用,填写一个包含bcrypt散列的文件,每行一个,例如
htpasswd -bnBC 10 "" supersecrets | tr -d ':\n' > passwords
然后启动指向该文件的gravel-gateway
gravel-gateway --basic-auth-file ./passwords
除非请求包含有效的 Authorization
标头,否则将对POST /metrics端点的请求进行拒绝
curl https://127.0.0.1:4278/metrics -vvv --data-binary @metrics.txt -u :supersecrets
TLS
TLS由 tls-key
和 tls-cert
参数提供。两者都是启动TLS服务器所必需的,分别代表私钥和展示的证书。
集群
为了水平扩展网关,您可以使用集群技术。Gravel网关通过维护由静态列表、SRV记录或文件提供的对等节点哈希环来支持集群。当请求到来时,如果启用了集群,则作业标签会被哈希处理,以生成该作业的“权威”节点,并且请求将相应地转发。因此,该节点成为唯一一个将暴露该作业指标的节点。
要启用集群,请使用cluster-enabled
标志,并提供发现机制。例如:
./gravel-gateway --cluster-enabled --peer localhost:4279 --peer localhost:4280
./gravel-gateway --cluster-enabled -l localhost:4279 --peer localhost:4278 --peer localhost:4280
./gravel-gateway --cluster-enabled -l localhost:4280 --peer localhost:4278 --peer localhost:4279
启动三个Gravel网关实例,使它们可以相互转发请求
鹅卵石
有时,对于仪表盘,您可能不只想跟踪您的值之一(仪表盘的默认值是“替换”)。例如,如果我们有一个内存使用量翻倍的新版本,那么我们可能想知道这种增加,而不想让它受到前一个版本数周的影响。对于这种情况,Gravel网关支持“鹅卵石”。鹅卵石实际上是基于时间的环形缓冲区桶。每个桶代表一个独立的时间段,并跟踪该时间段内的预聚合值。该指标的最终值是应用于每个桶的相同聚合。
这意味着我们实际上得到了一个“聚合的聚合”结果,这相对于存储所有原始数据会丢失一些精度,但在实践中这对我们影响不大。
您可以使用以下形式的clearmode启动鹅卵石:<aggregation><time>
,例如:{clearmode="mean5m"}
将对过去5分钟的传入数据进行平均值计算。目前可用的聚合包括“总和”和“平均值”,但“中值”即将推出,也许“百分位数”会是一个好的提案。
动机
我最近在一篇博客中写到了我在一个FAAS(函数即服务)系统中尝试编排Prometheus时的挫败感。我的主要挫败感是我试图从我的Prometheus指标中提取的语义数量太多了,而您可以用它们携带的数据是有限的。特别是,我有三个语义试图驱动:
- 聚合计数器 - 像请求数量这样的东西。FAAS应用程序通常只处理一个请求,因此每个都向网关发送一个1,我想将这些聚合为所有调用的总请求数量。
- 非聚合仪表盘 - 在一般情况下,聚合仪表盘没有太多意义,因此我想能够向网关发送仪表盘值,并使它们替换旧值
- 信息值 - 像构建信息这样的东西。当一个新标签集到来时,我想能够替换所有旧的标签集,例如,从
{version="0.1"}
升级到{version="0.2"}
时,应该替换{version="0.1"}
标签集。
现有的网关,如prom-aggregation-gateway或pushgateway,在聚合方面都是非此即彼——pushgateway完全不进行聚合,完全替换传入的值。聚合网关则相反——它聚合一切。我想要的是一种允许在聚合指标方面有更多灵活性的东西。为此,我编写了Gravel网关
依赖项
~13–29MB
~413K SLoC