本文介绍如何使用Prometheus监控提供的Pushgateway功能。

前提条件

背景信息

阿里云Prometheus监控目前支持Pushgateway功能,您可以使用标准的Pushgateway API,结合阿里云Prometheus监控和开源SDK通过Push模式投递指标。

步骤一:获取Pushgateway地址

Pushgateway地址形如https://cn-heyuan.arms.aliyuncs.com/prometheus/${password}/${userid}/${clusterid}/cn-heyuan/api/v2,您可以通过以下步骤找到相关的Pushgateway地址。

  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表,进入Prometheus监控的实例列表页面。
  3. 单击目标Prometheus实例名称。
  4. 在左侧导航栏单击设置,然后在设置页签的Push Gateway 地址区域获取公网的URL地址。
    重要 Prometheus监控控制台提供的Pushgateway地址是配合开源SDK使用的。在您使用开源SDK时,填入从Prometheus监控控制台上获取的Pushgateway地址后,系统会自动补齐类似/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}的后缀,若您使用的不是开源SDK,那么需要您自行拼接后缀,否则会报404错误。
    vr

步骤二:上报数据

重要

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

使用curl命令推送数据

您可以使用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 @- http://57.103.xx.xx:8080/prometheus/4b5e7a2ba963e873883be2c679****/167010063102****/ezruh4raaa/cn-heyuan/api/v2/metrics/job/some_job

使用开源SDK推送数据

获取Pushgateway地址之后,您就可以使用开源SDK来推送指标数据,这里以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 :="http://47.113.xx.xx:8080/prometheus/"+password+"/16701006310*****/ezruh4raaa/cn-heyuan/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("http://57.103.xx.xx:8080/prometheus/4b5e7a2ba963e873883be2c679****/167010063102****/ezruh4raaa/cn-heyuan/api/v2"));
            pg.pushAdd(registry, "my_batch_job");
        }
说明 若您需要为Prometheus监控云服务共享租户集群中推送数据,这里要求推送的指标需统一携带tenant_userid=****标签,标签值是该指标隶属的阿里云账号ID(即主账号ID),用于区分指标的隶属关系。

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

标准的Pushgateway协议是不包含数据保护相关内容的,即任何客户端一旦获取Pushgateway端点地址,都可以推送数据,对于对安全级别要求较高的场景,这可能无法符合要求。
说明 由于数据保护并非标准的Pushgateway协议的一部分,因此在Pushgateway的SDK中只有基本的Basic Auth,并没有更高级和通用的鉴权实现。

阿里云Prometheus监控实现了标准的JWT鉴权协议,可以保护您的数据安全。JWT鉴权协议的开启方式非常简单,您可以在Prometheus监控控制台或者通过OpenAPI开启鉴权,获取Token,这里为您介绍如何在Prometheus监控控制台获取Token。

  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表,进入Prometheus监控的实例列表页面。
  3. 单击目标Prometheus实例名称。
  4. 在左侧导航栏单击设置,然后在设置页签的Token区域单击生成token
    ey
    生成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. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表,进入Prometheus监控的实例列表页面。
  3. 单击目标Prometheus实例名称。
  4. 在左侧导航栏单击大盘列表,然后单击名称为ApiServer的大盘超链接,系统会跳转至大盘页面。
  5. 在大盘页面的左侧导航栏将鼠标悬停在eu图标上(图标①),并在弹框中单击Explorer,然后在Explorer页面右侧的下拉框中(图标②)选择对应Explorer查看数据是否推送成功。
    wt