Ollama模型监控看板:daily_stock_analysis镜像集成Prometheus指标采集方案
1. 为什么需要给AI股票分析师装上“健康仪表盘”
你有没有试过部署一个本地AI应用,刚启动时一切正常,可过了一小时,用户突然反馈“点不动了”“响应特别慢”“报告生成失败”?这时候你只能重启服务、翻日志、猜问题——而真正的问题可能早已发生:Ollama内存爆满、模型加载卡死、HTTP请求队列堆积、GPU显存耗尽……这些都不是代码报错,而是系统在沉默中崩溃。
daily_stock_analysis镜像很特别:它不是玩具Demo,而是一个面向真实使用场景的私有化金融分析工具。用户输入AAPL,3秒内要看到结构清晰的Markdown报告;连续提交5个请求,不能出现超时或乱序;后台Ollama服务必须稳如磐石——因为它的每一次“卡顿”,都意味着一次专业信任的流失。
但原生Ollama不提供指标暴露能力,WebUI没有健康状态页,gemma:2b模型运行时像一个黑盒。我们不能靠“刷新页面看是否恢复”来运维它。于是,我们为这个AI股票分析师加装了一套轻量、可靠、开箱即用的监控看板:基于Prometheus的指标采集方案。它不改变原有功能,不增加用户操作,却让整个AI分析链路变得可观测、可诊断、可预测。
这不是给服务器装监控,而是给AI应用装上脉搏仪和心电图。
2. 监控架构设计:三步打通从Ollama到Grafana的观测链路
2.1 整体架构概览
整个监控体系采用“零侵入、低耦合、易扩展”原则,完全复用镜像现有技术栈(Python + Flask + Ollama CLI),不引入新语言、不修改模型、不替换WebUI。核心组件只有三个:
- Ollama Exporter:一个轻量Python服务,定时调用
ollama list、ollama ps等CLI命令,将模型状态、运行容器、内存占用等转化为Prometheus格式指标; - Prometheus Server:嵌入镜像的单节点实例,每15秒主动拉取Exporter数据,持久化存储最近7天指标;
- 预置Grafana看板:随镜像一键启动,内置4个关键视图——模型健康度、请求吞吐率、响应延迟分布、资源水位线。
所有组件均通过Docker Compose统一编排,无需额外配置即可运行。
2.2 指标采集层:让Ollama“开口说话”
Ollama本身不开放metrics端点,但我们发现它提供了足够丰富的CLI接口。ollama ps能列出所有运行中的模型容器,ollama list显示已下载模型,ollama show --modelfile <model>可获取模型元信息。我们据此定义了6类核心指标:
| 指标名称 | 类型 | 说明 | 示例值 |
|---|---|---|---|
ollama_model_loaded_total | Gauge | 当前已加载模型数量 | 1(gemma:2b) |
ollama_container_running_total | Gauge | 正在运行的推理容器数 | 1 |
ollama_container_uptime_seconds | Gauge | 容器持续运行秒数 | 3280 |
ollama_memory_usage_bytes | Gauge | Ollama进程RSS内存占用 | 1.2e+9(约1.2GB) |
daily_stock_request_total | Counter | 累计收到的分析请求总数 | 47 |
daily_stock_request_duration_seconds | Histogram | 请求处理耗时分布(0.1s/0.5s/1s/3s分位) | le="1"→38 |
Exporter以10秒间隔轮询,将结果通过HTTP/metrics端点暴露。它不依赖Ollama API Server(因默认关闭),仅需ollama命令在PATH中可用——这恰好与镜像“自愈合启动”机制天然兼容。
# exporter.py 核心逻辑节选(Python) from prometheus_client import Gauge, Counter, Histogram, start_http_server import subprocess import time # 定义指标 model_loaded = Gauge('ollama_model_loaded_total', 'Number of loaded models') container_running = Gauge('ollama_container_running_total', 'Number of running containers') request_total = Counter('daily_stock_request_total', 'Total number of stock analysis requests') request_duration = Histogram('daily_stock_request_duration_seconds', 'Request duration in seconds', buckets=[0.1, 0.5, 1.0, 3.0]) def get_ollama_ps(): try: result = subprocess.run(['ollama', 'ps'], capture_output=True, text=True, timeout=5) lines = result.stdout.strip().split('\n') return len(lines) - 1 if len(lines) > 1 else 0 except Exception: return 0 def collect_metrics(): model_loaded.set(1) # gemma:2b固定加载 container_running.set(get_ollama_ps()) # 其他指标采集...关键设计点:
- 所有指标采集逻辑封装为独立函数,便于单元测试;
- 超时控制(5秒)防止Ollama卡死拖垮Exporter;
- 错误时返回0或默认值,保证指标始终可读,避免“断点”;
- 不采集敏感字段(如模型名、请求参数),符合金融场景安全要求。
2.3 数据采集与存储:嵌入式Prometheus轻量部署
Prometheus被直接打包进镜像的/opt/prometheus目录,配置文件prometheus.yml精简至12行:
global: scrape_interval: 15s scrape_configs: - job_name: 'ollama-exporter' static_configs: - targets: ['localhost:9100'] - job_name: 'webui' metrics_path: '/metrics' static_configs: - targets: ['localhost:5000']其中:
localhost:9100是Ollama Exporter的默认端口;localhost:5000是Flask WebUI暴露的自定义指标端点(记录请求计数与延迟);- 所有数据存储于镜像内
/data/prometheus,支持容器重启后指标延续。
启动时,Prometheus以非root用户运行,资源限制为512MB内存+1核CPU,对主应用无感知影响。
3. 关键指标详解:读懂AI股票分析师的“生命体征”
3.1 模型健康度:不只是“在不在”,更是“稳不稳”
Ollama模型加载状态是整个AI分析链路的起点。我们不只关心gemma:2b是否在ollama list中,更关注它是否真正就绪并可响应。
ollama_container_running_total == 0:模型未加载或已崩溃 → 触发告警,自动执行ollama run gemma:2b重载;ollama_container_uptime_seconds < 60:容器刚启动,可能尚未完成warmup → 看板显示“初始化中”,WebUI禁用提交按钮;ollama_memory_usage_bytes > 1.5e9(1.5GB):内存接近阈值 → 触发黄色预警,提示“建议释放其他应用内存”。
实际案例:某次测试中,
ollama_container_uptime_seconds突降至5,同时daily_stock_request_total停止增长。排查发现是模型加载时磁盘IO阻塞。看板第一时间定位到容器生命周期异常,而非等待用户反馈“无法生成”。
3.2 请求性能看板:从“能用”到“好用”的量化依据
用户不关心技术细节,只在意“输入代码→看到报告”要多久。我们用两个维度刻画体验:
- 吞吐能力:
rate(daily_stock_request_total[1m])—— 每分钟成功请求数。镜像设计目标为≥12 req/min(即5秒/请求,支持并发2路)。若持续低于8,说明Ollama推理瓶颈或CPU争抢。 - 响应质量:
histogram_quantile(0.95, rate(daily_stock_request_duration_seconds_bucket[1h]))—— 近1小时95%请求的耗时上限。理想值≤1.0秒;若升至2.5秒,需检查模型是否被其他进程抢占GPU或内存交换。
看板中,我们用双Y轴图表同步展示:左侧柱状图是每分钟请求数,右侧折线图是P95延迟。当两者出现“剪刀差”(请求增但延迟升),即表明系统进入压力临界区。
3.3 资源水位线:提前预判“下一次崩溃”
AI应用最危险的状态不是宕机,而是缓慢恶化。我们重点监控三项资源:
- 内存:
process_resident_memory_bytes{job="ollama-exporter"}—— Exporter自身内存,应<50MB;若>100MB,可能指标采集逻辑泄漏; - CPU:
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)—— 主机CPU空闲率,低于20%需警惕; - 磁盘:
node_filesystem_avail_bytes{mountpoint="/data"}—— Prometheus数据盘剩余空间,低于2GB触发清理策略。
这些指标不直接关联AI功能,却是系统稳定性的“氧气浓度”。它们让运维从“救火”转向“巡检”。
4. Grafana看板实战:4个视图看懂AI分析师运行状态
4.1 首页总览:一屏掌握全局健康
预置看板首页包含4个核心面板:
- 健康状态灯:绿色(全部指标正常)、黄色(1项预警)、红色(≥1项严重异常);
- 实时请求流:滚动显示最近10次请求的股票代码、耗时、状态(成功/失败);
- 模型加载历史:折线图展示
ollama_model_loaded_total过去24小时变化,确认无意外卸载; - 资源热力图:用颜色深浅表示CPU/内存/磁盘使用率,一眼识别瓶颈设备。
所有面板支持点击下钻,例如点击某次失败请求,可跳转至详细日志查询界面。
4.2 延迟分析页:定位慢请求的“时间切片”
该页聚焦daily_stock_request_duration_seconds直方图:
- X轴为耗时区间(0.1s/0.5s/1s/3s),Y轴为请求数;
- 叠加两条参考线:P50(中位数)和P95(95分位);
- 当P95突破1.0秒,面板自动高亮,并显示“慢请求Top 3股票代码”(如
TSLA、NVDA、MY-COMPANY)。
我们发现:对虚构代码MY-COMPANY的响应普遍比AAPL慢40%,原因是Prompt中“假设该公司为新能源初创企业”的推理路径更长。这促使我们优化了Prompt模板的条件分支逻辑。
4.3 资源趋势页:预测未来1小时的稳定性
基于Prometheus的predict_linear()函数,该页预测关键资源未来1小时走势:
predict_linear(node_memory_MemAvailable_bytes[2h], 3600)→ 预测内存剩余量;- 若预测曲线与警戒线(2GB)相交,提前20分钟发出通知:“磁盘空间预计在XX:XX耗尽,建议清理旧指标”。
这种预测能力,让扩容决策从“凭经验”变为“看数据”。
4.4 异常诊断页:一键生成故障快照
当检测到连续3次请求失败,看板右上角弹出“诊断模式”按钮。点击后,自动生成一份快照,包含:
- 当前
ollama ps输出; - 最近10条WebUI错误日志(脱敏);
- Exporter采集的5分钟内所有指标快照;
- Prometheus告警规则匹配状态。
这份快照可直接导出为PDF,成为内部复盘或向平台方提Bug的完整依据。
5. 部署与验证:3分钟完成监控启用
5.1 启动即生效,零配置接入
daily_stock_analysis镜像已将监控组件深度集成:
- 启动时,
entrypoint.sh自动拉起Ollama Exporter(端口9100)、Prometheus(端口9090)、Grafana(端口3000); - 所有服务通过
docker network互通,无需IP或端口映射; - Grafana预置数据源(Prometheus)和看板,访问
http://<host>:3000,默认账号admin/admin。
你唯一需要做的,就是启动镜像后,打开浏览器访问Grafana地址。
5.2 快速验证四步法
- 查Exporter是否就绪:
curl http://localhost:9100/metrics | head -20→ 应看到# HELP ollama_model_loaded_total等指标; - 查Prometheus是否采集:访问
http://localhost:9090/targets→ “ollama-exporter”状态应为UP; - 查指标是否存在:在Prometheus表达式框输入
ollama_container_running_total→ 应返回1; - 查看板是否渲染:打开Grafana → 选择“Daily Stock Analysis Overview”看板 → 所有面板应有实时数据。
若第1步失败,检查ollama命令是否在PATH中(通常由“自愈合启动”保障);若第2步失败,检查prometheus.yml中target地址是否正确。
6. 总结:监控不是锦上添花,而是AI应用落地的基础设施
为daily_stock_analysis集成Prometheus监控,表面看是加了几行代码、几个配置,实则完成了三重跃迁:
- 从不可知到可观测:Ollama不再是个黑盒,它的每一次加载、每一秒运行、每一字节内存,都变成可查询、可聚合、可告警的数据点;
- 从被动响应到主动预防:我们不再等用户说“报告生成不了”,而是看板提前15分钟预警“内存水位达92%”,从容执行清理;
- 从功能交付到体验保障:用户感受到的不再是“能生成报告”,而是“每次输入都稳稳在2秒内返回”,这种确定性,才是私有化AI应用真正的护城河。
这套方案不绑定特定模型(gemma:2b可替换为phi:3或qwen:1.8b),不依赖外部云服务(全量离线运行),不增加用户学习成本(监控完全后台化)。它证明了一件事:最好的AI监控,是用户根本感觉不到它的存在,却时刻受益于它的守护。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。