番外篇-Prometheus入门
应用监控的基本组合
日志Logging[ELK]+指标Metrics[AMP]+追踪Tracing[SkyWalking]
通过指标发现性能问题,通过追踪定位性能,通过日志定位出具体请求的明细参数
# 指标的基本组合
Actuator+Micrometer+Prometheus+Grafana
Actuator: 采集内部应用内部信息暴露给外部,提供原始监控数据,比如健康检查,指标收集,应用信息
Micrometer: 为性能数据收集提供通用的API,包括:计时器,计数器,可以与不同的监控系统适配
Prometheus: 系统监控报警框架,提供多维度数据模型和灵活的查询方式,采用Pull方式采集数据
Granfana: 数据监控和数据统计,可视化,报警,通知
# SpringBoot Actuator
- 引入SpringBoot Actuator及micrometer
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency><dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- 配置actuator
application.yml
management:
endpoint.health.show-details: always
endpoints:
web.exposure.include: prometheus,loggers
metrics.export.prometheus.enabled: true
metrics:
tags.application: flower
我们只配置了prometheus和loogers,prometheus可以监控程序,loggers可以修改日志级别,其他根据需要开启和关闭。配置以后可以通过/actuator/prometheus进行访问。
* 如果因为contentType访问失败,需要在WebMvcConfig中configureMessageConverters增加"application/openmetrics-text"的支持。
- 主要指标
运行时间
process_uptime_seconds{job="flower-webapi"}
jvm full GC - 24小时gc次数 - 可以设置报警
increase(jvm_gc_pause_seconds_count{application="agent", cause="Metadata GC Threshold"}[24h])
jvm 内存使用 -查看不同区域内存,合理调整jvm参数
jvm_memory_used_bytes{job="flower-webapi", area="heap"}/1024/1024
api qps - 5分钟访问量
sum(increase(http_server_requests_seconds_count{job="flower-webapi"}[5m])/300)
还可以查看
jvm线程数,jvm gc收集次数和收集耗时
接口请求次数,请求时长,日志情况
# Prometheus
- 安装和配置
Prometheus监控的目标是:长期趋势分析
Prometheus中文文档
Prometheus配置
global:
scrape_interval: 15s
scrape_configs:
- job_name: "flower-webapi"
params:
"product-code": ["A20001"]
authorization:
type: Bearer
credentials: "eyJ0eXAiOiJ...6Z6w"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["101.200.53.244:8210"]*此配置需要访问权限,具体credentials可以通过WebSecurityConfig设置特定角色访问
antMatchers(securityConfig.getActuatorUrl()).hasRole(securityConfig.getActuatorRole())
Prometheus安装
docker pull prom/prometheus
docker run --name prometheus -it -p 9090:9090 -v prometheus.yml:/etc/prometheus/prometheus.yml --network flower --network-alias flower-prom -d prom/prometheus* prometheus.yml参照prometheus配置
* 为了让Prometheus可以访问其他Docker,需要在同一个网络中,需要指定--network,可以通过docker network create flower预先创建
* Prometheus可以使用多种Exporter来监控其他类型的数据,常见Exporter如下:
BlackExporter
Prometheus社区提供的官方黑盒监控解决方案,可以通过https, https, dns, tcp, icmp方式对网络进行探测
运行
docker run -id --name cove-probe -p 9115:9115 -v blockbox.yml:/etc/blackbox_exporter/config.yml prom/blackbox-exporter
配置
https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md
Nginx Exporter
开启-需要开启Nginx sub_status功能
配置-sub_status
server {
listen 9000;
location /nginx_status {
stub_status on;
access_log off;
allow all;
}
}
通过curl http://localhost:9000/nginx_status进行验证
运行-exporter
docker run -p 9113:9113 --network flower--network-alias flower-nginx nginx/nginx-prometheus-exporter:0.10.0 -nginx.scrape-uri=http://<nginx>:8080/stub_status
通过curl http://localhost:9113/metrics进行验证参数
https://nginx.org/en/docs/http/ngx_http_stub_status_module.htmlprometheus job
- job_name: "flower-nginx"
metrics_path: "/metrics"
static_configs:
- targets: ["flower-nginx:9113"]
Node exporter
用于提供*NIX内核的硬件以及系统指标,可以通过--collectors.enabled执行需要收集的功能模块
重点关注cpu, memory, disk
./node_exporter --collector.disable-defaults --collector.cpu --collector.diskstats --collector.meminfo --collector.loadavg --collector.filesystem --collector.filesystem.ignored-fs-types="tmpfs" --web.listen-address=":9110"prometheus job
- job_name: "flower_node"
metrics_path: "/metrics"
static_configs:
- targets: ["ip:9110"]主要指标
负载
irate(node_load15{job="flower_node"}[5m])
cpu使用率
1-sum(irate(node_cpu_seconds_total{mode="idle",job="flower_node "}[5m]))/count(node_cpu_seconds_total{mode="user",job="flower_node "})
mem使用率
node_memory_MemAvailable_bytes{job="flower_node"}/node_memory_MemTotal_bytes{job="flower_node"}
disk使用率
1-node_filesystem_free_bytes{job="flower_node"}/node_filesystem_size_bytes{job="flower_node"}* exporter常用指标含义
https://www.cnblogs.com/robinunix/p/11276296.html
Docker Explorter - cavdisor
监控docker容器
运行
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=9300:8080 --detach=true --name=agent-docker-manage --privileged --device=/dev/kmsg --network flower --network-alias flower-docker -d google/cadvisor:latestprometheus job
- job_name: "flower-docker"
metrics_path: "/metrics"
static_configs:
- targets: ["101.200.53.244:9300"]主要指标
CPU使用情况
sum(rate(container_cpu_usage_seconds_total{name="flower-docker"}[5m]))*100
内存使用情况
sum(container_memory_working_set_bytes{name="flower-docker"})/1024
容器数量-可作为预警使用
count(container_start_time_seconds{name != ""})
- 探索PromQL
metric指标-要监控的对象
格式:<metric name>{<label name>=<label value>,}
sample-样本-某个时间戳的指标的值
metric类型
Counter计数器:代表一种样本数据单调递增的指标
Guage仪表盘:代表一种样本数据可以任意变化的指标
Histogram直方图:在一段时间内对数据进行采样
Summary摘要:表示一段时间内的数据采样结果
# 配置Granfana
部署
docker run -d --name agent-granfana -p 3000:3000 -v grafana.ini:/etc/grafana/grafana.ini grafana/grafana
访问
http://ip:3000
邮件配置
[smtp]
enabled = true #默认是false
host = smtp.mxhichina.com:465 #smtp服务器的地址和端口 465|25
user = test@xxx.com #你登录邮箱的账号
password = xxxxxxx #你邮箱账号的密码
from_address = test@xxx.com #发邮件的账号
from_name = Grafana #自定义的名字
ehlo_identity = dashboard.example.com #无关紧要的一个标示...
# 安全策略
- 同一机器的,使用本机地址访问,端口不对外开发
- 同一机器的,不同Docker,可以使用同一docker网络,端口不用映射
- 同一专有网络的,使用专有网络地址访问,端口不对外开发
- 只有Granfana对外公开,同时设置管理员账号
参考文献
https://mp.weixin.qq.com/s/yqMdXehLCl7-m2kcfjh6OQ