入门 | Prometheus+Grafana 普罗米修斯

一、prometheus介绍

1、监控系统组成

一个完整的监控系统需要包括如下功能:数据产生、数据采集、数据存储、数据处理、数据展示、分析、告警等。

(1)、数据来源

数据来源,也就是需要监控的数据。数据常见的产生、直接或间接暴露方式如下:

硬件本身的记录信息---以文件或者以内存属性的方式存在

应用业务的接口-- 主动暴露软件本身的运行状态,比如redis info、各种status 等

相关的信息采集工具 --- 方便收集数据或者采集数据的 系统级别的命令等

**注意:**这些数据在长时间的运行过程中,都是以固定的"属性指标"来描述他们,我们把这些称为 metric (监控指标),监控系统就需要对每个环境的每个指标都要进行数据的获取,并且按照用户的需要方式,提供给用户来使用。

(2)、数据采集和传输

对于上面所说的metric指标数据,我们需要持续性、周期性的方式来采集,根据数据采集方式的不同划分了两个分类:

软件层面:

agent:专用的软件的一种应用机制

ssh:系统常见的一种应用通信机制,但是并非所有的系统都支持

SNMP:简单网络管理协议,是工作在各种网络设备中的一种机制

硬件层面:

IPMI:智慧平台管理接口,是一种工业标准用于采集硬件设备的各种物理健康状态数据,如温度、电压、工作状态、电源状态等

**注意:**由于每个业务场景不同,我们需要的采集指标量不好评估,甚至一个业务场景,就需要采集数百个指标,如果按照上述所说的周期性采集的方式来说,数据的采集量是相当大的。

(3)、数据存储

由于采集到是"样本数据" ,不是一次性使用的,尤其是单个数据是没有意义的,我们需要将这些数据存储下来,在后续的工作场景中进行聚合操作,从而满足我们的需求。

我们在后续使用这些数据的时候,不仅仅要知道这些数据,还要知道这些数据的事件属性--什么时候的数据,所以这些数据在存储的时候,必须有一个重要的时间维度,所以我们一般将这种用于监控场景的数据,称为时间序列数据 -- TS,专门用于存储这些数据的数据库,称其为 时序数据库 TSDB

其具备以下特点:

数据结构简单:某一度量指标在某一时间点只会有一个值,没有复杂的结构(嵌套、层次)和关系(关联、主外键)

数据量大:由于时序数据由所监控的大量数据源来产生、收集和发送,比如主机、IoT设备、终端或 APP等

(4)、数据处理

如果仅仅采集到的是单条数据,本身没有太大的意义,我们需要对数据进行各种聚合和处理操作,才可以正常的用于工作分析场景,所以对于各种聚合操作之后的数据,我们也需要进行分析和展示。

(5)、数据分析展示

无论是采集到的时序数据,还是经过聚合分析之后的统计数据,由于数据量巨大,用肉眼观察很难看得清楚,尤其是通过表格来查看成千上万条数据,来分析其内在的逻辑趋势关系,所以对于监控系统来说,其本身的数据可视化功能是非常重要的,以各种图形演示的方式展示我们数据的发展趋势,方便我们进行分析。

(6)、告警

告警,就是在某些特殊情况下,提醒我们去看相关的数据,根据日常工作的状态值,设置一个阈值指标,后续数据采集的时候,一旦超出我们的阈值指标,就通过告警机制通知我们,提高我们的工作效率。

(7)、监控内容

资源监控:

硬件设备:服务器、路由器、交换机、IO系统等

系统资源:OS、网络、容器、VM实例

应用软件:nginx 、MySQL 、Java 应用等

业务服务:

业务状态:服务通信、服务运行、服务下线、性能指标、QPS、DAU日活、转化率、业务接口(登录、注册、聊天、留言)、产品转化率、充值额度、用户投诉等

一般故障:访问缓慢、存储空间不足、数据同步延迟、主机宕机、主机不可达

严重故障:服务不可达、集群故障

趋势分析:

数据统计:时间序列数据展示历史数据等

数据预测:事件什么时候发生、持续时间、发生概率是多大等,比如:电商大促时间

(8)、监控设施实现方式

对于Linux系统来说,他的系统监控的实现方式很多,主要有系统命令、开源软件、监控平台等

系统命令(略)

uptime

开源软件

zabbix、nogios、Prometheus、smoke ping 、cacti

对于传统的业务数据监控来说,Zabbix 是优秀的,由于 Zabbix 诞生的时代业务数据量相对不是太多,所以它默认采取的是关系型数据库作为后端存储。

所以随着业务场景的发展,尤其是微服务、云原生场景的发展,大量数据的存储就成为了 Zabbix 本身的限制。所以就出现了另外一种监控软件 Prometheus。

2、时序数据库

时间序列数据(TimeSeriesData): 按照时间顺序记录系统、设备状态变化的数据被称为时序数据。

时间序列数据库 (Time Series Database , 简称 TSDB) 是一种高性能、低成本、稳定可靠的在线时间序列数据库服务,提供高效读写、高压缩比存储、时序数据插值及聚合计算等服务

特点:

顺序写入操作,很少涉及修改数据

删除操作都是删除一段时间的数据,而不涉及到删除无规律数据,读操作一般都是升序或者降序

高效的压缩算法,节省存储空间,有效降低 IO,存储成本低

高性能读写, 每秒百万级数据点写入,亿级数据点聚合结果秒级返回

3、Prometheus

Prometheus是一个开源的系统监控和报警系统,本身基于Go语言开发的一套开源的系统监控报警框架和时序列数据库(TSDB)。

其特点主要如下:

支持多维数据模型:由度量名和键值对组成的时间序列数据

内置时间序列数据库TSDB(Time Series Database )

支持PromQL(Prometheus Query Language)查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义

支持 HTTP 的 Pull 方式采集时间序列数据

支持 PushGateway 采集瞬时任务的数据

支持静态配置和服务发现两种方式发现目标

多种可视化和仪表盘,支持第三方 Dashboard,比如:Grafana

数据特点:

监控指标采用,独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中很常见。

数据标签,支持多维度标签,每个独立的标签组合都代表一个独立的时间序列

数据处理,Prometheus内部支持多种数据的聚合、切割、切片等功能。

数据存储,Prometheus支持双精度浮点型数据存储和字符串

适用场景:

Prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监控场景,也适合于高度动态的面向服务的体系结构的监控场景。尤其是在微服务世界中,它对多维数据收集和查询的支持是一种特别的优势。

不足:

不支持集群化

被监控集群规模过大后本身性能有一定瓶颈

中文支持不好中文资料也很少

二、Prometheus架构

1、Prometheus架构图

2、架构详解

(1)、Prometheus Server(普罗米修斯服务器)

负责从各种数据源拉取指标数据(metrics pull)以及接收通过 Pushgateway 推送过来的指标数据(alerts push)。

通过 HTTP 与数据源进行交互,包括与各种 exporters(如 Jobs/ Node HDD/SSD 对应的 exporters)以及 targets(目标)通信。

内部包含一个时间序列数据库(TSDB server)用于存储抓取到的指标数据,支持 PromQL(Prometheus 查询语言)进行数据查询和分析。

提供 web UI 供用户查看和管理监控数据。

(2)、Pushgateway(推送网关)

主要用于接收短生命周期作业(Short-lived jobs)的数据推送,因为这些作业可能在 Prometheus 主动抓取数据之前就已经结束了。

将接收到的数据缓存起来,等待 Prometheus Server 来拉取。

(3)、Exporters(导出器)

负责从各种不同的数据源(如 Jobs/ Node HDD/SSD)收集数据,并将其转换为 Prometheus 可以理解的格式进行暴露。

使得 Prometheus 可以监控各种不同类型的系统和应用程序。

(4)、PromQL(Prometheus 查询语言)

用于查询和分析存储在 Prometheus Server 中的时间序列数据。

可以进行复杂的查询操作,例如聚合、过滤、函数计算等。

(5)、Grafana visualization(Grafana 可视化)

Grafana 是一个流行的开源数据可视化工具,可以与 Prometheus 集成。

通过使用 Prometheus 作为数据源,Grafana 可以将 Prometheus 中的监控数据以各种直观的图表和仪表盘形式展示出来。

(6)、Alertmanager(Prometheus 告警)

当监控数据满足特定条件时,可以触发警报。

可以通过 Alertmanager 将警报发送到各种渠道,如 PagerDuty、Email 等,以便及时通知相关人员进行处理。

(7)、API clients(API 客户端)

可以通过 Prometheus 的 API 与 Prometheus Server 进行交互,获取监控数据或者进行管理操作。

(8)、工作流程

Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。

Prometheus server 在本地存储收集到的 metrics,并运行已定义好的alert.rules,记录新的时间序列或者向 Alertmanager 推送警报,实现一定程度上的完全冗余功能。Alertmanager 根据配置文件,对接收到的警报进行去重分组,根据路由配置,向对应主机发出告警。集成Grafana或其他API作为图形界面,用于可视化收集的数据。

为保存数据的拉取效果,当数据量特别大时,会产生一定的延迟。基于promQL语句显示在web、UI上。

(9)、Prometheus数据模型

rometheus中存储的数据为时间序列,即基于同一度量标准或者同一时间维度的数据流。除了时间序列数据的正常存储之外,Prometheus还会基于原始数据临时生成新的时间序列数据,用于后续查询的依据或结果。

metric名字:

该名字必须有意义,用于表示 metric 的一般性功能,metric名字由ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式[a-zA-Z_:][a-zA-Z0-9_:]* 的查询需求。

注意:冒号是为用户定义的记录规则保留的。

标签:

标签是以键值对的样式而存在,不同的标签用于表示时间序列的不同维度标识,方便检索

基本格式:

<metric name>{<label name>=<label value>, ...}

指标类型:

Counter-累计图:

counter是一个累加的计数器,代表一个从0开始累积单调递增的计数器,其值只能在重新启动时增加或重置为零。典型的应用如:用户的访问量,请求的总个数,任务的完成数量或错误的数量等。不能使用Counter来表示递减值。

Gauge- 量规图:

Gauge是一种度量标准,只有一个简单的返回值,或者叫瞬时状态,可以代表可以任意metric的上下波动的数值。通常用于测量值,例如,硬盘剩余空间,当前的内存使用量,一个待处理队列中任务的个数等,还用于可能上升和下降的"计数",例如并发请求数。

Histogram-直方图:

某一段范围内的分布情况

Histogram统计数据的分布情况。比如最小值,最大值,中间值,还有中位数,75百分位,90百分位, 95百分位.98百分位,99百分位,和9.9百分位的值(percenties ,代表着近似的百分比估算数值

三、Prometheus部署

1、脚本安装Prometheus server

下载二进制安装包:

https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz

进行脚本安装:

#!/bin/bash
#
#無爲謂

PROMETHEUS_VERSION=2.54.1
PROMETHEUS_FILE="prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz"
PROMETHEUS_URL="https://mirrors.tuna.tsinghua.edu.cn/github-release/prometheus/prometheus/LatestRelease/${PROMETHEUS_FILE}"
#PROMETHEUS_URL="https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/${PROMETHEUS_FILE}"

INSTALL_DIR=/usr/local

HOST=`hostname -I|awk '{print $1}'`


. /etc/os-release

msg_error() {
  echo -e "\033[1;31m$1\033[0m"
}

msg_info() {
  echo -e "\033[1;32m$1\033[0m"
}

msg_warn() {
  echo -e "\033[1;33m$1\033[0m"
}


color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


install_prometheus () {
    if [ ! -f  ${PROMETHEUS_FILE} ] ;then
        wget ${PROMETHEUS_URL} ||  { color "下载失败!" 1 ; exit ; }
    fi
    [ -d $INSTALL_DIR ] || mkdir -p $INSTALL_DIR
    tar xf ${PROMETHEUS_FILE} -C $INSTALL_DIR
    cd $INSTALL_DIR &&  ln -s prometheus-${PROMETHEUS_VERSION}.linux-amd64 prometheus
    mkdir -p $INSTALL_DIR/prometheus/{bin,conf,data}
    cd $INSTALL_DIR/prometheus && { mv prometheus promtool bin/ ; mv prometheus.yml conf/; }
    groupadd -r prometheus
    useradd -r -g prometheus -s /sbin/nologin prometheus
    chown -R prometheus.prometheus ${INSTALL_DIR}/prometheus/

    cat >  /etc/profile.d/prometheus.sh <<EOF
export PROMETHEUS_HOME=${INSTALL_DIR}/prometheus
export PATH=\${PROMETHEUS_HOME}/bin:\$PATH
EOF

}


prometheus_service () {
    cat > /lib/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
User=prometheus
Group=prometheus
WorkingDirectory=${INSTALL_DIR}/prometheus
ExecStart=${INSTALL_DIR}/prometheus/bin/prometheus --config.file=${INSTALL_DIR}/prometheus/conf/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now prometheus.service
}


start_prometheus() {
    systemctl is-active prometheus
    if [ $?  -eq 0 ];then
        echo 
        color "Prometheus 安装完成!" 0
        echo "-------------------------------------------------------------------"
        echo -e "访问链接: \c"
        msg_info "http://$HOST:9090/"
    else
        color "Prometheus 安装失败!" 1
        exit
    fi
}

install_prometheus

prometheus_service

start_prometheus

Dashboard 菜单说明

Alerts #Prometheus的告警信息菜单

Graph #Prometheus的图形展示界面,这是prometheus默认访问的界面

Status #Prometheus的状态数据界面

Help #Prometheus的帮助信息界面

#Status子菜单,在Status菜单下存在很多的子选项,其名称和功能效果如下:

Runtime& Build Information 服务主机的运行状态信息及内部的监控项基本信息

Command-LineFlags 启动时候从配置文件中加载的属性信息

Configuration配置文件的具体内容(yaml格式)

Rules查询、告警、可视化等数据分析动作的规则记录

Targets监控的目标对象,包括主机、服务等以endpoint形式存在

ServiceDiscovery 自动发现的各种Targets对象列表

2、脚本安装node_exporter

安装 Node Exporter 用于收集各 node 主机节点上的监控指标数据,监听端口为9100

#!/bin/bash
#
#無僞謂

NODE_EXPORTER_VERSION=1.8.2
NODE_EXPORTER_FILE="node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz"
NODE_EXPORTER_URL=https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/${NODE_EXPORTER_FILE}
INSTALL_DIR=/usr/local

HOST=`hostname -I|awk '{print $1}'`


. /etc/os-release

msg_error() {
  echo -e "\033[1;31m$1\033[0m"
}

msg_info() {
  echo -e "\033[1;32m$1\033[0m"
}

msg_warn() {
  echo -e "\033[1;33m$1\033[0m"
}


color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


install_node_exporter () {
    if [ ! -f  ${NODE_EXPORTER_FILE} ] ;then
        wget ${NODE_EXPORTER_URL} ||  { color "下载失败!" 1 ; exit ; }
    fi
    [ -d $INSTALL_DIR ] || mkdir -p $INSTALL_DIR
    tar xf ${NODE_EXPORTER_FILE} -C $INSTALL_DIR
    cd $INSTALL_DIR &&  ln -s node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64 node_exporter
    mkdir -p $INSTALL_DIR/node_exporter/bin
    cd $INSTALL_DIR/node_exporter &&  mv node_exporter bin/

    cat >  /etc/profile.d/node_exporter.sh <<EOF
export NODE_EXPORTER_HOME=${INSTALL_DIR}/node_exporter
export PATH=\${NODE_EXPORTER_HOME}/bin:\$PATH
EOF

}


node_exporter_service () {
    cat > /lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
ExecStart=$INSTALL_DIR/node_exporter/bin/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now node_exporter.service
}


start_node_exporter() {
    systemctl is-active node_exporter.service
    if [ $?  -eq 0 ];then
        echo 
        color "node_exporter 安装完成!" 0
        echo "-------------------------------------------------------------------"
        echo -e "访问链接: \c"
        msg_info "http://$HOST:9100/metrics"
    else
        color "node_exporter 安装失败!" 1
        exit
    fi
}

install_node_exporter

node_exporter_service

start_node_exporter

3、修改配置,使得Prometheus采集node数据

修改配置文件

vim /usr/local/prometheus/conf/prometheus.yml

# my global config
global:
  # 默认情况下,每15s拉取一次目标采样点数据。注释后为1分钟
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  # 每15秒评估一次规则。默认值为每1分钟。
  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:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # job名称会增加到拉取到的所有采样点上,同时还有一个instance目标服务的host:port标签也会增加到采样点上
  - job_name: 'prometheus'

    # 覆盖global的采样点,拉取时间间隔5s
    scrape_interval: 5s
    static_configs:
    - targets: ['localhost:9090']
#添加新的node节点
  - job_name: "node1"
    static_configs:
      - targets: 
        - "192.168.10.110:9100"
-- 插入 --                     

检查配置文件语法是否有误:

新版本可能没有下载这个命令 promtool 可以下载一下:

promtool check config /usr/local/prometheus/conf/prometheus.yml

语法检查无误,重启Prometheus服务

systemctl restart prometheus.service 
相关推荐
惜.己4 小时前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
Java 第一深情4 小时前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft6184 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
PersistJiao5 小时前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
九河云5 小时前
如何对AWS进行节省
大数据·云计算·aws
FreeIPCC6 小时前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源
梦幻通灵6 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客6 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
天冬忘忧7 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
sevevty-seven7 小时前
幻读是什么?用什么隔离级别可以防止幻读
大数据·sql