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 核心组件介绍

整个监控系统主要由三个部分组成:

  1. SenseVoice-small服务(被监控对象)

    • 这是我们之前部署的语音识别WebUI
    • 它会在运行过程中产生各种数据:CPU用了多少、内存用了多少、处理了多少个识别请求等
    • 这些数据通过一个特定的端口(比如9091)暴露出来,等待被采集
  2. Prometheus(数据采集器)

    • 你可以把它想象成一个“数据收集员”
    • 它定期(比如每15秒)去访问SenseVoice服务的那个端口,把最新的运行数据“抄录”下来
    • 然后把这些数据按照时间顺序存储在自己的数据库里
    • Prometheus还提供了简单的查询语言,让你能查找历史数据
  3. 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.pywebui.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 验证服务运行

打开浏览器,访问以下地址:

  1. Prometheus界面http://你的服务器IP:9090

    • 点击顶部菜单的"Status" → "Targets"
    • 应该看到三个target都是UP状态:
      • prometheus (localhost:9090)
      • sensevoice-small (host.docker.internal:9091)
      • node (host.docker.internal:9100)
  2. 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界面中:

  1. 点击左侧"+"图标 → "Create" → "Dashboard"
  2. 点击"Add new panel"
  3. 在查询框中输入:sensevoice_service_up
  4. 点击"Run queries"
  5. 在右侧面板设置中,将标题改为"服务状态"
  6. 点击"Apply"保存面板
  7. 点击顶部"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后:

创建"服务状态"面板
  1. 点击"Create" → "Dashboard"
  2. 点击"Add new panel"
  3. 在查询框输入:sensevoice_service_up
  4. 右侧"Visualization"选择"Stat"
  5. 在"Field"设置中,找到"Thresholds",设置:
    • 当值=1时显示绿色"UP"
    • 当值=0时显示红色"DOWN"
  6. 点击"Apply"
创建"CPU使用率"面板
  1. 在仪表盘点击"Add panel"
  2. 查询框输入:sensevoice_cpu_usage_percent
  3. 可视化选择"Gauge"
  4. 单位选择"Percent (0-100)"
  5. 设置阈值:绿色(<70%)、黄色(70-90%)、红色(>90%)
  6. 点击"Apply"
创建"内存使用率"面板
  1. 添加新面板
  2. 查询框输入:sensevoice_memory_usage_percent
  3. 可视化选择"Gauge"
  4. 单位选择"Percent (0-100)"
  5. 设置阈值:绿色(<70%)、黄色(70-90%)、红色(>90%)
  6. 点击"Apply"
创建"请求统计"面板
  1. 添加新面板
  2. 查询框输入:rate(sensevoice_requests_total[5m])
  3. 可视化选择"Graph"
  4. 标题改为"请求速率(次/分钟)"
  5. 点击"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中,为关键指标设置告警:

服务宕机告警
  1. 在"服务状态"面板,点击标题 → "Edit"
  2. 切换到"Alert"标签页
  3. 点击"Create alert rule from this panel"
  4. 设置告警条件:
    • sensevoice_service_uplast()= 0时触发
  5. 设置评估间隔:每1m评估一次
  6. 点击"Save rule"
CPU使用率过高告警
  1. 在"CPU使用率"面板,点击标题 → "Edit"
  2. 切换到"Alert"标签页
  3. 点击"Create alert rule from this panel"
  4. 设置告警条件:
    • sensevoice_cpu_usage_percentlast()> 90时触发
  5. 设置评估间隔:每5m评估一次
  6. 点击"Save rule"
内存使用率过高告警
  1. 在"内存使用率"面板,点击标题 → "Edit"
  2. 切换到"Alert"标签页
  3. 点击"Create alert rule from this panel"
  4. 设置告警条件:
    • sensevoice_memory_usage_percentlast()> 90时触发
  5. 设置评估间隔:每5m评估一次
  6. 点击"Save rule"

7.2 配置告警通知渠道

告警需要发送到某个地方才能被我们看到。Grafana支持多种通知方式:

配置邮件通知(推荐)
  1. 点击左侧菜单"Alerting" → "Contact points"
  2. 点击"Add contact point"
  3. 名称填写"Email Alerts"
  4. 类型选择"Email"
  5. 填写收件人地址
  6. 点击"Test"测试,然后"Save"
配置Slack通知(如果团队用Slack)
  1. 在Slack中创建一个Incoming Webhook
  2. 在Grafana中,点击"Add contact point"
  3. 类型选择"Slack"
  4. 填写Webhook URL
  5. 点击"Test"测试,然后"Save"
配置钉钉通知(国内常用)
  1. 在钉钉群创建自定义机器人,获取Webhook
  2. 在Grafana中安装钉钉插件,或者使用Webhook方式
  3. 配置通知地址

7.3 将告警规则绑定到通知渠道

  1. 点击左侧菜单"Alerting" → "Alert rules"
  2. 找到刚才创建的告警规则
  3. 点击规则名称进入详情
  4. 在"Notifications"部分,选择刚才创建的Contact point
  5. 点击"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

可能原因和解决方法:

  1. 端口不对:检查SenseVoice服务是否在正确的端口提供了metrics

    curl http://localhost:9091/metrics
    
  2. 防火墙阻止:检查防火墙设置

    sudo ufw status
    sudo ufw allow 9091/tcp
    
  3. Docker网络问题:在Prometheus容器内测试连接

    docker exec -it prometheus sh
    curl http://host.docker.internal:9091/metrics
    
问题2:Grafana看不到数据

可能原因和解决方法:

  1. 数据源配置错误:检查Grafana数据源配置

    • 登录Grafana → Configuration → Data Sources
    • 点击Prometheus数据源 → 点击"Save & Test"
    • 应该显示"Data source is working"
  2. 时间范围设置错误:检查仪表盘的时间范围

    • 在仪表盘右上角,确保时间范围设置正确
    • 尝试设置为"Last 1 hour"或"Last 6 hours"
  3. 查询语句错误:检查面板的查询语句

    • 点击面板标题 → Edit
    • 检查查询语句是否正确
    • 点击"Query inspector"查看原始数据
问题3:监控数据不更新

可能原因和解决方法:

  1. Prometheus没有采集数据:检查target状态

    • 访问Prometheus:9090 → Status → Targets
    • 所有target应该是UP状态
  2. 指标名称变化:检查指标名称是否一致

    # 直接访问metrics端点,查看可用的指标
    curl http://localhost:9091/metrics | grep sensevoice
    
  3. 服务重启导致数据丢失:检查数据持久化

    # 检查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 我们完成了什么?

  1. 搭建了完整的监控架构:从数据采集(Prometheus)到可视化展示(Grafana)
  2. 扩展了SenseVoice服务:添加了Prometheus metrics端点,暴露关键业务指标
  3. 监控了系统资源:通过node_exporter监控服务器CPU、内存、磁盘等
  4. 创建了专业仪表盘:在Grafana中创建了服务状态、性能指标、业务统计等面板
  5. 配置了智能告警:当服务异常时,系统会自动通知我们
  6. 实现了高级监控:添加了业务成功率、处理时长等深度指标

10.2 监控带来的价值

现在,你不再需要手动登录服务器检查服务状态。通过监控系统,你可以:

  • 实时掌握服务状态:一眼看到服务是否正常运行
  • 提前发现问题:在用户投诉前发现性能下降趋势
  • 分析业务趋势:了解服务使用情况,为扩容提供数据支持
  • 快速定位问题:当问题发生时,快速找到根本原因
  • 量化服务效果:用数据证明服务的价值和稳定性

10.3 下一步建议

监控系统搭建好了,但监控工作才刚刚开始。我建议你:

  1. 持续优化仪表盘:根据实际使用情况,调整和添加需要的监控面板
  2. 设置关键告警:为最重要的指标设置告警,并确保通知渠道畅通
  3. 定期审查指标:每周花10分钟看看监控数据,了解服务运行状况
  4. 建立监控文化:让团队其他成员也学会使用监控系统
  5. 考虑扩展监控:随着业务发展,可能需要监控更多东西,比如:
    • 数据库性能
    • 网络延迟
    • 第三方API调用
    • 业务转化率等

10.4 资源推荐

如果你想深入学习监控系统,可以参考:

  • Prometheus官方文档:最权威的学习资料
  • Grafana官方文档:丰富的仪表盘示例和插件
  • 《Prometheus监控实战》:很棒的入门书籍
  • 监控社区:Prometheus和Grafana都有活跃的社区,遇到问题可以去提问

监控不是目的,而是手段。真正的目标是通过监控获得对系统的洞察,从而做出更好的决策。希望这套监控系统能帮助你更好地管理和优化SenseVoice-small服务。

最后的小提示:监控系统本身也需要被监控。你可以考虑为Prometheus和Grafana也设置简单的存活检查,确保监控系统本身是健康的。

祝你监控愉快!如果遇到问题,记得查看日志,大多数问题都能在日志中找到答案。


获取更多AI镜像

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

Logo

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

更多推荐