参考: pushgatewy GITHUB

我们都知道prometheus是主动的向被监控端拉取监控数据的,如果有需要向prometheus推送数据只能通过pushgateway的方式。

我们可以使用Prometheus监控到们大部分的应用和主机,但是总有会一些监控数据是无法通过在主机节点上部署一个exporter就能解决的。

比如我这边在工作中就遇到监控oracle的相关数据时就比较很不好监控,一些监控所需要的数据需要通过sql语句才能获得到。所以这边使用pushgateway可以很好的解决我的问题。

下载和安装

1
2
3
4
5
6
# 下载
cd /usr/local/src
wget https://github.com/prometheus/pushgateway/releases/download/v1.2.0/pushgateway-1.2.0.linux-amd64.tar.gz
# 安装
tar xvf pushgateway-1.2.0.linux-amd64.tar.gz -C /usr/local
ln -sv /usr/local/pushgateway-1.2.0.linux-amd64 /usr/local/pushgateway

启动和配置

启动和服务

启动

1
2
3
#可以直接启动
/usr/local/pushgateway 
# 默认是在前台启动 监听的端口为9091

pushgateway命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
usage: pushgateway [<flags>]

The Pushgateway

Flags:
  -h, --help                    
      --web.listen-address=":9091"    监控的地址和端口
      --web.telemetry-path="/metrics"   获得metrics的路径
      --web.external-url=        The URL under which the Pushgateway is externally reachable.
      --web.route-prefix=""      Prefix for the internal routes of web endpoints. Defaults to the path of --web.external-url.
      --web.enable-lifecycle    可以通过http来关闭pushgateway
      --web.enable-admin-api    启动admin api
      --persistence.file=""      指定存储的文件 默认存储在内存中,如果pushgateway异常,重启则数据不会被保留
      --persistence.interval=5m  指定存储的文件更新的频率
      --push.disable-consistency-check   不要检查推送的度量标准的一致性 这个参数比较危险 
      --log.level=info         日志级别
      --log.format=logfmt        Output format of log messages. One of: [logfmt, json]
      --version                  Show application version.

使用systemctl来启动,脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ vim /usr/lib/systemd/system/pushgateway.service
[Unit]
Description=pushgateway
After=network.target
[Service]
LimitCORE=infinity
LimitNOFILE=65535
LimitNPROC=65535
Type=simple
User=prometheus
Group=prometheus
ExecStart=/usr/local/pushgateway/pushgateway --web.enable-lifecycle --web.enable-admin-api --persistence.file=/usr/local/pushgateway/metrics_data --persistence.interval=3m
Restart=on-failure
[Install]
WantedBy=multi-user.target

上面启动脚本我们指定了 本地存储位置和更新时间

启动

1
2
3
4
5
systemctl daemon-reload 
systemctl start pushgateway.service
systemctl status pushgateway.service  # 查看状态
 systemctl enable pushgateway.service  # 开机自动启动
journalctl -xf -u pushgateway.service # 查看日志

也可以使用docker来启动 详细参数github地址

数据推送

pushgateway 提供了数据推送接口 即 http://:9091/metrics 通过PUT 或 POST方法推送数据 DELETE可删除数据

格式如下:

http://:9091/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}

具体可以参考官网或其他文章。这里给出prometheus与pushgateway的配置

1
2
3
4
5
6
  - job_name: 'pushgateway'
    honor_labels: true
    static_configs:
      - targets: ['192.168.1.100:9091']
        labels:
          group: 'pushgateway'

honor_labels: true 如果不配置则为false 。 此配置的说明 官方有很详细的说明: About the job and instance labels 和prometheus的 scrape_config

当不配置时或为false时 我们通过api 推送我们的监控数据,如下所示:

1
echo "test_metric 123456" | curl --data-binary @- http://192.168.1.100:9091/metrics/job/test_job

不过我们会发现,除了 test_metric 外,同时还新增了 push_time_secondspush_failure_time_seconds 两个指标,这两个是 PushGateway 系统自动生成的相关指标

我们prometheus查询的结果:

test_metric{exported_job="test_job",instance="pushgateway",job="pushgateway"}

为了使用推送的上来的job和instance 不被 prometheus本身监控pushgateway的标签数据覆盖则需要设置

honor_labels: true

官网或网络上介绍的都是curl的命令来推送数据的,下面来使用reqeusts来推送数据。

使用python的requests来推送数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# -*- coding: utf-8 -*-
import requests

PUSH_GATEWAY_URL = 'http://192.168.1.100:9091/metrics'


def push_metrics(metric_name, value, job, instance, labels: dict, type_str: str = None):
    """
    把数据push到prometheus上进行监控
    :param metric_name: 监控项名称
    :param value: 值 只能为数字
    :param job: 对应的job
    :param instance: 实例名,一般为ip地址
    :param labels: 标签
    :param type_str: 监控数据说明可为空 --> # TYPE some_metric counter/gauge
    :return:
    """
    headers = {
        'X-Requested-With': 'Python requests',
        'Content-type': 'text/xml'
    }
    # 组合访问地址
    url = f"{PUSH_GATEWAY_URL}/job/{job}/instance/{instance}"
    if labels:
        for k, v in labels.items():
            url += f"/{k}/{v}"

    payload = f"{type_str}\n{metric_name} {value}\n"

    response = requests.request("POST", url, headers=headers, data=payload)
    if response.status_code == 200:
        return True
    else:
        return False


def delete_metrics(job, instance, labels: dict):
    """
    删除指定的job和实例的数据
    :param job: 对应的job
    :param instance: 实例名,一般为ip地址
    :param labels: 标签
    :return:
    """

    headers = {
        'X-Requested-With': 'Python requests',
        'Content-type': 'text/xml'
    }

    # 组合访问地址
    url = f"{PUSH_GATEWAY_URL}/job/{job}/instance/{instance}"
    if labels:
        for k, v in labels.items():
            url += f"/{k}/{v}"

    response = requests.request("DELETE", url, headers=headers)
    if response.status_code == 202:
        return True
    return False

还可以python 的 prometheus_client 这个涉猎的不多。如果需要可自行在官方文档上学习。