PAI-Rec 引擎支持通过 Prometheus 来采集指标数据,本文说明如何开启这个功能、指标说明,以及如何增加自定义指标。
背景
推荐链路包含诸多环节,除了引擎整体的运行情况,通常还需要更细致的数据来观测各个环节。
PAI-Rec 引擎支持通过 Prometheus 来采集指标数据,可以实现以下几点目标:
增强系统可见性:通过收集和分析多维度的指标数据,帮助开发和运维团队更清晰地了解系统的运行状况和性能瓶颈。
快速故障排查:可观测性使团队能够快速识别和定位系统中的问题来源,缩短故障解决时间,从而提高系统的可靠性和可用性。
提高响应效率:通过实时监控和预警机制,团队可以在问题影响到用户之前采取措施,从而减少因系统故障导致的损失。
开启指标采集
指标采集功能通过在引擎配置单中增加对应配置来开启,配置示例如下:
{
"PrometheusConfig": {
"Enable": true,
"PushGatewayURL": "https://your_pushgateway_url",
"PushIntervalSecs": 15
}
}
配置说明:
字段 | 类型 | 是否必填 | 描述 |
Enable | bool | 是 | 是否开启指标收集,默认不开启 |
PushGatewayURL | string | 否 | Prometheus 的 Push Gateway 地址, 配置后推送指标数据到这个地址 |
PushIntervalSecs | int | 否 | 指标推送间隔,单位为秒,需要推送指标时必须设置一个大于0的值 |
修改配置后请重启引擎,使配置生效
两种采集方式
PAI-Rec 引擎支持两种指标采集方式,一种是通过暴露指标接口,Prometheus 主动采集,这是默认开启的。
目前引擎暴露了两个接口,分别对应内置指标和自定义指标:
内置指标:http://${your_service_host}/metrics
自定义指标:http://${your_service_host}/custom_metrics
如果在引擎配置中还设置了 PushGatewayURL 和 PushIntervalSecs,那么 Prometheus 可以通过 Push Gateway 被动地采集数据。这种方式需要先获取 Prometheus 的 Push Gateway 地址。
观测指标
以下用接入阿里云 应用实时监控服务 ARMS 作为例子,说明如何观测指标。
资源准备
开通 ARMS 服务。https://www.aliyun.com/product/arms
创建一个通用型 Prometheus 实例,并且绑定一个非共享 Grafana 工作区。
管控台侧边栏 Prometheus 实例 -> 实例列表 -> 新建 Prometheus 实例
接入步骤
在 ARMS 管控台上获取 Prometheus 实例的 Push Gateway 地址。
PAI-Rec 引擎开启指标收集,并且配置 Prometheus 实例的 Push Gateway 地址。
访问 Grafana 公网(或私网)地址并登录。
点击侧边栏 仪表板(dashboard),然后点击右上角新建按钮,选择导入。
上传配置json文件。下载链接:PAI-Rec Grafana 面板配置 JSON
设置 datasoure,选择对应的 Prometheus 实例,点击导入。
完成上面的步骤就可以看到指标面板了。除了已经配置好的指标面板,也可以参考下文指标说明,自行添加面板进行观测。
指标面板
系统概览
接口请求量展示接口每秒请求数,即QPS,并按状态码,接口uri两个维度展示
接口响应时间展示接口 T99, T95, T90 响应时间,反映接口响应速度
内存占用反映了 PAI-Rec 引擎实例占用的内存随时间的变化,每个实例对应一条曲线
GO 协程反映了 PAI-Rec 引擎实例协程数量随时间的变化,每个实例对应一条曲线
推荐数量不足错误展示 引擎无法返回足够的推荐条目的错误数量
召回指标
召回数量占比反映各个召回通道获取的推荐条目在总的推荐条目中的占比
目前只展示采集指标最近一次推荐的数据,如果某个召回没有召回任何条目,会保留之前一次的数据,可能导致召回占比总和大于1
召回耗时反映召回速度快慢,和接口请求响应时间一样,分别展示了 T99, T95, T90 数据
过滤指标
过滤耗时反映过滤速度快慢,和接口请求响应时间一样,分别展示了 T99, T95, T90 数据
粗排指标
粗排耗时反映粗排速度快慢,和接口请求响应时间一样,分别展示了 T99, T95, T90 数据
精排指标
精排耗时反映精排速度快慢,和接口请求响应时间一样,分别展示了 T99, T95, T90 数据
重排指标
重排耗时反映重排速度快慢,和接口请求响应时间一样,分别展示了 T99, T95, T90 数据
内置指标说明
指标名 | 类型 | 含义 | 维度标签 |
pairec_rec_total | Counter | 推荐总次数 | scene(场景) |
pairec_size_not_enough_total | Counter | 推荐条目不足总次数 | scene(场景) |
pairec_recall_items_percentage | Gauge | 各召回源条目占比 | recall_name(召回名) |
pairec_rec_duration_seconds | Histogram | 推荐整体流程耗时分布 | scene(场景) |
pairec_recall_duration_seconds | Histogram | 召回耗时分布 | scene(场景) |
pairec_filter_duration_seconds | Histogram | 过滤耗时分布 | scene(场景) |
pairec_general_rank_duration_seconds | Histogram | 粗排耗时分布 | scene(场景) |
pairec_load_feature_duration_seconds | Histogram | 特征加载耗时分布 | scene(场景) |
pairec_rank_duration_seconds | Histogram | 精排耗时分布 | scene(场景) |
pairec_sort_duration_seconds | Histogram | 重排耗时分布 | scene(场景) |
pairec_requests_total | Counter | http 请求总次数 | code,method,host,url |
pairec_request_duration_seconds | Histogram | http 请求处理时间分布 | code,method,host,url |
pairec_request_size_bytes | Histogram | http 请求体大小 | code,method,host,url |
pairec_response_size_bytes | Histogram | http 响应体大小 | code,method,host,url |
以上类型为 Histogram 的指标会反映当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)和分布区间(以_bucket作为后缀)。
除了这些指标,PAI-Rec 也采集了 Go 进程本身的指标数据。
指标数据还会带有 instance 和 job 信息,instance 表示来自哪个实例,job 表示来自哪个环境(生产环境为 product, 预发环境为 prepub)
自定义指标
如果需要获取和推送自定义指标,那么需要在 pairec 引擎代码中注册自定义指标,示例代码如下:
package main
import (
"log"
"time"
"github.com/alibaba/pairec/v2"
"github.com/alibaba/pairec/v2/service/metrics"
"github.com/prometheus/client_golang/prometheus"
)
func main() {
// 定义指标
m := prometheus.NewCounter(prometheus.CounterOpts{
Name: "abc",
})
// 在 pairec 中注册指标
err := metrics.CustomRegister.Register(m)
if err != nil {
log.Fatalln(err)
}
go func() {
for {
time.Sleep(time.Second * 5)
m.Inc() // 采集指标数据
}
}()
// ...
pairec.Run()
}
在 CustomRegister 注册自定义指标后,就能从 /custom_metrics 接口获取到自定义指标的数据了。
如果开启了推送配置,自定义指标数据也会被推送到 prometheus gateway。
示例代码中简单起见只是开启了一个协程定时设置指标数据,实际情况中可以在接口 controller 逻辑中或任意其他位置设置指标数据。