#prometheus #prometheus-metrics #open-metrics #push-gateway

app gravel-gateway

FAAS应用程序的Prometheus推送网关

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次下载

LGPL-3.0

65KB
1K SLoC

Gravel Gateway

Crates.io

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-keytls-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指标中提取的语义数量太多了,而您可以用它们携带的数据是有限的。特别是,我有三个语义试图驱动:

  1. 聚合计数器 - 像请求数量这样的东西。FAAS应用程序通常只处理一个请求,因此每个都向网关发送一个1,我想将这些聚合为所有调用的总请求数量。
  2. 非聚合仪表盘 - 在一般情况下,聚合仪表盘没有太多意义,因此我想能够向网关发送仪表盘值,并使它们替换旧值
  3. 信息值 - 像构建信息这样的东西。当一个新标签集到来时,我想能够替换所有旧的标签集,例如,从{version="0.1"}升级到{version="0.2"}时,应该替换{version="0.1"}标签集。

现有的网关,如prom-aggregation-gatewaypushgateway,在聚合方面都是非此即彼——pushgateway完全不进行聚合,完全替换传入的值。聚合网关则相反——它聚合一切。我想要的是一种允许在聚合指标方面有更多灵活性的东西。为此,我编写了Gravel网关

依赖项

~13–29MB
~413K SLoC