配置可观测监控Prometheus

PAI-Rec 引擎支持通过 Prometheus 来采集指标数据,本文说明如何开启这个功能、指标说明,以及如何增加自定义指标。

背景

推荐链路包含诸多环节,除了引擎整体的运行情况,通常还需要更细致的数据来观测各个环节。

PAI-Rec 引擎支持通过 Prometheus 来采集指标数据,可以实现以下几点目标:

  1. 增强系统可见性:通过收集和分析多维度的指标数据,帮助开发和运维团队更清晰地了解系统的运行状况和性能瓶颈。

  2. 快速故障排查:可观测性使团队能够快速识别和定位系统中的问题来源,缩短故障解决时间,从而提高系统的可靠性和可用性。

  3. 提高响应效率:通过实时监控和预警机制,团队可以在问题影响到用户之前采取措施,从而减少因系统故障导致的损失。

开启指标采集

指标采集功能通过在引擎配置单中增加对应配置来开启,配置示例如下:

{
  "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 实例

接入步骤

  1. 在 ARMS 管控台上获取 Prometheus 实例的 Push Gateway 地址。

  2. PAI-Rec 引擎开启指标收集,并且配置 Prometheus 实例的 Push Gateway 地址。

  3. 访问 Grafana 公网(或私网)地址并登录。

  4. 点击侧边栏 仪表板(dashboard),然后点击右上角新建按钮,选择导入。

  5. 上传配置json文件。下载链接:PAI-Rec Grafana 面板配置 JSON

  6. 设置 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 逻辑中或任意其他位置设置指标数据。