如何使用Pushgateway推送数据

本文介绍如何使用可观测监控 Prometheus 版提供的Pushgateway功能推送数据。

方案概览

如果您的数据源不能或不可以定期被Prometheus Server拉取数据(例如在没有稳定网络连接的环境中),您可以使用Pushgateway推送,数据源会先将监控数据发送到Pushgateway,再由Prometheus Server周期性地获取,实现步骤如下:

  1. 获取Pushgateway地址:通过可观测监控 Prometheus 版控制台获取Pushgateway地址。

  2. 上报数据:使用curl命令或者开源SDK实现数据推送,确保指标数据能够及时、可靠地被Prometheus收集并进行监控。

  3. 增加数据保护配置(可选):标准的Pushgateway协议是不包含数据保护相关内容的,在Pushgateway的SDK中只有基本的Basic Auth,并没有更高级和通用的鉴权实现,即任何客户端一旦获取Pushgateway端点地址,都可以推送数据。在可观测监控 Prometheus 版控制台获取Token,实现标准的JWT鉴权协议,从而保护您的数据安全。

    image

前提条件

已创建Prometheus实例。具体操作,请参见:

步骤一:获取Push Gateway地址

  1. 选择Prometheus实例:登录Prometheus控制台在左侧导航栏单击实例列表,进入可观测监控 Prometheus 版的实例列表页面。单击目标Prometheus实例名称。

    image

  2. 获取Push Gateway 地址:在左侧导航栏,选择设置,然后在设置页签的Push Gateway 地址区域获取公网的URL地址。

    image

步骤二:上报数据

使用开源SDK推送数据

重要
  • 目前数据协议支持Text Format和Protobuf Delimited这两种数据层协议,暂不支持Protobuf Text、Protobuf Compact-Text和Openmetrics这三种协议,SDK一般默认是Protobuf Delimited协议。

  • 目前元数据HELP不支持中文字符,如果HELP中有中文字符会导致数据上报失败。

本文以Go语言和Java语言为例介绍如何使用开源SDK推送指标数据。

Go语言示例如下:

completionTime := prometheus.NewGauge(prometheus.GaugeOpts{
    Name: "db_backup_last_completion_timestamp_seconds",
    Help: "The timestamp of the last successful completion of a DB backup.",
})
completionTime.SetToCurrentTime()
url :   = "https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"
pusher := push.New(url, "test").
    Collector(completionTime).Client(http.DefaultClient).
    Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
    Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
    fmt.Println("Could not push completion time to PushGateway: ", err)
}

Java语言示例如下:

CollectorRegistry registry = new CollectorRegistry();
Gauge duration = Gauge.build()
        .name("my_batch_job_duration_seconds").help("Duration of my batch job in seconds.").register(registry);
Gauge.Timer durationTimer = duration.startTimer();
try {
    // Your code here.

    // This is only added to the registry after success,
    // so that a previous success in the Pushgateway isn't overwritten on failure.
    Gauge lastSuccess = Gauge.build()
            .name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry);
    lastSuccess.setToCurrentTime();
} finally {
    durationTimer.setDuration();
    PushGateway pg = new PushGateway(new URL("https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"));
    pg.pushAdd(registry, "my_batch_job");
}
说明
  • 在您使用开源SDK时,填入从Prometheus监控控制台上获取的Pushgateway地址后,系统会自动补齐类似/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}的后缀,若您使用的不是开源SDK,那么需要您自行拼接后缀,否则会报404错误。

  • 若您需要为可观测监控 Prometheus 版云服务共享租户集群中推送数据,这里要求推送的指标需统一携带tenant_userid=****标签,标签值是该指标隶属的阿里云账号ID(即主账号ID),用于区分指标的隶属关系。

使用curl命令推送数据

重要

目前不支持application/x-www-form-urlencoded类型的Request,在curl命令中,需要增加Header,指定Content-Type: text/plain; version=0.0.4; charset=utf-8

echo "some_metric 3.14" | curl -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" --data-binary @- https://cn-hangzhou.arms.aliyuncs.com/prometheus/51bbea9ck41b9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2/metrics/label_key_1/label_value_1/label_key_2/label_value_2
说明

多个Label可以在URL后面拼接,但需要注意整体URL长度。

步骤三:增加数据保护配置(可选)

  1. 获取token:在左侧导航栏,选择设置,然后在设置页签的Token区域单击生成token

    image

  2. 传递token:生成Token后,您可以看到具体的Token值,有以下两种方式传递Token。

    • 方式一:将Token设置到客户端请求Header里,即可正常的推送数据,否则系统会拒绝数据写入。Header的设置如下图所示:vr

    • 方式二:由于在Pushgateway的SDK里只有基本的Basic Auth,并没有支持JWT。如果想要完全使用SDK并实现鉴权,可以使用BasicAuth接口,将Password设置为Token,服务侧兼容了这种鉴权方式。使用第一种方式有一定的开发成本。这里以Go语言SDK为例。

      pusher := push.New(url, "test").
              Collector(completionTime).Client(http.DefaultClient).
              Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
              .BasicAuth("admin", "实际token值").
              Format(expfmt.FmtProtoDelim)

结果验证

您可以通过Grafana查询数据是否成功推送。

  1. 进入ApiServer大盘:在左侧导航栏,选择大盘列表,然后单击名称为ApiServer的大盘超链接,系统会跳转至大盘页面。

  2. 选择Explore查看数据:在大盘页面的左侧导航栏将鼠标悬停在eu图标上(图标①),并在弹框中单击Explore,然后在Explore页面右侧的下拉框中(图标②)选择对应Explore查看数据是否推送成功。

    wt