小型系统如何零成本自主开发AIOps

小型系统如何零成本自主开发AIOps 1. 前言市面上的AIOps产品一般都是既大、又重、又贵。但是其基本功能无外乎还是监控指标预测、系统异常侦测、以及资源容量规划等等。对于小型系统来说或者有自主开发能力的实体(企业部门或者组织)实现这些看似高大上的功能实际上并不难甚至也消耗不了太多的资源。我这里就简单说说怎么“零投入”自己动手搞一个小型但实用的AIOps系统。2. 要安装什么系统和工具虽然说是“零投入”做AIOps但是一般来说原来也应该有个I/T监控或者APM之类的系统如果还没有的话推荐看看我写的有关OpenTelemetry的文章。我们假设有metrics存放在Prometheus数据库(小系统监控的最常见选择)我们就以此为基础进行分析。下一步就是找一台PC(内存不要太小)把R语言的环境装起来。作为生产系统我一般都是首选Linux系统。3. 把数据从Prometheus中读取出来用于分析Prometheus存储的时序数据无法直接被R语言用来分析。我们要把它转换为R语言能读懂的类型叫做tsibble。假设我在Prometheus中存储了一个Gauge类型的metric叫做“cpu_usage_percent”意思是CPU的使用率(百分比)那么我可以用一个简单的R语言脚本把最近7天的数据取出来为了后面反复使用我把它存储成一个文件(注意我的Prometheus里实际只有几小时的演示数据所以后面样图显示的只是几小时的数据)。下面就是代码library(httr) library(jsonlite) library(tsibble) library(dplyr) query_prometheus - function(query) { url - http://localhost:9090/api/v1/query_range end_time - Sys.time() start_time - end_time - 7*24*3600 response - GET( url, query list( query query, start as.numeric(start_time), end as.numeric(end_time), step 300s ) ) data - fromJSON(content(response, text)) values - data$data$result$values df - data.frame( timestamp as.numeric(values[[1]][,1]), value as.numeric(values[[1]][,2]) ) } cpu - query_prometheus( # 100 - avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100 avg_over_time(cpu_usage_percent[5m]) ) cpu_ts - cpu %% mutate( timestamp as.POSIXct(timestamp, origin1970-01-01) ) %% as_tsibble(indextimestamp) save(cpu_ts, fileres/cpu_ts.rdata)这个CPU的数据就足以演示“监控指标预测”和“系统异常侦测”这两大功能了。但是我还想用磁盘占用率来演示“资源容量规划”这个功能。所以我用下面的代码来读取最近7天的一个叫做“disk_usage_percent”的metric也把它转换为tsibble并存储为一个文件。library(httr) library(jsonlite) library(tsibble) library(dplyr) query_prometheus - function(query) { url - http://localhost:9090/api/v1/query_range end_time - Sys.time() start_time - end_time - 7*24*3600 response - GET( url, query list( query query, start as.numeric(start_time), end as.numeric(end_time), step 300s ) ) data - fromJSON(content(response, text)) values - data$data$result$values df - data.frame( timestamp as.numeric(values[[1]][,1]), value as.numeric(values[[1]][,2]) ) } disk - query_prometheus( avg_over_time(disk_usage_percent[5m]) ) disk_ts - disk %% mutate( timestamp as.POSIXct(timestamp, origin1970-01-01) ) %% as_tsibble(indextimestamp) save(disk_ts, fileres/disk_ts.rdata)4. 预测未来的监控指标这个代码真是相当的简洁目的是预测24小时之后的CPU使用率。我选了一个很小的叫做“ETS”的(指数平滑)模型作为示范。这个模型可以自动检测简单的趋势和季节性但是对于较复杂的情况可自行搜若文档或AI并修改代码。library(tsibble) library(dplyr) library(fable) library(ggtime) loadCpuTs - load(res/cpu_ts.rdata) cpu_ts - get(loadCpuTs) fit - cpu_ts %% model( ets ETS(value) ) future - fit %% forecast(h 24 hours) ggtime::autoplot(cpu_ts, value) ggtime::autolayer(future)于是我们得到一个“Rplots.pdf”文件包含如下的未来监控指标的分析和预测。因为我的原始数据只有几小时原始数据只展现了一个简单的趋势。所以预测的图像也比较简单包括95%的可能范围和80%的可能范围。5. 系统异常侦测下一步我们做一下也是AIOps里常见的项目叫做“系统异常侦测”其实就是看哪个检测指标的波动超出了可预见的波动范围。我们还以那个CPU metric为例。以下是代码library(anomalize) library(dplyr) loadCpuTs - load(res/cpu_ts.rdata) cpu_ts - get(loadCpuTs) cpu_anomaly - cpu_ts %% time_decompose( value, methodstl ) %% anomalize( remainder ) %% time_recompose() plot_anomalies(cpu_anomaly)这里采用了默认的方法(iqr四分位距方法)来发现异常的指标。还是生成一个“Rplots.pdf”文件包含如下的分析我们可以看到在接近13:00时有一个红点标志着CPU指标异常。6. 资源容量规划最后演示一个重要功能叫做“资源容量规划”。这个功能可以提前发现是否存在资源短缺的风险可提前准备。我们用磁盘的监控指标来做这个规划以下是代码loadDisk - load(res/disk.rdata) disk - get(loadDisk) fit - lm(value ~ timestamp, datadisk) target - 80 predict_time - (target - coef(fit)[[1]]) / coef(fit)[[2]] print(Disk usage will be 80% at:) as.POSIXct(predict_time, origin1970-01-01)可以看出我用了一个线性规划来模拟磁盘的增长。为了代码简单我没有增加作图的部分。以下是代码的返回[1] Disk usage will be 80% at: [1] 2026-06-02 02:57:13 CST可见该系统的磁盘使用率会在几天后到达80%需要提前准备。7. 总结本文为小型I/T系统提供了一个“零投入”、手工实现AIOps的方案。包括相关的代码用来实现监控指标预测、系统异常侦测、以及资源容量规划等常见的AIOps的功能。具体实现时需要对相关代码进行定制和优化并提供自动化的手段(比如用Python整合一下流程)。