Prometheus 快速入门

发布时间 2023-12-12 20:35:56作者: 戴莫先生Study平台

Prometheus&Grafana快速入门

一、prometheus简介

prometheus是监控多个大数据组件的监控系统。Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。

2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。

Prometheus性能也足够支撑上万台规模的集群。

官网:https://prometheus.io/
  • 监控分类

google指出,监控分为白盒监控和黑盒监控之分。

白盒监控:通过监控内部的运行状态及指标判断可能会发生的问题,从而做出预判或对其进 行优化。

黑盒监控:监控系统或服务,在发生异常时做出相应措施。

监控目的是:根据历史监控数据,对为了做出预测。发生异常时,即使报警,或做出相应措施。根据监控报警及时定位问题根源。通过可视化表展示,便于直观获取信息。

image-20231212160825429

二、时序数据库

时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签的数据,带时间标签的数据也称为时间序列数据。

时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测 和预警等功能。

对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据。同时时序数据的 查询也总是会带上时间作为过滤条件。

特点:1、多是写入操作。2、写入操作几乎是时间顺序添加。3、写操作很少写入之前的数据,很少更新数据。4、删除数据一般是区块删除。5、基本数据量大,超过内存大小。6、读操作是典型的升序或降序读。7、高并发读操作十分常见。

应用场景:时间序列数据主要由电力行业、化工行业、气象行业、地理信息等各类型实时监测、检查与分析设 备所采集、产生的数据,这些工业数据的典型特点是:产生频率快(每一个监测点一秒钟内可产生 多条数据)、严重依赖于采集时间(每一条数据均要求对应唯一的时间)、测点多信息量大(常规 的实时监测系统均有成千上万的监测点,监测点每秒钟都产生数据,每天产生几十GB的数据 量)。

  • 举例说明

image-20231212161055094

如图度量是Wind,每一个数据点都具有一个timestamp,两个field:direction和speed,两个tag:sensor、city。

它的第一行和第三行,存放都是sensor号码为95D8-7913的设备,属性城市是上海。

随着时间变化,风向和风速都发生了变化,风向从23.4变成23.2,风速从3.4变成了3.3。

三、软件架构

核心服务:prometheus server它本身就是一款时序数据库,它的数据都存储在磁盘上,它要去拉取数据,基于服务发现找到目标服务器,然后将数据拉取到TSDB,它既然是数据库就要支持数据的查询,PromQL就是查询语言。

读取数据:长声明周期每个任务专门有一个xxxExporter,作用就是收集指标,这个Exporter接口是每个软件自己开发的,根据自己的需要也可以自定义自己的Exporter。短生命周期的任务存活时间不可控,需要任务将自己重要的指标发送给pushGateway。

告警系统:当prometheus的数据达到阈值,就会进行告警,将告警信息推送给alterManager告警系统会发送邮件等信息给管理者。

信息查询:监控监控每隔一段时间使用PromQL查询TSDB,就可以获取最新的任务的执行状况,最终将信息呈现给WebUI或者Grafana。

image-20231212162712728

四、生态圈组件

Prometheus Server 是 Prometheus 组件中的核心部分,负责实现对监控数据的获取,存储以 及查询。

Client Library:客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。

Push Gateway:主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失 了。为此,这次 jobs 可以直接向 Prometheusserver 端推送它们的 metrics。这种方式主要用于 服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。

Exporters:用于暴露已有的第三方服务的 metrics 给 Prometheus。

主要用来采集数据,并通过 HTTP 服务的形式暴露给 Prometheus Server,Prometheus Server 通过访问该 Exporter 提供的接口,即可获取到需要采集的监控数据。常见的Exporter有很 多,例node_exporter、mysqld_exporter、haproxy_exporter 等,支持如 HAProxy、StatsD、 Graphite、Redis 此类的服务监控;

Alertmanager:从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受 方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。

五、数据存储

image-20231212163016525

promethus提供两种存储方式:本地存储和远端存储。

本地存储:一种是本地存储,通过Prometheus自带的TSDB(时序数 据库),将数据保存到本地磁盘,为了性能考虑,建议使用SSD。但本地存储的容量毕竟有限,建 议不要保存超过一个月的数据。Prometheus本地存储经过多年改进,自Prometheus 2.0后提供的V3 版本TSDB性能已经非常高,可以支持单机每秒1000w个指标的收集。

远端存储:适用于大量历史监控数据的存储和查询。通过中间层的适配器的转化, Prometheus将数据保存到远端存储。目前远端存储包括:OpenTSDB、InfluxDB、Elasticsearch、M3DB最受欢迎后端存储是M3DB。

  • 数据模型

prometheus采集到的监控数据均以metric(指标)形式保存在时序数据库中(TSDB),属于同一 指标名称,同一标签集合的、有时间戳标记的数据流。

每一条时间序列由 metric 和 labels 组成,每条时间序列按照时间的先后顺序存储它的样本值。

样本由三部分组成=>指标(metric):指标名称和描述当前样本特征的 labelsets;

时间戳(timestamp):一个精确到毫秒的时间戳;

样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。

image-20231212163430381

  • 指标格式

格式:<指标名>

image-20231212163914526

  • 指标类型

四种核心指标类型:Counter、Gauge、Histogram、Summary

Counter:一种累加的 metric,典型的应用如:请求的个数,结束的任务数, 出现的错误数等等。

Gauge:一种常规的 metric,典型的应用如:温度,运行的 goroutines 的个数。可以任意加减。

Histogram:可以理解为柱状图,典型的应用如:请求持续时间,响应大小。可以对观察结果采样,分组 及统计。

Summary:在客户端直接聚合生成的百分位数,即可以按百分比划分跟踪结果。

六、PromQL

image-20231212164247992

Prometheus数据展现除了自带的WebUI还可以通过Grafana,他们本质上都是通过HTTP + PromQL 的方式查询Prometheus数据。和关系型数据库的SQL类似,Prometheus也内置了数据查询语言 PromQL,它提供对时间序列数据丰富的查询,聚合以及逻辑运算的能力。

七、软件安装

image-20231212164354836

  • 在官网下载好prometheus服务组件。https://prometheus.io/download/

  • 把下载好的软件包上传到root目录下,然后解压到自定义目录中。

tar -zvxf prometheus-2.8.2-linux-arm64.tar.gz - C /usr/local/promethus
  • 修改配置文件
vim /usr/local/promethus/prometheus-2.8.2/prometheus.yml
  • 配置信息如下(由于是yml文件,配置时主要缩进!)
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 192.168.147.110:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/usr/local/prometheus/prometheus-2.30.3.linux-amd64/rules/*.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["192.168.147.110:9090"]
  - job_name: "server_node"
    static_configs:
      - targets: ['192.168.147.120:9100','192.168.147.130:9100','192.168.147.110:9100']
  • 添加环境变量
vim /etc/systemd/system/prometheus.service
  • 配置信息
[Unit]
Description=prometheus
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/prometheus/prometheus-2.30.3.linux-amd64/prometheus \
    --config.file=/usr/local/prometheus/prometheus-2.30.3.linux-amd64/prometheus.yml \
    --storage.tsdb.path=/usr/local/prometheus/prometheus-2.30.3.linux-amd64/data/ \
    --web.enable-lifecycle
[Install]
WantedBy=multi-user.target
  • 重新加载服务
systemctl daemon-reload #重新加载服务
systemctl start prometheus #启动服务
systemctl status prometheus #查看服务状态

image-20231212165357053

浏览器访问:http://192.168.147.110:9090/(进入页面就算配置成功!)

image-20231212165506389

  • Exporter数据采集工具配置

下载 node_exporter-1.2.2.linux-amd64.tar.gz压缩包,上传到所有需要被监控的服务器节点上!官网下载:(https://prometheus.io/docs/instrumenting/exporters/或者https://github.com/prometheus

  • 解压到指定文件目录
 tar -zxvf node_exporter-1.2.2.linux-amd64.tar.gz -C /usr/local/node_exporter/
 ## 分发到其他节点
 rsync -av node_exporter-1.2.2.linux-amd64.tar.gz root@node2:/usr/local/node_exporter/
 rsync -av node_exporter-1.2.2.linux-amd64.tar.gz root@master:/usr/local/node_exporter/
  • 设置开机自启动
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter-1.2.2.linux-amd64/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
  • 加载启动服务
systemctl daemon-reload #重新加载服务
systemctl start node_exporter #启动服务
systemctl status node_exporter #查看服务状态

image-20231212170332384

  • 在prometheus上配置数据拉取
vim /usr/local/promethus/prometheus-2.8.2/prometheus.yml
  • 配置信息(注意缩进)
  - job_name: "server_node"
    static_configs:
      - targets: ['192.168.147.120:9100','192.168.147.130:9100','192.168.147.110:9100']
  • 软件热加载
curl -XPOST http://192.168.147.110:9090/-/reload

image-20231212170616632

  • 在WebUi界面中使用prometheusQL语言查询数据
prometheus_http_request_duration_seconds_bucket{job="prometheus"}

image-20231212170753065

image-20231212170855401

  • 配置告警管理组件

image-20231212170933707

Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除 重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的 模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM 工具。

Prometheus的警报分为两个部分。Prometheus服务器中的警报规则将警报发送到Alertmanager。该 Alertmanager 然后管理这些警报,包括沉默,抑制,聚集和通过的方法,如电子邮件发出通知,对 呼叫通知系统,以及即时通讯平台。

  • 软件安装
#在prometheus中开启告警功能
vim /usr/local/promethus/prometheus-2.8.2/prometheus.yml
  • 配置文件如下
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 192.168.147.110:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/usr/local/prometheus/prometheus-2.30.3.linux-amd64/rules/*.yml"
  • 在prometheus软件根目录下创建rules文件夹
mkdir -p /usr/local/promethus/prometheus-2.8.2/rules

image-20231212171305573

  • 以下为内存大小、磁盘大小、cpu使用率大小、node可用性四个配置文件模板(yml文件注意空格缩进)
## 文件名是node_alived.yml
groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警
    expr: up == 0
    for: 1m
    labels:
      user: prometheus
      severity: warning
    annotations:
      summary: "主机宕机!!"
      description: "该实例主机已经宕机超过一分钟了。"
      
      
      
      
      
## 文件名是:memory_over.yml
groups:
- name: 内存报警规则
  rules:
  - alert: 内存使用率告警
    expr: (1 - (node_memory_MemAvailable_bytes/(node_memory_MemTotal_bytes)))*100 > 50
    for: 1m
    labels:
      user: prometheus
      severity: warning
    annotations:
      summary: "服务器内存不足!"
      description: "服务器内存使用率已经超过百分之50,(当前值:{{$value}}%)"



## 文件名是:cpu_over.yml
groups:
- name: CPU报警规则
  rules:
  - alert: CPU使用率警告
    expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 50
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "CPU使用率正在飙升。"
      description: "CPU使用率超过50%(当前值{{$value}}%)"



## 文件名是:disk_over.yml
groups:
- name: 磁盘使用率报警规则
  rules:
  - alert: 磁盘使用率告警
    expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"}/node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
    for: 20m
    labels:
      severity: warning
    annotations:
      summary: "硬盘分区使用率过高"
      description: "分区使用大于80%(当前值:{{ $value }}%)"

把以上四个文件移动到/usr/local/promethus/prometheus-2.8.2/rules目录下

mv node_alived.yml   /usr/local/promethus/prometheus-2.8.2/rules/
mv memory_over.yml   /usr/local/promethus/prometheus-2.8.2/rules/
mv cpu_over.yml   /usr/local/promethus/prometheus-2.8.2/rules/
mv disk_over.yml   /usr/local/promethus/prometheus-2.8.2/rules/
  • 重启Prometheus热加载
curl -XPOST http://192.168.147.110:9090/-/reload

image-20231212172100661

  • 安装alertmanager

下载alertmanager-0.23.0.linux-amd64.tar.gz上传到服务器,并解压到自定义文件夹中!

tar -zvxf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/altermanager/
  • 配置全局配置文件内容
vim /usr/local/alertmanager-0.23.0.linux-amd64/alertmanager.yml
  • 配置文件内容
global:
  resolve_timeout: 5m #超时,默认5min
  smtp_smarthost: 'smtp.qq.com:465' #邮箱smtp服务
  smtp_from: '187***@qq.com'
  smtp_auth_username: '187***@qq.com'
  smtp_auth_password: '自己填写'
  smtp_require_tls: false
templates:
  - '/usr/local/alertmanager-0.23.0.linux-amd64/template/*.tmpl' # 路径
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'mail'
receivers:
- name: 'mail'
  email_configs:
  - to: '{{ template "email.to" . }}' #接收警报的email
    html: '{{ template "email.to.html" . }}' # 模板
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

  • 创建存放模板文件的目录
mkdir -p /usr/local/alertmanager-0.23.0.linux-amd64/template/
  • 编辑模板文件内容
vim /usr/local/alertmanager-0.23.0.linux-amd64/template/email.tmpl
  • 模板文件内容
{{ define "email.from" }}863****@qq.com{{ end }}
{{ define "email.to" }}54066***@qq.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: yjxxt_prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ .StartsAt.Format "2023-12-12 15:04:05" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
  • 添加环境变量
vim /etc/systemd/system/alertmanager.service

[Unit]
Description=alertmanager
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager-0.23.0.linux-amd64/alertmanager \
--config.file /usr/local/alertmanager-0.23.0.linux-amd64/alertmanager.yml \
--storage.path /usr/local/alertmanager-0.23.0.linux-amd64/data/
[Install]
WantedBy=multi-user.target
  • 加载和启动环境变量
systemctl daemon-reload #重新加载服务
systemctl start alertmanager #启动服务
systemctl status alertmanager #查看服务状态
  • 浏览器访问
http://192.168.147.110:9093

image-20231212173111018

八、Grafana简介

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的
展示,并及时通知。它主要有以下六大特点:
1、展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方
库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;
2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;
3、通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;
4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;
5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;
6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该
数据源的所有查询。

下载地址:https://grafana.com/grafana/download

image-20231212173248126

九、Grafana软件安装

  • 在线安装
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.2.1-1.x86_64.rpm
sudo rpm -Uvh grafana-enterprise-8.2.1-1.x86_64.rpm
  • 本地安装
先在`https://dl.grafana.com/enterprise/release/grafana-enterprise-8.2.1-1.x86_64.rpm`下载grafana-enterprise-8.2.1-1.x86_64.rpm文件上传到服务器上。

## yum 在线安装
yum install localinstall grafana-enterprise-8.2.1-1.x86_64.rpm
  • 访问服务
http://192.168.147.110:3000/

首次登录账户和密码:admin admin
  • 添加数据源

image-20231212174041462

image-20231212174109162

  • 加载可视化界面

image-20231212174330152

  • 查找使用第三方模板

分为用户自定义和模板

推荐使用模板:https://grafana.com/grafana/dashboards/

image-20231212174608201

image-20231212174726019

image-20231212174853366

十、node_exporte配置(附录)

  • 基本信息配置
--web.listen-address=":9100"
#node_exporter监听的端口,默认是9100,若需要修改则通过此参数。
--web.telemetry-path="/metrics"
#获取metric信息的url,默认是/metrics,若需要修改则通过此参数
--log.level="info"
#设置日志级别
--log.format="logger:stderr"
#设置打印日志的格式,若有自动化日志提取工具可以使用这个参数规范日志打印的格式

-----------------------------------------------------------------------------------------
--collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[az]|nvme\\d+n\\d+p)\\d+$"
#通过正则表达式忽略某些磁盘的信息收集
--collector.filesystem.ignored-mount-points="^/(dev|proc|sys|var/lib/docker/.+)
($|/)"
#通过正则表达式忽略某些文件系统挂载点的信息收集
--collector.filesystem.ignored-fs-types="^(autofs|binfmt_misc|bpf|cgroup2?
|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|nsfs|overlay|proc|proc
fs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$"
#通过正则表达式忽略某些文件系统类型的信息收集
--collector.netclass.ignored-devices="^$"
#通过正则表达式忽略某些网络类的信息收集
--collector.netdev.ignored-devices="^$"
#通过正则表达式忽略某些网络设备的信息收集
--collector.netstat.fields="^$"
#通过正则表达式配置需要获取的网络状态信息
--collector.vmstat.fields="^(oom_kill|pgpg|pswp|pg.*fault).*"
#通过正则表达式配置vmstat返回信息中需要收集的选项