当前位置: 首页 > article >正文

RexUniNLU保姆级教程:日志埋点+Prometheus监控+NLU服务性能大盘搭建

RexUniNLU保姆级教程日志埋点Prometheus监控NLU服务性能大盘搭建1. 为什么需要监控NLU服务当你把RexUniNLU部署到生产环境后会发现几个现实问题用户说服务响应时快时慢但不知道具体慢在哪里出现识别错误时很难快速定位是哪个环节出了问题服务到底承载了多少请求量峰值时期能否稳定运行没有监控的NLU服务就像在黑夜里开车——你不知道速度多少不知道油量还剩多少甚至不知道前方有没有危险。通过本教程你将学会如何为RexUniNLU添加完整的监控体系让服务运行状态一目了然。2. 环境准备与依赖安装在开始之前确保你已经部署了RexUniNLU基础服务。我们需要额外安装一些监控相关的依赖包。# 安装监控所需的Python依赖 pip install prometheus-client loguru # 安装Prometheus选择一种方式 # 方式一Docker安装推荐 docker run -d -p 9090:9090 --name prometheus prom/prometheus # 方式二本地安装 # 从 https://prometheus.io/download/ 下载对应版本创建监控专用的配置文件目录mkdir -p monitoring/config mkdir -p monitoring/logs3. 为RexUniNLU添加日志埋点日志是监控的基础好的日志能让我们快速定位问题。我们使用loguru这个强大的日志库来替代Python自带的logging。创建monitoring/logger_setup.py文件from loguru import logger import json import time import os def setup_logger(): 配置日志系统 log_path monitoring/logs/nlu_service.log # 清除默认配置 logger.remove() # 添加文件日志每天轮转保留7天 logger.add( log_path, rotation00:00, # 每天午夜轮转 retention7 days, # 保留7天 encodingutf-8, format{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}, levelINFO ) # 添加错误日志单独存储 logger.add( monitoring/logs/error.log, rotation00:00, retention30 days, encodingutf-8, format{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}, levelERROR ) return logger # 初始化日志 nlu_logger setup_logger() def log_request(request_id, text, labels, result, processing_time): 记录请求日志 log_data { request_id: request_id, text: text, labels: labels, result: result, processing_time: processing_time, timestamp: time.time() } nlu_logger.info(fNLU_REQUEST|{json.dumps(log_data, ensure_asciiFalse)}) def log_error(request_id, error_type, error_message, textNone): 记录错误日志 error_data { request_id: request_id, error_type: error_type, error_message: error_message, text: text, timestamp: time.time() } nlu_logger.error(fNLU_ERROR|{json.dumps(error_data, ensure_asciiFalse)})4. 集成Prometheus监控指标Prometheus是流行的监控系统我们需要在RexUniNLU中暴露各种监控指标。创建monitoring/prometheus_metrics.py文件from prometheus_client import Counter, Gauge, Histogram, generate_latest, REGISTRY import time # 定义监控指标 NLU_REQUESTS_TOTAL Counter( nlu_requests_total, Total NLU requests, [method, endpoint] ) NLU_REQUEST_DURATION Histogram( nlu_request_duration_seconds, NLU request duration in seconds, [method, endpoint] ) NLU_REQUEST_SIZE Gauge( nlu_request_size_bytes, Size of NLU request in bytes ) NLU_RESPONSE_SIZE Gauge( nlu_response_size_bytes, Size of NLU response in bytes ) NLU_SUCCESS_RATE Gauge( nlu_success_rate, NLU request success rate ) NLU_MODEL_LOAD_TIME Gauge( nlu_model_load_time_seconds, Time taken to load NLU model ) # 请求计时装饰器 def track_request_time(method, endpoint): def decorator(func): def wrapper(*args, **kwargs): start_time time.time() try: result func(*args, **kwargs) duration time.time() - start_time NLU_REQUEST_DURATION.labels(methodmethod, endpointendpoint).observe(duration) NLU_REQUESTS_TOTAL.labels(methodmethod, endpointendpoint).inc() return result except Exception as e: duration time.time() - start_time NLU_REQUEST_DURATION.labels(methodmethod, endpointendpoint).observe(duration) raise e return wrapper return decorator5. 改造RexUniNLU服务端现在我们需要修改原来的server.py集成日志和监控功能。创建新的server_with_monitoring.py文件from fastapi import FastAPI, Request, HTTPException from fastapi.responses import JSONResponse import uvicorn import time import json import uuid from typing import Dict, List # 导入监控组件 from monitoring.logger_setup import log_request, log_error, nlu_logger from monitoring.prometheus_metrics import ( track_request_time, NLU_REQUESTS_TOTAL, NLU_REQUEST_SIZE, NLU_RESPONSE_SIZE, NLU_SUCCESS_RATE ) # 导入原有的RexUniNLU功能 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks app FastAPI(titleRexUniNLU with Monitoring) # 全局变量用于存储模型和统计信息 nlu_pipeline None request_stats {total: 0, success: 0} app.on_event(startup) async def startup_event(): 服务启动时加载模型 global nlu_pipeline try: nlu_logger.info(开始加载RexUniNLU模型...) start_time time.time() nlu_pipeline pipeline( taskTasks.siamese_uie, modeldamo/nlp_siamese-uie_chinese-base ) load_time time.time() - start_time nlu_logger.info(f模型加载完成耗时: {load_time:.2f}秒) except Exception as e: nlu_logger.error(f模型加载失败: {str(e)}) raise e app.middleware(http) async def monitor_requests(request: Request, call_next): 监控中间件 request_id str(uuid.uuid4()) start_time time.time() # 记录请求信息 body await request.body() NLU_REQUEST_SIZE.set(len(body)) try: response await call_next(request) processing_time time.time() - start_time # 记录响应信息 response_body b async for chunk in response.body_iterator: response_body chunk NLU_RESPONSE_SIZE.set(len(response_body)) # 更新成功率统计 request_stats[total] 1 request_stats[success] 1 success_rate request_stats[success] / request_stats[total] NLU_SUCCESS_RATE.set(success_rate) return Response(contentresponse_body, status_coderesponse.status_code, headersdict(response.headers)) except Exception as e: processing_time time.time() - start_time log_error(request_id, middleware_error, str(e)) raise HTTPException(status_code500, detail内部服务器错误) app.post(/nlu) track_request_time(POST, /nlu) async def nlu_endpoint(request: Request): NLU处理端点 request_id str(uuid.uuid4()) try: data await request.json() text data.get(text, ) labels data.get(labels, []) if not text or not labels: raise HTTPException(status_code400, detail缺少text或labels参数) start_time time.time() # 调用NLU处理 result nlu_pipeline(inputtext, schemalabels) processing_time time.time() - start_time # 记录日志 log_request(request_id, text, labels, result, processing_time) return { request_id: request_id, result: result, processing_time: processing_time, status: success } except Exception as e: log_error(request_id, nlu_processing_error, str(e), text) raise HTTPException(status_code500, detailf处理失败: {str(e)}) app.get(/metrics) async def metrics(): Prometheus指标端点 from monitoring.prometheus_metrics import generate_latest return Response(generate_latest(), media_typetext/plain) app.get(/health) async def health_check(): 健康检查端点 return { status: healthy, model_loaded: nlu_pipeline is not None, request_stats: request_stats } if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)6. 配置Prometheus监控创建Prometheus配置文件monitoring/config/prometheus.ymlglobal: scrape_interval: 15s # 每15秒采集一次数据 evaluation_interval: 15s scrape_configs: - job_name: rexuninlu static_configs: - targets: [localhost:8000] # NLU服务地址 metrics_path: /metrics scrape_interval: 10s - job_name: prometheus static_configs: - targets: [localhost:9090]启动Prometheus# 使用Docker启动 docker run -d \ -p 9090:9090 \ -v $(pwd)/monitoring/config/prometheus.yml:/etc/prometheus/prometheus.yml \ --name prometheus \ prom/prometheus # 或者使用本地安装的Prometheus ./prometheus --config.filemonitoring/config/prometheus.yml7. 使用Grafana创建监控大盘安装Grafana# Docker方式 docker run -d -p 3000:3000 --name grafana grafana/grafana # 或者本地安装 # 参考: https://grafana.com/docs/grafana/latest/installation/配置Grafana数据源访问 http://localhost:3000默认账号/密码admin/admin添加Prometheus数据源http://localhost:9090导入NLU监控仪表盘创建monitoring/config/grafana-dashboard.json{ title: RexUniNLU性能监控, panels: [ { title: 请求吞吐量, type: graph, targets: [{ expr: rate(nlu_requests_total[1m]), legendFormat: 请求速率 }] }, { title: 响应时间分布, type: graph, targets: [{ expr: histogram_quantile(0.95, rate(nlu_request_duration_seconds_bucket[5m])), legendFormat: P95响应时间 }] }, { title: 成功率, type: stat, targets: [{ expr: nlu_success_rate * 100, legendFormat: 成功率 }] } ] }8. 实际运行与测试启动增强版的NLU服务python server_with_monitoring.py测试服务是否正常# 测试健康检查 curl http://localhost:8000/health # 测试NLU功能 curl -X POST http://localhost:8000/nlu \ -H Content-Type: application/json \ -d { text: 帮我定一张明天去上海的机票, labels: [出发地, 目的地, 时间, 订票意图] } # 查看监控指标 curl http://localhost:8000/metrics9. 监控效果验证访问各个监控界面检查是否正常工作Prometheus: http://localhost:9090Grafana: http://localhost:3000查看日志文件:monitoring/logs/nlu_service.log你应该能看到Prometheus中能够采集到NLU服务的各项指标Grafana中能够看到请求量、响应时间、成功率等图表日志文件中记录了详细的请求和处理信息10. 总结通过本教程我们为RexUniNLU搭建了完整的监控体系核心收获学会了如何使用loguru进行结构化日志记录掌握了Prometheus监控指标的集成方法了解了如何通过Grafana可视化监控数据构建了从日志埋点到监控大盘的完整链路实际价值实时掌握服务运行状态快速发现性能瓶颈出现问题时能够快速定位和排查基于数据做容量规划和服务优化提升服务可靠性和用户体验下一步建议添加告警规则当成功率下降或响应时间变长时自动通知集成更多维度的监控指标如内存使用、GPU利用率等建立日志分析系统对识别结果进行质量分析设置自动化测试定期验证服务健康状态现在你的RexUniNLU服务已经从不透明的黑盒变成了完全可观测的白盒能够更好地服务于生产环境。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

RexUniNLU保姆级教程:日志埋点+Prometheus监控+NLU服务性能大盘搭建

RexUniNLU保姆级教程:日志埋点Prometheus监控NLU服务性能大盘搭建 1. 为什么需要监控NLU服务? 当你把RexUniNLU部署到生产环境后,会发现几个现实问题:用户说服务响应时快时慢,但不知道具体慢在哪里;出现识…...

DotNetPy:现代.NET 与 Python 互操作 实战指南概

我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...

AcousticSense AI算力优化:批处理+FP16混合精度使吞吐量提升3.2倍

AcousticSense AI算力优化:批处理FP16混合精度使吞吐量提升3.2倍 1. 引言:当音乐分析遇上性能瓶颈 想象一下,你正在搭建一个音乐流派的智能分析平台。用户上传一首歌,系统需要快速、准确地告诉你这首歌是摇滚、爵士还是电子乐。…...

GlosSI技术解析:解锁Windows全场景Steam控制器兼容方案

GlosSI技术解析:解锁Windows全场景Steam控制器兼容方案 【免费下载链接】GlosSI Tool for using Steam-Input controller rebinding at a system level alongside a global overlay 项目地址: https://gitcode.com/gh_mirrors/gl/GlosSI GlosSI(G…...

RexUniNLU中文NLU实战:从新闻中一键抽取人名地名机构名

RexUniNLU中文NLU实战:从新闻中一键抽取人名地名机构名 1. 为什么选择RexUniNLU进行信息抽取 1.1 零样本学习的革命性突破 传统的信息抽取系统通常需要大量标注数据来训练模型。以一个典型的人名识别任务为例,你可能需要准备至少5000条标注样本才能达…...

PVE-CT容器部署Ubuntu轻量级桌面环境全攻略

1. PVE-CT容器与Ubuntu轻量桌面环境简介 如果你正在寻找一种在Proxmox VE(PVE)环境下快速部署轻量级Linux桌面的方法,那么使用LXC容器搭配Ubuntu系统绝对是值得考虑的选择。我最近在项目中尝试了这种方案,实测下来不仅资源占用低&…...

Qwen-Image-2512-SDNQ Web服务部署教程:CSDN GPU实例SSH连接与日志实时查看

Qwen-Image-2512-SDNQ Web服务部署教程:CSDN GPU实例SSH连接与日志实时查看 1. 项目概述 Qwen-Image-2512-SDNQ-uint4-svd-r32是一个基于先进AI技术的图片生成服务,通过简单的Web界面就能将文字描述转化为高质量的图像。这个服务特别适合需要快速生成视…...

小白友好:Qwen3-0.6B-FP8部署全流程,Chainlit让交互可视化

小白友好:Qwen3-0.6B-FP8部署全流程,Chainlit让交互可视化 1. 认识Qwen3-0.6B-FP8模型 Qwen3-0.6B-FP8是阿里巴巴通义千问系列中的轻量级语言模型,特别适合在资源有限的设备上快速部署和运行。这个版本采用了FP8(8位浮点数&…...

抖音评论采集工具:3步快速获取完整评论数据的终极指南

抖音评论采集工具:3步快速获取完整评论数据的终极指南 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 想要深入分析抖音热门视频的用户反馈?希望了解竞品账号的互动情况?…...

Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制

Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreation…...

AIVideo从入门到精通:掌握全流程自动化视频生产的秘诀

AIVideo从入门到精通:掌握全流程自动化视频生产的秘诀 1. 为什么你需要一个AI视频创作平台 想象一下这样的场景:周一早上,老板突然要求你在下午三点前制作一个产品介绍视频。传统流程可能需要你:写脚本→找素材→录音→剪辑→调…...

all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性

all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性 1. 模型架构与设计理念 all-MiniLM-L6-v2是一个令人印象深刻的轻量级句子嵌入模型,它基于BERT架构但进行了精心的优化设计。这个模型的核心目标是在保持高质量语义表示能力的同时…...

FigmaCN:3分钟让Figma界面说中文的终极解决方案

FigmaCN:3分钟让Figma界面说中文的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾因Figma的全英文界面而困扰?是否在紧张的设计工作中频繁…...

抖音评论采集工具:3分钟获取完整互动数据的智能解决方案

抖音评论采集工具:3分钟获取完整互动数据的智能解决方案 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper TikTokCommentScraper 是一款专为抖音/ TikTok 设计的评论数据采集工具,通过…...

宝可梦游戏终极随机化器:Universal Pokemon Randomizer ZX完全指南

宝可梦游戏终极随机化器:Universal Pokemon Randomizer ZX完全指南 【免费下载链接】universal-pokemon-randomizer-zx Public repository of source code for the Universal Pokemon Randomizer ZX 项目地址: https://gitcode.com/gh_mirrors/un/universal-pokem…...

告别Cartographer重定位慢:3个优化技巧与子图筛选源码解析

Cartographer重定位性能优化实战:从源码解析到参数调优全指南 在机器人定位与建图领域,Cartographer凭借其出色的SLAM算法表现成为工业界和学术界的宠儿。但当场景切换到重定位场景时,许多开发者都会遇到一个共同的痛点——匹配速度慢得令人抓…...

如何彻底解决Windows驱动残留问题:显卡驱动清理的终极指南

如何彻底解决Windows驱动残留问题:显卡驱动清理的终极指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstal…...

从音频到体重秤:聊聊那些‘看不见’的Delta-Sigma ADC在你身边的真实应用

从音频到体重秤:Delta-Sigma ADC如何重塑日常测量的精度边界 当你用蓝牙耳机聆听192kHz高解析音频时,或在智能体脂秤上看到小数点后两位的体重变化时,可能不会想到这些体验背后都藏着一项诞生于1980年代的革命性技术——Delta-Sigma ADC&…...

基于VC++的OBD2蓝牙诊断仪开发实战指南

1. 开发环境搭建与硬件准备 搞OBD2蓝牙诊断仪开发,首先得把家伙事儿备齐。我当年第一次折腾这个的时候,光找兼容的蓝牙模块就花了三天,这里把踩过的坑都给你总结好了。 开发主机建议用Windows 10/11系统,Visual Studio 2019或2022…...

Meixiong Niannian画图引擎MobaXterm集成:远程开发环境配置

Meixiong Niannian画图引擎MobaXterm集成:远程开发环境配置 1. 引言 远程开发已经成为现代开发者的标配,特别是对于需要高性能GPU支持的AI画图应用。Meixiong Niannian画图引擎作为一个强大的AI图像生成工具,通常部署在远程服务器上&#x…...

WeMod Pro功能解锁终极指南:本地增强工具Wand-Enhancer完全解析

WeMod Pro功能解锁终极指南:本地增强工具Wand-Enhancer完全解析 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否厌倦了游戏辅助工具We…...

从汽车ECU通信看CAN协议:位填充与错误帧如何保障行车安全与网络稳定

从汽车ECU通信看CAN协议:位填充与错误帧如何保障行车安全与网络稳定 现代汽车电子系统正变得越来越复杂,一辆普通家用轿车可能包含超过100个电子控制单元(ECU),这些ECU通过控制器局域网(CAN)总线…...

如何一键获取Steam游戏清单?5分钟掌握Onekey工具的完整指南

如何一键获取Steam游戏清单?5分钟掌握Onekey工具的完整指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为获取Steam游戏文件清单而烦恼吗?传统方法需要复杂的API…...

MAA明日方舟小助手:如何用开源自动化工具解放你的游戏日常

MAA明日方舟小助手:如何用开源自动化工具解放你的游戏日常 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https:/…...

Verilator 5.008 + GTKWave 搭建指南:从安装到流水灯实战(附避坑清单)

Verilator 5.008 GTKWave 全流程实战指南:从环境搭建到流水灯仿真 在数字电路设计领域,仿真工具链的搭建往往是初学者面临的第一道门槛。Verilator作为当前最高效的开源Verilog仿真器之一,配合GTKWave波形查看工具,能够构建完整的…...

高效解密网易云音乐NCM格式的专业解决方案

高效解密网易云音乐NCM格式的专业解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐版权保护的背景下,网易云音乐采用的NCM加密格式为用户带来了跨平台播放的挑战。这种专有格式虽然有效保护了音乐版权&…...

网络安全学习第165天

前言: 就是勒索病毒的防治,因为这是2023年的课程,不知道现在有没有最新的方法,可以解密这个工具,问了ai,说没有解密提高 正题: 没有办法可以解密,因为很难解密,只能做好…...

HY-MT1.5-7B翻译模型效果展示:33种语言互译,实测效果惊艳

HY-MT1.5-7B翻译模型效果展示:33种语言互译,实测效果惊艳 1. 模型核心能力概览 1.1 多语言翻译新标杆 HY-MT1.5-7B是腾讯混元团队推出的新一代翻译大模型,支持33种主流语言之间的高质量互译,并特别优化了5种民族语言及方言变体…...

5分钟掌握跨平台输入法词库转换:告别设备更换的输入烦恼

5分钟掌握跨平台输入法词库转换:告别设备更换的输入烦恼 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾因更换电脑或手机而烦恼输入法词库无法同…...

MetaTube插件:Jellyfin/Emby高性能媒体元数据解决方案深度解析

MetaTube插件:Jellyfin/Emby高性能媒体元数据解决方案深度解析 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube MetaTube是一款专为Jellyfin和Emby媒体…...