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: '[email protected]'
    from: '[email protected]'
    smarthost: 'smtp.example.com:587'
    auth_username: '[email protected]'
    auth_identity: '[email protected]'
    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
相关推荐
为美好的生活献上中指6 分钟前
java每日精进 4.29【框架之自动记录日志并插入如数据库流程分析】
java·linux·数据库
mljy.18 分钟前
Linux《进程概念(中)》
linux
JhonKI28 分钟前
【Linux网络】深入解析I/O多路转接 - Select
linux·运维·网络
伤不起bb28 分钟前
Nginx 核心功能
linux·服务器·nginx
The-Dog1 小时前
Linux命令使用记录(自用)
linux
yunson_Liu1 小时前
prometheus通过Endpoints自定义grafana的dashboard模块
贪心算法·grafana·prometheus
识途老码1 小时前
什么是单臂路由
运维·服务器·网络·单臂路由
Linux运维老纪2 小时前
Ansible 铸就 Linux 安全之盾(Ansible Builds Linux Security Shield)
linux·服务器·网络·安全·云计算·ansible·运维开发
唐青枫2 小时前
Linux apropos 命令使用详解
linux
刘大猫.2 小时前
Centos Ubuntu RedOS系统类型下查看系统信息
linux·ubuntu·centos·ip·ifconfig·redos·查询系统信息