SenseVoice-small WebUI部署教程:Prometheus+Grafana监控指标采集配置
SenseVoice-small WebUI部署教程:Prometheus+Grafana监控指标采集配置
1. 引言:为什么你的语音识别服务需要监控?
想象一下这个场景:你刚刚部署好SenseVoice-small语音识别服务,它运行得又快又准,帮你把会议录音变成了文字稿,把外语视频加上了字幕。但某天下午,用户突然反馈“网页打不开了”或者“识别速度变慢了”。你手忙脚乱地登录服务器,敲了一堆命令,才发现是内存用完了,或者某个进程意外退出了。
问题来了: 难道每次都要等到用户抱怨,你才能发现问题吗?
当然不是。一个专业的服务部署,除了“能用”,更要“可观测”。你需要知道它现在运行得怎么样,过去一小时表现如何,以及未来可能出现什么问题。这就是监控系统的价值——让你从“被动救火”变成“主动运维”。
今天,我就带你为SenseVoice-small WebUI服务搭建一套完整的监控系统。我们将使用Prometheus来采集各项运行指标,用Grafana来制作直观的仪表盘。完成后,你不仅能实时看到服务的CPU、内存使用情况,还能监控识别请求的数量、成功率、响应时间等业务指标。
学习目标:
- 理解监控系统的基本原理和组件
- 掌握Prometheus的安装和配置方法
- 学会配置Grafana并创建监控仪表盘
- 为SenseVoice-small服务添加自定义的业务指标监控
前置知识:
- 基本的Linux命令行操作
- 已经部署好的SenseVoice-small WebUI服务(参考之前的部署教程)
- 对Docker有基本了解会更轻松
教程价值: 即使你是监控系统的新手,跟着这篇教程一步步操作,也能在1小时内搭建起专业的监控环境。我们会用最直接的方式,避开复杂的理论,专注于“怎么做”。
2. 监控系统架构:Prometheus+Grafana如何工作?
在开始动手之前,我们先花几分钟了解一下这套监控系统是怎么运转的。不用担心,我用最直白的方式解释。
2.1 核心组件介绍
整个监控系统主要由三个部分组成:
-
SenseVoice-small服务(被监控对象)
- 这是我们之前部署的语音识别WebUI
- 它会在运行过程中产生各种数据:CPU用了多少、内存用了多少、处理了多少个识别请求等
- 这些数据通过一个特定的端口(比如9091)暴露出来,等待被采集
-
Prometheus(数据采集器)
- 你可以把它想象成一个“数据收集员”
- 它定期(比如每15秒)去访问SenseVoice服务的那个端口,把最新的运行数据“抄录”下来
- 然后把这些数据按照时间顺序存储在自己的数据库里
- Prometheus还提供了简单的查询语言,让你能查找历史数据
-
Grafana(数据展示台)
- 这是给“人”看的界面
- 它从Prometheus那里读取数据,然后用漂亮的图表展示出来
- 你可以创建各种仪表盘:实时状态图、历史趋势图、报警面板等
- 支持设置阈值,当某个指标异常时自动发送通知
2.2 数据流向示意图
SenseVoice服务 (产生数据)
↓ (通过/metrics接口暴露)
Prometheus (定时采集并存储)
↓ (通过查询接口提供)
Grafana (读取并可视化展示)
↓
你在浏览器中看到的漂亮图表
2.3 我们需要监控什么?
对于SenseVoice-small服务,我们主要关注以下几类指标:
| 指标类型 | 具体指标 | 为什么重要 |
|---|---|---|
| 系统资源 | CPU使用率、内存使用量、磁盘空间 | 确保服务器有足够资源运行服务 |
| 服务状态 | 进程是否存活、端口是否可访问 | 确保服务一直在运行 |
| 业务指标 | 识别请求数、识别成功率、平均响应时间 | 了解服务的使用情况和性能 |
| 网络指标 | 网络连接数、带宽使用情况 | 确保网络通畅 |
接下来,我们就开始动手搭建。我会把每个步骤都写清楚,你跟着做就行。
3. 环境准备:安装必要的组件
首先,确保你已经在服务器上部署了SenseVoice-small WebUI服务。如果还没部署,可以参考之前的教程先完成部署。
3.1 检查当前环境
登录到你的服务器,先看看系统的基本情况:
# 查看系统信息
uname -a
# 查看磁盘空间(确保有足够空间安装监控组件)
df -h
# 查看内存情况
free -h
# 查看SenseVoice服务是否在运行
supervisorctl status sensevoice:sensevoice-webui
如果SenseVoice服务正在运行(显示RUNNING),就可以继续了。
3.2 安装Docker和Docker Compose
我们将使用Docker来运行Prometheus和Grafana,这样最方便,也避免污染系统环境。
如果你的系统还没有安装Docker,执行以下命令:
# 安装Docker(以Ubuntu为例)
sudo apt-get update
sudo apt-get install -y docker.io
# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version
如果看到版本号输出,说明安装成功。
3.3 创建监控项目目录
为了管理方便,我们创建一个专门的目录来存放监控相关的配置文件:
# 创建监控目录
mkdir -p ~/sensevoice-monitoring
cd ~/sensevoice-monitoring
# 创建子目录用于存放配置文件
mkdir -p prometheus/config grafana/provisioning/dashboards grafana/provisioning/datasources
现在目录结构应该是这样的:
sensevoice-monitoring/
├── prometheus/
│ └── config/
└── grafana/
└── provisioning/
├── dashboards/
└── datasources/
环境准备就绪,接下来我们开始配置各个组件。
4. 配置Prometheus:让数据采集器认识你的服务
Prometheus需要知道两件事:1)去哪里采集数据;2)采集哪些数据。我们通过配置文件来告诉它。
4.1 创建Prometheus配置文件
在prometheus/config目录下创建配置文件:
cd ~/sensevoice-monitoring
nano prometheus/config/prometheus.yml
将以下内容复制到文件中:
global:
scrape_interval: 15s # 每15秒采集一次数据
evaluation_interval: 15s # 每15秒评估一次告警规则
# 告警规则配置(暂时留空,后续可以添加)
rule_files:
# - "alert.rules"
# 采集任务配置
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
scrape_interval: 15s
# 监控SenseVoice-small服务
- job_name: 'sensevoice-small'
static_configs:
- targets: ['host.docker.internal:9091'] # 这里假设SenseVoice服务暴露在9091端口
scrape_interval: 15s
metrics_path: '/metrics' # Prometheus采集数据的路径
# 监控服务器节点(通过node_exporter)
- job_name: 'node'
static_configs:
- targets: ['host.docker.internal:9100'] # node_exporter默认端口
scrape_interval: 15s
重要说明:
host.docker.internal是Docker容器访问宿主机服务的特殊域名- 如果你的SenseVoice服务运行在别的端口,需要修改
9091为实际端口 - 如果SenseVoice服务没有暴露Prometheus格式的metrics,我们需要先为它添加这个功能(下一节会讲)
保存并退出编辑器(按Ctrl+X,然后按Y,再按Enter)。
4.2 为SenseVoice服务添加metrics导出功能
默认情况下,SenseVoice-small WebUI可能没有提供Prometheus格式的metrics。我们需要修改它的代码来添加这个功能。
首先,找到SenseVoice项目的WebUI代码位置:
# 假设你的SenseVoice项目在这个目录
cd /root/sensevoice-small-语音识别-onnx
我们需要修改WebUI的Python代码,添加一个/metrics接口。创建一个新的Python文件:
nano prometheus_metrics.py
添加以下内容:
"""
SenseVoice-small Prometheus Metrics Exporter
为SenseVoice WebUI添加Prometheus监控指标
"""
from prometheus_client import Counter, Gauge, Histogram, generate_latest, CONTENT_TYPE_LATEST
from flask import Response
import time
import psutil
import threading
# 创建指标
# 请求相关指标
REQUEST_COUNT = Counter('sensevoice_requests_total', 'Total number of requests')
REQUEST_SUCCESS = Counter('sensevoice_requests_success_total', 'Total successful requests')
REQUEST_FAILURE = Counter('sensevoice_requests_failure_total', 'Total failed requests')
REQUEST_DURATION = Histogram('sensevoice_request_duration_seconds', 'Request duration in seconds')
# 系统资源指标
CPU_USAGE = Gauge('sensevoice_cpu_usage_percent', 'CPU usage percentage')
MEMORY_USAGE = Gauge('sensevoice_memory_usage_bytes', 'Memory usage in bytes')
MEMORY_USAGE_PERCENT = Gauge('sensevoice_memory_usage_percent', 'Memory usage percentage')
# 业务指标
ACTIVE_REQUESTS = Gauge('sensevoice_active_requests', 'Number of active requests')
TOTAL_AUDIO_PROCESSED = Counter('sensevoice_audio_processed_seconds_total', 'Total audio processed in seconds')
# 服务状态指标
SERVICE_UP = Gauge('sensevoice_service_up', 'Service status (1=up, 0=down)')
def update_system_metrics():
"""定期更新系统指标"""
while True:
try:
# 获取CPU使用率
cpu_percent = psutil.cpu_percent(interval=1)
CPU_USAGE.set(cpu_percent)
# 获取内存使用情况
memory = psutil.virtual_memory()
MEMORY_USAGE.set(memory.used)
MEMORY_USAGE_PERCENT.set(memory.percent)
# 服务状态设为正常
SERVICE_UP.set(1)
except Exception as e:
print(f"Error updating system metrics: {e}")
SERVICE_UP.set(0)
# 每5秒更新一次
time.sleep(5)
def start_metrics_updater():
"""启动指标更新线程"""
thread = threading.Thread(target=update_system_metrics, daemon=True)
thread.start()
return thread
def get_metrics():
"""返回Prometheus格式的metrics"""
return generate_latest()
def setup_metrics_route(app):
"""为Flask应用设置/metrics路由"""
@app.route('/metrics')
def metrics():
"""Prometheus metrics endpoint"""
return Response(get_metrics(), mimetype=CONTENT_TYPE_LATEST)
# 启动系统指标更新
start_metrics_updater()
print("Prometheus metrics endpoint available at /metrics")
接下来,我们需要修改SenseVoice WebUI的主文件,添加这个metrics端点。找到WebUI的主Python文件(可能是app.py或webui.py):
# 查找主文件
find . -name "*.py" -type f | grep -E "(app|webui|main)\.py$" | head -5
假设主文件是webui.py,我们修改它:
# 备份原文件
cp webui.py webui.py.backup
# 编辑文件
nano webui.py
在文件开头附近添加导入:
# 在文件开头的import部分添加
try:
from prometheus_metrics import setup_metrics_route
PROMETHEUS_ENABLED = True
except ImportError:
PROMETHEUS_ENABLED = False
print("Prometheus metrics disabled (prometheus_client not installed)")
在创建Flask app后,添加metrics路由:
# 找到创建app的代码,类似这样:
app = Flask(__name__)
# 在这行之后添加:
if PROMETHEUS_ENABLED:
setup_metrics_route(app)
另外,我们需要在识别请求的处理函数中添加业务指标记录。找到处理语音识别的函数,添加指标记录:
# 在识别请求开始时
REQUEST_COUNT.inc()
ACTIVE_REQUESTS.inc()
start_time = time.time()
try:
# 原有的识别处理代码...
# 识别成功
REQUEST_SUCCESS.inc()
except Exception as e:
# 识别失败
REQUEST_FAILURE.inc()
raise e
finally:
# 记录请求耗时
duration = time.time() - start_time
REQUEST_DURATION.observe(duration)
ACTIVE_REQUESTS.dec()
最后,安装必要的Python包:
pip install prometheus-client psutil
重启SenseVoice服务:
supervisorctl restart sensevoice:sensevoice-webui
现在,SenseVoice服务应该已经在http://你的服务器IP:7860/metrics提供了Prometheus格式的指标数据。你可以用浏览器访问这个地址验证一下。
4.3 安装node_exporter监控服务器资源
node_exporter是Prometheus官方提供的服务器监控组件,可以采集CPU、内存、磁盘、网络等系统指标。
# 下载node_exporter
cd ~
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
# 解压
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
cd node_exporter-1.6.1.linux-amd64
# 创建系统服务
sudo nano /etc/systemd/system/node_exporter.service
添加以下内容:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/root/node_exporter-1.6.1.linux-amd64/node_exporter
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
# 检查服务状态
sudo systemctl status node_exporter
现在,node_exporter应该在http://你的服务器IP:9100/metrics提供系统指标。
5. 使用Docker Compose启动监控服务
有了配置文件,现在我们可以用Docker Compose一键启动整个监控系统。
5.1 创建Docker Compose配置文件
在监控项目根目录创建docker-compose.yml文件:
cd ~/sensevoice-monitoring
nano docker-compose.yml
添加以下内容:
version: '3.8'
services:
# Prometheus服务
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090" # Prometheus Web界面
volumes:
- ./prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d' # 保留30天数据
- '--web.enable-lifecycle'
networks:
- monitoring
# Grafana服务
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000" # Grafana Web界面
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123 # 初始管理员密码
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources
- ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
5.2 配置Grafana数据源
Grafana需要知道从哪里获取数据,我们创建一个数据源配置文件:
nano grafana/provisioning/datasources/prometheus.yml
添加以下内容:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
5.3 启动监控服务
现在一切就绪,启动服务:
# 在监控项目根目录执行
docker-compose up -d
检查服务状态:
docker-compose ps
你应该看到两个服务都是Up状态。如果启动失败,可以查看日志:
# 查看Prometheus日志
docker-compose logs prometheus
# 查看Grafana日志
docker-compose logs grafana
5.4 验证服务运行
打开浏览器,访问以下地址:
-
Prometheus界面:
http://你的服务器IP:9090- 点击顶部菜单的"Status" → "Targets"
- 应该看到三个target都是
UP状态:- prometheus (localhost:9090)
- sensevoice-small (host.docker.internal:9091)
- node (host.docker.internal:9100)
-
Grafana界面:
http://你的服务器IP:3000- 用户名:
admin - 密码:
admin123(我们在docker-compose.yml中设置的) - 登录后,点击左侧菜单的"Configuration" → "Data Sources"
- 应该看到Prometheus数据源已经配置好了
- 用户名:
如果所有服务都正常运行,恭喜你!监控系统的基础框架已经搭建完成。
6. 创建Grafana监控仪表盘
现在监控数据已经采集上来了,我们需要在Grafana中创建仪表盘来可视化这些数据。
6.1 导入预制的SenseVoice监控仪表盘
我为你准备了一个专门为SenseVoice-small优化的监控仪表盘。创建仪表盘配置文件:
nano grafana/provisioning/dashboards/sensevoice-dashboard.yml
添加以下内容:
apiVersion: 1
providers:
- name: 'SenseVoice Dashboards'
orgId: 1
folder: ''
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: true
options:
path: /etc/grafana/provisioning/dashboards
现在创建仪表盘JSON文件。由于JSON内容很长,我把它放在一个单独的文件中。你可以从我的GitHub仓库下载,或者手动创建:
# 下载预制的仪表盘配置
cd ~/sensevoice-monitoring/grafana/provisioning/dashboards
wget https://raw.githubusercontent.com/example/sensevoice-monitoring/main/dashboards/sensevoice-overview.json
如果下载不了,你可以手动创建一个简单的仪表盘。在Grafana界面中:
- 点击左侧"+"图标 → "Create" → "Dashboard"
- 点击"Add new panel"
- 在查询框中输入:
sensevoice_service_up - 点击"Run queries"
- 在右侧面板设置中,将标题改为"服务状态"
- 点击"Apply"保存面板
- 点击顶部"Save dashboard"保存整个仪表盘
6.2 创建完整的监控仪表盘
让我为你创建一个更完整的仪表盘配置。创建一个新的JSON文件:
nano ~/sensevoice-monitoring/grafana/provisioning/dashboards/sensevoice-overview.json
由于完整的仪表盘JSON非常长(几千行),我在这里提供一个简化版本的核心结构。你可以先创建这个基本版本,然后在Grafana界面中逐步完善:
{
"dashboard": {
"title": "SenseVoice-small 监控仪表盘",
"tags": ["sensevoice", "monitoring"],
"timezone": "browser",
"panels": [
{
"id": 1,
"title": "服务状态",
"type": "stat",
"targets": [
{
"expr": "sensevoice_service_up",
"legendFormat": "服务状态"
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [
{
"type": "value",
"options": {
"0": {"text": "DOWN", "color": "red"},
"1": {"text": "UP", "color": "green"}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "red", "value": null},
{"color": "green", "value": 1}
]
}
}
},
"gridPos": {"h": 3, "w": 6, "x": 0, "y": 0}
},
{
"id": 2,
"title": "CPU使用率",
"type": "gauge",
"targets": [
{
"expr": "sensevoice_cpu_usage_percent",
"legendFormat": "CPU使用率"
}
],
"fieldConfig": {
"defaults": {
"unit": "percent",
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "green", "value": null},
{"color": "yellow", "value": 70},
{"color": "red", "value": 90}
]
}
}
},
"gridPos": {"h": 5, "w": 6, "x": 6, "y": 0}
}
],
"version": 1
},
"overwrite": true
}
保存后,重启Grafana使配置生效:
docker-compose restart grafana
6.3 通过Grafana界面创建面板
对于初学者,我建议直接在Grafana界面中创建面板,这样更直观。登录Grafana后:
创建"服务状态"面板
- 点击"Create" → "Dashboard"
- 点击"Add new panel"
- 在查询框输入:
sensevoice_service_up - 右侧"Visualization"选择"Stat"
- 在"Field"设置中,找到"Thresholds",设置:
- 当值=1时显示绿色"UP"
- 当值=0时显示红色"DOWN"
- 点击"Apply"
创建"CPU使用率"面板
- 在仪表盘点击"Add panel"
- 查询框输入:
sensevoice_cpu_usage_percent - 可视化选择"Gauge"
- 单位选择"Percent (0-100)"
- 设置阈值:绿色(<70%)、黄色(70-90%)、红色(>90%)
- 点击"Apply"
创建"内存使用率"面板
- 添加新面板
- 查询框输入:
sensevoice_memory_usage_percent - 可视化选择"Gauge"
- 单位选择"Percent (0-100)"
- 设置阈值:绿色(<70%)、黄色(70-90%)、红色(>90%)
- 点击"Apply"
创建"请求统计"面板
- 添加新面板
- 查询框输入:
rate(sensevoice_requests_total[5m]) - 可视化选择"Graph"
- 标题改为"请求速率(次/分钟)"
- 点击"Apply"
按照同样的方法,你可以继续添加更多面板,比如:
- 请求成功率:
sensevoice_requests_success_total / sensevoice_requests_total - 平均响应时间:
rate(sensevoice_request_duration_seconds_sum[5m]) / rate(sensevoice_request_duration_seconds_count[5m]) - 活跃请求数:
sensevoice_active_requests
6.4 仪表盘布局优化
创建完所有面板后,你可以拖动面板调整位置和大小,让仪表盘看起来更整洁。一个好的布局建议是:
┌─────────────────┬─────────────────┬─────────────────┐
│ 服务状态 │ CPU使用率 │ 内存使用率 │
├─────────────────┼─────────────────┼─────────────────┤
│ │ 请求统计 │ │
│ 请求成功率 ├─────────────────┤ 平均响应时间 │
│ │ 活跃请求数 │ │
└─────────────────┴─────────────────┴─────────────────┘
保存仪表盘,给它起个名字,比如"SenseVoice监控看板"。
7. 配置告警规则:有问题及时知道
监控系统不仅要能"看",还要能"报"。当出现问题时,系统应该主动通知我们。Grafana提供了强大的告警功能。
7.1 创建告警规则
在Grafana中,为关键指标设置告警:
服务宕机告警
- 在"服务状态"面板,点击标题 → "Edit"
- 切换到"Alert"标签页
- 点击"Create alert rule from this panel"
- 设置告警条件:
- 当
sensevoice_service_up的last()值= 0时触发
- 当
- 设置评估间隔:每
1m评估一次 - 点击"Save rule"
CPU使用率过高告警
- 在"CPU使用率"面板,点击标题 → "Edit"
- 切换到"Alert"标签页
- 点击"Create alert rule from this panel"
- 设置告警条件:
- 当
sensevoice_cpu_usage_percent的last()值> 90时触发
- 当
- 设置评估间隔:每
5m评估一次 - 点击"Save rule"
内存使用率过高告警
- 在"内存使用率"面板,点击标题 → "Edit"
- 切换到"Alert"标签页
- 点击"Create alert rule from this panel"
- 设置告警条件:
- 当
sensevoice_memory_usage_percent的last()值> 90时触发
- 当
- 设置评估间隔:每
5m评估一次 - 点击"Save rule"
7.2 配置告警通知渠道
告警需要发送到某个地方才能被我们看到。Grafana支持多种通知方式:
配置邮件通知(推荐)
- 点击左侧菜单"Alerting" → "Contact points"
- 点击"Add contact point"
- 名称填写"Email Alerts"
- 类型选择"Email"
- 填写收件人地址
- 点击"Test"测试,然后"Save"
配置Slack通知(如果团队用Slack)
- 在Slack中创建一个Incoming Webhook
- 在Grafana中,点击"Add contact point"
- 类型选择"Slack"
- 填写Webhook URL
- 点击"Test"测试,然后"Save"
配置钉钉通知(国内常用)
- 在钉钉群创建自定义机器人,获取Webhook
- 在Grafana中安装钉钉插件,或者使用Webhook方式
- 配置通知地址
7.3 将告警规则绑定到通知渠道
- 点击左侧菜单"Alerting" → "Alert rules"
- 找到刚才创建的告警规则
- 点击规则名称进入详情
- 在"Notifications"部分,选择刚才创建的Contact point
- 点击"Save"
现在,当服务出现问题时,你就会收到通知了。
8. 高级监控配置:让监控更全面
基础监控已经搭建完成,但我们可以做得更好。下面是一些高级配置,让你的监控系统更强大。
8.1 监控音频处理时长
对于语音识别服务,处理时长是一个关键指标。我们可以在SenseVoice代码中添加这个指标的记录。
修改SenseVoice的识别处理函数:
# 在识别开始处记录开始时间
import time
def process_audio(audio_file, language='auto'):
"""处理音频文件的主函数"""
start_time = time.time()
# 记录活跃请求数增加
ACTIVE_REQUESTS.inc()
try:
# 原有的识别逻辑...
# 计算处理时长
processing_time = time.time() - start_time
# 记录到Histogram指标
REQUEST_DURATION.observe(processing_time)
# 记录音频时长(如果有的话)
audio_duration = get_audio_duration(audio_file) # 需要实现这个函数
TOTAL_AUDIO_PROCESSED.inc(audio_duration)
# 记录成功请求
REQUEST_SUCCESS.inc()
return result
except Exception as e:
# 记录失败请求
REQUEST_FAILURE.inc()
raise e
finally:
# 减少活跃请求数
ACTIVE_REQUESTS.dec()
8.2 添加业务成功率监控
除了技术指标,业务成功率也很重要。我们可以计算识别成功率:
# 在metrics中添加成功率指标
SUCCESS_RATE = Gauge('sensevoice_success_rate', 'Success rate of recognition requests')
def update_success_rate():
"""定期更新成功率指标"""
while True:
try:
success_count = REQUEST_SUCCESS._value.get()
total_count = REQUEST_COUNT._value.get()
if total_count > 0:
rate = success_count / total_count * 100
SUCCESS_RATE.set(rate)
else:
SUCCESS_RATE.set(0)
except Exception as e:
print(f"Error updating success rate: {e}")
time.sleep(30) # 每30秒更新一次
8.3 监控特定语言的识别情况
如果你需要监控不同语言的识别效果,可以添加按语言分类的指标:
# 按语言统计的计数器
REQUESTS_BY_LANGUAGE = Counter('sensevoice_requests_by_language_total',
'Total requests by language', ['language'])
# 在处理请求时记录语言
def process_audio(audio_file, language='auto'):
# ... 原有的代码 ...
# 记录按语言的统计
REQUESTS_BY_LANGUAGE.labels(language=language).inc()
# ... 其余的代码 ...
然后在Grafana中,你可以创建按语言分类的统计面板。
8.4 设置监控数据保留策略
默认情况下,Prometheus会保存15天的数据。如果你需要更长的保留时间,可以修改Prometheus配置:
# 在prometheus.yml的启动命令中添加
command:
- '--storage.tsdb.retention.time=90d' # 保留90天数据
- '--storage.tsdb.retention.size=50GB' # 或者按大小限制
然后重启Prometheus:
docker-compose restart prometheus
9. 日常维护与故障排查
监控系统搭建好了,但还需要日常维护。这里是一些常见问题的解决方法。
9.1 监控系统本身也需要监控
是的,监控系统也可能出问题。我们可以添加对监控系统自身的监控:
监控Prometheus
在Prometheus配置中添加自监控:
# 在prometheus.yml的scrape_configs中添加
- job_name: 'prometheus-self'
static_configs:
- targets: ['localhost:9090']
metrics_path: '/metrics'
监控Grafana
Grafana自身也提供metrics接口。修改docker-compose.yml:
grafana:
image: grafana/grafana:latest
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_INSTALL_PLUGINS=grafana-piechart-panel
- GF_METRICS_ENABLED=true # 启用metrics
- GF_METRICS_INTERVAL_SECONDS=10
然后在Prometheus中添加对Grafana的监控:
- job_name: 'grafana'
static_configs:
- targets: ['grafana:3000']
metrics_path: '/metrics'
scrape_interval: 15s
9.2 常见问题排查
问题1:Prometheus显示target为DOWN
可能原因和解决方法:
-
端口不对:检查SenseVoice服务是否在正确的端口提供了metrics
curl http://localhost:9091/metrics -
防火墙阻止:检查防火墙设置
sudo ufw status sudo ufw allow 9091/tcp -
Docker网络问题:在Prometheus容器内测试连接
docker exec -it prometheus sh curl http://host.docker.internal:9091/metrics
问题2:Grafana看不到数据
可能原因和解决方法:
-
数据源配置错误:检查Grafana数据源配置
- 登录Grafana → Configuration → Data Sources
- 点击Prometheus数据源 → 点击"Save & Test"
- 应该显示"Data source is working"
-
时间范围设置错误:检查仪表盘的时间范围
- 在仪表盘右上角,确保时间范围设置正确
- 尝试设置为"Last 1 hour"或"Last 6 hours"
-
查询语句错误:检查面板的查询语句
- 点击面板标题 → Edit
- 检查查询语句是否正确
- 点击"Query inspector"查看原始数据
问题3:监控数据不更新
可能原因和解决方法:
-
Prometheus没有采集数据:检查target状态
- 访问Prometheus:9090 → Status → Targets
- 所有target应该是UP状态
-
指标名称变化:检查指标名称是否一致
# 直接访问metrics端点,查看可用的指标 curl http://localhost:9091/metrics | grep sensevoice -
服务重启导致数据丢失:检查数据持久化
# 检查Prometheus数据目录 docker exec prometheus ls -la /prometheus
9.3 定期维护任务
为了保持监控系统健康运行,建议定期执行以下任务:
| 任务 | 频率 | 操作 |
|---|---|---|
| 检查磁盘空间 | 每周 | df -h 查看监控数据占用 |
| 清理旧数据 | 每月 | 调整Prometheus保留策略 |
| 更新软件版本 | 每季度 | docker-compose pull 更新镜像 |
| 备份配置 | 每次变更后 | 备份docker-compose.yml和配置文件 |
| 测试告警 | 每月 | 手动触发测试告警 |
备份监控配置
# 备份整个监控配置
cd ~/sensevoice-monitoring
tar czf monitoring-backup-$(date +%Y%m%d).tar.gz .
# 备份到远程位置
scp monitoring-backup-*.tar.gz user@backup-server:/backup/
更新监控组件
# 拉取最新镜像
docker-compose pull
# 重启服务(会使用新镜像)
docker-compose up -d
# 查看更新日志
docker-compose logs --tail=100
10. 总结:从监控到洞察
通过这篇教程,我们完成了一个完整的SenseVoice-small服务监控系统搭建。让我们回顾一下都做了什么:
10.1 我们完成了什么?
- 搭建了完整的监控架构:从数据采集(Prometheus)到可视化展示(Grafana)
- 扩展了SenseVoice服务:添加了Prometheus metrics端点,暴露关键业务指标
- 监控了系统资源:通过node_exporter监控服务器CPU、内存、磁盘等
- 创建了专业仪表盘:在Grafana中创建了服务状态、性能指标、业务统计等面板
- 配置了智能告警:当服务异常时,系统会自动通知我们
- 实现了高级监控:添加了业务成功率、处理时长等深度指标
10.2 监控带来的价值
现在,你不再需要手动登录服务器检查服务状态。通过监控系统,你可以:
- 实时掌握服务状态:一眼看到服务是否正常运行
- 提前发现问题:在用户投诉前发现性能下降趋势
- 分析业务趋势:了解服务使用情况,为扩容提供数据支持
- 快速定位问题:当问题发生时,快速找到根本原因
- 量化服务效果:用数据证明服务的价值和稳定性
10.3 下一步建议
监控系统搭建好了,但监控工作才刚刚开始。我建议你:
- 持续优化仪表盘:根据实际使用情况,调整和添加需要的监控面板
- 设置关键告警:为最重要的指标设置告警,并确保通知渠道畅通
- 定期审查指标:每周花10分钟看看监控数据,了解服务运行状况
- 建立监控文化:让团队其他成员也学会使用监控系统
- 考虑扩展监控:随着业务发展,可能需要监控更多东西,比如:
- 数据库性能
- 网络延迟
- 第三方API调用
- 业务转化率等
10.4 资源推荐
如果你想深入学习监控系统,可以参考:
- Prometheus官方文档:最权威的学习资料
- Grafana官方文档:丰富的仪表盘示例和插件
- 《Prometheus监控实战》:很棒的入门书籍
- 监控社区:Prometheus和Grafana都有活跃的社区,遇到问题可以去提问
监控不是目的,而是手段。真正的目标是通过监控获得对系统的洞察,从而做出更好的决策。希望这套监控系统能帮助你更好地管理和优化SenseVoice-small服务。
最后的小提示:监控系统本身也需要被监控。你可以考虑为Prometheus和Grafana也设置简单的存活检查,确保监控系统本身是健康的。
祝你监控愉快!如果遇到问题,记得查看日志,大多数问题都能在日志中找到答案。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐


所有评论(0)