Prometheus使用Pushgateway推送数据

Pushgateway简介

Prometheus 的 Pushgateway 是一个简单的 HTTP 服务器,它允许数据被推送到该服务器,而不是通过拉取的方式获取。它的存在是为了让临时和批处理作业能够将其指标暴露给 Prometheus。由于这类作业可能存在的时长不足以被主动抓取,因此它们可以将指标推送到 Pushgateway。随后,Pushgateway 会将这些指标暴露给 Prometheus。

Pushgateway 作为中间件,保存推送的数据直到 Prometheus 抓取。它支持从多个来源推送指标,每个来源都通过唯一的 job 标签来标识,并且可以选择性地附加额外的标签

Pushgateway GitHub 地址:https://github.com/prometheus/pushgateway

安装

要安装 Pushgateway,你可以下载二进制包或使用包管理器,但更推荐使用 Docker。你可以在任何机器上安装 Pushgateway,通常只需要一台 Pushgateway 服务器即可处理来自所有来源的指标。以下是使用 Docker 设置 Pushgateway 的方法:

shell 复制代码
docker pull prom/pushgateway

docker run -d -p 9091:9091 prom/pushgateway

向 Pushgateway 推送指标

向 Pushgateway 推送指标时,你可以使用 curl 命令行工具或者开发自定义应用程序发送 HTTP 请求。此外,还有适用于多种编程语言的第三方库,可简化向 Pushgateway 发送指标的过程。

使用 curl

以下是一个向 Pushgateway 推送单个指标的例子:

shell 复制代码
curl -X POST http://{pushgateway_server}:{port}/metrics/job/myjob/instance/myinstance \
     --data 'my_metric{label="value"} 1.0'

此命令推送了一个名为 my_metric 的指标,其值为 1.0 并带有一个 label 设置为 value 的标签。

使用第三方库

有若干第三方库可以帮助你将 Pushgateway 的功能整合到你的应用程序中。这些库提供了一个更高层次的 API 来发送指标,使得与 Pushgateway 的交互更加容易管理。

例如,在 Python 中,你可以使用 prometheus_client 库,下面是一段实现代码:

python 复制代码
import csv
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway

class PrometheusPusher:
    def __init__(self, metric_name: str, description: str, job_name: str, pushgateway_url: str = 'localhost:9091'):
        """
        Initialize an instance of PrometheusPusher.
        
        :param metric_name: The name of the metric.
        :param description: A description of the metric.
        :param job_name: Job name used to identify the source.
        :param pushgateway_url: URL of the Pushgateway service, default is localhost:9091.
        """
        self.metric_name = metric_name
        self.description = description
        self.job_name = job_name
        self.pushgateway_url = pushgateway_url
        self.registry = CollectorRegistry()
        self.gauge = None

    def create_gauge(self, label_names: list):
        """
        Create a gauge metric with labels.
        
        :param label_names: List of label names.
        """
        self.gauge = Gauge(self.metric_name, self.description, label_names, registry=self.registry)
    
    def push_metrics(self, label_values: list):
        """
        Push the metric value to the Pushgateway.
        
        :param label_values: List of label values.
        """
        if not self.gauge:
            print('Error: Gauge is not created')
            return
        self.gauge.labels(*label_values).set(1)
        try:
            push_to_gateway(self.pushgateway_url, job=self.job_name, registry=self.registry)
            print(f'Successfully pushed metrics for {label_values}')
        except Exception as e:
            print(f'Failed to push metrics for {label_values}. Error: {e}')
    
    def push_metrics_from_csv(self, csv_file_path: str):
        """
        Read data from a CSV file and push metrics.
        
        :param csv_file_path: Path to the CSV file.
        """
        with open(csv_file_path, mode='r') as file:
            reader = csv.reader(file)
            # Get the label names (first row)
            label_names = next(reader)
            self.create_gauge(label_names)
            for row in reader:
                if len(row) != len(label_names):
                    print(f"Warning: Ignoring row with incorrect number of columns: {row}")
                    continue
                self.push_metrics(row)

# Example CSV file format:
# label1, label2
# value1, value2
# ...

# Main entry point
if __name__ == '__main__':
    # Set CSV file path and other parameters
    csv_file_path = 'example_data.csv'
    metric_name = 'example_metric'
    description = 'An example metric for demonstration purposes.'
    job_name = "example_job"
    pushgateway_url = 'slcx-grafana.calix.local:9091'

    # Create an instance of PrometheusPusher and push data from CSV file
    pusher = PrometheusPusher(metric_name, description, job_name, pushgateway_url)
    pusher.push_metrics_from_csv(csv_file_path)
相关推荐
菜鸟挣扎史11 小时前
grafana+prometheus+windows_exporter实现windows进程资源占用的监控
windows·grafana·prometheus·进程·process
牙牙7052 天前
Prometheus结合K8s(二)使用
容器·kubernetes·prometheus
牙牙7053 天前
Prometheus结合K8s(一)搭建
容器·kubernetes·prometheus
福大大架构师每日一题3 天前
32.2 prometheus倒排索引统计功能
ios·iphone·prometheus
让生命变得有价值5 天前
使用 Grafana api 查询 Datasource 数据
grafana·prometheus
福大大架构师每日一题5 天前
31.3 XOR压缩和相关的prometheus源码解读
prometheus
赫萝的红苹果5 天前
Springboot整合Prometheus+grafana实现系统监控
spring boot·grafana·prometheus
Heartsuit5 天前
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
nginx·云原生·nacos·grafana·prometheus·运维监控
Heartsuit5 天前
云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测
云原生·grafana·prometheus·influxdb·telegraf·运维监控
武子康10 天前
大数据-218 Prometheus 插件 exporter 与 pushgateway 配置使用 监控服务 使用场景
大数据·hive·hadoop·flink·spark·prometheus