一、Prometheus监控Consul
之前已经部署过Consul了,现在需要部署个Consul Exporter,它负责将Consul的状态信息转为Prometheus兼容的指标格式并予以暴露。
1.1 部署Consul Exporter软件包
wget https://github.com/prometheus/consul_exporter/releases/download/v0.9.0/consul_exporter-0.9.0.linux-amd64.tar.gz
tar -xf consul_exporter-0.9.0.linux-amd64.tar.gz
mv consul_exporter-0.9.0.linux-amd64 /usr/local/consul_exporter
1.2 为Consul Exporter设置systemd unit配置文件
vim /lib/systemd/system/consul_exporter.service
[Unit]
Description=consul_exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/default/consul_exporter
# 具体使用时,若consul_exporter与consul server不在同一主机时,consul server要指向实际的地址;
ExecStart=/usr/local/consul_exporter/consul_exporter \
--consul.server="http://192.168.131.11:8500" \
--web.listen-address=":9107" \
--web.telemetry-path="/metrics" \
--log.level=info \
$ARGS
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
systemctl enable --now consul_exporter
此时,9107端口已正常监听,执行curl 192.168.131.11:9107/metrics命令也能看到其暴露的指标。
1.3 配置consul_exporter服务并注册到Consul
#在Consul的配置目录下操作
vim /etc/consul/consul_exporter.json
{
"service": [{
"id": "consul_exporter",
"name": "consul_exporter_node1",
"address": "192.168.131.11",
"port": 9107,
"tags": ["consul_exporter"],
"checks": [{
"http": "http://192.168.131.11:9107/metrics",
"interval": "10s"
}]
}]
}
consul reload
加载完配置信息后,再次查看Consul界面,发现consul_exporter_node1这个Service已经注册上去了。
1.4 Prometheus发现consul_exporter服务
这里使用基于Consul的服务发现方式。Prometheus.yml的相关配置如下:
- job_name: "consul_exporter"
consul_sd_configs:
- server: "192.168.131.11:8500"
tags:
- "consul_exporter"
refresh_interval: 10s
curl -XPOST http://192.168.131.11:9090/-/reload
此时,查看Prometheus Web界面,发现多了个Target,名为consul_exporter。如果consul_exporter这个服务在Consul中注销了,则Prometheus不再监视该服务。
二、Prometheus监控Mysql
在部署好Mysql的基础上,需要为每个MySQL Server实例部署mysql-exporter,它负责将MySQL Server的状态信息转为Prometheus兼容的指标格式并予以暴露。
2.1 部署Mysql Exporter软件包
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar -xf mysqld_exporter-0.15.0.linux-amd64.tar.gz
mv mysqld_exporter-0.15.0.linux-amd64 /usr/local/mysqld_exporter
2.2 配置Mysql Exporter
在mysqld-exporter安装路径下,创建my.cnf文件。内容如下:
[client]
user=mysqld_exporter
password=123456
2.3 配置Mysql的用户并授权
需要注意的是用户账号授权时使用的主机范围。
create user 'mysqld_exporter'@'localhost' identified by '123456';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'mysqld_exporter'@'localhost';
GRANT SELECT ON performance_schema.* TO 'mysqld_exporter'@'localhost';
2.4 为Mysql Exporter设置systemd unit配置文件
vim /lib/systemd/system/mysqld_exporter.service
[Unit]
Descriptinotallow=consul_exporter
Documentatinotallow=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Type=simple
User=mysql
# 具体使用时,若mysql_exporter与mysql server不在同一主机时,mysql server要指向实际的地址;
# mysql_exporter连接mysql server使用的用户名和密码均为exporter,该用户要获得正确的授权;
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter \
--config.my-cnf=/usr/local/mysqld_exporter/my.cnf \
--web.listen-address=":9104" \
--web.telemetry-path="/metrics" \
--collect.info_schema.innodb_tablespaces \
--collect.info_schema.innodb_metrics \
--collect.global_status \
--collect.global_variables \
--collect.slave_status \
--collect.engine_innodb_status
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
systemctl enable --now mysqld_exporter
此时,9104端口已正常监听,执行curl Mysql_Exporter IP:9104/metrics命令也能看到其暴露的指标。
2.5 Prometheus.yml配置job监控Mysql
这里使用静态发现服务的方式配置。Prometheus.yml配置内容如下:
#监控主机node信息,依赖插件mysql_exporter
- job_name: "mysqld_exporter"
static_configs:
- targets: ['192.168.131.12:9104']
curl -XPOST http://192.168.131.11:9090/-/reload
三、Prometheus监控Nginx
3.1 准备相关安装包
监控nginx需要用到如下两个模块:
- nginx-module-vts:这是一个 nginx 模块,提供对 nginx 虚拟机主机状态数据的访问,可将数据输出格式为json、html、json、prometheus。
- nginx-vts-exporter:主要用于收集nginx的监控数据,并暴露端口给 Prometheus 用于数据采集。
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.zip && unzip v0.2.2.zip
wget https://nginx.org/download/nginx-1.24.0.tar.gz && tar -xf nginx-1.24.0.tar.gz && cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module --with-http_flv_module --with-http_mp4_module --with-http_sub_module --with-http_v2_module --with-pcre-jit --with-pcre --with-http_dav_module --with-http_addition_module --add-module=/root/package/nginx-module-vts-0.2.2
make && make install
3.2 编辑Nginx配置
http {
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
server {
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
# 配置解释
1、vhost_traffic_status_zone; 是必填项
2、vhost_traffic_status_filter_by_host on; 即打开vhost过滤,开启此功能,在nginx配置有多个server_name的情况下会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上
3、 在不想统计流量的server区域可以使用 vhost_traffic_status off; 禁止
/usr/local/nginx/sbin/nginx
访问/status界面如下:
访问/status/format/prometheus页面如下:
3.3 安装nginx-vts-exporter
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
tar -xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64 /usr/local/nginx-vts-exporter
3.4 为nginx-vtx-exporter设置systemd unit配置文件
vim /lib/systemd/system/nginx-vts-exporter.service
[Unit]
Descriptinotallow=nginx-vts-exporter
Documentatinotallow=https://github.com/hnlq715/nginx-vts-exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://192.168.131.12/status/format/json
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl enable --now nginx-vtx-exporter
3.5 Prometheus配置job监控Nginx
这里使用静态发现服务的方式配置。prometheus.yml的配置内容如下:
- job_name: 'nginx'
static_configs:
- targets: ['192.168.131.12:9913'] #9913为nginx-vtx-exporter工具启动的端口
scrape_interval: 10s
curl -XPOST http://192.168.131.11:9090/-/reload
附:Nginx监控指标说明
四、Prometheus监控Tomcat
Prometheus监控Tomcat需要向Tomcat内添加jmx_prometheus_javaagent包,并暴露一个端口给外部访问来获取数据。
4.1 下载相关安装包
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-10/v10.1.13/bin/apache-tomcat-10.1.13.tar.gz
tar -xf apache-tomcat-10.1.13.tar.gz
mv apache-tomcat-10.1.13 /usr/local/tomcat
4.2 jmx_exporter相关配置文件下载
wget https://github.com/prometheus/jmx_exporter/blob/master/example_configs/tomcat.yml
tomcat.yml的内容如下:
# https://grafana.com/grafana/dashboards/8704-tomcat-dashboard/
---
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem", "Catalina:*"]
blacklistObjectNames: []
rules:
- pattern: 'Catalina<type=Server><>serverInfo: (.+)'
name: tomcat_serverinfo
value: 1
labels:
serverInfo: "$1"
type: COUNTER
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
name: tomcat_$3_total
labels:
port: "$2"
protocol: "$1"
help: Tomcat global $3
type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplicatinotallow=none, J2EEServer=none><>(requestCount|processingTime|errorCount):'
name: tomcat_servlet_$3_total
labels:
module: "$1"
servlet: "$2"
help: Tomcat servlet $3 total
type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|connectionCount|acceptCount|acceptorThreadCount|pollerThreadCount|maxThreads|minSpareThreads):'
name: tomcat_threadpool_$3
labels:
port: "$2"
protocol: "$1"
help: Tomcat threadpool $3
type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), cnotallow=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
name: tomcat_session_$3_total
labels:
context: "$2"
host: "$1"
help: Tomcat session $3 total
type: COUNTER
4.3 tomcat收集指标数据
mkdir /usr/local/tomcat/jmx
cp jmx_prometheus_javaagent-0.19.0.jar tomcat.yml /usr/local/tomcat/jmx
之后修改tomcat的配置文件catalina.sh
vim /usr/local/tomcat/bin/catalina.sh
JAVA_OPTS="-javaagent:/usr/local/tomcat/jmx/jmx_prometheus_javaagent-0.19.0.jar=39081:/usr/local/tomcat/jmx/tomcat.yml"
#之后启动tomcat
/usr/local/tomcat/bin/startup.sh
测试是否收到数据:curl localhost:39081或curl localhost:39081/metrics
4.4 Prometheus配置Job采集数据
这里直接采用静态服务发现的方式配置。prometheus.yml的相关配置如下(在scrape_configs下添加):
- job_name: 'tomcat'
static_configs:
- targets: ['192.168.131.12:39081']
scrape_interval: 10s
curl -XPOST http://192.168.131.11:9090/-/reload
另外,Prometheus使用up指标可以查询指定的Exporter实例以及状态。
up{instance="192.168.131.12:39081"}
五、Prometheus实现黑盒监控
5.1 白盒监控&黑盒监控
白盒监控指监控主机的资源用量、容器的运行状态、数据库中间件的运行数据等等(实现方式:要么内置测量系统,要么添加Exporter来查询相关中间件的内部信息随后再暴露出去),这些都是支持业务和服务的基础设施,通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。
黑盒监控指以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP 探针、 TCP 探针等用于检测站点或者服务的可访问性,以及访问效率等。
黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向的。当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要能够从白盒的角度发现潜在问题,能够在黑盒的角度快速发现已经发生的问题。
5.2 blackbox_exporter简介
blackbox_exporter 是 Prometheus 官方提供的官方黑盒监控解决方案,可通过http(s)、dns、tcp、icmp 的方式对网络进行探测。支持的应用场景包括:
- ICMP:主机存活探测
- DNS:域名解析
- TCP:端口存活检测
- SSL证书过期时间检测
- HTTP:定义 Request Header 信息和判断 Http status/Http Respones Header/Http Body 内容
- POST:接口联通性
5.3 部署blackbox_exporter安装包
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz
tar -xf blackbox_exporter-0.24.0.linux-amd64.tar.gz
mv blackbox_exporter-0.24.0.linux-amd64 /usr/local/blackbox_exporter
5.4 为blackbox_exporter设置Systemd unit配置文件
vim /lib/systemd/system/blackbox_exporter.service
[Unit]
Descriptinotallow=blackbox_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/blackbox_exporter/blackbox_exporter --config.file=/usr/local/blackbox_exporter/blackbox.yml --web.listen-address=:9115
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl enable --now blackbox_exporter
5.5 blackbox-exporter配置文件解析
blackbox-exporter的配置文件使用默认的即可(/usr/local/blackbox_exporter/blackbox.yml),文件里定义了进行目标检测时要使用的模块和模块参数。至于要检测哪些目标是定义在Prometheus 的Job配置中。
modules:
http_2xx: #模块名
prober: http
http:
preferred_ip_protocol: "ip4"
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
grpc:
prober: grpc
grpc:
tls: true
preferred_ip_protocol: "ip4"
grpc_plain:
prober: grpc
grpc:
tls: false
service: "service1"
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: "SSH-2.0-blackbox-ssh-check"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp
icmp_ttl5:
prober: icmp
timeout: 5s
icmp:
ttl: 5
5.6 配置Prometheus使用黑盒监控
vim /usr/local/prometheus/prometheus.yml
- job_name: 'blackbox' #配置job名
metrics_path: /probe #定义metric获取的路径
params:
module: [http_2xx] #这里就是我们在black_exporter中定义的模块名
static_configs:
- targets:
- www.magedu.com
- www.google.com
relabel_configs:
- source_labels: [__address__] #当前target的访问地址,比如监控百度则为 https://baidu.com
target_label: __param_target #__param_是默认参数前缀,target为参数,这里可以理解为把__address__ 的值赋给__param_target,若监控百度,则target=https://baidu.com
- source_labels: [__param_target]
target_label: instance #可以理解为把__param_target的值赋给instance标签。instance的标签值还是保存的是原来__address__的值,而非重写后(黑盒地址)的值。如果将__address__的值改为黑盒地址,则会误以为这是针对黑盒服务器的探测结果。其实不然,这是借助黑盒服务器探测其它网站的结果。因此,在__address__的值重写之前,需将其值赋给instance之上。每个target都有两个用于标识身份的标签:instance和job。
- target_label: __address__
replacement: "192.168.131.12:9115" #web监控本来是以的target为站点的地址的,但Prometheus不是直接去请求该地址(target网站地址本身不暴露指标),而是去请求black_exporter,故需要把目标地址替换为black_exporter的地址(加上指标路径)。此地址向targets发起请求,根据模块的探测结果通过指标路径响应给Prometheus。target只是告诉了要探测工作性能的目标网站而已。
- target_label: region
replacement: "local"
#重新加载Prometheus
curl -XPOST 192.168.131.11:9090/-/reload
blackbox下并不是Prometheus中State状态为UP就认为是正常状态。虽然在Prometheus探测google.com的状态为UP,但进入blackbox主界面就能发现,探测google.com的结果就是失败的。
标签:exporter,http,nginx,--,consul,中间件,案例,Prometheus From: https://blog.51cto.com/u_15796303/7800113