prometheus

 


Prometheus部署

主机名 IP地址 CPU 内存 磁盘 角色
prometheus-server31 10.0.0.31 1C 1G 20G+ Prometheus server
prometheus-server32 10.0.0.32 1C 1G 20G+ Prometheus server
prometheus-server33 10.0.0.33 1C 1G 20G+ Prometheus server
prometheus-node41 10.0.0.41 1C 512M 20G+ node-exporter
prometheus-node42 10.0.0.42 1C 512M 20G+ node-exporter
prometheus-node43 10.0.0.43 1C 512M 20G+ node-exporter
alermanager51 10.0.0.51 1C 512M 20G+ alermanager
pushgateway61 10.0.0.61 1C 512M 20G+ pushgateway

0.概述

什么是Prometheus:
Prometheus是一个开源的系统监控和报警系统,它启发与Google的borgmon监控系统,在一定程度上开源理解为,Google BorgMon监控系统的开源版本。

该软件由工作在SoundClound的前Google员工在2012年创建,作为社区开源项目进行开发,并于2015年正式成立。

2016年,Prometheus正式加入CNCF(Clound Native Computing Foundation),成为继kubernetes之后第二个CNCF托管的项目,现广泛用于在容器和微服务领域中得到了广泛的应用,当然不仅限于此。

2018年8月9日prometheus称为CNCF继kubernetes之后毕业的第二个项目。

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

Prometheus的监控能功能很完善和全面,性能也足够支持上万台规模的集群。



推荐阅读:
    云原生CNCF官网:
        https://landscape.cncf.io/

    Prometheus的GitHub地址:
        https://github.com/prometheus/prometheus

    Prometheus的官网地址:
        https://prometheus.io/


2.Prometheus主要特点
	- 支持多维数据模型,由度量名称和键值对组成的时间序列;

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

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

	- 支持http的pull方式采集时间序列数据;

	- 支持pushGateway采集瞬时任务的数据;

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

	- 不依赖存储,数据可以本地保存也可以远程保存;

	- 平均每个采样点仅占3.5bytes,且一个prometheus server可以处理数百万级别的metrics指标数据;

	- 易于横向伸缩;

	- 众多官方和第三方的exporter实现不同的指标数据收集;


3.Prometheus数据特点
- 监控指标:
采用独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中很常见;

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

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

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

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

	Prometheus的设计旨在提高可靠性,使其成为中断期间要使用的系统,以使您能够快速诊断问题。每个Prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务。当基础结构的其他部分故障时,您可以依靠它,并且无需广泛的基础结构即可使用它。

	由于Prometheus重视可靠性,在故障情况下,我们可以查看有关系统的可用统计信息,但是如果您需要100%的准确性,则Prometheus并不是一个不错的选择,因为所收集的数据可能不会足够详细和完整。在这种情况下,最好使用其他系统来收集和分析数据以进行计费,并使用Prometheus进行其余监视。


5.为什么要使用Prometheus
	容器监控的实现对比虚拟机或者物理机来说有比较大的区别,比如容器在k8s环境中可以任意横向扩容与缩容,那么就需要监控服务能够自动对新创建的容器进行监控,当容器删除后又能及时的从监控服务中删除,而传统的zabbix的监控方式需要在每一个容器中安装并启动zabbix agent,并且在容器自动发现注册及模板关联方面并没有比较好的实现方式。




- prometheus架构图解
- Prometheus:
时间数据存储,监控指标管理。

- 可视化:
Prometheus Web UI: 集群状态管理,PromQL。
Grafana: 非常全面的可视化套件。

- 数据采集:
Exporter: 为当前的客户端暴露出符合Prometheus规则的数据指标,Exporter以守护进程的模式运行并开始采集数据,Exporter本身也是一个http_server可以对http请求作出响应返回数据(K/V形式的metrics)。

- 监控目标:
服务发现: file,DNS,Kubernete,Consul,custom Integration,...

- 告警:
alertmanager


Prometheus由几个主要软件包组成,其职责如下:
- Prometheus Server:
彼此独立运行,仅依靠其本地存储来实现其核心功能,抓取时序数据,规则处理和报警等。

- Prometheus targets:
静态收集的目标服务数据。

- service discovery:
动态服务发现。

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

- Push Gateway:
exporter采集型已经很丰富,但是依然需要很多自定义的监控数据,由pushgateway可以实现自定义的监控数据,任意灵活想做什么都可以做到。
exporter的开发需要使用真正的编程语音,不支持shell这种脚本,而pushgateway开发却容易的多。
pushgateway主要用于短期的jobs,由于这类jobs存在时间较短,可能是Prometheus来pull之前就消失了。为此,这次jobs可以直接向Prometheus server端推送它们的metrics,这种凡是主要用于服务层面的metrics,对于机器层面的metrics,需要使用node exporter。

- Exporters:
部署第三方软件主机上,用于暴露已有的第三方服务的metrics给Prometheus。

- Altermanager:
从Prometheus Server端接收到alters后,会进行去除重复数据,分组,并路由到对应的接收方式,以高效向用户完成告警信息发送。常见的方式有: 电子邮件,pagerduty,OpsGenie,Webhook等一些其他的工具。

- Data Visualization:
Prometheus Web UI(Prometheus Server内置的界面),Grafana(第三方可视化组件,需要单独部署)。

- Server Discovery:
动态发现待监控的Target,从而完成监控配置的重要组件,在容器化环境中尤为有用,该组件目前由Prometheus Server内建支持。


上述组件中,大多数都是用Go编写的,因此易于构建和部署为二进制文件。


参考地址:
    https://prometheus.io/docs/introduction/overview/
    https://github.com/prometheus/prometheus

1. prometheus-server部署

- prometheus的部署方式
7.1.包安装 
RHEL系统: 
参考链接: 
https://packagecloud.io/app/prometheus-rpm/release/search

Ubuntu和Debian:
可以直接使用apt命令安装即可。

7.2 二进制部署
参考链接: 
https://prometheus.io/download


7.3 基于docker部署 
参考链接:
https://prometheus.io/docs/prometheus/latest/installation

7.4 基于kubernetes operator安装
参考链接:
https://github.com/coreos/kube-prometheus


7.5 基于helm部署
需要单独安装helm组件,K8S集群。

7.6 手动部署prometheus server到K8S集群
需要编写资源清单文件 。

	# ubuntu系统
[root@prometheus-server31 ~]# uname -r
5.15.0-78-generic
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      dhcp4: false
      addresses: [10.0.0.31/24]
      gateway4: 10.0.0.254
      nameservers:
        addresses: [223.5.5.5,223.6.6.6]
  version: 2
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# cat /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
[root@prometheus-server31 ~]# 




参考链接:
	https://developer.aliyun.com/mirror/ubuntu
	
	
	
- 二进制安装prometheus server
	1.下载软件包
[root@prometheus-server31 ~]# wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz


	
- 使用shell一键部署prometheus server 
[root@prometheus-server33 ~]# cat install-prometheus.sh 
#!/bin/bash

VERSION=2.45.3
SOFTWARE=prometheus-${VERSION}.linux-amd64.tar.gz
URL=https://github.com/prometheus/prometheus/releases/download/v${VERSION}/${SOFTWARE}
DOWNLOAD=./download
INSTALLDIR=/jiaxing/softwares
BASEDIR=${INSTALLDIR}/prometheus-${VERSION}.linux-amd64

# 判断目录是否存在,若不存在则创建
[ -d $INSTALLDIR ] || mkdir -pv ${INSTALLDIR}
[ -d $DOWNLOAD ] || mkdir -pv ${DOWNLOAD}

# 判断系统是否安装wget
# [ -f /usr/bin/wget ] || yum -y install wget

# 判断文件是否存在,若不存在则下载
[ -s ${DOWNLOAD}/${SOFTWARE} ] || wget $URL -O ${DOWNLOAD}/${SOFTWARE}

if [ $? -eq 0 ]; then
  # 解压文件软件包
  tar xf ${DOWNLOAD}/${SOFTWARE} -C ${INSTALLDIR}

  # 生成启动脚本
cat > /etc/systemd/system/prometheus-server.service <<EOF
[Unit]
Description=Jiaxing Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
ExecStart=${BASEDIR}/prometheus \
    --config.file=${BASEDIR}/prometheus.yml \
    --web.listen-address="0.0.0.0:9090" \
    --storage.tsdb.path="/jiaxing/data/prometheus" \
    --storage.tsdb.retention.time=30d \
    --web.enable-lifecycle
ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

  # 将服务设置为开机自启动
  systemctl daemon-reload
  systemctl enable --now prometheus-server
  systemctl status prometheus-server
fi
[root@prometheus-server33 ~]# 

2. node-exporter部署

- 部署node exporter 
	1.下载软件包 
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz


- 基于脚本一键部署node-exporter
[root@prometheus-node42 ~]# cat install-node-exporter.sh 
#!/bin/bash

VERSION=1.7.0
SOFTWARE=node_exporter-${VERSION}.linux-amd64.tar.gz
URL=https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/${SOFTWARE}
DOWNLOAD=./download
INSTALLDIR=/jiaxing/softwares
BASEDIR=${INSTALLDIR}/node_exporter-${VERSION}.linux-amd64

# 判断目录是否存在,若不存在则创建
[ -d $INSTALLDIR ] || mkdir -pv ${INSTALLDIR}
[ -d $DOWNLOAD ] || mkdir -pv ${DOWNLOAD}

# 判断系统是否安装curl
# [ -f /usr/bin/wget ] || apt update && apt -y install wget

# 判断文件是否存在,若不存在则下载
[ -s ${DOWNLOAD}/${SOFTWARE} ] || wget $URL -O ${DOWNLOAD}/${SOFTWARE}

if [ $? -eq 0 ]; then
  # 解压文件软件包
  tar xf ${DOWNLOAD}/${SOFTWARE} -C ${INSTALLDIR}

  # 生成启动脚本
cat > /etc/systemd/system/node-exporter.service <<EOF
[Unit]
Description=Jiaxing Node Exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
ExecStart=${BASEDIR}/node_exporter --web.listen-address=:9100

[Install]
WantedBy=multi-user.target
EOF

  # 将服务设置为开机自启动
  systemctl daemon-reload
  systemctl enable --now node-exporter.service
fi

[root@prometheus-node42 ~]# 
[root@prometheus-node42 ~]# bash install-node-exporter.sh 

	6.访问node-exporter的WebUI
http://10.0.0.42:9100/metrics

3. 监控node-exporter

- prometheus监控node-exporter 
	1.修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...

  - job_name: "oldboyedu-node-exporter"
    static_configs:
    - targets: 
      - "10.0.0.41:9100"
      - "10.0.0.42:9100"


	2.检查配置文件
[root@prometheus-server31 ~]# /jiaxing/softwares/prometheus-2.45.3.linux-amd64/promtool check config /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
Checking /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
 SUCCESS: /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml is valid prometheus config file syntax

[root@prometheus-server31 ~]# 


	3.配置环境变量
[root@prometheus-server31 ~]# cat /etc/profile.d/prometheus.sh
#!/bin/bash

export PROMETHEUS_HOME=/jiaxing/softwares/prometheus-2.45.3.linux-amd64/
export PATH=$PATH:$PROMETHEUS_HOME
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# source /etc/profile.d/prometheus.sh
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# promtool check config $PROMETHEUS_HOME/prometheus.yml 
Checking /oldboyedu/softwares/prometheus-2.45.3.linux-amd64//prometheus.yml
 SUCCESS: /oldboyedu/softwares/prometheus-2.45.3.linux-amd64//prometheus.yml is valid prometheus config file syntax

[root@prometheus-server31 ~]# 


	4.重新加载配置
方式一:
[root@prometheus-server31 ~]# systemctl restart prometheus

方式二: (无需重启服务,启动prometheus时需要"--web.enable-lifecycle")
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload

 
	5.访问prometheus server WebUI
http://10.0.0.31:9090/targets
	
	6.查询数据
node_cpu_seconds_total
	
	
温馨提示:
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
Lifecycle API is not enabled.


出现如上所示的字样,说明咱们的prometheus server服务启动时未启用"--web.enable-lifecycle"参数。

3. prometheus metrics type

-  prometheus metrics type
prometheus监控中采集过来的数据统一称为Metrics数据,其并不是代表具体的数据格式,而是一种统计度量计算单位。

当我们需要为某个系统或者某个服务做监控时,就需要使用到metrics。

prometheus支持的metrics包括但不限于以下几种数据类型:
	guage:
		最简单的度量指标,只是一个简单的返回值,或者叫瞬时状态。
		比如说统计硬盘,内存等使用情况。
	
	couter:
		就是一个计数器,从数据量0开始累积计算,在理想情况下,只能是永远的增长,不会降低(有特殊情况,比如粉丝量)。
		比如统计1小时,1天,1周,1一个月的用户访问量,这就是一个累加的操作。
		
	histograms:
		是统计数据的分布情况,比如最小值,最大值,中间值,中位数等,代表的是一种近似百分比估算数值。
		通过histograms可以分别统计处在一个时间段(1s,2s,5s,10s)内nginx访问用户的响应时间。
		
	summary:
		summary是histograms的扩展类型,主要弥补histograms不足。

4. PromQL

-  PromQL初体验
2.2.1 查看某个特定的key
node_cpu_seconds_total
 

2.2.2 查看某个节点的指标
node_cpu_seconds_total{instance="10.0.0.41:9100"}

 

2.2.3 查看某个节点的某刻CPU的某种状态
node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}
 

2.2.4 查询最近10s内某个节点CPU的某种状态时间

node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}[10s]
 


2.2.5 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,非空闲状态使用的总时间

node_cpu_seconds_total{mode!="idle",cpu="0", instance="10.0.0.42:9100"}[1m]
 

2.2.6 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,mode名称以字母"i"开头的所有CPU核心。

node_cpu_seconds_total{mode=~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m]

   
2.2.7 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,mode名称不是以字母"i"开头的所有CPU核心。
node_cpu_seconds_total{mode!~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m]

 
 
 
 
- 2.3 Prometheus常用的函数
2.3.1 increase
increase函数:
	用来针对counter数据类型,截取其中一段时间总的增量。
	
	
举个例子:
	increase(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.42:9100"}[1m])
		统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,空闲状态使用的总时间增量。

 

2.3.2 sum
sum函数:
	加和的作用。
	
	
举个例子:
 sum(increase(node_cpu_seconds_total{mode="idle",cpu="0"}[1m]))
		统计1分钟内,使用标签过滤器查看所有节点的第0颗CPU,空闲状态使用的总时间增量,并将返回结果累加。



2.3.3 by

by函数:
	将数据进行分组,类似于MySQL的"GROUP BY"。
	
	
举个例子:
	sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
		统计1分钟内,使用标签过滤器查看CPU空闲状态,并将结果进行累加,基于instance进行分组。




2.3.4 rate
rate函数:
	它的功能是按照设置的时间段,取counter在这个时间段中平均每秒的增量。
	
	
举个例子:
	rate(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.42:9100"}[1m])
		统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,空闲状态使用的每秒的增量。
		

 
		
increase和rate如何选择:
	(1)对于采集数据频率较低的场景建议使用increase函数,因为使用rate函数可能会出现断点,比如针对硬盘容量监控。
	(2)对于采集数据频率较高的场景建议使用rate函数,比如针对CPU,内存,网络流量等都是可以基于rate函数来采集等。

2.3.5 topk
topk函数:
	取前几位的最高值,实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。
	
举个例子:
	topk(3, rate(node_cpu_seconds_total{mode="idle"}[1m]))
		统计1分钟内,使用标签过滤器查看CPU,所有状态使用的每秒的增量,只查看前3个节点。

 

2.3.6 count

count函数:
	把数值符合条件的,输出数目进行累加加和。
	比如说企业中有100台服务器,如果只有10台服务器CPU使用率高于80%时候是不需要报警的,但是数量操作70台时就需要报警了。
	
举个例子:
	count(oldboyedu_tcp_wait_conn > 500):
		假设oldboyedu_tcp_wait_conn是咱们自定义的KEY。
		若TCP等待数量大于500的机器数量就判断条件为真。

	count(rate(node_cpu_seconds_total{cpu="0",mode="idle"}[1m]))
		对统计的结果进行计数。

 

2.3.7 其他函数
推荐阅读:
	https://prometheus.io/docs/prometheus/latest/querying/functions/

5. Grafana部署

- 基于grafana实现数据的展示和查询:
	1.基于Ubuntu安装grafana
apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb
dpkg -i grafana-enterprise_10.3.1_amd64.deb



	2.启动服务 
systemctl daemon-reload
systemctl enable --now grafana-server

监控zookeeper-云原生应用

1.prometheus监控zookeeper集群

- prometheus server监控zookeeper集群
	1.修改zookeeper的配置文件
[root@elk91 ~]# vim /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg 
...
# https://prometheus.io Metrics Exporter
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpHost=0.0.0.0
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
[root@elk91 ~]# 


	2.将配置同步到其他节点
[root@elk91 ~]# scp /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg  elk92:/oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg

[root@elk91 ~]# scp /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg  elk93:/oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg


	3.启动zookeeper集群
[root@elk91 ~]# managaer-zk.sh start


	4.检查各节点的Metrics状态
[root@elk91 ~]# curl -s http://10.0.0.93:7000/metrics | tail -1
learner_handler_qp_size_sum{key="92",} 3.0
[root@elk91 ~]# 
[root@elk91 ~]# 
[root@elk91 ~]# curl -s http://10.0.0.92:7000/metrics | tail -1
startup_txns_loaded_sum 2.0
[root@elk91 ~]# 
[root@elk91 ~]# 
[root@elk91 ~]# curl -s http://10.0.0.91:7000/metrics | tail -1
# TYPE learner_handler_qp_size summary
[root@elk91 ~]# 


	5.修改prometheus server配置监控
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "oldboyedu-zookeeper"
    static_configs:
    - targets:
      - "10.0.0.91:7000"
      - "10.0.0.92:7000"
      - "10.0.0.93:7000"


	6.重新加载prometheus的配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload


	7.验证prometheus的WebUI是否成功监控target
http://10.0.0.31:9090/targets


	8.grafana导入模板
10465

2.servicemonitor监控etcd

三.Prometheus监控云原生应用etcd案例
1.测试ectd metrics接口
	1.查看etcd证书存储路径
[root@master231 yinzhengjie]#  egrep "\--key-file|--cert-file" /etc/kubernetes/manifests/etcd.yaml 
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --key-file=/etc/kubernetes/pki/etcd/server.key
[root@master231 yinzhengjie]#  


	2.测试etcd证书访问的metrics接口
[root@master231 yinzhengjie]#  curl -s --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key https://10.0.0.231:2379/metrics -k | tail
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes 1.8446744073709552e+19
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 4
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 yinzhengjie]# 

2.etcd Service创建
	1.创建etcd的service
[root@master231 01-etcd]# cat etcd-svc.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  name: etcd-k8s
  namespace:  kube-system
subsets:
- addresses:
  - ip: 10.0.0.231
  ports:
  - name: https-etcd
    port: 2379
    protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: etcd-k8s
  namespace: kube-system
  labels:
    apps: etcd
spec:
  ports:
  - name: https-etcd
    port: 2379
    targetPort: 2379
  type: ClusterIP
[root@master231 01-etcd]# 
[root@master231 01-etcd]# kubectl apply -f etcd-svc.yaml
endpoints/etcd-k8s created
service/etcd-k8s created
[root@master231 01-etcd]# 
[root@master231 01-etcd]# kubectl get svc -n kube-system -l apps=etcd
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
etcd-k8s   ClusterIP   10.200.10.2   <none>        2379/TCP   22s
[root@master231 01-etcd]# 
[root@master231 01-etcd]# kubectl -n kube-system describe svc etcd-k8s  | grep Endpoints
Endpoints:         10.0.0.231:2379
[root@master231 01-etcd]# 



	2.基于创建的svc访问测试连通性
[root@master231 01-etcd]# curl -s --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key https://10.200.10.2:2379/metrics -k | tail -5
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 3
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 01-etcd]# 


	3.创建etcd证书的secrets并挂载到Prometheus server
3.1.查找需要挂载etcd的证书文件路径
[root@master231 01-etcd]# egrep "\--key-file|--cert-file|--trusted-ca-file" /etc/kubernetes/manifests/etcd.yaml
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
[root@master231 01-etcd]# 

	
	
	2.根据etcd的实际存储路径创建secrets
[root@master231 yinzhengjie]# kubectl create secret generic etcd-tls --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key  --from-file=/etc/kubernetes/pki/etcd/ca.crt -n monitoring 
secret/etcd-tls created
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl -n monitoring get secrets etcd-tls 
NAME       TYPE     DATA   AGE
etcd-tls   Opaque   3      12s
[root@master231 yinzhengjie]# 


	3.修改Prometheus的资源,修改后会自动重启
[root@master231 yinzhengjie]# kubectl -n monitoring edit prometheus k8s
...
spec:
  secrets:
  - etcd-tls
  ...  
[root@master231 yinzhengjie]# kubectl -n monitoring get pods -l app.kubernetes.io/component=prometheus -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
prometheus-k8s-0   2/2     Running   0          74s   10.100.1.57   worker232   <none>           <none>
prometheus-k8s-1   2/2     Running   0          92s   10.100.2.28   worker233   <none>           <none>
[root@master231 yinzhengjie]# 


	4.查看证书是否挂载成功
[root@master231 yinzhengjie]# kubectl -n monitoring exec prometheus-k8s-0 -c prometheus -- ls -l /etc/prometheus/secrets/etcd-tls
total 0
lrwxrwxrwx    1 root     2000            13 Jan 24 14:07 ca.crt -> ..data/ca.crt
lrwxrwxrwx    1 root     2000            17 Jan 24 14:07 server.crt -> ..data/server.crt
lrwxrwxrwx    1 root     2000            17 Jan 24 14:07 server.key -> ..data/server.key
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl -n monitoring exec prometheus-k8s-1 -c prometheus -- ls -l /etc/prometheus/secrets/etcd-tls
total 0
lrwxrwxrwx    1 root     2000            13 Jan 24 14:07 ca.crt -> ..data/ca.crt
lrwxrwxrwx    1 root     2000            17 Jan 24 14:07 server.crt -> ..data/server.crt
lrwxrwxrwx    1 root     2000            17 Jan 24 14:07 server.key -> ..data/server.key
[root@master231 yinzhengjie]# 


	5.创建ServerMonitor
5.1.创建ServiceMonitor资源关联etcd的svc
[root@master231 yinzhengjie]# cat  etcd-smon.yaml 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: jiaxing-etcd-smon
  namespace: monitoring
spec:
  # 指定job的标签,可以不设置。
  jobLabel: kubeadm-etcd-k8s-jiaxing
  # 指定监控后端目标的策略
  endpoints:
    # 监控数据抓取的时间间隔
  - interval: 30s
    # 指定metrics端口,这个port对应Services.spec.ports.name
    port: https-etcd
    # Metrics接口路径
    path: /metrics
    # Metrics接口的协议
    scheme: https
    # 指定用于连接etcd的证书文件
    tlsConfig:
      # 指定etcd的CA的证书文件
      caFile:  /etc/prometheus/secrets/etcd-tls/ca.crt
      # 指定etcd的证书文件
      certFile: /etc/prometheus/secrets/etcd-tls/server.crt
      # 指定etcd的私钥文件
      keyFile: /etc/prometheus/secrets/etcd-tls/server.key
      # 关闭证书校验,毕竟咱们是自建的证书,而非官方授权的证书文件。
      insecureSkipVerify: true
  # 监控目标Service所在的命名空间
  namespaceSelector:
    matchNames:
    - kube-system
  # 监控目标Service目标的标签。
  selector:
    # 注意,这个标签要和etcd的service的标签保持一致哟
    matchLabels:
      apps: etcd
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl apply -f etcd-smon.yaml 
servicemonitor.monitoring.coreos.com/yinzhengjie-etcd-smon created
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl get smon -n monitoring jiaxing-etcd-smon 
NAME                    AGE
yinzhengjie-etcd-smon   8s
[root@master231 yinzhengjie]# 


	2.访问Prometheus的WebUI
http://10.0.0.233:30090/targets?search=
5.查看etcd的数据


如上图所示,我们搜索"etcd_cluster_version"就可以查询到etcd的数据啦。
6.使用grafana查看etcd数据


导入etcd的模板,建议编号为"3070"

监控非云原生应用

1. 监控MySQL-非云原生应用

- Promethues监控MySQL服务
	1.部署MySQL软件
1.1.下载对应的软件包
[root@elk92 ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar


1.2.创建工作目录
[root@elk92 ~]# mkdir -pv /jiaxing/{softwares,data,logs}/

1.3.解压软件包 
[root@elk92 ~]# tar xf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz  -C /jiaxing/softwares/


1.4 创建符号链接(软连接)
[root@elk92 ~]# cd /jiaxing/softwares/ && ln -sv mysql-8.0.28-linux-glibc2.12-x86_64 mysql80

1.5 配置环境变量
cat > /etc/profile.d/mysql80.sh <<'EOF'
#!/bin/bash

export MYSQL_HOME=/jiaxing/softwares/mysql80
export PATH=$PATH:$MYSQL_HOME/bin
EOF
source /etc/profile.d/mysql80.sh


1.6 卸载当前系统自带的MySQL分支
[root@elk92 ~]# rpm -qa | grep mariadb
[root@elk92 ~]# yum -y remove mariadb-libs


1.7 准备mysql的配置文件
[root@elk92 ~]# cat > /etc/my.cnf <<'EOF'
# mysql服务端的配置参数
[mysqld]
# 指定mysql服务端的运行用户
user=mysql
# 指定mysql的安装目录
basedir=/jiaxing/softwares/mysql80
# 指定mysql的数据目录
datadir=/jiaxing/data/mysql80
# 指定socket套接字文件
socket=/tmp/jiaxing-mysql80.sock
[mysql]
socket=/tmp/jiaxing-mysql80.sock
EOF


1.8 修改mysql的启动脚本
[root@elk92 ~]# cp /jiaxing/softwares/mysql80/support-files/mysql.server  /etc/init.d/mysqld
[root@elk92 ~]# 
[root@elk92 ~]# vim /etc/init.d/mysqld
...(仅需修改下面2个参数即可,大概是在46-47行之间哟~)
basedir=/jiaxing/softwares/mysql80
datadir=/jiaxing/data/mysql80


1.9 修改文件权限
[root@elk92 ~]# useradd mysql && chown mysql:mysql -R /jiaxing/softwares/mysql80/
[root@elk92 ~]# 
[root@elk92 ~]# ll /jiaxing/softwares/mysql80/
total 284
drwxr-xr-x  2 mysql mysql   4096 Dec 18  2021 bin
drwxr-xr-x  2 mysql mysql     55 Dec 18  2021 docs
drwxr-xr-x  3 mysql mysql    282 Dec 18  2021 include
drwxr-xr-x  6 mysql mysql    201 Dec 18  2021 lib
-rw-r--r--  1 mysql mysql 276595 Dec 18  2021 LICENSE
drwxr-xr-x  4 mysql mysql     30 Dec 18  2021 man
-rw-r--r--  1 mysql mysql    666 Dec 18  2021 README
drwxr-xr-x 28 mysql mysql   4096 Dec 18  2021 share
drwxr-xr-x  2 mysql mysql     77 Dec 18  2021 support-files
[root@elk92 ~]# 


1.10 初始化MySQL服务
初始化MySQL数据库
install -d /jiaxing/data/mysql80 -o mysql -g mysql

# 姿势1,不会生成文件,会直接将密码打印到当前终端。
# mysqld --user=mysql --basedir=/jiaxing/softwares/mysql80 --datadir=/oldboyedu/data/mysql80 --initialize

# 姿势2,初学者推荐使用这种方式进行初始化即可。因为这种方式初始化的密码为空。
mysqld --user=mysql --basedir=/jiaxing/softwares/mysql80 --datadir=/jiaxing/data/mysql80 --initialize-insecure


1.11 启动MySQL服务
[root@elk92 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/oldboyedu/data/mysql80/elk92.err'.
. SUCCESS! 
[root@elk92 ~]# 
[root@elk92 ~]# ss -ntl | grep 3306
LISTEN     0      128       [::]:3306                  [::]:*                  
LISTEN     0      70        [::]:33060                 [::]:*                  
[root@elk92 ~]# 


	2.MySQL授权mysql_exporter
CREATE USER 'mysql_exporter'@'%'  IDENTIFIED WITH mysql_native_password BY 'jiaxing' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
QUIT
mysql -umysql_exporter -pjiaxing -h 10.0.0.92



	3.部署mysql_exporter
3.1 下载mysql_exporter
[root@elk93 ~]# https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz

3.2 解压软件包
[root@elk93 ~]# tar xf mysqld_exporter-0.15.1.linux-amd64.tar.gz -C /usr/local/bin/ mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter  --strip-components=1

3.3 创建MySQL的配置,指定默认的用户名和密码
[root@elk93 ~]# cat > /root/.my.cnf <<EOF
[client]
user=mysql_exporter
password=jiaxing
EOF

3.4 运行mysqld-exporter
[root@elk93 ~]# mysqld_exporter --mysqld.address="10.0.0.92:3306" --web.listen-address=:9104 --config.my-cnf="/root/.my.cnf"


3.5 访问webUI测试
http://10.0.0.93:9104/metrics


3.6 配置prometheus监控MySQL
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
 ...
  - job_name: "oldboyedu-mysql"
    static_configs:
    - targets:
      - "10.0.0.93:9104"

3.7 重新加载prometheus的配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload


3.8 grafana导入模板
7362

1.2 通过serviceMonitor监控mysql(内部)

四.Prometheus监控非云原生应用MySQL案例
1.部署MySQL服务
	1.编写资源清单
[root@master231 yinzhengjie]# cat deploy-mysql80.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql80-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: mysql80
  template:
    metadata:
      labels:
        apps: mysql80
    spec:
      containers:
      - name:  mysql
        image: harbor.oldboyedu.com/db/mysql:8.0-oracle
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: jiaxing
---

apiVersion: v1
kind: Service
metadata:
  name: mysql80-service
spec:
  selector:
    apps: mysql80
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
[root@master231 yinzhengjie]# 


	2.创建资源
[root@master231 yinzhengjie]# kubectl apply -f deploy-mysql80.yaml
deployment.apps/mysql80-deployment created
service/mysql80-service created
[root@master231 yinzhengjie]# 


	3.验证服务的可用性
[root@master231 yinzhengjie]# kubectl get pods,svc  | grep mysql80
pod/mysql80-deployment-846477c784-hmvfw   1/1     Running   0          43s
service/mysql80-service   ClusterIP   10.200.95.73    <none>        3306/TCP   43s
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# telnet 10.200.95.73 3306
Trying 10.200.95.73...
Connected to 10.200.95.73.
Escape character is '^]'.
J
8.0.3xkS`0Pÿ2uV9z}tX'pcaching_sha2_password


2.为mysql_exporter授权
[root@master231 yinzhengjie]# kubectl exec -it mysql80-deployment-846477c784-hmvfw -- mysql -pjiaxing
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> CREATE USER mysql_exporter IDENTIFIED BY 'jiaxing' WITH MAX_USER_CONNECTIONS 3;
Query OK, 0 rows affected (0.04 sec)

mysql> GRANT PROCESS,REPLICATION CLIENT,SELECT ON *.* TO mysql_exporter;
Query OK, 0 rows affected (0.01 sec)

mysql> 



3.部署mysql_exporter
	1.编写资源清单
[root@master231 yinzhengjie]# cat deploy-svc-cm-mysql_exporter.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: my.cnf
data:
  .my.cnf: |-
    [client]
    user = mysql_exporter
    password = jiaxing
    
    [client.servers]
    user = mysql_exporter
    password = jiaxing

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: mysql-exporter
  template:
    metadata:
      labels:
        apps: mysql-exporter
    spec:
      volumes:
      - name: data
        configMap:
          name: my.cnf
          items:
          - key: .my.cnf
            path: .my.cnf
      containers:
      - name:  mysql-exporter
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/mysqld-exporter:v0.15.1
        command:
        - mysqld_exporter 
        - --config.my-cnf=/root/my.cnf 
        - --mysqld.address=mysql80-service.default.svc.oldboyedu.com:3306
        securityContext:
          runAsUser: 0
        ports:
        - containerPort: 9104
        #env:
        #- name: DATA_SOURCE_NAME
        #  value: mysql_exporter:yinzhengjie@(mysql80-service.default.svc.oldboyedu.com:3306)
        volumeMounts:
        - name: data
          mountPath: /root/my.cnf
          subPath: .my.cnf

---

apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter-service
  labels:
    apps: mysqld
spec:
  selector:
    apps: mysql-exporter
  ports:
    - protocol: TCP
      port: 9104
      targetPort: 9104
      name: mysql80
[root@master231 yinzhengjie]# 


	2.验证数据是否采集到
[root@master231 yinzhengjie]# kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes               ClusterIP   10.200.0.1      <none>        443/TCP    22d
mysql-exporter-service   ClusterIP   10.200.96.244   <none>        9104/TCP   3m57s
mysql80-service          ClusterIP   10.200.95.73    <none>        3306/TCP   2d12h
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# curl -s 10.200.96.244:9104/metrics | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# curl -s 10.200.96.244:9104/metrics | wc -l
2557
[root@master231 yinzhengjie]# 
4.编写ServiceMonitor监控mysql_exporter
[root@master231 yinzhengjie]# cat mysql-smon.yaml 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: yinzhengjie-mysql-smon
spec:
  jobLabel: kubeadm-mysql-k8s-yinzhengjie
  endpoints:
  - interval: 30s
    # 这里的端口可以写svc的端口号,也可以写svc的名称。
    # 但我推荐写svc端口名称,这样svc就算修改了端口号,只要不修改svc端口的名称,那么我们此处就不用再次修改哟。
    # port: 9104
    port: mysql80
    path: /metrics
    scheme: http
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      apps: mysqld
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl apply -f mysql-smon.yaml 
servicemonitor.monitoring.coreos.com/yinzhengjie-mysql-smon created
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# 
[root@master231 yinzhengjie]# kubectl get smon
NAME                     AGE
yinzhengjie-mysql-smon   8s
[root@master231 yinzhengjie]# 



5.观察Prometheus是否有数据


如上图所示,我们观察到Prometheus已经监控到mysql_exporter啦。


如下图所示,我们也可以搜索"mysql_up"这个metrics来观察是否采集到数据指标。


6.使用grafana查看数据


导入模板ID。如上图所示,我使用的是"7362"这个ID编号。


参考链接:
	https://www.cnblogs.com/yinzhengjie/p/17993644

1.3 通过serviceMonitor监控mysql(外部)

[root@master231 /oldboyedu/prom]# cat 04-endpoint_mysql.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  name: jiaxing-mysql-metrics
subsets:
- addresses:
  - ip: 10.0.0.52
  ports:
  - port: 9104
    name: mysql80

---

apiVersion: v1
kind: Service
metadata:
  name: jiaxing-mysql-metrics
  labels:
    apps: mysqld
spec:
  ports:
    - protocol: TCP
      port: 9104
      targetPort: 9104
      name: mysql80
[root@master231 /oldboyedu/prom]# cat mysql-smon.yaml 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: jiaxing-mysql-smon
spec:
  jobLabel: kubeadm-mysql-k8s-jiaxing
  endpoints:
  - interval: 30s
    port: mysql80
    path: /metrics
    scheme: http
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      apps: mysqld
[root@master231 /oldboyedu/prom]# 

2. 监控elk集群-非云原生应用

- prometheus监控ElasticSearch集群
	1.验证集群的可用性
[root@elk92 ~]# curl -u elastic:123456 10.0.0.91:9200/_cat/nodes
10.0.0.92 43 57 1 0.00 0.04 0.05 cdfhilmrstw * elk92
10.0.0.91 58 47 7 0.07 0.26 0.24 cdfhilmrstw - elk91
10.0.0.93 44 31 2 0.12 0.12 0.08 cdfhilmrstw - elk93
[root@elk92 ~]# 

	2.下载ElasticSearch-exporter
[root@elk92 ~]# wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.7.0/elasticsearch_exporter-1.7.0.linux-amd64.tar.gz

	3.解压软件包
[root@elk92 ~]# tar xf elasticsearch_exporter-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ elasticsearch_exporter-1.7.0.linux-amd64/elasticsearch_exporter  --strip-components=1

	4.启动ElasticSearch_exporter
[root@elk92 ~]# elasticsearch_exporter --es.uri="http://elastic:123456@10.0.0.91:9200" --web.listen-address=:9114 --es.all


	5.验证数据
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk92 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.92",name="elk92"} 2.31223915e+08
[root@elk93 ~]# 
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk93 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.93",name="elk93"} 1.38740035e+08
[root@elk93 ~]# 
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk91 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.91",name="elk91"} 1.31043729e+08
[root@elk93 ~]# 


	6.配置prometheus监控ElasticSearch集群
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "oldboyedu-elasticsearch"
    static_configs:
    - targets:
      - "10.0.0.92:9114"


	7.让配置生效
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
	

	8.验证target是否监控到es集群
http://10.0.0.31:9090/targets


	9.grafana导入模板
14191

3. 监控kafka集群

- prometheus监控kafka实战
	1.启动zookeeper集群
[root@elk91 ~]# managaer-zk.sh start
[root@elk91 ~]#
[root@elk91 ~]# managaer-zk.sh status
查看状态
========== 10.0.0.91 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
========== 10.0.0.92 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
========== 10.0.0.93 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
[root@elk91 ~]# 


	2.启动kafka集群
[root@elk91 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
[root@elk92 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
[root@elk93 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties

	3.查看zookeeper对应的broker是否上线
[root@elk91 ~]# zkCli.sh 
...
[zk: localhost:2181(CONNECTED) 9] ls /oldboyedu_kafka351/brokers/ids 
[91, 92, 93]
[zk: localhost:2181(CONNECTED) 10] 

	4.下载kafka_exporter
[root@elk93 ~]# wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.7.0/kafka_exporter-1.7.0.linux-amd64.tar.gz

	5.解压软件包
[root@elk93 ~]# tar xf kafka_exporter-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ kafka_exporter-1.7.0.linux-amd64/kafka_exporter --strip-components=1
[root@elk93 ~]# 


	6.运行kafka_exporter
[root@elk93 ~]# kafka_exporter --kafka.version="3.5.1" --web.listen-address=":9308" --web.telemetry-path="/oldboyedu-metrics" --kafka.server=10.0.0.91:9092 --kafka.server=10.0.0.92:9092 --kafka.server=10.0.0.93:9092


温馨提示:
	如果不修改"web.telemetry-path",默认值为"/metrics"
	
	
	7.客户端测试访问
[root@elk91 ~]# curl -s http://10.0.0.93:9308/oldboyedu-metrics | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
[root@elk91 ~]# 

4. 监控nginx

- prometheus监控nginx
	1 编译安装nginx
1.1 安装编译工具
yum -y install git wget gcc make zlib-devel gcc-c++ libtool openssl openssl-devel


1.2 克隆nginx-module-vts模块
git clone git://github.com/vozlt/nginx-module-vts.git


如果上述连接不好用,可以执行下面代码:
git clone https://gitee.com/jasonyin2020/nginx-module-vts.git

1.3 下载nginx软件包
wget http://nginx.org/download/nginx-1.22.1.tar.gz

1.4 解压nginx
tar xf nginx-1.22.1.tar.gz

1.5 配置nginx
cd nginx-1.22.1
./configure --prefix=/oldboyedu/softwares/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--without-http_gzip_module \
--with-pcre \
--with-file-aio \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/root/nginx-module-vts

1.6 编译并安装nginx
make -j 2 && make install

1.7 修改nginx的配置文件
vim /oldboyedu/softwares/nginx/conf/nginx.conf
...
http {
    vhost_traffic_status_zone;
    upstream oldboyedu-promethues {
       server 10.0.0.31:9090;
    }
    ...
    server {
        ...
        location / {
            root   html;
            # index  index.html index.htm;
            proxy_pass http://oldboyedu-promethues;
        }

        location /status {
        	# 使用新加入模块功能
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

1.8 检查配置文件语法
/oldboyedu/softwares/nginx/sbin/nginx -t

1.9 启动nginx
/oldboyedu/softwares/nginx/sbin/nginx

1.10 访问nginx的状态页面
http://10.0.0.41/status/format/prometheus

 

	2 安装nginx-vtx-exporter
2.1 下载nginx-vtx-exporter

wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz

温馨提示:
	不建议下载更高版本,因为其会提升对GLIC的版本要求,可以通过" strings /lib64/libc.so.6 | grep GLIBC_ "查看默认是2.17版本,若使用较高版本则需要2.32+

2.2 解压软件包到path路径
tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz -C /usr/local/bin/ nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter --strip-components=1

2.3 运行nginx-vtx-exporter
nginx-vts-exporter -nginx.scrape_uri=http://10.0.0.245/status/format/json


	3.配置prometheus采集nginx数据
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "oldboyedu-nginx-exporter"
    metrics_path: "/status/format/prometheus"
    static_configs:
      - targets:
          - "10.0.0.245:80"

  - job_name: "oldboyedu-nginx-vts-exporter"
    static_configs:
      - targets:
          - "10.0.0.245:9913"

3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload


3.3 导入grafana模板
2949

5. 监控redis

-  prometheus监控redis环境
	1 部署redis
1.1 安装redis
curl  -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install redis

1.2 修改redis的配置文件
sed -i '/^bind/s#127.0.0.1#0.0.0.0#' /etc/redis.conf 
grep ^bind /etc/redis.conf

1.3 启动redis
systemctl start redis


1.4 写入测试数据
[root@prometheus-node41 ~]# redis-cli -n 5 --raw# redis-cli -n 5 –raw
127.0.0.1:6379[5]> LPUSH xiyouji 孙悟空 猪八戒 沙和尚 唐三藏
127.0.0.1:6379[5]> SET school oldboyedu
127.0.0.1:6379[5]> SET class linux86
127.0.0.1:6379[5]> KEYS *
class
xiyouji
school
127.0.0.1:6379[5]>

	2 部署redis-exporter
2.1 下载redis-exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v1.57.0/redis_exporter-v1.57.0.linux-amd64.tar.gz


2.2 解压软件包到PATH路径
tar xf redis_exporter-v1.57.0.linux-amd64.tar.gz -C /usr/local/bin/ redis_exporter-v1.57.0.linux-amd64/redis_exporter --strip-components=1


2.3 运行redis-exporter
redis_exporter

# redis_exporter -web.listen-address ":9121" -web.telemetry-path "/metrics"



	3 配置prometheus采集redis数据
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 

...
scrape_configs:
  ...
  - job_name: "oldboyedu-redis-exporter"
    static_configs:
      - targets:
          - "10.0.0.245:9121"


3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload


3.3 导入grafana模板
763 
14091 
14615
 

6. 监控tomcat-基于docker镜像方式

- prometheus监控tomcat
	1 部署tomcat-exporter
1.1 安装docker环境
略。

1.2 基于Dockerfile构建tomcat-exporter
参考我给的Dockerfile(25天笔记)

[root@prometheus-node41 tomcat]# docker build -t  tomcat-exporter:v0.1 .


1.3 运行tomcat镜像
[root@prometheus-node41 tomcat]# docker run -d --network host tomcat-exporter:v0.1
a25c1d26f1a710c37eed5a21db66de9641e50880f77989598b6b066466524edc
[root@prometheus-node41 tomcat]# 
[root@prometheus-node41 tomcat]# 
[root@prometheus-node41 tomcat]# ss -ntl | grep 8080
LISTEN 0      100                     *:8080            *:*          
[root@prometheus-node41 tomcat]# 


1.4 访问tomcat应用
http://10.0.0.41:8080/metrics/

http://10.0.0.41:8080/myapp/  


	2 配置prometheus监控tomcat应用
2.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 

...
scrape_configs:
  ...
  - job_name: "oldboyedu-tomcat-exporter"
    static_configs:
      - targets: 
          - "10.0.0.41:8080"


2.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload


2.3 导入grafana模板
由于官方的支持并不友好,可以在GitHub自行搜索相应的tomcat监控模板。

 
参考链接:
https://github.com/nlighten/tomcat_exporter/blob/master/dashboard/example.json

插件安装方式

- 安装grafana插件
	1 查看dashboard时观察缺少相应的插件而报错
Panel plugin not found: natel-discrete-panel

温馨提示:
	根据报错提示,可以看出是缺少"natel-discrete-panel"相关的插件。
 

	2 搜索某个插件关键字  
centos环境可以搜索关键字,但Ubuntu系统不支持搜索,可以采取如下的方法。

2.1 下载插件	 
wget  https://grafana.com/api/plugins/natel-discrete-panel/versions/latest/download -O /opt/natel-discrete-panel.zip

2.2 解压软件包到grafana的指定目录
[root@prometheus-node42 ~]# cd /opt/
[root@prometheus-node42 opt]# 
[root@prometheus-node42 opt]# apt -y install unzip
[root@prometheus-node42 opt]# 
	# grafana插件默认路径/var/lib/grafana/plugins/
[root@prometheus-node42 opt]# unzip natel-discrete-panel.zip -d /var/lib/grafana/plugins/

2.3 重启grafana服务
[root@prometheus-node42 ~]# systemctl restart grafana-server
[root@prometheus-node42 ~]# ss -ntl | grep 3000
LISTEN 0      4096               *:3000            *:*          
[root@prometheus-node42 ~]# 

2.3 导入grafana模板
由于官方的支持并不友好,可以在GitHub自行搜索相应的tomcat监控模板。

 
参考链接:
https://github.com/nlighten/tomcat_exporter/blob/master/dashboard/example.json

blackbox_exporter的作用和部署

0. 概述

- 监控分类:
	黑盒监控:
		是从外部监控服务,当服务出现故障时,触发告警,让用户解决问题。
		说白了就是问题发生了才告警通知运维。
	
	白盒监控:
		是服务内部的监控,是服务自身暴露的监控指标,通过这些指标可以提前预测问题,从而将问题扼杀在摇篮里。
		说白了就是问题还没有发生之前就告知运维。
 
 参考链接:
	 https://prometheus.io/docs/prometheus/latest/configuration/configuration/
	 https://github.com/prometheus/blackbox_exporter
 

- blackbox_exporter的作用和部署
	1 blackbox_exporter概述
blackbox exporter支持基于HTTP, HTTPS, DNS, TCP, ICMP, gRPC协议来对目标节点进行监控。

比如基于http协议我们可以探测一个网站的返回状态码为200判读服务是否正常。

比如基于TCP协议我们可以探测一个主机端口是否监听。

比如基于ICMP协议来ping一个主机的连通性。

比如基于gRPC协议来调用接口并验证服务是否正常工作。

比如基于DNS协议可以来检测域名解析。

	2 部署blackbox exporter
2.1 下载blackbox exporter
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz


2.2 解压软件包
tar xf blackbox_exporter-0.24.0.linux-amd64.tar.gz -C  /oldboyedu/softwares/


2.3 启动服务
cd /oldboyedu/softwares/blackbox_exporter-0.24.0.linux-amd64/

./blackbox_exporter


2.4 访问blackbox的webUI
http://10.0.0.41:9115/

1. prometheus基于blackbox的http案例

-  prometheus基于blackbox的http案例
	1 修改Prometheus配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
    # 指定作业的名称,生成环境中,通常是指一类业务的分组配置。
  - job_name: 'oldboyedu-blackbox-exporter'
    # 修改访问路径,若不修改,默认值为"/metrics"
    metrics_path: /probe
    # 配置URL的相关参数
    params:
      # 此处表示使用的是blackbox的http模块,从而判断相应的返回状态码是否为200
      module: [http_2xx]
      school: [oldboyedu]
      class: ["linux89"]
    # 静态配置,需要手动指定监控目标
    static_configs:
        # 需要监控的目标
      - targets:
          # 支持https协议
        - https://www.oldboyedu.com/
          # 支持http协议
        - http://10.0.0.41
          # 支持http协议和自定义端口
        - http://10.0.0.31:9090
    # 对采集的metrics进行重新打标签一种方式。
    relabel_configs:
        # 指定源标签,此处的"__address__"表示内置的标签,存储的是被监控目标的IP地址
      - source_labels: [__address__]
        # 指定目标标签,其实就是在"Endpoint"中加了一个target字段(用于指定监控目标),
        target_label: __param_target
        # 指定需要执行的动作,默认值为"replace",有效动作为: replace, keep, and drop。
        # 将"__address__"传递给target字段。
        action: replace
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        # 指定要替换的值,此处我指定为blackbox exporter的主机地址
        replacement: 10.0.0.41:9115


	2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/


	3.导入grafana模板
7587
13659

2. prometheus基于blackbox的ICMP案例

- prometheus基于blackbox的ICMP案例
	1 修改Prometheus配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'jiaxing-blackbox-exporter-icmp'
    metrics_path: /probe
    params:
      # 如果不指定模块,则默认类型为"http_2xx",不能乱写!乱写监控不到服务啦!
      module: [icmp]
    static_configs:
      - targets:
          - 10.0.0.41
          - 10.0.0.42
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        # 指定注意的是,如果instance不修改,则instance和"__address__"的值相同
        target_label: ip
        # target_label: instance
      - target_label: __address__
        replacement: 10.0.0.41:9115  


	2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/

3. prometheus基于blackbox的TCP案例

- prometheus基于blackbox的TCP案例
	1 修改Prometheus配置文件

vim /jiaxing/softwares/prometheus/prometheus.yml
...
scrape_configs:
  ...
  - job_name: 'oldboyedu-blackox-exporter-tcp'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
          - 10.0.0.41:80
          - 10.0.0.42:22
          - 10.0.0.31:9090
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.0.41:9115


	2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/

prometheus监控容器案例-cadvisor

- prometheus监控容器案例-cadvisor
	1. 运行测试容器
docker run -d -p 19090:9090 --restart always --name oldboyedu_prometheus_server prom/prometheus:v2.45.3

docker  run -d   -p 19100:9100 --restart always --name oldboyedu_node-exporter prom/node-exporter:v1.7.0 

docker run -d --name=grafana -p 13000:3000 grafana/grafana:10.3.1-ubuntu

	2 cAdvisor概述
cAdvisor(Container Advisor)让容器用户了解其运行容器的资源使用情况和性能特征。

它是一个正在运行的守护进程,用于收集、聚合、处理和导出有关正在运行的容器的信息。

具体来说,对于每个容器,它保留资源隔离参数、历史资源使用情况、完整历史资源使用的直方图和网络统计信息。

官网地址:
	https://github.com/google/cadvisor

	3 部署cAdvisor容器 
docker run --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --network host \
  --detach=true \
  --name=oldboyedu_cadvisor \
  registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/cadvisor:v0.47.2


	4 prometheus采集cAdvisor容器
4.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "prometheus-oldboyedu-cAdvisor"
    static_configs:
    - targets:
        - "10.0.0.41:8080"

4.2 重载配置
curl -X POST http://10.0.0.31:9090/-/reload

4.3 访问WebUI验证配置是否生效
http://10.0.0.31:9090/targets



	5 导入grafana模板
315
10619

promethus的服务发现配置

1. promethus的服务发现配置-file_sd_configs

-  promethus的服务发现配置
	1.prometheus 服务发现配置概述
prometheus支持除了支持静态配置(static_configs)外,还支持各种动态的服务发现。

静态配置配置修改prometheus server的配置文件,都需要重新加载配置。

参考连接:
	https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file


	2.基于文件的服务发现
2.1 架构说明
略。

2.2 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'oldboyedu-file-service-discovery'
    # 基于文件的服务发现
    file_sd_configs:
        # 指定文件路径
      - files:
          - /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json
          - /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml


2.3 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload

2.4 修改动态配置文件 
cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml <<EOF
- targets:
    - '10.0.0.41:9100'
    - '10.0.0.42:9100'
  labels:
    "address": "shahe"
    "office": "https://www.oldboyedu.com" 
EOF

cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json << EOF
[
  {
    "targets": [ "10.0.0.41:8080","10.0.0.42:8080"],
    "labels": {
      "school": "oldboyedu", "class": "linux89"
    }
  }
]
EOF


2.5 访问webUI
http://10.0.0.31:9090/targets

2. prometheus基于consul服务实现自动发现

- prometheus基于consul服务实现自动发现
	1 架构说明
官网地址: 
	https://www.consul.io/

	2 部署consul
	
2.1 下载consul
wget https://releases.hashicorp.com/consul/1.17.2/consul_1.17.2_linux_amd64.zip

2.2 解压consul
apt -y install unzip
unzip consul_1.17.2_linux_amd64.zip -d /usr/local/bin/


3 运行consul 集群
	服务端31:
consul agent -server -bootstrap -bind=10.0.0.31 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.31 -ui

	客户端32:
consul agent  -bind=10.0.0.32 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.32 -ui -retry-join=10.0.0.31

	客户端33:
consul agent -server -bind=10.0.0.33 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.33 -ui -retry-join=10.0.0.31



	3 使用consul实现自动发现
3.1 修改prometheus的配置文件
vim /oldboyedu/softwares/prometheus/prometheus.yml
...
scrape_configs:
  ...
  - job_name: "oldboyedu-consul-seriver-discovery"
    # 配置基于consul的服务发现
    consul_sd_configs:
        # 指定consul的服务器地址,若不指定,则默认值为"localhost:8500".
      - server: 10.0.0.31:8500
      - server: 10.0.0.32:8500
      - server: 10.0.0.33:8500
    relabel_configs:
        # 匹配consul的源标签字段,表示服务名称
      - source_labels: [__meta_consul_service]
        # 指定源标签的正则表达式,若不定义,默认值为"(.*)"
        regex: consul
        # 执行动作为删除,默认值为"replace",有效值: replace, keep, and drop
        action: drop

3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload

3.3 任意节点在consul集群注册要监控的target节点 
[root@harbor250 ~]# curl -X PUT -d '{"id":"prometheus-node41","name":"oldboyedu-prometheus-node41-svc","address":"10.0.0.41","port":9100,"tags":["node-exporter"],"checks": [{"http":"http://10.0.0.41:9100","interval":"5m"}]}' http://10.0.0.31:8500/v1/agent/service/register
[root@harbor250 ~]# 



注意,也可以使用POSTMAN直接进行如下操作
{"id":"prometheus-node42","name":"oldboyedu-prometheus-node42-svc","address":"10.0.0.42","port":9100,"tags":["node-exporter"],"checks": [{"http":"http://10.0.0.42:9100","interval":"1m"}]}
 

3.4 注销节点
curl -X PUT http://10.0.0.31:8500/v1/agent/service/deregister/prometheus-node41


TODO---> 目前有个坑:
	你注册时找得哪个节点,那么注销时也要找这个节点注销,待解决...


注意,也可以使用POSTMAN直接进行如下操作,需要使用PUT方法。

prometheus联邦模式

QQ20240929-103718

- prometheus联邦模式
	1.prometheus联邦模式架构概述
默认情况下,prometheus采集的数据会存储到本地,这意味者prometheus在这种工作模式下,可能会存在单机存储的瓶颈。
为了解决prometheus对于数据的采集压力,我们可以采用联邦模式来部署prometheus。

	2.部署联邦模式之prometheus server32配置
2.1 修改prometheus server配置文件
[root@prometheus-server32 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'jiaxing-file-service-discovery-32'
    # 基于文件的服务发现
    file_sd_configs:
        # 指定文件路径
      - files:
          - /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml

2.2 重载prometheus server
curl -X POST http://10.0.0.32:9090/-/reload


2.3 编写yaml文件
cat > /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml <<EOF
- targets:
    - '10.0.0.41:9100'
  labels:
    "address": "shahe"
    "office": "www.oldboyedu.com" 
    "apps": "yaml"
EOF

2.4 验证数据是否采集成功
http://10.0.0.32:9090/targets


	3.部署联邦模式之prometheus server33 配置
3.1 修改prometheus server的配置文件
[root@prometheus-server33 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: 'jiaxing-file-service-discovery-33'
    # 基于文件的服务发现
    file_sd_configs:
        # 指定文件路径
      - files:
          - /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json

3.2 重载prometheus server 
curl -X POST http://10.0.0.33:9090/-/reload

3.3 编写json文件 
cat > /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json << EOF
[
  {
    "targets": ["10.0.0.42:9100"],
    "labels": {
      "school": "oldboyedu", 
      "class": "linux89",
      "apps": "json"
    }
  }
] 
EOF

3.4 验证数据是否采集成功
http://10.0.0.33:9090/targets


                                                           
	4.部署联邦模式之Prometheus server31配置
4.1 修改prometheus server的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "prometheus-federate-32"
    metrics_path: "/federate"
    # 用于解决标签的冲突问题,有效值为: true和false,默认值为false
    # 当设置为true时,将保留抓取的标签以忽略服务器自身的标签。说白了会覆盖原有标签。
    # 当设置为false时,则不会覆盖原有标签,而是在标点前加了一个"exported_"前缀。
    honor_labels: true
    params:
       "match[]":
       - '{job="promethues"}'
       - '{__name__=~"job:.*"}'
       - '{__name__=~"node.*"}'
    static_configs:
    - targets:
        - "10.0.0.32:9090"

  - job_name: "prometheus-federate-33"
    metrics_path: "/federate"
    honor_labels: true
    params:
       "match[]":
       - '{job="promethues"}'
       - '{__name__=~"job:.*"}'
       - '{__name__=~"node.*"}'
    static_configs:
    - targets:
        - "10.0.0.33:9090"


4.2 重载prometheus server

curl -X POST http://10.0.0.31:9090/-/reload

4.3 验证数据是否采集成功
http://10.0.0.31:9090/targets


4.4 查询数据
node_cpu_seconds_total{job=~"jiaxing-file-service-discovery-.*"}

prometheus之本地存储模式配置

- Prometheus的存储系统配置之本地存储配置
1.1 常用参数说明
--config.file=/jiaxing/softwares/prometheus/prometheus.yml 
	指定prometheus的配置文件。
	
--web.enable-lifecycle 
	启用web方式热加载。

--storage.tsdb.path="/jiaxing/data/prometheus" 
	指定prometheus数据存储路径。

--storage.tsdb.retention.time="60d" 
	指定prometheus数据存储周期。

--web.listen-address="0.0.0.0:9090" 
	指定prometheus的监听端口。

--web.max-connections=4096 
	指定最大的连接数。

--storage.tsdb.retention.size="512MB" 
	指定prometheus数据块的滚动大小,就是单个文件最大容量,达到512MB时则写入到其他文件。

--query.timeout=10s 
	查询数据的超时时间。

--query.max-concurrency=20
	最大并发查询数量。

--log.level=info
	指定日志级别。

--log.format=logfmt
	指定日志格式。

--web.read-timeout=5m
	最大的空闲超时时间。


1.2 修改prometheus的启动脚本
cat > /etc/systemd/system/prometheus-server.service <<EOF
[Unit]
Description=jiaxing Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
ExecStart=/oldboyedu/softwares/prometheus/prometheus \
    --config.file=/oldboyedu/softwares/prometheus/prometheus.yml \
    --web.enable-lifecycle \
    --storage.tsdb.path=/oldboyedu/data/prometheus \
    --storage.tsdb.retention.time=60d \
    --web.listen-address=0.0.0.0:9090 \
    --web.max-connections=4096 \
    --storage.tsdb.retention.size=512MB \
    --query.timeout=10s \
    --query.max-concurrency=20 \
    --log.level=info \
    --log.format=json \
    --web.read-timeout=5m
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart prometheus-server

prometheus之远端存储VictoriaMetrics

	1 VicoriaMetrics概述
VictoriaMetrics是一个快速、经济高效且可扩展的监控解决方案和时间序列数据库。

官网地址:
	https://victoriametrics.com/

官方文档:
	https://docs.victoriametrics.com/

GitHub地址:
	https://github.com/VictoriaMetrics/VictoriaMetrics


	2 部署victoriametrics
2.1 下载victoriametrics
root@prometheus-node41:~# wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.10/victoria-metrics-linux-amd64-v1.93.10.tar.gz


2.2 解压软件包 
root@prometheus-node41:~# tar xf victoria-metrics-linux-amd64-v1.93.10.tar.gz -C /usr/local/bin/

2.3 编写启动脚本
root@prometheus-node41:~# cat > /etc/systemd/system/victoria-metrics.service <<EOF
[Unit]
Description=jiaxing VictoriaMetrics Server
Documentation=https://docs.victoriametrics.com/
After=network.target

[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod  \
   -httpListenAddr=0.0.0.0:8428 \
   -storageDataPath=/jiaxing/data/victoria-metrics \
   -retentionPeriod=3

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now victoria-metrics.service
systemctl status victoria-metrics
 


	3.prometheus配置VictoriaMetrics远端存储
3.1 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
# 在顶级字段中配置VictoriaMetrics地址
remote_write:
  - url: http://10.0.0.41:8428/api/v1/write
    # 如果prometheus的负载过高,可以考虑使用如下配置,可以顶得住20w/QPS
    queue_config:
      max_samples_per_send: 10000
      capacity: 20000
      max_shards: 30


3.2 重新加载prometheus的配置
curl -X POST http://10.0.0.31:9090/-/reload

3.3 验证victoria-metrics是否有数据(我的环境是在联邦模式基础之上配置的)
node_cpu_seconds_total{job=~"jiaxing-file-service-discovery-.*"}

3.4 配置grafana的数据源及URL
# 数据源是prometheus,但是URL得写VictoriaMetric的URL哟。
http://10.0.0.41:8428/


3.5 导入grafana的模板ID并选择数据源
1860

pushgateway组件-自定义监控指标

1. 部署

-  pushgateway组件实战案例
	1.pushgateway概述
pushgateway用于定义自定义监控指标数据,用户可以将自定义的数据推送到pushgateway中。
而后prometheus server从pushgateway组件中拉取数据,进行监控。

	2.部署pushgateway
2.1 下载pushgateway组件 
wget https://github.com/prometheus/pushgateway/releases/download/v1.7.0/pushgateway-1.7.0.linux-amd64.tar.gz

2.2 解压软件包
tar xf pushgateway-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ pushgateway-1.7.0.linux-amd64/pushgateway --strip-components=1


2.3 编写启动脚本
cat > /etc/systemd/system/pushgatway.service <<EOF
[Unit]
Description=jiaxing Pushgateway
After=network.target

[Service]
ExecStart=/usr/local/bin/pushgateway  \
  --persistence.file=/jiaxing/data/pushgatway.log \
  --persistence.interval=5m \
  --log.level=info \
  --log.format=json

[Install]
WantedBy=multi-user.target
EOF

2.4 启动pushgateway服务
systemctl daemon-reload
systemctl enable --now pushgatway

2.5 访问pushgateway的WebUI
http://10.0.0.41:9091/


	3.推送数据到pushgateway
默认push到pushgateway路径:http://<ip>:9091/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}
3.1 使用curl工具推送测试数据
echo "student_online 35" | curl --data-binary @-  http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250

echo "student_online 200" | curl --data-binary @-  http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250

echo "student_online{school=\"oldboyedu\",class=\"linux89\"} 57" | curl --data-binary @-  http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250


3.2 查看pushgateway的WebUI
http://10.0.0.41:9091/


	4.prometheus配置抓取pushgateway数据
4.1 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 

...
scrape_configs:
  ...
  - job_name: "jiaxing_pushgateway"
    honor_labels: true
    static_configs:
    - targets: ["10.0.0.41:9091"]


4.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload

4.3 查询数据验证
student_online
student_online{class="linux89"}

2. shell脚本自定义监控指标

- prometheus监控tcp的12种状态案例
	1.采集指标到pushgateway
1.编写脚本采集12种状态
[root@k8s231.oldboyedu.com ~]# cat /usr/local/bin/tcp_status.sh  
#!/bin/bash
# auther: Jason Yin
# school: oldboyedu
# class: linux89
# office: www.oldboyedu.com


# 定义TCP的12种状态
ESTABLISHED_COUNT=0
SYN_SENT_COUNT=0
SYN_RECV_COUNT=0
FIN_WAIT1_COUNT=0
FIN_WAIT2_COUNT=0
TIME_WAIT_COUNT=0
CLOSE_COUNT=0
CLOSE_WAIT_COUNT=0
LAST_ACK_COUNT=0
LISTEN_COUNT=0
CLOSING_COUNT=0
UNKNOWN_COUNT=0

# 定义任务名称
JOB_NAME=tcp_status
# 定义实例名称
INSTANCE_NAME=harbor250
# 定义pushgateway主机
HOST=10.0.0.41
# 定义pushgateway端口
PORT=9091

# TCP的12种状态
ALL_STATUS=(ESTABLISHED SYN_SENT SYN_RECV FIN_WAIT1 FIN_WAIT2 TIME_WAIT CLOSE CLOSE_WAIT LAST_ACK LISTEN CLOSING UNKNOWN)

# 声明一个关联数组,类似于py的dict,go的map
declare -A tcp_status

# 统计TCP的12种状态
for i in ${ALL_STATUS[@]}
do
  temp=`netstat -untalp | grep $i  | wc -l`
  tcp_status[${i}]=$temp
done

# 将统计后的结果发送到pushgateway
for i in ${!tcp_status[@]}
do 
   data="$i ${tcp_status[$i]}"
   # TODO: shell如果想要设计成相同key不同标签的方式存在问题,只会有最后一种状态被发送
   # data="oldboyedu_tcp_all_status{status=\"$i\"} ${tcp_status[$i]}"
   # echo $data
   echo $data | curl --data-binary @-  http://${HOST}:${PORT}/metrics/job/${JOB_NAME}/instance/${INSTANCE_NAME}
done
[root@k8s231.oldboyedu.com ~]# 

2.编写定时任务推送数据到pushgateway
[root@k8s231.oldboyedu.com ~]# echo "*/5 * * * * /usr/local/bin/tcp_status.sh" >> /var/spool/cron/root
[root@k8s231.oldboyedu.com ~]# 
[root@k8s231.oldboyedu.com ~]# crontab -l
*/5 * * * * /usr/local/bin/tcp_status.sh
[root@k8s231.oldboyedu.com ~]# 

3.观察pushgateway的WebUI
http://10.0.0.61:9091/

 
 
其他补充参考:
[root@harbor250 ~]# cat oldboyedu-tcp-status.sh
#!/bin/bash

# 设置 Pushgateway 的 URL
pushgateway_url="http://10.0.0.41:9091/metrics/job/tcp_status"
time=$(date +%Y-%m-%d+%H:%M:%S)

state="SYN-SENT SYN-RECV FIN-WAIT-1 FIN-WAIT-2 TIME-WAIT CLOSE CLOSE-WAIT LAST-ACK LISTEN CLOSING ESTAB"
for i in  $state
 do
 t=`ss -tan |grep $i |wc -l`
 echo tcp_connections{state=\""$i"\"} $t >>/tmp/tcp.txt
done;

cat /tmp/tcp.txt | curl --data-binary @- $pushgateway_url
rm -rf  /tmp/tcp.txt
[root@harbor250 ~]# 

3. python脚本自定义exporter监控指标

- 使用python程序自定义exporter案例
	1.安装pip3工具包
[root@prometheus-node42 ~]#  apt update
[root@prometheus-node42 ~]#  apt install -y python3-pip


    2.创建用户
[root@prometheus-node42 ~]#  useradd -m -s /bin/bash python


    3.修改配置文件(可选)
[root@prometheus-node42 ~]#  su - python
python@prometheus-node42:~$ 
python@prometheus-node42:~$ vim .bashrc 
...
# 取消下面一行的注释,添加颜色显示
force_color_prompt=yes


    4.pip配置加速
python@prometheus-node42:~$ mkdir ~/.pip
python@prometheus-node42:~$ 
python@prometheus-node42:~$ vim ~/.pip/pip.conf
# [global]
# index-url=https://pypi.tuna.tsinghua.edu.cn/simple
# [install]
# trusted-host=pypi.douban.com
[global]
index-url=https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host=mirrors.aliyun.com
python@prometheus-node42:~$ 

 

    5.安装实际环境中相关模块库
python@prometheus-node42:~$ pip3 install flask prometheus_client
python@prometheus-node42:~$ pip3 list

 
    6.创建代码目录
python@prometheus-node42:~$ mkdir code

	7.编写代码
python@prometheus-node42:~$ cd code
python@prometheus-node42:~/code$ 
python@prometheus-node42:~/code$ cat flask_metric.py 
#!/usr/bin/python3

from prometheus_client import start_http_server,Counter, Summary
from flask import Flask, jsonify
from wsgiref.simple_server import make_server
import time

app = Flask(__name__)

# Create a metric to track time spent and requests made
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
COUNTER_TIME  = Counter("request_count", "Total request count of the host")

@app.route("/metrics")
@REQUEST_TIME.time()
def requests_count():
    COUNTER_TIME.inc()
    return jsonify({"return": "success OK!"})

if __name__ == "__main__":
    start_http_server(8000)
    httpd = make_server( '0.0.0.0', 8001, app )
    httpd.serve_forever()
python@prometheus-node42:~/code$ 

	8.启动python程序
python@prometheus-node42:~/code$ python3 flask_metric.py 

...
# 当启动客户端测试时,可能会出现如下的信息
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25

	
	9.客户端测试
python@prometheus-node42:~/code$ cat jiaxing_curl_metrics.sh
#!/bin/bash

URL=http://10.0.0.42:8001/metrics

while true;do
    curl_num=$(( $RANDOM%50+1 ))
    sleep_num=$(( $RANDOM%5+1 ))
    for c_num in `seq $curl_num`;do
        curl -s $URL &> /dev/null
    done
    sleep $sleep_num
done
python@prometheus-node42:~/code$ 
python@prometheus-node42:~/code$ bash curl_metrics.sh 



- prometheus监控自定义的exporter实战
    1.编辑配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
...

  - job_name: "jiaxing_python_custom_metrics"
    static_configs:
      - targets:
        - 10.0.0.42:8000
root@prometheus41:~# 

root@prometheus41:~# 


    2.检查配置文件语法
[root@prometheus-server31 ~]# cd /jiaxing/softwares/prometheus-2.45.3.linux-amd64/
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# 
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check config  prometheus.yml 
Checking prometheus.yml
 SUCCESS: prometheus.yml is valid prometheus config file syntax

[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# 

    3.重新加载配置文件
curl -X POST http://10.0.0.31:9090/-/reload 


	4.验证prometheus是否采集到数据
http://10.0.0.31:9090/targets


	5.grafana作图展示
request_count_total
	apps请求总数。
	
	
increase(request_count_total{job="jiaxing_python_custom_metrics"}[1m])
	每分钟请求数量曲线QPS。


irate(request_count_total{job="jiaxing_python_custom_metrics"}[1m])
	每分钟请求量变化率曲线 
	
request_processing_seconds_sum{job="jiaxing_python_custom_metrics"} / request_processing_seconds_count{job="jiaxing_python_custom_metrics"}
	每分钟请求处理平均耗时

4. golang脚本自定义exporter监控指标

- 使用golang程序自定义exporter案例
	1.Linux安装golang环境
[root@prometheus-node41 ~]# apt -y install golang
[root@prometheus-node41 ~]#
[root@prometheus-node41 ~]# go version
go version go1.18.1 linux/amd64
[root@prometheus-node41 ~]# 
 
二进制安装:
	1.下载软件包
[root@prometheus-node42 ~]# wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz

	2.解压软件包
[root@prometheus-node42 ~]# tar xf go1.21.6.linux-amd64.tar.gz  -C /oldboyedu/softwares/

	3.配置环境变量
[root@prometheus-node42 ~]# cat /etc/profile.d/go.sh
#!/bin/bash

export GOPATH=/oldboyedu/code/go
export GOPROXY=https://proxy.golang.org,direct
export GOROOT=/oldboyedu/softwares/go
export PATH=$PATH:$GOROOT/bin
[root@prometheus-node42 ~]# 
[root@prometheus-node42 ~]# go version
go version go1.21.6 linux/amd64
[root@prometheus-node42 ~]# 


 
	2.编写测试代码
2.1 创建工作目录
[root@prometheus-node41 ~]# mkdir -pv code/
[root@prometheus-node41 ~]# 
[root@prometheus-node41 ~]# cd code/
[root@prometheus-node41 code]# 


2.2 初始化go.mod依赖包文件
[root@prometheus-node41 code]# go mod init code
go: creating new go.mod: module code
go: to add module requirements and sums:
	go mod tidy
[root@prometheus-node41 code]# 
[root@prometheus-node41 code]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 30 07:43 ./
drwx------ 8 root root 4096 Jan 30 07:43 ../
-rw-r--r-- 1 root root   21 Jan 30 07:43 go.mod
[root@prometheus-node41 code]# 
[root@prometheus-node41 code]# cat go.mod 
module code

go 1.18
[root@prometheus-node41 code]# 


2.3 配置软件源为国内的
[root@prometheus-node41 code]# go env -w GOPROXY=https://goproxy.cn,direct
[root@prometheus-node41 code]# 
[root@prometheus-node41 code]# go env | grep GOPROXY
GOPROXY="https://goproxy.cn,direct"
[root@prometheus-node41 code]# 

备选的软件源:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
go env -w GOPROXY=https://goproxy.io,direct


温馨提示:
	Go语言在 1.13 版本之后GOPROXY 默认值为"https://proxy.golang.org"。
	在国内可能会存在下载慢或者无法访问的情况,所以十分建议大家将GOPROXY设置为国内的 goproxy.cn。



2.4 安装依赖包
[root@prometheus-node41 code]# go get github.com/prometheus/client_golang/prometheus
[root@prometheus-node41 code]# go get github.com/prometheus/client_golang/prometheus/promhttp
[root@prometheus-node41 code]#
[root@prometheus-node41 code]# cat go.mod 
module code

go 1.18

require (
	github.com/beorn7/perks v1.0.1 // indirect
	github.com/cespare/xxhash/v2 v2.2.0 // indirect
	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
	github.com/prometheus/client_golang v1.18.0 // indirect
	github.com/prometheus/client_model v0.5.0 // indirect
	github.com/prometheus/common v0.45.0 // indirect
	github.com/prometheus/procfs v0.12.0 // indirect
	golang.org/x/sys v0.15.0 // indirect
	google.golang.org/protobuf v1.31.0 // indirect
)
[root@prometheus-node41 code]# 


2.5 Gauge类型案例
[root@prometheus-node41 code]# cat 01-Gauge.go 
package main

import (
    "net/http"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func GaugeDemo() {
    queueLength := prometheus.NewGauge(prometheus.GaugeOpts{
        /*
            指标名称拼接语法: [Namespace]_[Subsystem]_[Name]

        */
        Namespace: "oldboyedu",
        Subsystem: "linux89",
        Name:      "queque_length",
        // 指标的帮助文档
        Help: "The number of items in the queue.",
        // 指标的标签
        ConstLabels: map[string]string{
            "auther": "JasonYin",
        },
    })

    /*
        相关方法说明:
            - Set:
                设置指定的值。
            - Inc:
                +1
            - Dec:
                -1
            - Add:
                +n
            - Sub:
                -n
    */
    queueLength.Set(8000)

    // 在默认的注册表中注册该指标,否则看不到咱们自定义的指标哟~
    prometheus.MustRegister(queueLength)

    // Prometheus 提供了专门的Handler
    http.Handle("/metrics", promhttp.Handler())

    // 监听8080端口
    http.ListenAndServe(":18080", nil)
}

func main() {
    GaugeDemo()
}
[root@prometheus-node41 code]# 


 
2.6 编译go程序
[root@prometheus-node41 code]# go build  -o oldboyedu-custom-go-prometheus 01-Gauge.go 


2.7 运行程序
[root@prometheus-node41 code]# ./oldboyedu-custom-go-prometheus 


2.8 校验数据
[root@harbor250 ~]# curl -s http://10.0.0.41:18080/metrics | grep oldboyedu_linux89_queque_length
# HELP oldboyedu_linux89_queque_length The number of items in the queue.
# TYPE oldboyedu_linux89_queque_length gauge
oldboyedu_linux89_queque_length{auther="JasonYin"} 8000
[root@harbor250 ~]# 



对于运维工程师而言,只需要完成2.7~2.8步骤即可。



2.9 prometheus监控自定义的exporter实战
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
  - job_name: "yinzhengjie_golang_custom_metrics"
    static_configs:
    - targets:
      - 10.0.0.41:18080


2.10 重新加载配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload 


2.11 验证数据是否采集成功
http://10.0.0.31:9090/targets

自定义指标如下:
oldboyedu_linux89_queque_length

altermanager告警功能

1. 部署

- altermanager组件
	1.altermanager概述
用于prometheus server的告警功能的组件,目前支持多种告警媒介,包括但不限于邮件告警,钉钉告警,企业微信告警等。


	2.部署alermanager组件
2.1 下载软件包
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz


2.2 解压软件包
[root@prometheus-server33 ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /oldboyedu/softwares/


2.3 创建符号链接
cd /oldboyedu/softwares/ && ln -svf alertmanager-0.26.0.linux-amd64 alertmanager


2.4 修改alermanager的配置文件
cat > alertmanager.yml <<'EOF'
global:
  resolve_timeout: 5m
  smtp_from: '1271557164@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '1271557164@qq.com'
  smtp_auth_password: 'ekpinvxmqsnmfibg'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '1271557164@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
EOF


    

相关参数说明:
global:
  resolve_timeout:
  	解析超时时间。
  smtp_from:
  	发件人邮箱地址。
  smtp_smarthost:
  	邮箱的服务器的地址及端口,例如:  'smtp.qq.com:465'。
  smtp_auth_username:
  	发送人的邮箱用户名。
  smtp_auth_password:
  	发送人的邮箱密码。
  smtp_require_tls:
  	是否基于tls加密。
  smtp_hello:
  	邮箱服务器,例如: 'qq.com'。
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval:
  	重复报警的间隔时间,如果没有解即报警问题,则会间隔指定时间一直触发报警,比如:5m。
  receiver: 
  	采用什么方式接收报警,例如'email'。
receivers:
- name: 
	定义接收者的名称,注意这里的name要和上面的route对应,例如: 'email'
  email_configs:
  - to: 
  	邮箱发给谁。
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 
      	匹配报警级别,例如: 'critical'。
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
    
 


配置文件参考链接:
	https://prometheus.io/docs/alerting/latest/configuration/#file-layout-and-global-settings
	
	
    
温馨提示:
	163邮箱修改授权码步骤很简单,依次点击"设置" ---> "POP3/SMTP/IMAP" ---> "新增授权密码"


温馨提示:
	我的授权码已经更改了,每次讲课需要重新获取最新的授权码哟!!

2.5 启动alermanager并访问webUI
http://10.0.0.33:9093/#/status
 
 

	3.prometheus配置alermanager作为告警媒介
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml 
...
scrape_configs:
  ...
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 10.0.0.33:9093
			
rule_files:
  - "/oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml"

...

3.2 修改告警规则
[root@prometheus-server31 ~]# mkdir  /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml << 'EOF'
groups:
- name: oldboyedu-linux89-container-runtime
  rules:
  - alert: yinzhengjie_golang_custom_metrics-41节点挂掉啦
    expr: up{instance="10.0.0.41:18080", job="yinzhengjie_golang_custom_metrics"} == 0
    for: 15s
    labels:
      school: oldboyedu
      class: linux89
    annotations:
      summary: "{{ $labels.instance }} 已停止运行超过 15s!"
  - alert: yinzhengjie_python_custom_metrics-42节点的联邦模式挂掉啦
    expr: up{instance="10.0.0.42:8000", job="yinzhengjie_python_custom_metrics"} == 0
    for: 15s
    labels:
      school: oldboyedu
      class: linux89
    annotations:
      summary: "{{ $labels.instance }} 已停止运行超过 15s!"
EOF




3.3 重新加载prometheus的配置
curl -X POST http://10.0.0.31:9090/-/reload



3.4 查看prometheus server的WebUI
http://10.0.0.31:9090/alerts


3.5 查看alermanager的WebUI
http://10.0.0.33:9093/#/alerts

2. 自定义监控告警模板

- alermanager自定义告警模板
	1.告警模板介绍
默认的告警信息界面有些简单,可以借助告警的模板信息,对告警信息进行丰富,需要借助于Alertmanager的模板功能来实现。

告警模板的使用流程如下:
    - 分析关键信息
    - 定制模板内容
    - Alertmanager加载模板文件
    - 告警信息使用模板内容属性


模板文件使用标准Go模板语法,并暴露一些包含时间标签和值的变量。
    - 标签引用: {{ $label.<label_name> }}
    - 指标样本值引用: {{ $value }}
    
为了显式效果,需要了解一些html相关技术,参考链接:
    https://www.w3school.com.cn/html/index.asp
    
    
	2.altermanger节点自定义告警模板参考案例
2.1 创建邮件模板文件工作目录
[root@prometheus-server33 ~]# mkdir -pv /oldboyedu/softwares/alertmanager/tmpl


2.2 创建模板实例,工作中可以考虑嵌入公司的logo
[root@prometheus-server33 ~]# cat /oldboyedu/softwares/alertmanager/tmpl/email.tmpl 
{{ define "oldboyedu.html" }}
<h1>老男孩IT教育欢迎您:  https://www.oldboyedu.com/</h1>
<table border="1">
        <tr>
                <th>报警项</th>
                <th>实例</th>
                <th>报警阀值</th>
                <th>开始时间</th>
        </tr>
        {{ range $i, $alert := .Alerts }}
                <tr>
                        <td>{{ index $alert.Labels "alertname" }}</td>
                        <td>{{ index $alert.Labels "instance" }}</td>
                        <td>{{ index $alert.Annotations "value" }}</td>
                        <td>{{ $alert.StartsAt }}</td>
                </tr>
        {{ end }}
</table>
{{ end }}
[root@prometheus-server33 ~]# 



	3.alertmanager引用自定义模板文件
[root@prometheus-server33 alertmanager]# vim /oldboyedu/softwares/alertmanager/alertmanager.yml 
...
# 加载模板
templates:
  - '../tmpl/*.tmpl'


receivers:
  - name: 'yinzhengjie_email'
    email_configs:
    - to: "y1053419035@qq.com"
      send_resolved: true
      # 添加此行,定制邮件的标题,对于"{{}}"属性用于加载其他信息,需要使用单引号括住。
      headers: { Subject: "[WARN] 报警邮件" }
      # 添加此行,调用模板显式邮件正文,对于"{}"不需要使用单引号,否则服务启动不成功。
      html: '{{ template "oldboyedu.html" . }}'
...
[root@prometheus-server33 alertmanager]# 


    4.语法检查
[root@prometheus-server33 alertmanager]# pwd
/oldboyedu/softwares/alertmanager
[root@prometheus-server33 alertmanager]# 
[root@prometheus-server33 alertmanager]# ./amtool check-config /oldboyedu/softwares/alertmanager/alertmanager.yml 
Checking '/oldboyedu/softwares/alertmanager/alertmanager.yml'  SUCCESS
Found:
 - global config
 - route
 - 1 inhibit rules
 - 1 receivers
 - 1 templates
  SUCCESS

[root@prometheus-server33 alertmanager]# 


    
    5.重新加载配置信息
[root@prometheus-server33 alertmanager]# systemctl reload alertmanager.service 


    6.查看WebUi观察配置是否生效
http://10.0.0.33:9093/#/status



	7.上面我们定制邮件内容中包含阈值的部分,而我们在规则中并没有指定,所以prometheus需要修改以下规则文件。
7.1 修改规则文件
[root@prometheus-server31 ~]# cat /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml 
groups:
- name: oldboyedu-linux89-container-runtime
  rules:
  - alert: yinzhengjie_golang_custom_metrics-41节点挂掉啦
    expr: up{instance="10.0.0.41:18080", job="yinzhengjie_golang_custom_metrics"} == 0
    for: 15s
    labels:
      school: oldboyedu
      class: linux89
    annotations:
      summary: "{{ .instance }} 已停止运行超过 15s!"
      # 这里注释部分增加了一个value的属性信息,会从Prometheus的默认信息中获取阈值
      value: "{{ $value }}"
  - alert: yinzhengjie_python_custom_metrics-42节点的联邦模式挂掉啦
    expr: up{instance="10.0.0.42:8000", job="yinzhengjie_python_custom_metrics"} == 0
    for: 15s
    labels:
      school: oldboyedu
      class: linux89
    annotations:
      summary: "{{ .instance }} 已停止运行超过 15s!"
      # 这里注释部分增加了一个value的属性信息,会从Prometheus的默认信息中获取阈值
      value: "{{ $value }}"
[root@prometheus-server31 ~]# 


7.2 检查语法
[root@prometheus-server31 ~]# cd /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# 
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check rules rules/oldboyedu-linux89-rules.yaml 
Checking rules/oldboyedu-linux89-rules.yaml
  SUCCESS: 2 rules found

[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# 
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check config prometheus.yml 
Checking prometheus.yml
  SUCCESS: 1 rule files found
 SUCCESS: prometheus.yml is valid prometheus config file syntax

Checking /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml
  SUCCESS: 2 rules found

[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# 


7.3 重新加载配置文件
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# curl -X POST http://10.0.0.31:9090/-/reload 

监控k8s集群

1. serviceMonitor服务发现原理

image-20240927133458461

二.ServiceMonitor配置解析
	1.什么是ServiceMonitor 
传统的部署方式基于"prometheus.yml"配置文件来监控被目标,但是随着监控目标的增多,我们的配置文件就会变得很冗余,可读性就会变差。

于是就有了各种服务发现来减少"prometheus.yml"配置文件的配置,比如: "file_sd_config,consul_sd_config,kubernetes_sd_config,..."等配置。

而"Kube-Prometheus Stack"别具一格,采用了一种名为"ServiceMonitor"的自定义资源进行配置。

如上图所示,这个"ServiceMonitor"自定义资源基于标签来关联services资源,而services资源的ep列表会自动发现关联后端的Pod,然后在自动生成对应的"prometheus.yml"配置文件相匹配的代码块。

说白了,"ServiceMonitor"就是用来配置监控目标的,Prometheus可以识别这些配置并自动将其转换为"prometheus.yml"能识别的配置代码块。

2. prometheus-operator

- 在K8S集群部署kube-prometheus stack
	1 基于K8S版本选择合适的prometheus-operator
参考地址:
	https://github.com/prometheus-operator/kube-prometheus?tab=readme-ov-file#compatibility
	
	
	2 下载软件包
wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.11.0.tar.gz



	3 解压软件包
tar xf kube-prometheus-0.11.0.tar.gz -C 

	4 切换工作目录,进入到prometheus-operator主目录
cd kube-prometheus-0.11.0/

	5 安装自定义资源
5.1 下载镜像并修改文件
温馨提示:
	如果镜像下载失败,所有工作节点可以如下措施:
docker pull registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1 
docker tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1 k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1


docker pull registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0 
docker tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0


	或者修改资源清单,执行如下操作:
[root@master231 kube-prometheus-0.11.0]# vim manifests/prometheusAdapter-deployment.yaml
......
        # image: k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1
...



[root@master231 kube-prometheus-0.11.0]# vim manifests/kubeStateMetrics-deployment.yaml
...
        # image: k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0


[root@master231 kube-prometheus-0.11.0]# vim manifests/grafana-service.yaml
....
spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 30070


[root@master231 kube-prometheus-0.11.0]# vim manifests/alertmanager-service.yaml  
...
spec:
  type: NodePort
  ports:
  - name: web
    port: 9093
    targetPort: web
    nodePort: 30080
...


[root@master231 kube-prometheus-0.11.0]# vim manifests/prometheus-service.yaml
....
spec:
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 30090




5.2 部署服务
kubectl apply --server-side -f manifests/setup
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring
kubectl apply -f manifests/


 
5.3  验证服务
[root@master231 05-kube-prometheus-stack]# kubectl get pods -n monitoring 
NAME                                  READY   STATUS    RESTARTS   AGE
alertmanager-main-0                   2/2     Running   0          23s
alertmanager-main-1                   2/2     Running   0          31s
alertmanager-main-2                   2/2     Running   0          35s
blackbox-exporter-746c64fd88-mm684    3/3     Running   0          80m
grafana-5fc7f9f55d-qtvvt              1/1     Running   0          80m
kube-state-metrics-5c5cfbf465-4rmgz   3/3     Running   0          4m26s
node-exporter-56fst                   2/2     Running   0          80m
node-exporter-jxv5f                   2/2     Running   0          80m
node-exporter-tb578                   2/2     Running   0          80m
prometheus-adapter-5b479bc754-6ggqn   1/1     Running   0          80m
prometheus-adapter-5b479bc754-hgc4n   1/1     Running   0          4m25s
prometheus-k8s-0                      2/2     Running   0          20s
prometheus-k8s-1                      2/2     Running   0          10m
prometheus-operator-f59c8b954-wcfwb   2/2     Running   0          4m26s
[root@master231 05-kube-prometheus-stack]# 

[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30070
monitoring                     grafana                                   NodePort       10.200.21.213    <none>        3000:30070/TCP                  14m
[root@master231 kube-prometheus-0.11.0]# 
[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30080
monitoring                     alertmanager-main                         NodePort       10.200.231.77    <none>        9093:30080/TCP,8080:38123/TCP   15m
[root@master231 kube-prometheus-0.11.0]# 
[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30090
monitoring                     prometheus-k8s                            NodePort       10.200.53.208    <none>        9090:30090/TCP,8080:20511/TCP   15m
[root@master231 kube-prometheus-0.11.0]#



	6.访问测试
http://10.0.0.233:30070/
http://10.0.0.233:30080/
http://10.0.0.233:30090/



	7.温馨提示:如下频繁重启,可以考虑如下配置
[root@master231 05-kube-prometheus-stack]# vim kube-prometheus-0.11.0/manifests/alertmanager-alertmanager.yaml 
...
spec:
  image: quay.io/prometheus/alertmanager:v0.24.0
  ...
  replicas: 1

[root@master231 05-kube-prometheus-stack]# kubectl replace -f kube-prometheus-0.11.0/manifests/alertmanager-alertmanager.yaml 
alertmanager.monitoring.coreos.com/main replaced
[root@master231 05-kube-prometheus-stack]# 


[root@master231 05-kube-prometheus-stack]# vim kube-prometheus-0.11.0/manifests/prometheus-prometheus.yaml 
...
spec:
  ...
  image: quay.io/prometheus/prometheus:v2.36.1
  ...
  replicas: 1
...
[root@master231 05-kube-prometheus-stack]# kubectl apply -f kube-prometheus-0.11.0/manifests/prometheus-prometheus.yaml 
prometheus.monitoring.coreos.com/k8s configured
[root@master231 05-kube-prometheus-stack]# 
[root@master231 05-kube-prometheus-stack]# kubectl get pods -o wide -n monitoring 
NAME                                  READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
alertmanager-main-0                   2/2     Running   0          4m36s   10.100.2.18    worker233   <none>           <none>
blackbox-exporter-746c64fd88-mm684    3/3     Running   0          86m     10.100.1.254   worker232   <none>           <none>
grafana-5fc7f9f55d-qtvvt              1/1     Running   0          86m     10.100.1.2     worker232   <none>           <none>
kube-state-metrics-5c5cfbf465-4rmgz   3/3     Running   0          10m     10.100.1.171   worker232   <none>           <none>
node-exporter-56fst                   2/2     Running   0          86m     10.0.0.231     master231   <none>           <none>
node-exporter-jxv5f                   2/2     Running   0          86m     10.0.0.233     worker233   <none>           <none>
node-exporter-tb578                   2/2     Running   0          86m     10.0.0.232     worker232   <none>           <none>
prometheus-adapter-5b479bc754-6ggqn   1/1     Running   0          86m     10.100.1.3     worker232   <none>           <none>
prometheus-adapter-5b479bc754-hgc4n   1/1     Running   0          10m     10.100.1.167   worker232   <none>           <none>
prometheus-k8s-0                      2/2     Running   0          6m15s   10.100.2.17    worker233   <none>           <none>
prometheus-operator-f59c8b954-wcfwb   2/2     Running   0          10m     10.100.1.168   worker232   <none>           <none>
[root@master231 05-kube-prometheus-stack]# 

3. 监控hpa伸缩状态

如果你只想使用 Prometheus 监控 HPA 的伸缩状态,而不进行 HPA 和 Prometheus 的集成,可以通过 PromQL 查询 HPA 相关的指标。以下是一些基本的 PromQL 示例,可以帮助你监控 HPA 的状态和伸缩情况:

1. 监控 HPA 当前副本数

要监控 HPA 当前的副本数,可以使用以下查询:

kubectl:horizontalpodautoscaler:current_replicas:sum{namespace="<your-namespace>", name="<your-hpa-name>"}

2. 监控 HPA 目标副本数

要监控 HPA 目标的副本数,可以使用以下查询:

kubectl:horizontalpodautoscaler:desired_replicas:sum{namespace="<your-namespace>", name="<your-hpa-name>"}

3. 监控 HPA 的指标(如 CPU 使用率)

如果 HPA 根据 CPU 使用率进行伸缩,可以查询 CPU 使用率:

sum(rate(container_cpu_usage_seconds_total{namespace="<your-namespace>", pod=~"<your-pod-name>.*"}[5m])) by (pod)

4. 监控 HPA 触发的事件

你还可以监控 HPA 触发的事件(如扩展或收缩),虽然这些通常不是通过 PromQL 直接获取的,但可以通过 Kubernetes 事件来监控。

5. 将 HPA 状态可视化

将以上 PromQL 查询添加到你的监控仪表盘(如 Grafana)中,以便可视化 HPA 的状态和性能。这将帮助你实时了解 HPA 的行为和集群的负载状况。

示例 Grafana 配置

在 Grafana 中,你可以创建一个新面板并将以下 PromQL 查询作为数据源,设置适当的图表类型(如时间序列图或单值面板)来显示 HPA 的当前副本数和目标副本数。

通过这些 PromQL 查询,你可以有效监控 HPA 的伸缩状态,而无需将 Prometheus 与 HPA 集成。

posted @   逃离这世界~  阅读(61)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示

目录导航