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能识别这些内容就好了。

结语

这个过程,我追求的是低成本、高回报、明效果,毕竟处于一个人的探索阶段,所有的思路都要自己一个人去构思一个人完成,所以难免有存在问题的地方,希望大佬们可以提供一些更好的思路,进行指正,哈哈哈哈哈。

债见。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐