首页
/ LitServe项目中Prometheus监控集成的最佳实践

LitServe项目中Prometheus监控集成的最佳实践

2025-06-26 18:28:06作者:侯霆垣

概述

在LitServe项目中实现有效的性能监控是确保服务稳定运行的关键环节。本文将详细介绍如何在LitServe框架中正确集成Prometheus监控系统,解决常见的多进程指标收集问题,并提供完整的实现方案。

多进程环境下的Prometheus集成挑战

LitServe作为高性能服务框架,默认采用多进程架构来处理请求。这种架构给Prometheus监控带来了特殊挑战:

  1. 指标收集问题:传统单进程Prometheus客户端无法跨进程收集指标
  2. 序列化警告:直接使用Prometheus客户端会收到不可序列化警告
  3. 中间件兼容性:需要确保HTTP监控中间件与多进程架构协同工作

完整解决方案实现

1. 配置多进程指标收集

首先需要设置Prometheus的多进程模式环境变量,并创建专用的指标存储目录:

import os
from prometheus_client import CollectorRegistry, multiprocess

# 设置多进程指标存储目录
os.environ["PROMETHEUS_MULTIPROC_DIR"] = "/tmp/prometheus_multiproc_dir"

# 确保目录存在
if not os.path.exists("/tmp/prometheus_multiproc_dir"):
    os.makedirs("/tmp/prometheus_multiproc_dir")

# 创建多进程注册表
registry = CollectorRegistry()
multiprocess.MultiProcessCollector(registry)

2. 实现Prometheus日志记录器

创建自定义的PrometheusLogger类,继承自LitServe的Logger基类:

from prometheus_client import Histogram
import litserve as ls

class PrometheusLogger(ls.Logger):
    def __init__(self):
        super().__init__()
        # 使用多进程注册表创建直方图指标
        self.function_duration = Histogram(
            "request_processing_seconds",
            "Time spent processing request",
            ["function_name"],
            registry=registry
        )

    def process(self, key, value):
        # 记录方法执行时间
        self.function_duration.labels(function_name=key).observe(value)

3. 实现HTTP监控中间件

对于HTTP请求的监控,需要同样使用多进程注册表:

from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware

HTTP_REQUEST_LATENCY = Histogram(
    "http_server_requests_duration_seconds_total",
    "HTTP request latency in seconds",
    ["endpoint", "status_code", "method"],
    registry=registry
)

class HTTPLatencyMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        method = request.method
        endpoint = os.path.normpath(request.url.path)
        status_code = 200

        start_time = time.perf_counter()
        try:
            response = await call_next(request)
            status_code = response.status_code
            return response
        finally:
            duration = time.perf_counter() - start_time
            HTTP_REQUEST_LATENCY.labels(
                method=method, 
                endpoint=endpoint, 
                status_code=status_code
            ).observe(duration)

4. 服务启动配置

在启动LitServe服务时,需要正确配置日志记录器和中间件:

if __name__ == "__main__":
    prometheus_logger = PrometheusLogger()
    # 注意禁用压缩以避免指标数据被二次压缩
    prometheus_app = make_asgi_app(registry=registry, disable_compression=True)
    prometheus_logger.mount(path="/metrics", app=prometheus_app)
    
    server = ls.LitServer(
        YourLitAPI(),
        loggers=prometheus_logger,
        middlewares=[HTTPLatencyMiddleware]
    )
    server.run(port=8000)

关键注意事项

  1. 压缩问题:由于LitServe默认启用GZip中间件,必须为Prometheus ASGI应用设置disable_compression=True,避免指标数据被二次压缩导致监控系统无法解析。

  2. 序列化警告:可以安全忽略"Logger PrometheusLogger is not picklable"警告,LitServe会自动处理不可序列化对象的重建。

  3. 指标目录权限:确保Prometheus多进程目录对所有工作进程可写。

  4. 指标清理:服务重启前应清理旧的指标文件,避免残留数据影响监控准确性。

监控指标解读

成功集成后,可以在/metrics端点看到两类关键指标:

  1. HTTP请求指标

    • 请求延迟分布(直方图)
    • 按端点、状态码和方法分类的统计
  2. 业务方法指标

    • 自定义方法的执行时间
    • 可按方法名称标签过滤

总结

通过正确配置多进程注册表和注意压缩设置,可以在LitServe中实现完整的Prometheus监控方案。这种集成不仅提供了服务级别的性能监控,还能跟踪具体业务方法的执行效率,为性能优化提供数据支持。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
54
469
kernelkernel
deepin linux kernel
C
22
5
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
880
519
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.1 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
181
264
cjoycjoy
一个高性能、可扩展、轻量、省心的仓颉Web框架。Rest, 宏路由,Json, 中间件,参数绑定与校验,文件上传下载,MCP......
Cangjie
87
14
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.09 K
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
361
381
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
613
60