AIOps实践方案:基于Dify的Prometheus+夜莺智能监控分析平台
本文介绍了一个AIOps实验,通过整合Prometheus监控系统、Dify AI平台和夜莺监控平台,构建具备智能分析能力的监控系统。实验采用"监控数据+AI分析"的轻量级架构,利用Prometheus采集系统指标,通过Dify平台构建具备Prometheus查询能力的AI Agent,并将AI能力嵌入到监控界面中。
文章目录
AIOps实验:Agent接入Prometheus与夜莺
一、思路
元旦放假期间,研究了一下AIOps,使用了一下市场上广受好评的Dify,Dify上有一个插件可以使AI调用Prometheus内的数据完成数据分析,那么这一下子就来灵感了,如果把AI接入Prometheus,那么岂不是可以让AI自己去分析服务器、中间件的性能了?说干就干,然后最开始很装,以为自己可以用go自己手搓,但是给自己蠢死了,没那个能力还瞎整哈哈哈哈哈。
但是既然干了,就要干出点成果,既然自己开发不出来,那么我的理念就是,做一个资源整合家,充分利用现有的开源产品,将其整合到一起,实现1+1≥2的效果,就像之前拿Jenkins+supervisor弄出一个流水线一样,干就完了。
这个实验采用"监控数据+AI分析"的轻量级AIOps架构,核心思路是通过三个组件的有机整合,数据采集层使用Prometheus收集系统指标,智能分析层基于Dify平台构建具备Prometheus查询能力的AI Agent,交互展示层通过Nginx反向代理将AI能力嵌入到Prometheus原生界面。
当然,我比较推荐把这个直接接入到夜莺上,这样一个监控、告警、AI分析,一个一体化的平台就出现了,并且这么做的原因在于,在使用了一下WatchAlert之后(也是一个非常厉害的开源监控平台,并且支持AI分析),我发现这个平台的AI只能分析一个数据,举个例子,如果现在出现了问题,他只能分析那一条出问题的数据,并且是瞬时数据,数据不连续,应该就是所谓的上下文不全,这就会导致AI会胡乱分析,然而接入MCP之后,可以让AI分析Prometheus上所有的监控数据,把Prometheus当成了TSDB,AI就可以关联其他指标去做具体的判断(安全性也是需要考虑的问题,不过这只是思路,其他的目前不考虑,感觉整个过程就是AI查询数据库的过程)。
该实验的最终实现效果:
Prometheus:

夜莺:

实验过程
环境准备:
ubuntu22.04操作系统,。
内存建议≥4G,硬盘≥40G。
一、部署实验环境
1、部署Prometheus
在官方下载Prometheus软件包并解压:
下载地址:https://prometheus.io/download/
tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /data/
mv prometheus-3.5.0.linux-amd64/ prometheus
cd /data/prometheus/
./prometheus --version
prometheus, version 3.5.0 (branch: HEAD, revision: 8be3a9560fbdd18a94dedec4b747c35178177202)
build user: root@4451b64cb451
build date: 20250714-16:15:23
go version: go1.24.5
platform: linux/amd64
tags: netgo,builtinassets
编写systemd启动文件:
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
Group=root
# 工作目录
WorkingDirectory=/data/prometheus
# 启动命令
ExecStart=/data/prometheus/prometheus \
--config.file=/data/prometheus/prometheus.yml \
--storage.tsdb.path=/data/prometheus/data \
--web.console.templates=/data/prometheus/consoles \ # 可以不使用该参数,是之前嵌套使用的方案一,这次不用
--web.console.libraries=/data/prometheus/console_libraries \ # 同上
--web.enable-lifecycle \
--web.enable-remote-write-receiver
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start prometheus.service
2、部署node_exporter
为了后续实验效果明显,我们部署一个node_exporter作为我们后续要让AI分析的数据源。
node_exporter下载地址:https://prometheus.io/download/
# node_exporter 部署
tar -zxf node_exporter-1.8.1.linux-amd64.tar.gz -C /data/prometheus/
cd /data/prometheus/
mv node_exporter-1.8.1.linux-amd64/ node_exporter/
# 编写systemd启动
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
ExecStart=/data/prometheus/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.targe
systemctl daemon-reload
systemctl start node_exporter
编写Prometheus配置文件:
root@instance-wc5p3ngj:/data/prometheus# cat prometheus.yml
# 只展示新增部分:
scrape_configs:
- job_name: "node_exporter"
static_configs:
- targets: ['127.0.0.1:9100']
labels:
instance: '127.0.0.1:9100'
env: 'deploy'
重启Prometheus即可。
web端查看:

3、部署夜莺平台
部署夜莺所需的依赖:MySQL与Redis
# 启动redis
sudo docker run -d \
--name redis \
-p 6379:6379 \
-v /data/n9e/redis:/data \
redis:6.0.13 \
redis-server --appendonly yes --requirepass "Abc123"
# 启动MySQL
sudo docker run -d \
--name mysql \
-p 3306:3306 \
-v /data/n9e/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Abc123 \
mysql:8.0
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a40102e8e89a mysql:8.0 "docker-entrypoint.s…" 29 seconds ago Up 29 seconds 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql
bec174c22f7b redis:6.0.13 "docker-entrypoint.s…" 41 seconds ago Up 40 seconds 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp
导入n9e所需数据库:
# 下载官方软件包
wget https://github.com/ccfos/nightingale/releases/download/v8.4.0/n9e-v8.4.0-linux-amd64.tar.gz
mkdir /data/n9e
tar -zxf n9e-v8.4.1-linux-amd64.tar.gz -C /data/n9e/
# 安装数据库连接工具
sudo apt update && sudo apt install mysql-client
# 导入n9e所需数据库
mysql -uroot -p -h 127.0.0.1 --protocol=tcp
source /data/n9e/n9e.sql ;
exit;
编写配置文件:
# 编写n9e配置文件
vim /data/n9e/etc/config.toml
# 编辑数据库和redis部分
[DB]
# postgres: host=%s port=%s user=%s dbname=%s password=%s sslmode=%s
# postgres: DSN="host=127.0.0.1 port=5432 user=root dbname=n9e_v6 password=1234 sslmode=disable"
# sqlite: DSN="/path/to/filename.db"
DSN = "root:Abc123@tcp(127.0.0.1:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
# enable debug mode or not
Debug = false
# mysql postgres sqlite
DBType = "mysql"
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# enable auto migrate or not
# EnableAutoMigrate = false
[Redis]
# address, ip:port or ip1:port,ip2:port for cluster and sentinel(SentinelAddrs)
Address = "127.0.0.1:6379"
# Username = ""
Password = "Abc123"
# DB = 0
# UseTLS = false
# TLSMinVersion = "1.2"
# standalone cluster sentinel
RedisType = "standalone"
# Mastername for sentinel type
# MasterName = "mymaster"
# SentinelUsername = ""
# SentinelPassword = ""
# 连接Prometheus部分
[[Pushgw.Writers]]
# Url = "http://127.0.0.1:8480/insert/0/prometheus/api/v1/write"
Url = "http://127.0.0.1:9090/api/v1/write"
# Basic auth username
BasicAuthUser = ""
# Basic auth password
BasicAuthPass = ""
# timeout settings, unit: ms
Headers = ["X-From", "n9e"]
Timeout = 10000
DialTimeout = 3000
TLSHandshakeTimeout = 30000
ExpectContinueTimeout = 1000
IdleConnTimeout = 90000
# time duration, unit: ms
KeepAlive = 30000
MaxConnsPerHost = 0
MaxIdleConns = 100
MaxIdleConnsPerHost = 100
编写n9e.service 使用systemd启动:
vim /etc/systemd/system/n9e.service
[Unit]
Description=Nightingale Monitoring Service
After=network.target
[Service]
Type=simple
ExecStart=/data/n9e/n9e
WorkingDirectory=/data/n9e
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=n9e
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start n9e.service
默认端口17000,可以修改etc/conf.toml文件修改默认端口,默认账户登陆密码:
用户:root
密码:root.2020
至此,夜莺基本环境搭建完成。
在夜莺上导入配置数据源,点击集成中心–>数据源–>新增–>选择Prometheus

填写相关数据,若Prometheus无密码则不需要填写授权信息:

点击测试并保存:

测试即时查看:

功能其实和Prometheus的这个一样:
二、部署Dify
1、安装Docker环境
由于Dify建议采用docker-compose搭建,所以需要提前搭建docker-compose环境:
# 安装必要的工具包
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 创建密钥环目录并添加Docker的官方GPG密钥(用于验证软件包)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 将Docker仓库添加到APT源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 配置国内镜像源,当然也可以不配置,可以配一个Docker代理,让Docker坐上VPN,在此不再展示
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl start docker
# 验证配置
docker info
2、部署dify
极简方式部署dify:(由于是自己探索着玩的测试环境所以无所谓,如果需要细致的操作建议系统学习一下如何部署)
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d

部署完成之后,访问80端口进行登陆:
(首次部署要重置管理员密码)

至此,该部分完成。
三、Dify配置
1、配置模型供应商
点击右上角的工具,安装模型供应商的插件,我选择了安装deepseek和硅基流动:


安装插件之后,点击头像,点击模型供应商,配置API密钥:


(ps:这个模型超级贵哈哈哈哈,Pro/zai-org/GLM-4.7,我为了分析的准,直接拉满maxtoken=131072拉满,问了4次花了10块。)

2、Prometheus插件配置
安装Prometheus插件:(核心)

它是核心:允许AI使用PromQL查询Prometheus指标数据,支持时间范围。
安装插件之后,配置Prometheus数据源:

填写Prometheus的地址信息:
使用部署Prometheus的IP,类似:http://192.168.1.1:9090

Ok 插件也部署完成了,下面配置AI Agent
3、智能体配置
回到工作室,创建空白应用:

由于对Dify还不是很了解,所以选择了新手方式的Agent模式,有经验的大佬们就自行配置了:

首先做模型配置,点击右上角的模型,配置相关参数,deepseek的最大token8192,一次大概1毛左右:

配置提示词:
你现在是一名拥有10年经验的资深运维工程师/SRE,你:
- 精通Linux系统运维管理、Shell脚本编程
- 熟练使用Docker、Kubernetes、Ansible等工具
- 擅长云平台(AWS/Azure/阿里云)运维和成本优化
- 有丰富的故障排查和应急响应经验
请以这个专业身份回答问题。回答时:
1. 根据问题可以适当提供执行的命令,脚本如果用户提出需求则提供
2. 解释命令的作用和原理
3. 考虑安全性和最佳实践
4. 给出注意事项和风险提示
5. 调用Prometheus数据进行分析,需要在Prometheus数据的时间基础上增加8小时
6. 给用户回答之前,再次梳理逻辑
7. 回答之前注意可能存在的问题并告知用户
添加Prometheus工具:

点击右上角发布即可完成智能体配置,这个时候可以使用一下右面的进行测试:

那么现在我们就集成进Prometheus。
四、集成Prometheus
1、部署Nginx
nginx的版本是无所谓的,直接使用apt部署nginx即可:
apt install nginx -y
systemctl start nginx
复制dify提供的嵌入网站的前端代码:点击发布,点击嵌入网站,选择中间的那个:


<script>
window.difyChatbotConfig = {
token: 'jaVvM2Zycul3cM0y',
baseUrl: 'http://192.168.1.1',
inputs: {
// You can define the inputs from the Start node here
// key is the variable name
// e.g.
// name: "NAME"
},
systemVariables: {
// user_id: 'YOU CAN DEFINE USER ID HERE',
// conversation_id: 'YOU CAN DEFINE CONVERSATION ID HERE, IT MUST BE A VALID UUID',
},
userVariables: {
// avatar_url: 'YOU CAN DEFINE USER AVATAR URL HERE',
// name: 'YOU CAN DEFINE USER NAME HERE',
},
}
</script>
<script
src="http://192.168.1.1/embed.min.js"
id="jaVvM2Zycul3cM0y"
defer>
</script>
<style>
#dify-chatbot-bubble-button {
background-color: #1C64F2 !important;
}
#dify-chatbot-bubble-window {
width: 24rem !important;
height: 40rem !important;
}
</style>
会获得一个这样的代码片段,不过我为了显示效果,width: 24rem调整到了50,下面就是要把这个前端代码嵌入到nginx当中,恶心也就恶心在这里了,这个代码放在nginx里面的格式有点恶心,并且鄙人不善于前端,所以这个部分的配置建议直接让AI来处理把,处理成下面的格式,当然有更好的方法希望大佬们可以教教。
编写nginx配置文件:
vim /etc/nginx/sites-enabled/default
server {
// 访问8080端口
listen 8080 default_server;
listen [::]:8080 default_server;
server_name _;
charset utf-8;
add_header X-Frame-Options SAMEORIGIN;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / {
// 代理PrometheusUI
proxy_pass http://127.0.0.1:9090;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_read_timeout 360s;
proxy_send_timeout 360s;
# ========== Dify =============
sub_filter '</body>' '<script>window.difyChatbotConfig={token:"jaVvM2Zycul3cM0y",baseUrl:"http://192.168.1.1",inputs:{},systemVariables:{},userVariables:{}}</script><script src="http://192.168.1.1/embed.min.js" id="jaVvM2Zycul3cM0y" defer></script><style>#dify-chatbot-bubble-button{background-color:#1C64F2!important;}#dify-chatbot-bubble-window{width:50rem!important;height:40rem!important;}</style></body>';
sub_filter_once on;
}
}
更新nginx配置:
nginx -t
nginx -s reload
访问8080端口:

这就爽了,完事儿了。
2、简单体验
指定AI查询某个参数,去分析数据:

分析过去一小时的服务器状态:


那么接入Prometheus至此完成。
五、集成夜莺平台
1、配置nginx
道理是相同的:
vim /etc/nginx/sites-enabled/default
server {
// 访问8080端口
listen 8080 default_server;
listen [::]:8080 default_server;
server_name _;
charset utf-8;
add_header X-Frame-Options SAMEORIGIN;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / {
// 代理夜莺
proxy_pass http://127.0.0.1:17000;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_read_timeout 360s;
proxy_send_timeout 360s;
# ========== Dify =============
sub_filter '</body>' '<script>window.difyChatbotConfig={token:"jaVvM2Zycul3cM0y",baseUrl:"http://192.168.1.1",inputs:{},systemVariables:{},userVariables:{}}</script><script src="http://192.168.1.1/embed.min.js" id="jaVvM2Zycul3cM0y" defer></script><style>#dify-chatbot-bubble-button{background-color:#1C64F2!important;}#dify-chatbot-bubble-window{width:50rem!important;height:40rem!important;}</style></body>';
sub_filter_once on;
}
}
更新nginx配置:
nginx -t
nginx -s reload
访问8080端口进行登陆:


2、简单体验
因为本质上其实还是调用的Prometheus上的数据,那么就不会识别到我们在夜莺平台上配置的相关告警规则、告警分组之类的信息,所以这是存在点弊端,如果AI能识别这些内容就好了。
结语
这个过程,我追求的是低成本、高回报、明效果,毕竟处于一个人的探索阶段,所有的思路都要自己一个人去构思一个人完成,所以难免有存在问题的地方,希望大佬们可以提供一些更好的思路,进行指正,哈哈哈哈哈。
债见。
更多推荐



所有评论(0)