Prometheus

1、Prometheus 介绍

Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发并开源。它专注于在大规模分布式系统中收集时间序列数据,例如服务器指标、应用程序性能数据等。Prometheus具有高度灵活的查询语言PromQL,能够实时查询收集的数据,并支持强大的图形化展示和警报功能。它通常与Grafana等工具配合使用,用于可视化和分析监控数据。

1.1安装就不详细说明了

bash 复制代码
# 1、包安装

[root@ubuntu2204 ~]#apt -y install  prometheus

# 2、二进制安装
下载包,安装就可以了(不会可以私信我)


# 3、容器安装

#直接启动容器
[root@ubuntu:~]# apt install docker.io
[root@ubuntu:~]# docker pull prom/prometheus
[root@ubuntu:~]# docker run -d --name prometheus -p 9090:9090 prom/prometheus

#用自己的配置文件启动容器
#把容器里的配置文件复制出来,自己修改一下(定制容器)
[root@ubuntu:~]# docker cp prometheus:/etc/prometheus/prometheus.yml .
[root@ubuntu:~]# docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml   prom/prometheus

2、Prometheus 组件

1、Prometheus Server

Prometheus Server 是核心组件,负责收集和存储时间序列数据,执行数据查询、聚合和存储。它可以通过 HTTP 协议暴露指标和查询 API,并通过配置的数据源定期抓取数据。

2、PromQL (Prometheus Query Language)

PromQL 是 Prometheus 的查询语言,用于从 Prometheus 中获取和分析时间序列数据。它支持丰富的操作符和函数,允许用户执行复杂的数据查询和聚合操作。

3、Exporters

Exporters 是用于从各种系统和服务中收集指标数据的组件。它们作为中间件,将数据转换成 Prometheus 可以理解的格式,并通过 HTTP 端点暴露给 Prometheus Server。常见的 Exporters 包括 Node Exporter、cAdvisor、Blackbox Exporter 等,每个用于不同类型的系统或服务监控。

4、Alertmanager

Alertmanager 是用于处理和管理 Prometheus 生成的警报的组件。它能够根据配置的规则对接收到的警报进行路由、抑制和通知处理,并支持多种通知方式(如电子邮件、企业微信、钉钉 等)。

5、Pushgateway

Pushgateway 是一种中介服务,用于短期作业和临时任务的指标收集。它允许客户端将指标推送到 Pushgateway,然后由 Prometheus Server 定期抓取这些指标。适用于一些短生命周期的任务,如批处理作业或定时任务。

6、Grafana Integration

虽然不是 Prometheus 自身的组件,但 Grafana 是一个流行的开源数据可视化和监控工具,广泛与 Prometheus 集成。Grafana 提供了强大的仪表板和查询功能,可以直观地展示 Prometheus 收集的指标数据。

3、PromQL

Prometheus Query Language (PromQL) 是一种强大的查询语言,用于从Prometheus服务器中检索和处理时间序列数据。它支持许多操作和函数,使得用户可以灵活地分析和聚合监控数据。

bash 复制代码
1、基本查询:使用指标名称和可选的标签过滤器来检索时间序列数据。

示例:up{job="node"} 表示检索所有 job 标签为 "node" 的 up 指标数据。

-------------------------------------------------------------------------------------

2、聚合函数:PromQL 提供各种聚合函数,如 sum、avg、min、max 等,用于计算时间序列数据的汇总值。

示例:avg(rate(http_requests_total[5m])) 表示计算最近5分钟内 HTTP 请求速率的平均值。

-------------------------------------------------------------------------------------

3、操作符:支持数学和逻辑操作符,如 +、-、*、/、==、!= 等,用于在查询中进行计算和比较。

示例:node_memory_MemTotal_bytes - node_memory_MemFree_bytes 表示计算内存总量和空闲内存之间的差异。

-------------------------------------------------------------------------------------

4、范围选择:通过时间范围选择符号 [ ] 和 { },可以指定查询的时间范围和步长。

示例:rate(http_requests_total{job="api"}[5m]) 表示计算最近5分钟内 API job 的 HTTP 请求速率。

-------------------------------------------------------------------------------------

5、向量匹配:支持根据标签匹配的方式对多个时间序列进行操作和过滤。

示例:sum(rate(http_requests_total{job=~"api|frontend"}[5m])) 表示计算 API 和 frontend job 的 HTTP 请求速率之和。

4、Prometheus 标签管理

标签(Labels)是对时间序列数据进行维度化和区分的重要元素。有效的标签管理可以帮助你组织和查询监控数据。

bash 复制代码
1、标签基础:

标签键(Label Key):标签的名称部分,例如 job、instance。
标签值(Label Value):与标签键关联的具体值,例如 node-exporter, localhost:9090。


2、标签在查询中的作用:

标签允许你对时间序列进行分类和过滤,例如通过 job="node-exporter" 来选择所有与 Node Exporter 相关的时间序列数据。


3、标签最佳实践:

选择合适的标签:选择具有代表性和描述性的标签键和值,这样可以更容易地组织和理解数据。
避免过多标签:尽量避免定义过多的标签,以免增加查询和存储的复杂性。
标签命名规范:建立良好的标签命名规范,例如使用小写字母、下划线或短划线分隔单词,以确保一致性和可读性。

------------------------------------------------------------------------------------

示例

1.定义和配置标签

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
        labels:
          environment: 'prod'     # 标签
          datacenter: 'us-east-1' # 标签


2.在查询中使用标签

up{job="node", environment="prod"}


3.标签在告警规则中的使用

groups:
- name: example
  rules:
  - alert: InstanceDown
    expr: up{job="node"} == 0
    for: 5m
    labels:
      severity: 'critical'
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

在这个例子中,如果某个 job 是 node 的实例 up 指标值为 0 并且持续5分钟,将会触发 InstanceDown 告警

5、告警通知

Prometheus 的告警通知系统基于 Alertmanager 来管理告警的处理和发送。

bash 复制代码
1、配置告警规则

在 Prometheus 的配置文件(例如 prometheus.yml)中,定义一个告警规则文件,并在告警规则文件中定义告警规则:

rule_files:
  - 'alert.rules.yml'

groups:
- name: example
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: 'critical'
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

alert 定义了告警名称 InstanceDown。
expr 定义了触发告警的条件:当 up 指标为 0 时。
for 定义了触发告警的持续时间:条件满足 5 分钟后触发告警。
labels 定义了告警的标签,用于标识告警的严重程度等信息。
annotations 定义了告警的附加信息,例如摘要和描述。

-------------------------------------------------------------------------------------

2、配置 Alertmanager

global:
  resolve_timeout: 5m

route:
  receiver: 'default'
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h

receivers:
- name: 'default'
  email_configs:
  - to: 'your-email@example.com'
    from: 'alertmanager@example.com'
    smarthost: 'smtp.example.com:587'
    auth_username: 'your-email@example.com'
    auth_identity: 'your-email@example.com'
    auth_password: 'your-password'


global 配置了全局设置,例如告警解决的超时时间。
route 定义了告警的路由规则,包括接收器、分组方式、等待时间、重复间隔等。
receivers 定义了告警的接收器,这里配置了一个电子邮件接收器。

-------------------------------------------------------------------------------------


3、 将 Prometheus 与 Alertmanager 集成

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 'localhost:9093'  # Alertmanager 的地址

6、服务发现

Prometheus 的服务发现(Service Discovery)功能使得它可以自动发现和监控目标服务,而无需手动配置所有监控目标。这对于动态和大规模的环境(如Kubernetes、Consul、EC2等)特别有用。

  • 静态配置(Static Configuration)
  • DNS 服务发现(DNS Service Discovery)
  • 文件服务发现(File Service Discovery)
  • Consul 服务发现(Consul Service Discovery)

1、静态配置

bash 复制代码
静态配置是最简单的服务发现方式,直接在Prometheus配置文件中指定目标服务。

prometheus.yml:

scrape_configs:
  - job_name: 'static'
    static_configs:
      - targets: ['localhost:9090', 'localhost:9100']

2、DNS 服务发现

bash 复制代码
通过DNS服务发现,可以根据DNS记录动态发现目标。

scrape_configs:
  - job_name: 'dns'
    dns_sd_configs:
      - names:
          - 'my-service.example.com'  # 需要解析的 DNS 名称
        type: 'A'                     # DNS 记录类型 (A 记录)
        port: 9100                    # 目标服务的端口

3、文件服务发现

bash 复制代码
通过文件服务发现,可以将目标列表放在一个文件中,Prometheus会定期检查该文件的变化。

targets.json:

[
  {
    "targets": ["localhost:9090", "localhost:9100"],
    "labels": {
      "env": "prod"
    }
  }
]


prometheus.yml:

scrape_configs:
  - job_name: 'file'
    file_sd_configs:
      - files:
          - 'targets.json'

4、Consul 服务发现

bash 复制代码
Consul 是一个服务网格解决方案,Prometheus可以通过它来发现服务。

scrape_configs:
  - job_name: 'consul'
    consul_sd_configs:
      - server: 'localhost:8500'
        services: []

7、各种 Exporter

Prometheus的exporter是用于导出不同系统和服务的监控指标的组件。exporter通过特定的接口或协议收集系统的性能数据,并以Prometheus可以读取的格式暴露这些数据。

1、Node_exporter

bash 复制代码
# 做如下实现,需提前安装 node_exporter
# 官网下载安装
https://github.com/prometheus/node_exporter/releases 

--collector.systemd               #显示当前系统中所有的服务状态信息
--collector.systemd.unit-include  #仅仅显示符合条件的systemd服务条目
--collector.systemd.unit-exclude  #显示排除列表范围之外的服务条目

1、修改 node_exporter 的配置文件

[root@node01:~]# vim /lib/systemd/system/node_exporter.service 
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/node_exporter/bin/node_exporter  --collector.systemd --collector.systemd.unit-include=".*(ssh|mysql|node_exporter|nginx).*"   #包含nginx,ssh,mysql,node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=prometheus
Group=prometheus

[Install]
WantedBy=multi-user.target

#重启node_exporter服务
systemctl daemon-reload
systemctl restart node_exporter.service


2、修改 Prometheus 配置

#修改prometheus的配置文件,让它自动过滤文件中的节点信息
[root@prometheus:~]# vim /usr/local/prometheus/conf/prometheus.yml
scrape_configs:
  - job_name: "node_exporter_service"
    static_configs:
      - targets: ["node01.zgh.org:9100"]

#重启服务
systemctl reload prometheus.service
相关推荐
bingbingyihao2 分钟前
Linux安装ftp、Java的FTP上传下载文件工具类
java·linux·centos
krb___15 分钟前
Gitlab代码管理工具安装配置
linux·服务器·gitlab
噫吁嚱!!!1 小时前
Linux安装elasticsearch单机版
linux·运维·ubuntu
lshzdq1 小时前
【CMake】基本概念和快速入门
linux·运维·服务器
爱技术的小伙子1 小时前
Linux 磁盘管理与分区:使用fdisk、parted、df、du等命令管理磁盘和分区
linux·运维·服务器
Java小白白同学1 小时前
Linux:CentOS 系统磁盘扩容操作
linux·服务器·centos
wanhengwangluo1 小时前
徐州服务器租用:论带宽的作用有哪些
运维·网络安全·数据安全
不喜欢就睡大觉1 小时前
Linux—网络设置
linux·运维·服务器
Roc-xb1 小时前
使用ifconfig命令获取当前服务器的内网IP地址
运维·服务器·tcp/ip
qq_1778036221 小时前
Windows系统服务器远程教程
运维·服务器·云计算·ddos·ip