ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Prometheus Exporter 与 Grafana 构建 SRS 实时媒体服务器的可观测性监控

使用 Prometheus Exporter 与 Grafana 构建 SRS 实时媒体服务器的可观测性监控 使用 Prometheus Exporter 与 Grafana 构建 SRS 实时媒体服务器的可观测性监控【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srsSRS 官方文档将可观测性定义为三件套指标Prometheus Exporter、链路追踪APM与日志Cloud Logging其中 Exporter 是最容易上手、也是最常用的监控入口。本文以 SRS 仓库内 exporter 文档为骨架结合源码逐层讲解 Exporter 的配置、指标清单与底层实现并给出从推流到 Prometheus 采集、再到 Grafana 可视化的完整落地步骤读完后你可以在自己的 SRS 集群上直接复刻出一套实时监控大盘。SRS 可观测性体系与 Exporter 架构SRS 的可观测性分为三个维度指标Metrics、链路追踪Tracing和日志Logging。其中 Exporter 承担指标维度它通过 HTTP 暴露 Prometheus 文本格式的指标端点由 Prometheus 定时抓取scrape再由 Grafana 负责渲染与告警。整体数据链路如下----- ----------- --------- | SRS --Exporter----| Promethus ---- Grafana ----- (HTTP) ----------- ---------即SRS 进程内嵌 Exporter通过 HTTP 对外暴露/metrics端点默认端口9972Prometheus 按设定的scrape_interval周期拉取指标Grafana 以 Prometheus 为数据源绘制图表。这套架构把服务自身运行状态与主机节点状态统一纳管便于在集群规模下做横向对比。指标、链路追踪、日志三者的分工可以参考业界通行的 observability primer指标回答系统现在是否健康追踪回答一次请求经历了什么日志回答发生了什么细节。本文聚焦指标链路。Exporter 配置详解Exporter 由独立的exporter {}配置块控制完整示例见 prometheus.conf 与 full.conf# Prometheus exporter config. # See https://prometheus.io/docs/instrumenting/exporters exporter { # Whether exporter is enabled. # Overwrite by env SRS_EXPORTER_ENABLED # Default: off enabled off; # The http api listen port for exporter metrics. # Overwrite by env SRS_EXPORTER_LISTEN # Default: 9972 # See https://github.com/prometheus/prometheus/wiki/Default-port-allocations listen 9972; # The logging label to category the cluster servers. # Overwrite by env SRS_EXPORTER_LABEL label cn-beijing; # The logging tag to category the cluster servers. # Overwrite by env SRS_EXPORTER_TAG tag cn-edge; }各参数说明如下参数默认值环境变量覆盖含义enabledoffSRS_EXPORTER_ENABLED是否开启 Exporter关闭时访问/metrics会返回错误listen9972SRS_EXPORTER_LISTENExporter 的 HTTP 监听端口9972是 Prometheus 社区默认端口分配表中为 SRS 预留的端口label空SRS_EXPORTER_LABEL用于区分集群服务器的日志标签如cn-beijing地域tag空SRS_EXPORTER_TAG用于区分集群服务器的日志标签如cn-edge角色label与tag会以 label 的形式出现在srs_build_info指标中用于在多节点集群里区分哪个地域、哪个角色的服务器是集群级监控的基石。官方强烈建议使用环境变量来启用 Exporter这样无需维护配置文件即可在容器、编排平台中快速开关。仓库提供的 prometheus.conf 是一份开箱即用的演示配置其中exporter块已设置为enabled on; listen 9972;并同时开启了 RTMP、HTTP API、HTTP Server 与 RTC 等模块适合直接跑通全流程。源码剖析/metrics 指标端点的底层实现理解了配置再看源码能更清楚地知道每个配置项去了哪里、做了什么。配置解析四个 getter 与环境变量覆盖Exporter 配置的解析集中在 srs_app_config.cpp对应四个 getterget_exporter_enabled()读取exporter.enabled默认false可通过环境变量SRS_EXPORTER_ENABLED覆盖源码中SRS_OVERWRITE_BY_ENV_BOOL(srs.exporter.enabled)get_exporter_listen()读取exporter.listen默认9972可被SRS_EXPORTER_LISTEN覆盖get_exporter_label()/get_exporter_tag()默认空字符串可被SRS_EXPORTER_LABEL/SRS_EXPORTER_TAG覆盖。这也是文档中推荐使用环境变量建议的源码依据每个配置项都有对应的SRS_EXPORTER_*环境变量通道。独立监听器与路由挂载Exporter 并非挂在 HTTP API默认 1985 端口上而是独立的 TCP 监听器。在 srs_app_server.cpp 中当get_exporter_enabled()为真时会以get_exporter_listen()为端口创建SrsTcpListener标签Exporter-Server并开始监听if (config_-get_exporter_enabled()) { exporter_listener_-set_endpoint(config_-get_exporter_listen()); exporter_listener_-set_label(Exporter-Server); if ((err exporter_listener_-listen()) ! srs_success) { return srs_error_wrap(err, exporter server listen); } }随后在 srs_app_server.cpp 中将处理类SrsGoApiMetrics挂载到 HTTP 路由/metrics// metrics by prometheus SrsGoApiMetrics *metrics new SrsGoApiMetrics(); metrics-assemble(); if ((err http_api_mux_-handle(/metrics, metrics)) ! srs_success) { return srs_error_wrap(err, handle tests errors); }而在连接接受逻辑中srs_app_server.cppexporter_listener_上收到的连接会复用http_api_mux_这个 HTTP 复用器因此访问http://srs-host:9972/metrics即命中SrsGoApiMetrics::serve_http。源码注释也指出目前 Exporter 端口暂不支持 HTTPSTODO: FIXME: Maybe should support https metrics.生产环境如需加密建议前置反向代理。当enabled off时访问/metrics会返回错误码ERROR_EXPORTER_DISABLED值为1090见 srs_kernel_error.hpp 中定义的Prometheus exporter is disabled。指标清单serve_http 输出什么SrsGoApiMetrics定义在 srs_app_http_api.hpp核心实现在 srs_app_http_api.cpp。其serve_http依次输出以下 Prometheus 文本格式指标指标名类型含义srs_node_uname_infogauge主机系统信息unamesysname、nodename、release、version、machine仅在 Linux/macOS 下输出srs_build_infogaugeSRS 构建信息含 server/service id、pid、构建日期、主版本、版本号并携带label、tag标签srs_cpu_percentgaugeSRS 进程 CPU 使用百分比srs_memorygaugeSRS 进程内存使用量MBsrs_send_bytes_totalcounterSRS 累计发送字节数srs_receive_bytes_totalcounterSRS 累计接收字节数srs_streamsgauge当前并发流数量srs_clientsgauge当前在线客户端数量srs_clients_totalcounter客户端累计连接数srs_clients_errs_totalcounter客户端累计错误数其中srs_build_info中携带的label/tag正是来自配置块中的exporter.label与exporter.tag见 srs_app_http_api.cpp 中if (!label_.empty()) ... if (!tag_.empty())的条件输出逻辑这就是集群分类监控的实现位置。业务计数指标发送/接收字节、流数、客户端数则来自全局统计单例SrsStatistic::dumps_metricssrs_app_statistic.cpp它从 KBPS 采样器与流/客户端表中取数send_bytes kbps_-get_send_bytes(); recv_bytes kbps_-get_recv_bytes(); nstreams streams_.size(); nclients clients_.size(); total_nclients nb_clients_; nerrs nb_errs_;单测 srs_utest_ai16.cpp 中的SrsGoApiMetricsTest.ServeHttpSuccess会校验响应的 Prometheus 格式包括# HELP srs_build_info、srs_cpu_percent、srs_memory、srs_send_bytes_total等指标是否按预期输出可作为理解指标语义的参考。另外srs_app_latest_version.cpp 在向官方版本服务上报运行特征时也会通过get_exporter_enabled()附带prom功能标记说明 Exporter 是 SRS 官方认可的受支持能力。实战一构建并启动 SRS Exporter下面从零开始跑通推流 → 采集 → 查询全链路。1. 编译并启动 SRS5.0.86在仓库trunk目录下编译并启动./configure make env SRS_ENV_ONLYon SRS_EXPORTER_ENABLEDon SRS_LISTEN1935 \ ./objs/srs -e./configure make完成默认特性的编译SRS_ENV_ONLYon仅使用环境变量配置 SRS不加载配置文件SRS_EXPORTER_ENABLEDon开启 Exporter等价于配置块exporter { enabled on; }SRS_LISTEN1935RTMP 监听端口./objs/srs -e以环境变量模式启动。启动后打开http://localhost:9972/metrics即可看到上述全部指标。也可以改用配置文件conf/prometheus.conf启动演示对应仓库内 prometheus.conf其中exporter { enabled on; listen 9972; }已就绪。2. 用 FFmpeg 推一路直播流使用官方编码器镜像推流验证接收字节指标随流增长docker run --rm -it ossrs/srs:encoder ffmpeg -re -i doc/source.flv -c copy \ -f flv rtmp://host.docker.internal/live/livestream3. 启动 node_exporter 采集主机指标Exporter 只反映 SRS 进程自身主机层指标CPU、内存、磁盘、网络需要 node_exporterdocker run --rm -p 9100:9100 prom/node-exporter打开http://localhost:9100/metrics即可验证。生产环境强烈建议从其官方 Release 下载二进制直接运行而不是在每台主机上常驻 Docker 容器。4. 编写 prometheus.yml 并启动 Prometheus创建prometheus.yml同时配置 node 与 srs 两个抓取任务scrape_configs: - job_name: node metrics_path: /metrics scrape_interval: 5s static_configs: - targets: [host.docker.internal:9100] - job_name: srs metrics_path: /metrics scrape_interval: 5s static_configs: - targets: [host.docker.internal:9972]注意这里将scrape_interval设为5s而 Prometheus 的默认值是1m一分钟。对直播场景而言默认值粒度过粗建议按监控精度需求显式调小。启动 Prometheusdocker run --rm -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ -p 9090:9090 prom/prometheus5. 用 PromQL 查询输入码率打开http://localhost:9090/targets查看两个抓取目标是否 UP然后在http://localhost:9090/graph中执行查询rate(srs_receive_bytes_total[10s])*8该查询计算 SRS 最近 10 秒接收字节的变化率并乘以 8即得到输入码率bit/s。推流过程中曲线应随码率波动直观验证Exporter → Prometheus链路已经打通。若要监控输出码率将指标替换为srs_send_bytes_total即可。实战二接入 Grafana 可视化大盘Prometheus 适合查询与告警日常观察与汇报更常用 Grafana。1. 启动 Grafanadocker run --rm -it -p 3000:3000 \ -e GF_SECURITY_ADMIN_USERadmin \ -e GF_SECURITY_ADMIN_PASSWORD12345678 \ -e GF_USERS_DEFAULT_THEMElight \ grafana/grafana浏览器打开http://localhost:3000/使用admin/12345678登录。2. 通过 API 添加 Prometheus 数据源curl -s -H Content-Type: application/json \ -XPOST http://admin:12345678localhost:3000/api/datasources \ -d { name: prometheus, type: prometheus, access: proxy, isDefault: true, url: http://host.docker.internal:9090 }其中access: proxy表示由 Grafana 服务端代理转发查询isDefault: true使其成为默认数据源url指向 Prometheus 的 9090 端口。3. 导入 HelloWorld 仪表盘data$(curl https://raw.githubusercontent.com/ossrs/srs-grafana/main/dashboards/helloworld-import.json 2/dev/null) curl -s -H Content-Type: application/json \ -XPOST http://admin:12345678localhost:3000/api/dashboards/db \ --data-binary {\dashboard\:${data},\overwrite\:true,\inputs\:[],\folderId\:0}第一条命令从 srs-grafana 仓库拉取 HelloWorld 仪表盘 JSON第二条命令通过 Grafana Dashboard API 导入。之后打开http://localhost:3000/dashboards即可看到导入的仪表盘。官方还提供了更多仪表盘包含 SRS 各指标的面板组合存放在 srs-grafana 仓库的dashboards目录下可按需导入。任何改进都欢迎提交补丁SRS 社区持续维护这套可观测性资产。生产环境实践建议集群分类为每个 SRS 节点设置不同的label地域与tag角色如cn-edge、cn-origin配合srs_build_info{label..., tag...}即可在 Grafana 中按节点维度拆分监控方便定位哪台边缘节点异常。抓取间隔直播业务指标变化快建议scrape_interval设为 5s15s若集群节点多、指标量大可适当放宽以降低 Prometheus 压力。端口规划9972是社区默认端口分配表中 SRS 预留端口若与既有端口冲突通过SRS_EXPORTER_LISTEN或exporter { listen ...; }调整并同步修改 Prometheus 的targets。安全边界Exporter 端口当前不支持 HTTPS且/metrics无需鉴权即可访问生产环境建议将 9972 端口收敛在内网/监控网段或在前置网关做访问控制。从源码验证本文涉及的指标输出逻辑srs_app_http_api.cpp、配置解析srs_app_config.cpp与统计取数srs_app_statistic.cpp均可直接在仓库中对照阅读单测 srs_utest_ai16.cpp 则给出了指标响应的格式基线。参考文件索引exporter 官方文档本文骨架来源prometheus.conf开箱即用的 Exporter 演示配置full.conf完整配置参考中的 exporter 段srs_app_config.cppExporter 四个配置项的解析与环境变量覆盖srs_app_server.cppExporter 独立监听器的创建与启停srs_app_http_api.cpp/metrics端点与全部指标的输出实现srs_app_http_api.hppSrsGoApiMetrics处理类声明srs_app_statistic.cpp全局统计指标取数实现srs_kernel_error.hppERROR_EXPORTER_DISABLED错误码定义srs_utest_ai16.cpp/metrics响应格式的单元测试。【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表