链载Ai

标题: 揭秘「零故障」运维:Prophet 时序预测与 AI 模型如何联手驯服服务器风险? [打印本页]

作者: 链载Ai    时间: 昨天 22:14
标题: 揭秘「零故障」运维:Prophet 时序预测与 AI 模型如何联手驯服服务器风险?





背景

最近做了些AI在告警和日志上面的尝试,尤其是告警,都是在发生后,才做的巡检,那么,如何在告警发生前就提前预知呢?来看下面的预警方案。


智能预警方案设计

方案分五步步骤:

    utside;" class="list-paddingleft-2">
  1. 数据采集:定时从 Zabbix API 拉取监控数据(如磁盘、内存历史数据)。

  2. 数据预处理:对数据做清洗、归一化、滑动窗口等处理。

  3. AI趋势分析:用大模型(如 DeepSeek、GPT-4)或传统时序预测模型(如 Prophet、LSTM)分析未来一段时间的增长趋势。

  4. 智能预警:如果模型预测未来X小时内有较大概率达到阈值,则提前发出预警。

  5. 告警推送:通过邮件、钉钉、微信等方式推送智能预警。


Prophet 预测原理简述

1. 加性模型(Additive Model)

Prophet 假设时间序列可以分解为:

y(t) = g(t) + s(t) + h(t) + ε_t

g(t):趋势(Trend)分量,描述长期增长或下降趋势

s(t):季节性(Seasonality)分量,描述周期性变化(如日、周、年周期)

h(t):节假日(Holiday)分量,描述特殊事件对数据的影响

ε_t:误差项(Noise)

2. 趋势建模

Prophet 支持线性趋势和饱和增长(logistic growth)两种趋势模型。

可以自动检测并拟合趋势中的“转折点”(changepoints),即趋势发生变化的时间点。

3. 季节性建模

使用傅里叶级数(Fourier series)建模季节性成分,能灵活拟合各种周期性波动。

支持多种季节性(如日、周、年等),可自定义。

4. 节假日建模

用户可指定节假日或特殊事件,Prophet 会自动建模这些事件对数据的影响。

5. 鲁棒性与自动化

Prophet 对异常值和缺失值有较强的鲁棒性。

只需少量参数即可自动建模,适合非专业数据科学用户。


核心代码

1、zabbixAPI获取历史数据defget_item_history(auth,itemid,time_from,time_till):payload={"jsonrpc":"2.0","method":"history.get","params":{"output":"extend","history":0,#0:float"itemids":itemid,"sortfield":"clock","sortorder":"ASC","time_from":time_from,"time_till":time_till,"limit":1000},"auth":auth,"id":2}r=requests.post(ZABBIX_URL,json=payload)result=r.json()['result']print(f"[DEBUG]get_item_historyforitemid={itemid}:{result[:3]}...total={len(result)}")returnresult
2、数据清洗defpreprocess(data):df=pd.DataFrame(data)df['clock']=pd.to_numeric(df['clock'],errors='coerce')df['value']=pd.to_numeric(df['value'],errors='coerce')df=df.dropna(subset=['clock','value'])ifdf.empty:returnpd.DataFrame(columns=['ds','y'])df['clock']=pd.to_datetime(df['clock'],unit='s')df=df.set_index('clock').sort_index()#只保留value列df=df[['value']]#强制value为float64df['value']=df['value'].astype('float64')#重采样df=df.resample('5min').mean().interpolate()df=df.reset_index()df=df.rename(columns={'clock':'ds','value':'y'})returndf
3、时序模型做本地趋势预测defforecast_trend(df,periods=24):model=Prophet()model.fit(df)future=model.make_future_dataframe(periods=periods,freq='5min')forecast=model.predict(future)returnforecast[['ds','yhat']].tail(periods)
4.构造AI大模型解释Prompt(提示词工程)defbuild_prompt(df,forecast,metric_name="磁盘使用率",threshold=THRESHOLD,hostname="主机"):history=df['y'].tolist()[-24:]future=forecast['yhat'].tolist()prompt=(f"主机:{hostname}\n"f"以下是该主机最近24小时的{metric_name}历史数据(每5分钟采样,单位%):\n"f"{history}\n"f"rophet模型预测未来2小时的{metric_name}为:\n{future}\n"f"当前阈值为{threshold}%。这是磁盘空闲率指标,值越小说明可用存储空间越小,存储越紧张,需要尽快清理空间或者磁盘扩容,请判断该指标是否有异常降低的趋势,未来2小时内是否有可能持续低于阈值,低于阈值的时候就需要提醒该清理空间或扩容磁盘了,并给出预警建议。")returnprompt
5.调用OpenAI大模型defask_ai(prompt):client=OpenAI(api_key="sk-xxxxxx",base_url="https://api.deepseek.com")messages=[{"role":"user","content":prompt}]response=client.chat.completions.create(model="deepseek-reasoner",messages=messages)reasoning_content=response.choices[0].message.reasoning_contentcontent=response.choices[0].message.contentreturncontent

效果展示

以磁盘预警为例,当我设置磁盘空闲率为20%阈值时,磁盘初始化值使用率为80%左右,当我定时批量写入数据,将磁盘空闲率降低到22%左右,这时还没触发告警阈值,此时运行预警程序,则会提示,磁盘使用率将要达到阈值,即将触发报警

image.png

而当我开始清理磁盘时,空间逐步释放,这时候再次运行程序,则提示磁盘空间逐步释放,无法清理

image.png

总结

这是一次数据预测模型与AI模型相结合的尝试,经过前面几次尝试,发现,直接将源数据吐给大模型,并不能实现准确的分析与评估,需要数学模型结合,对数据进行清洗,然后由AI给出总结报告,这样得出的结论还是比较准备。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5