Prometheus概述

  • Prometheus是一套开源的监控&报警&时间序列数据库的组合。适合监控docker容器,因为k8s的流行带动了Prometheus的发展;
  • 时间序列数据:按照时间顺序记录系统、设备状态变化的数据被称为时序数据;
  • 时间序列数据特点
    性能好:关系型数据库对于大规模数据的处理性能糟糕。NOSQL(泛指非关系型的数据库)可以比较好的处理大规模数据,但依然比不上时间序列数据库;
    存储成本低:高效的压缩算法,节省存储空间,有效降低IO;Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概花了200多G;

Prometheus架构图

  • 官网:https://prometheus.io/docs/introduction/overview/

存储计算层

Prometheus Server,里面包含了存储引擎和计算引擎
Retrieval组件为取数组件,他会主动从Pushgateway或者Exporter拉取指标数据;
Service discovery,可以动态发现要监控的目标;
TSDB,数据核心存储与查询
HTTP server,对外提供HTTP服务

采集层

采集层分为两类,一类是生命周期较短的作业,还有一类是生命周期较长的作业。
短作业:直接通过API,在退出的时候,指标推送给Pushgateway;
长作业:Retrieval组件直接从job或者Exporter拉取数据;

应用层

应用层主要分为两种,一种是AlertManager,另一种是数据可视化
AlertManager
对接Pagerduty,是一套付费监控报警系统,可实现短信报警、5分钟无人 ack打电话通知、依然无人ack,通知值班人员Manager
数据可视化
Prometheus build-in WebUI
Grafana
其他基于API开发的客户端

环境准备

克隆虚拟机

prometheus 监控rediscluster prometheus 监控数据库_grafana

Prometheus服务器           192.168.111.100    Prometheus.glodon.cn
grafana服务器              192.168.111.101    grafana.glodon.cn
被监控服务器                192.168.111.102    apiServer.glodon.cn

初始化服务器

IP地址、hostname主机名称、绑定/etc/hosts文件、时间同步(重要)

IP地址

prometheus 监控rediscluster prometheus 监控数据库_java_02

vim /etc/sysconf/network-scripts/ifcfg-ens33
BOOTPROTO=dhcp-->none/static
uuid                          因为3台虚拟机是克隆的,所以保证3台服务器uuid不一致
PREFIX=22                     子网掩码,要和本机子网掩码保持一致
IPADDR=192.168.111.100        给虚拟机设置虚拟IP
GATEWAY=192.168.111.254       虚拟机网关,要和本机网关保持一致
DNS1=114.114.114.114          DNS服务器
DNS2=223.5.5.5                备用DNS服务器

VMWare配置

针对wifi的设置(有线的话可以不用关注这里)

prometheus 监控rediscluster prometheus 监控数据库_服务器_03


prometheus 监控rediscluster prometheus 监控数据库_prometheus_04

hostname主机名称

hostnamectl set-hostname prometheus.glodon.cn
hostnamectl set-hostname apiServer.glodon.cnwojiu
hostnamectl set-hostname grafana.glodon.cn
使用命令su切换

绑定/etc/hosts文件

192.168.111.100 prometheus prometheus.glodon.cn
192.168.111.101 grafana grafana.glodon.cn
192.168.111.102 apiServer apiServer.glodon.cn

时间同步(重要)

prometheus 监控rediscluster prometheus 监控数据库_grafana_05

mount /dev/cdrom /mnt
yum install ntpdate -y
ntpdate cn.ntp.org.cn
使用date命令来校验

安装prometheus

上传安装包到linux服务器

解压并安装软件

安装目录:/usr/local/prometheus
cd /usr/local
tar -zxvf prometheus-2.36.2.linux-amd64.tar.gz
mv prometheus-2.36.2.linux-amd64 prometheus

启动prometheus

cd /usr/local/prometheus
启动prometheus服务
nohup ./prometheus --config.file="/usr/local/prometheus/prometheus.yml" --web.enable-admin-api --web.listen-address=:9090 >/dev/null 2>&1 &
关闭防火墙
systemctl stop firewalld

测试端口占用情况

判断是否真正的启动了 lsof -i:9090

web端访问prometheus

http://服务器IP:9090访问prometheus的主界面

prometheus 监控rediscluster prometheus 监控数据库_grafana_06

系统默认监控自己的主机信息,监控接口:通过http://服务器IP:9090/metrics可以查看到监控数据

prometheus 监控rediscluster prometheus 监控数据库_grafana_07

prometheus通过关键字查看监控项:process_cpu_secords_total

prometheus 监控rediscluster prometheus 监控数据库_java_08

监控远程Linux主机

node组件介绍:在远程linux主机上安装node_exporter组件(这样prometheus就可以接收到其收集系统)

上传软件包到linux服务器中

安装wget
yum install -y wget
使用wget下载node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz

解压安装node_exporter组件

cd /usr/local
tar -zxvf node_exporter-1.2.2.linux-am
mv node_exporter-1.2.2.linux-amd64.tar.gz node_exporter

启动node_exporter收集linux主机信息

cd /usr/local/node_exporter
nohup ./node_exporter &
扩展:nohup命令:如果把启动node_exporter的终端给关闭,那么进程随之也会关闭。nohup命令会帮助你解决这个问题
关闭防火墙
systemctl stop firewalld

查看端口占用情况

lsof -i:9100 端口被占用说明服务启动成功

web端访问node_exporter

http://服务器IP:9090访问linux主机信息

prometheus 监控rediscluster prometheus 监控数据库_java_09

通过浏览器访问http://被监控端IP:9100/metrics就可以看到node_exporter被监控端收集的监控信息

prometheus 监控rediscluster prometheus 监控数据库_prometheus_10

prometheus配置node_exporter的信息

cd /usr/local/prometheus/
vi prometheus.yml          具体添加信息如下图
kill -9 pid(prometheus的进程ID)
lsof -i:9090               确认端口没有进程占用
再次启动prometheus
nohup ./prometheus --config.file="/usr/local/prometheus/prometheus.yml" --web.enable-admin-api --web.listen-address=:9090 >/dev/null 2>&1 &
lsof -i:9090               确认端口被占用,说明重启成功
systemctl stop firewalld   关闭防火墙

prometheus 监控rediscluster prometheus 监控数据库_grafana_11

回到web管理界面–点击status–点击targets可以看到多了一台监控目标

prometheus 监控rediscluster prometheus 监控数据库_服务器_12

安装grafana

grafana简介:grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析、查询、然后进行可视化的展示,并能实现报警;

上传安装包到Linux服务器

使用命令下载
wget https://dl.grafana.com/oss/release/grafana-7.1.3-1.x86_64.rpm
官网下载
下载地址:https://grafana.com/grafana/download

安装grafana

安装服务
yum -y install grafana-7.1.3-1.x86_64.rpm

启动grafana

服务启动
service grafana-server start
关闭防火墙
systemctl stop firewalld

测试端口占用情况

监听grafana的默认端口3000
lsof -i:3000

web访问Grafana

http://192.168.111.101:3000/

prometheus 监控rediscluster prometheus 监控数据库_grafana_13

Grafana默认账号密码

用户名:admin

密码:admin

首次登录需要修改默认密码

grafana配置prometheus数据展示

prometheus 监控rediscluster prometheus 监控数据库_服务器_14

prometheus 监控rediscluster prometheus 监控数据库_grafana_15

导入官方模板:8919、9276(建议使用此模板)

prometheus 监控rediscluster prometheus 监控数据库_grafana_16

prometheus 监控rediscluster prometheus 监控数据库_服务器_17

prometheus 监控rediscluster prometheus 监控数据库_prometheus_18

grafana+onealert报警

prometheus 监控rediscluster prometheus 监控数据库_prometheus_19

prometheus 监控rediscluster prometheus 监控数据库_服务器_20

prometheus 监控rediscluster prometheus 监控数据库_java_21


优点:可以免费发送告警邮件

prometheus 监控rediscluster prometheus 监控数据库_数据_22

prometheus 监控rediscluster prometheus 监控数据库_服务器_23

生成的告警信息

模拟CPU过高的代码

安装java环境
yum -y list java*
yum install java-1.8.0-openjdk.x86_64
java -version

执行java命令

javac CPU.java
java CPU

具体代码

import java.util.HashSet;

public class CPU {

    private static HashSet hashSet = new HashSet();
    public static void main(String[] args) {
        cpuHigh();
        addHashSetThread();
    }

    public static void addHashSetThread(){
        new Thread(() -> {
            int count = 0;
            while (true){
                try{
                    hashSet.add("count" + count);
                    Thread.sleep(10000);
                    count++;
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void cpuHigh(){
        new Thread(() ->{
            while (true){
                System.out.println("666~");
            }
        }).start();
    }
}

模拟CPU高的命令

cat /dev/urandom | md5sum