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 实例,点击导入。
完成上面的步骤就可以看到指标面板了。除了已经配置好的指标面板,也可以参考下文指标说明,自行添加面板进行观测。
内置指标说明
指标名 | 类型 | 含义 | 维度标签 |
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 逻辑中或任意其他位置设置指标数据。