干了几天运维,对于系统监控的几个小的实践。把思路稍作整理,目前5个维度入手:
- 服务器性能监控。应用JVM监控。应用状态监控。日志关键词监控。自定义业务逻辑监控。
监控的基础架构为:Prometheus+Grafana,需一定的基础。
预警渠道:
短信
钉钉
邮件
服务器性能监控
服务器安装node_expoter,Promentheus采集CPU、内存、IO、硬盘等信息,并在Grafana展示,配置预警信息等。
应用JVM监控
SpringBoot自带了监控功能,直接添加micrometer包即可。
应用状态监控
本身可以通过JVM得到系统的运行状态,为何多此一举,有时候发现应用状态正常但是数据库却访问不了。所以想通过一种简单的方式判断应用数据库操作是否正常。
首先要确定应用的唯一标识,经过衡量:应用名+本机内网IP为对应服务的标识。
策略:应用每隔一分钟更新数据库中的对应的标识数据时间,类似应用做一次签到。
由于prometheus只能返回数字信息,将签到的结果(当前时间-签到时间=间隔的分钟数)转换为metrics格式的guage类型数据追加至/actuator/prometheus接口后面。
日志关键词监控
由于历史原因,未能部署ELK。系统运行中存在一些异常错误,输出在日志中,希望在出现错误关键词后能够及时将信息通知开发知晓。
应用服务标识与应用状态监控相同,采用应用名+本机内网IP为对应服务的标识。
策略:定时每10分钟解析近10分钟的日志文件,如出现设置的关键词,取关键词上下文各20行同步保存至数据库的日志异常记录中。并将关键词次数作为结果追加至/actuator/prometheus接口后面。
邮件:Grafana触发监控值预警后,同步触发一个webhook异常日志的查询接口,将数据库中的异常日志作为邮件发送至该项目对应的开发邮箱中。
自定义业务逻辑监控
每个业务系统都有自己的业务属性,所以监控点也都不同,可从一下几个维度去入手监控:
*.单业务点监控维度
*.最大:上限校验
*.最小:下限校验
*.累计:总值校验
*.期限:时间范围,活动期到期等
*.连续:监控值是否持续性校验
*.平衡:与外表的交叉校验
每项业务都可总结对应的监控点,直接创建一个Bean对象。该监控值会自动添加至/actuator/prometheus返回中,无需手动添加至接口返回值后面。
举例:每分钟成功总数、每分钟失败总数。
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class TransMonitorBean {
private final AtomicInteger gauge_trans_tot_amt_min_success;
private final AtomicInteger gauge_trans_tot_num_min_success;
public TransMonitorBean(MeterRegistry registry) {
this.gauge_trans_tot_amt_min_success = registry.gauge("gauge_trans_tot_amt_min_success", new AtomicInteger(0));
this.gauge_trans_tot_num_min_success = registry.gauge("gauge_trans_tot_num_min_success", new AtomicInteger(0));
}
public void handleTotAmtMinSuccess(int val) {
this.gauge_trans_tot_amt_min_success.set(val);
}
public void handleTotNumMinSuccess(int val) {
this.gauge_trans_tot_num_min_success.set(val);
}
}



