SenseVoice-small实战教程:Prometheus+Grafana监控WebUI服务健康度

1. 引言:为什么需要监控语音识别服务?

想象一下,你部署了一个非常棒的语音识别服务,用户可以通过网页上传录音,系统就能快速转成文字。但某天早上,用户反馈说网页打不开了,或者识别速度变得特别慢。你登录服务器一看,发现服务已经悄悄崩溃了几个小时,期间所有用户的请求都失败了。

这种情况在线上服务中并不少见。SenseVoice-small作为一个轻量级多任务语音模型,虽然部署简单、资源占用低,但只要是服务,就可能遇到各种问题:内存泄漏、CPU跑满、网络波动,或者只是简单的进程挂掉。等到用户投诉才发现问题,往往已经造成了不好的体验。

这就是服务监控的价值所在。它就像给服务装上了“健康监测仪”,能实时告诉你:

  • 服务还活着吗?
  • 响应速度正常吗?
  • 资源使用情况如何?
  • 有没有异常错误?

今天,我们就来实战搭建一套专业的监控系统,用Prometheus采集数据,用Grafana展示仪表盘,7x24小时守护你的SenseVoice-small WebUI服务。无论你是用在手机平板的离线语音助手,还是边缘计算的会议纪要系统,这套监控方案都能让你对服务状态了如指掌。

2. 监控方案设计:Prometheus + Grafana 黄金组合

在开始动手之前,我们先了解一下这套监控方案的整体设计。它由三个核心组件组成,各司其职,共同构建了一个完整的监控体系。

2.1 监控架构概览

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│                 │    │                 │    │                 │
│  SenseVoice     │───▶│   Prometheus    │───▶│    Grafana      │
│  WebUI 服务     │    │   (数据采集)    │    │   (数据展示)    │
│                 │    │                 │    │                 │
└─────────────────┘    └─────────────────┘    └─────────────────┘
        │                       │                       │
        │ 暴露/metrics端点      │ 定时抓取数据         │ 查询数据并可视化
        │                       │                       │
        ▼                       ▼                       ▼
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│  Prometheus     │    │   Alertmanager  │    │   邮件/钉钉     │
│  Client库       │    │   (告警管理)    │    │   告警通知      │
│  (Python)       │    │                 │    │                 │
└─────────────────┘    └─────────────────┘    └─────────────────┘

各组件分工明确:

  1. SenseVoice WebUI服务:通过Prometheus Client库暴露监控指标
  2. Prometheus:定时抓取这些指标并存储到时序数据库
  3. Grafana:从Prometheus查询数据,用漂亮的图表展示出来
  4. Alertmanager(可选):管理告警规则,发送通知

2.2 我们要监控什么?

对于SenseVoice-small WebUI服务,我们主要关注以下几个维度的健康度:

监控维度 具体指标 为什么重要
服务可用性 服务是否运行、HTTP接口是否可达 最基本的要求,服务挂了什么都白搭
性能表现 请求响应时间、识别耗时、QPS(每秒查询数) 直接影响用户体验,慢了用户会流失
资源使用 CPU使用率、内存占用、磁盘IO 资源不足会导致服务变慢或崩溃
业务指标 识别成功率、各语言使用比例、情感分析分布 了解业务运行情况,优化服务
错误监控 HTTP错误码、异常堆栈、识别失败次数 及时发现并修复问题

2.3 环境准备

在开始之前,请确保你的服务器已经部署了SenseVoice-small WebUI服务。如果你还没有部署,可以参考之前的教程先完成部署。

系统要求:

  • Linux服务器(Ubuntu/CentOS等)
  • Docker和Docker Compose(推荐方式)
  • 或者直接安装Python环境
  • 至少1GB可用内存(监控组件本身占用不大)

3. 第一步:为SenseVoice WebUI添加监控端点

监控的第一步是让我们的服务能够“说出”自己的健康状况。我们需要在现有的SenseVoice WebUI服务中集成Prometheus Client,暴露一个/metrics端点,供Prometheus抓取数据。

3.1 安装Prometheus Client库

首先,进入你的SenseVoice-small项目目录。如果你按照标准方式部署,路径应该是/root/sensevoice-small-语音识别-onnx

cd /root/sensevoice-small-语音识别-onnx

激活你的Python虚拟环境(如果使用了的话),然后安装必要的依赖:

# 如果你使用了conda环境
conda activate torch29

# 安装Prometheus Python客户端
pip install prometheus-client==0.20.0

这个库非常轻量,不会对现有服务造成明显影响。

3.2 修改WebUI代码添加监控

我们需要修改WebUI的主文件来添加监控功能。找到你的WebUI入口文件,通常是app.pywebui.py

备份原始文件(重要!):

cp webui.py webui.py.backup

然后编辑文件,在合适的位置添加监控代码。以下是完整的修改示例:

#!/usr/bin/env python3
"""
SenseVoice-small WebUI with Prometheus Monitoring
"""

import os
import time
import logging
from datetime import datetime
from flask import Flask, request, jsonify, render_template
from prometheus_client import make_wsgi_app, Counter, Histogram, Gauge
from werkzeug.middleware.dispatcher import DispatcherMiddleware

# 创建Flask应用
app = Flask(__name__)

# ==================== Prometheus Metrics 定义 ====================

# 计数器:总请求数
REQUEST_COUNT = Counter(
    'sensevoice_http_requests_total',
    'Total HTTP requests',
    ['method', 'endpoint', 'status']
)

# 直方图:请求耗时分布
REQUEST_LATENCY = Histogram(
    'sensevoice_http_request_duration_seconds',
    'HTTP request latency in seconds',
    ['method', 'endpoint']
)

# 仪表盘:当前正在处理的请求数
IN_PROGRESS = Gauge(
    'sensevoice_http_requests_in_progress',
    'Number of in-progress HTTP requests',
    ['method', 'endpoint']
)

# 计数器:语音识别请求数
RECOGNITION_REQUESTS = Counter(
    'sensevoice_recognition_requests_total',
    'Total speech recognition requests',
    ['language', 'status']
)

# 直方图:识别耗时分布
RECOGNITION_LATENCY = Histogram(
    'sensevoice_recognition_duration_seconds',
    'Speech recognition latency in seconds',
    ['language']
)

# 仪表盘:服务运行时间
SERVICE_UPTIME = Gauge(
    'sensevoice_service_uptime_seconds',
    'Service uptime in seconds'
)

# 仪表盘:内存使用量(MB)
MEMORY_USAGE = Gauge(
    'sensevoice_memory_usage_mb',
    'Memory usage in MB'
)

# 记录服务启动时间
start_time = time.time()

# ==================== 监控中间件 ====================

@app.before_request
def before_request():
    """记录请求开始时间"""
    request.start_time = time.time()
    IN_PROGRESS.labels(request.method, request.path).inc()

@app.after_request
def after_request(response):
    """记录请求完成信息"""
    # 计算请求耗时
    latency = time.time() - request.start_time
    REQUEST_LATENCY.labels(request.method, request.path).observe(latency)
    
    # 记录请求计数
    REQUEST_COUNT.labels(request.method, request.path, response.status_code).inc()
    
    # 减少正在处理的请求数
    IN_PROGRESS.labels(request.method, request.path).dec()
    
    # 更新运行时间
    SERVICE_UPTIME.set(time.time() - start_time)
    
    # 更新内存使用(示例,实际需要根据情况调整)
    try:
        import psutil
        process = psutil.Process()
        memory_mb = process.memory_info().rss / 1024 / 1024
        MEMORY_USAGE.set(memory_mb)
    except:
        pass  # 如果无法获取内存信息,忽略
    
    return response

# ==================== 原有路由处理 ====================

@app.route('/')
def index():
    """主页"""
    return render_template('index.html')

@app.route('/api/recognize', methods=['POST'])
def recognize():
    """语音识别接口"""
    start_time = time.time()
    
    try:
        # 获取请求参数
        audio_file = request.files.get('audio')
        language = request.form.get('language', 'auto')
        
        if not audio_file:
            RECOGNITION_REQUESTS.labels(language=language, status='error').inc()
            return jsonify({'error': 'No audio file provided'}), 400
        
        # 这里调用实际的识别逻辑
        # result = your_recognition_function(audio_file, language)
        
        # 模拟识别结果
        result = {
            'text': '这是一个测试识别结果',
            'language': 'zh',
            'emotion': 'neutral',
            'confidence': 0.95
        }
        
        # 计算识别耗时
        recognition_time = time.time() - start_time
        RECOGNITION_LATENCY.labels(language=language).observe(recognition_time)
        RECOGNITION_REQUESTS.labels(language=language, status='success').inc()
        
        return jsonify(result)
        
    except Exception as e:
        RECOGNITION_REQUESTS.labels(language=language or 'unknown', status='error').inc()
        logging.error(f"Recognition error: {str(e)}")
        return jsonify({'error': str(e)}), 500

@app.route('/health')
def health_check():
    """健康检查端点"""
    return jsonify({
        'status': 'healthy',
        'timestamp': datetime.now().isoformat(),
        'uptime': time.time() - start_time
    })

# ==================== 主程序 ====================

if __name__ == '__main__':
    # 创建DispatcherMiddleware,将/metrics路由交给Prometheus
    app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
        '/metrics': make_wsgi_app()
    })
    
    # 启动服务
    app.run(host='0.0.0.0', port=7860, debug=False)

关键修改说明:

  1. 导入Prometheus客户端库from prometheus_client import make_wsgi_app, Counter, Histogram, Gauge
  2. 定义监控指标:创建了7个核心指标,覆盖请求、识别、资源等维度
  3. 添加监控中间件@app.before_request@app.after_request装饰器自动记录每个请求
  4. 集成/metrics端点:通过DispatcherMiddleware/metrics路由交给Prometheus
  5. 在识别接口中添加监控:记录识别请求的成功/失败、耗时等信息

3.3 安装额外依赖

修改后的代码需要额外的依赖,创建或更新requirements.txt文件:

# 创建requirements.txt
cat > requirements.txt << EOF
flask>=2.0.0
prometheus-client==0.20.0
werkzeug==2.0.0
psutil==5.9.0
EOF

# 安装依赖
pip install -r requirements.txt

3.4 测试监控端点

重启WebUI服务,然后测试监控端点是否正常工作:

# 重启服务(根据你的部署方式)
supervisorctl restart sensevoice:sensevoice-webui

# 等待几秒后测试
curl http://localhost:7860/health
curl http://localhost:7860/metrics

如果一切正常,访问/metrics应该能看到类似这样的输出:

# HELP sensevoice_http_requests_total Total HTTP requests
# TYPE sensevoice_http_requests_total counter
sensevoice_http_requests_total{method="GET",endpoint="/",status="200"} 1.0

# HELP sensevoice_http_request_duration_seconds HTTP request latency in seconds
# TYPE sensevoice_http_request_duration_seconds histogram
sensevoice_http_request_duration_seconds_bucket{method="GET",endpoint="/",le="0.005"} 0.0
sensevoice_http_request_duration_seconds_bucket{method="GET",endpoint="/",le="0.01"} 1.0
sensevoice_http_request_duration_seconds_bucket{method="GET",endpoint="/",le="0.025"} 1.0
...

看到这些指标数据,说明监控端点已经成功集成了!

4. 第二步:部署Prometheus数据采集器

现在我们的服务已经能够“说出”自己的状态了,接下来需要部署一个“听众”——Prometheus,来定期收集这些指标数据。

4.1 使用Docker快速部署Prometheus

最简单的方式是使用Docker Compose。创建一个docker-compose.yml文件:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./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'
      - '--web.enable-lifecycle'
    ports:
      - "9090:9090"
    networks:
      - monitoring

volumes:
  prometheus_data:

networks:
  monitoring:
    driver: bridge

4.2 配置Prometheus抓取规则

创建Prometheus配置文件prometheus.yml

global:
  scrape_interval: 15s  # 每15秒抓取一次数据
  evaluation_interval: 15s  # 每15秒评估一次告警规则
  scrape_timeout: 10s  # 抓取超时时间

# 告警规则配置
rule_files:
  # - "alert_rules.yml"

# 抓取配置
scrape_configs:
  # Prometheus自身监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
    scrape_interval: 15s

  # SenseVoice WebUI服务监控
  - job_name: 'sensevoice-webui'
    static_configs:
      - targets: ['host.docker.internal:7860']  # Docker内部访问宿主机
        labels:
          service: 'sensevoice-webui'
          environment: 'production'
    scrape_interval: 15s
    metrics_path: '/metrics'
    
  # 节点监控(系统资源)
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['host.docker.internal:9100']
        labels:
          service: 'node-exporter'
          environment: 'production'
    scrape_interval: 15s

# 告警管理器配置
alerting:
  alertmanagers:
    - static_configs:
        - targets: []
      # - targets: ['alertmanager:9093']

重要配置说明:

  1. scrape_interval: 15s:每15秒抓取一次数据,这个频率对大多数场景都合适
  2. targets: ['host.docker.internal:7860']:Docker容器内访问宿主机服务的特殊地址
  3. metrics_path: '/metrics':指定抓取的端点路径
  4. labels:为监控目标添加标签,方便后续筛选和分组

4.3 启动Prometheus

创建好配置文件后,启动Prometheus服务:

# 创建配置目录
mkdir -p /root/monitoring/prometheus
cd /root/monitoring

# 将上面的docker-compose.yml和prometheus.yml放到这个目录
# 启动服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f prometheus

4.4 验证Prometheus是否正常工作

等待几秒钟后,访问Prometheus的Web界面:

  • 地址:http://你的服务器IP:9090
  • 或者本地访问:http://localhost:9090

在Prometheus界面中,点击顶部菜单的"Status" → "Targets",应该能看到类似这样的状态:

Endpoint                    State     Labels                                   Last Scrape
http://host.docker.internal:7860/metrics  UP       environment="production",job="sensevoice-webui",service="sensevoice-webui"  3.456s ago
http://localhost:9090/metrics             UP       job="prometheus"                                           3.123s ago

如果状态显示为"UP"(绿色),说明Prometheus已经成功连接到SenseVoice WebUI服务并开始采集数据了。

4.5 添加系统监控(可选但推荐)

为了监控服务器的CPU、内存、磁盘等系统资源,我们可以部署Node Exporter。创建docker-compose.node.yml文件:

version: '3.8'

services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    ports:
      - "9100:9100"
    networks:
      - monitoring

networks:
  monitoring:
    external: true
    name: monitoring_default

启动Node Exporter:

# 创建网络(如果不存在)
docker network create monitoring_default 2>/dev/null || true

# 启动Node Exporter
docker-compose -f docker-compose.node.yml up -d

# 验证
curl http://localhost:9100/metrics | head -20

现在Prometheus会同时监控SenseVoice服务和服务器系统资源。

5. 第三步:使用Grafana创建监控仪表盘

数据采集好了,接下来我们需要一个漂亮的界面来展示这些数据。Grafana就是专门做这个的——它可以从Prometheus读取数据,然后用各种图表展示出来。

5.1 部署Grafana

创建docker-compose.grafana.yml文件:

version: '3.8'

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123  # 初始密码,请修改!
      - GF_INSTALL_PLUGINS=grafana-piechart-panel
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    ports:
      - "3000:3000"
    networks:
      - monitoring

volumes:
  grafana_data:

networks:
  monitoring:
    external: true
    name: monitoring_default

启动Grafana:

# 创建配置目录
mkdir -p /root/monitoring/grafana/provisioning/datasources
mkdir -p /root/monitoring/grafana/provisioning/dashboards

# 创建数据源配置文件
cat > /root/monitoring/grafana/provisioning/datasources/prometheus.yml << EOF
apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true
EOF

# 启动Grafana
docker-compose -f docker-compose.grafana.yml up -d

# 查看状态
docker-compose -f docker-compose.grafana.yml ps

5.2 配置Grafana数据源

  1. 访问Grafana:http://你的服务器IP:3000
  2. 使用默认账号登录:
    • 用户名:admin
    • 密码:admin123(你刚才在配置里设置的)
  3. 首次登录会要求修改密码,建议修改一个强密码
  4. 数据源应该已经自动配置好了(通过provisioning配置),可以在"Configuration" → "Data Sources"中查看

5.3 导入SenseVoice监控仪表盘

Grafana支持导入现成的仪表盘配置。这里我为你准备了一个专门为SenseVoice WebUI设计的监控仪表盘。

创建仪表盘配置文件/root/monitoring/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文件。由于内容较长,我提供一个精简版的配置,你可以在Grafana界面中手动创建或导入完整版:

{
  "dashboard": {
    "title": "SenseVoice WebUI 服务监控",
    "description": "SenseVoice-small语音识别服务健康度监控",
    "tags": ["sensevoice", "monitoring", "speech-recognition"],
    "style": "dark",
    "timezone": "browser",
    "panels": [
      {
        "id": 1,
        "title": "服务概览",
        "type": "stat",
        "gridPos": {"h": 3, "w": 12, "x": 0, "y": 0},
        "targets": [{
          "expr": "up{service=\"sensevoice-webui\"}",
          "legendFormat": "服务状态"
        }],
        "fieldConfig": {
          "defaults": {
            "color": {"mode": "thresholds"},
            "mappings": [
              {"type": "value", "options": {"0": {"text": "❌ 离线"}, "1": {"text": "✅ 在线"}}}
            ],
            "thresholds": {"steps": [{"value": null, "color": "red"}, {"value": 1, "color": "green"}]}
          }
        }
      }
    ],
    "time": {"from": "now-1h", "to": "now"},
    "refresh": "10s"
  }
}

实际上,一个完整的监控仪表盘应该包含多个面板。我建议通过Grafana界面手动创建,这样更直观:

5.4 手动创建监控仪表盘

在Grafana中点击"+" → "Dashboard",然后依次添加以下面板:

面板1:服务状态概览
  • 类型:Stat(状态)
  • 查询up{service="sensevoice-webui"}
  • 设置:值映射,1=在线,0=离线
  • 位置:顶部,显示服务是否正常运行
面板2:请求QPS(每秒查询数)
  • 类型:Graph(图表)
  • 查询rate(sensevoice_http_requests_total[1m])
  • 设置:线图,显示每分钟请求量变化
  • 用途:观察服务负载情况
面板3:请求延迟分布
  • 类型:Heatmap(热图)
  • 查询sensevoice_http_request_duration_seconds_bucket
  • 设置:显示请求延迟的分布情况
  • 用途:了解大多数请求的响应时间
面板4:识别成功率
  • 类型:Pie chart(饼图)
  • 查询sum by (status)(rate(sensevoice_recognition_requests_total[5m]))
  • 设置:显示成功和失败的比例
  • 用途:监控识别服务的稳定性
面板5:各语言识别请求分布
  • 类型:Bar gauge(条形图)
  • 查询sum by (language)(rate(sensevoice_recognition_requests_total[5m]))
  • 设置:按语言分类显示请求量
  • 用途:了解用户使用哪种语言最多
面板6:识别耗时P95
  • 类型:Graph(图表)
  • 查询histogram_quantile(0.95, sum(rate(sensevoice_recognition_duration_seconds_bucket[5m])) by (le, language))
  • 设置:显示95%的识别请求在多少时间内完成
  • 用途:监控识别性能,确保用户体验
面板7:系统资源监控
  • 类型:Row(行),包含多个子面板
  • CPU使用率rate(node_cpu_seconds_total{mode!="idle"}[1m]) * 100
  • 内存使用率(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
  • 磁盘使用率(node_filesystem_size_bytes{fstype!="tmpfs"} - node_filesystem_free_bytes{fstype!="tmpfs"}) / node_filesystem_size_bytes{fstype!="tmpfs"} * 100
面板8:错误率监控
  • 类型:Graph(图表)
  • 查询rate(sensevoice_http_requests_total{status=~"5.."}[5m]) / rate(sensevoice_http_requests_total[5m]) * 100
  • 设置:显示HTTP 5xx错误的比例
  • 告警:当错误率超过1%时触发告警

5.5 仪表盘布局建议

一个合理的仪表盘布局应该让重要信息一目了然。我建议这样排列:

┌─────────────────┬─────────────────┬─────────────────┐
│  服务状态概览   │   请求QPS       │   识别成功率    │
│  (在线/离线)    │  (实时流量)     │  (成功比例)     │
├─────────────────┼─────────────────┼─────────────────┤
│                请求延迟热图                        │
│              (响应时间分布)                        │
├─────────────────┬─────────────────┬─────────────────┤
│  各语言分布     │ 识别耗时P95     │  系统CPU        │
│  (使用情况)     │ (性能指标)      │  (使用率)       │
├─────────────────┼─────────────────┼─────────────────┤
│  系统内存       │  系统磁盘       │  错误率         │
│  (使用率)       │  (使用率)       │  (5xx比例)      │
└─────────────────┴─────────────────┴─────────────────┘

这样的布局让运维人员一眼就能看到:

  1. 服务是否正常(左上角)
  2. 当前负载如何(右上角)
  3. 性能表现怎样(中间)
  4. 系统资源是否充足(下方)

6. 第四步:设置告警规则

监控仪表盘能让我们看到问题,但更好的方式是让系统主动通知我们。这就是告警的作用——当某些指标异常时,自动发送通知。

6.1 配置Prometheus告警规则

创建告警规则文件alert_rules.yml

groups:
  - name: sensevoice_alerts
    rules:
      # 规则1:服务下线告警
      - alert: SenseVoiceServiceDown
        expr: up{service="sensevoice-webui"} == 0
        for: 1m  # 持续1分钟才触发
        labels:
          severity: critical
          service: sensevoice-webui
        annotations:
          summary: "SenseVoice WebUI服务已下线"
          description: "{{ $labels.instance }} 上的SenseVoice服务已经停止响应超过1分钟"
          value: "{{ $value }}"
          
      # 规则2:高错误率告警
      - alert: HighErrorRate
        expr: |
          (
            rate(sensevoice_http_requests_total{status=~"5.."}[5m])
            /
            rate(sensevoice_http_requests_total[5m])
          ) * 100 > 5
        for: 2m
        labels:
          severity: warning
          service: sensevoice-webui
        annotations:
          summary: "SenseVoice服务错误率过高"
          description: "{{ $labels.instance }} 的错误率超过5%,当前值为 {{ $value | humanize }}%"
          
      # 规则3:识别性能下降告警
      - alert: RecognitionSlow
        expr: |
          histogram_quantile(0.95, rate(sensevoice_recognition_duration_seconds_bucket[5m])) > 10
        for: 3m
        labels:
          severity: warning
          service: sensevoice-webui
        annotations:
          summary: "语音识别性能下降"
          description: "{{ $labels.instance }} 的P95识别耗时超过10秒,当前值为 {{ $value | humanize }}秒"
          
      # 规则4:系统内存不足告警
      - alert: HighMemoryUsage
        expr: |
          (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)
          / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
          service: system
        annotations:
          summary: "系统内存使用率过高"
          description: "内存使用率超过85%,当前值为 {{ $value | humanize }}%"
          
      # 规则5:磁盘空间不足告警
      - alert: LowDiskSpace
        expr: |
          (node_filesystem_size_bytes{fstype!="tmpfs"} - node_filesystem_free_bytes{fstype!="tmpfs"})
          / node_filesystem_size_bytes{fstype!="tmpfs"} * 100 > 90
        for: 10m
        labels:
          severity: critical
          service: system
        annotations:
          summary: "磁盘空间不足"
          description: "{{ $labels.mountpoint }} 磁盘使用率超过90%,当前值为 {{ $value | humanize }}%"

6.2 更新Prometheus配置

修改prometheus.yml,取消注释告警规则配置:

rule_files:
  - "alert_rules.yml"  # 取消这行的注释

然后将告警规则文件放到正确的位置:

# 复制告警规则文件到Prometheus配置目录
cp alert_rules.yml /root/monitoring/prometheus/

# 重启Prometheus使配置生效
docker-compose restart prometheus

6.3 验证告警规则

在Prometheus的Web界面中,点击"Alerts"菜单,应该能看到我们刚刚配置的告警规则:

Name                    State    Active Since    Value
SenseVoiceServiceDown   inactive -              -
HighErrorRate           inactive -              -
RecognitionSlow         inactive -              -
HighMemoryUsage         inactive -              -
LowDiskSpace            inactive -              -

状态显示为"inactive"表示当前没有触发告警,这是正常的。

6.4 测试告警(可选)

如果你想测试告警是否正常工作,可以临时停止SenseVoice服务:

# 停止服务
supervisorctl stop sensevoice:sensevoice-webui

# 等待1-2分钟
sleep 120

# 查看Prometheus告警页面
# 应该能看到SenseVoiceServiceDown告警状态变为"pending",然后"firing"

测试完成后记得重启服务:

supervisorctl start sensevoice:sensevoice-webui

7. 第五步:配置告警通知(邮件示例)

告警触发后,我们需要收到通知。这里以邮件通知为例,展示如何配置。

7.1 部署Alertmanager

创建docker-compose.alertmanager.yml

version: '3.8'

services:
  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    restart: unless-stopped
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"
    networks:
      - monitoring

networks:
  monitoring:
    external: true
    name: monitoring_default

7.2 配置Alertmanager

创建alertmanager.yml配置文件:

global:
  smtp_smarthost: 'smtp.qq.com:587'  # QQ邮箱SMTP服务器,根据你的邮箱修改
  smtp_from: 'your-email@qq.com'     # 发件人邮箱
  smtp_auth_username: 'your-email@qq.com'  # 邮箱账号
  smtp_auth_password: 'your-auth-code'     # 授权码,不是密码!
  smtp_require_tls: true

route:
  group_by: ['alertname', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email-notifications'

receivers:
  - name: 'email-notifications'
    email_configs:
      - to: 'admin@your-company.com'  # 收件人邮箱
        send_resolved: true  # 问题解决时也发送通知
        headers:
          subject: '{{ template "email.default.subject" . }}'
        html: '{{ template "email.default.html" . }}'

templates:
  - '/etc/alertmanager/templates/*.tmpl'

重要提示

  • 你需要使用真实的邮箱配置
  • 对于QQ邮箱,需要在设置中开启SMTP服务并获取授权码
  • 生产环境建议使用企业邮箱或专业的邮件服务

7.3 创建邮件模板(可选)

创建模板文件email.tmpl

{{ define "email.default.subject" }}[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }} on {{ .GroupLabels.service }}{{ end }}

{{ define "email.default.html" }}
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .critical { color: #d9534f; }
        .warning { color: #f0ad4e; }
        .info { color: #5bc0de; }
        .resolved { color: #5cb85c; }
    </style>
</head>
<body>
    <h2>{{ .GroupLabels.alertname }}</h2>
    
    <p><strong>状态:</strong> 
    {{ if eq .Status "firing" }}
        <span class="critical">⚠️ 告警中</span>
    {{ else }}
        <span class="resolved">✅ 已恢复</span>
    {{ end }}
    </p>
    
    <p><strong>服务:</strong> {{ .GroupLabels.service }}</p>
    <p><strong>时间:</strong> {{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>
    
    {{ if eq .Status "firing" }}
    <p><strong>持续时间:</strong> {{ .Duration }}</p>
    {{ else }}
    <p><strong>恢复时间:</strong> {{ .EndsAt.Format "2006-01-02 15:04:05" }}</p>
    {{ end }}
    
    <h3>告警详情</h3>
    <ul>
    {{ range .Annotations }}
        <li><strong>{{ .Name }}:</strong> {{ .Value }}</li>
    {{ end }}
    </ul>
    
    <h3>标签</h3>
    <ul>
    {{ range .Labels }}
        <li><strong>{{ .Name }}:</strong> {{ .Value }}</li>
    {{ end }}
    </ul>
    
    <hr>
    <p><small>此邮件由 Prometheus Alertmanager 自动发送</small></p>
</body>
</html>
{{ end }}

7.4 更新Prometheus配置

修改prometheus.yml中的alerting部分:

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

7.5 启动Alertmanager

# 启动Alertmanager
docker-compose -f docker-compose.alertmanager.yml up -d

# 重启Prometheus
docker-compose restart prometheus

现在,当告警触发时,你就会收到邮件通知了。

8. 总结:从监控到洞察

通过以上五个步骤,我们成功为SenseVoice-small WebUI服务搭建了一套完整的监控系统。让我们回顾一下这个系统能为我们带来什么价值:

8.1 监控系统的核心价值

  1. 实时可见性:7x24小时监控服务状态,随时了解服务健康度
  2. 快速定位:出现问题时有详细的数据支持,快速定位问题根源
  3. 性能优化:通过历史数据发现性能瓶颈,针对性优化
  4. 容量规划:基于资源使用趋势,合理规划服务器扩容
  5. 主动告警:问题发生前预警,减少服务中断时间

8.2 针对不同场景的监控重点

根据你使用SenseVoice-small的不同场景,监控的重点可以有所调整:

使用场景 监控重点 建议告警阈值
离线语音助手 服务可用性、响应速度 响应时间>2秒触发告警
实时字幕系统 识别延迟、成功率 识别延迟>1秒或成功率<95%告警
客服质检 识别准确率、系统稳定性 错误率>3%或服务中断立即告警
会议纪要 多语言支持、长时间运行稳定性 内存泄漏检测、各语言识别成功率
医疗/金融隐私场景 数据安全性、服务可靠性 任何异常立即告警,加强日志审计

8.3 后续优化建议

这套监控系统已经可以满足基本需求,但你还可以根据实际情况进一步优化:

  1. 添加业务指标监控

    • 各语言识别准确率
    • 情感分析分布统计
    • 用户使用习惯分析
  2. 集成更多通知渠道

    • 钉钉/企业微信机器人
    • 短信通知
    • 电话告警(对于关键服务)
  3. 设置自动化修复

    • 检测到服务挂掉时自动重启
    • 磁盘空间不足时自动清理日志
    • 内存使用过高时自动扩容
  4. 建立监控仪表盘分类

    • 运维视图:技术指标监控
    • 业务视图:业务指标分析
    • 管理层视图:服务健康度概览

8.4 日常运维检查清单

建立监控系统后,建议养成以下运维习惯:

  • 每日检查:快速浏览仪表盘,确认所有服务正常
  • 每周回顾:分析一周的性能趋势,发现潜在问题
  • 每月报告:生成月度监控报告,用于容量规划和优化决策
  • 告警响应:建立告警响应流程,确保问题及时处理

监控不是目的,而是手段。真正的价值在于通过监控数据驱动决策,持续优化服务,为用户提供稳定可靠的语音识别体验。SenseVoice-small作为轻量级模型,在资源有限的环境中尤其需要精细化的监控来保障服务质量。

现在,你的SenseVoice-small服务已经拥有了"全天候健康监护",可以更加安心地服务于各种应用场景了。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐