package
0.0.0-20241210072037-85388b86cfc1
Repository: https://github.com/wlbgo/utils.git
Documentation: pkg.go.dev

# README

diststat 基于 Redis 分布式统计,用于在分布式环境中高效地统计计数器数据。

相比于基于Prometheus指标统计,有不依赖于指标平台、数据量小、实时性强、可灵活获取数据的优势。

它提供了一个简单的接口来增加计数器,并定期将计数器数据刷新到 Redis 中。

使用并修改Python脚本,可以针对不同维度统计出CSV表格数据。再结合 企业微信机器人 等社交软件,可以方便灵活的提供给分析人员。

fetch_in_wecom.png

使用方法

使用 go get 命令安装 diststat

go get github.com/yourusername/diststat

初始化

首先,创建一个 StatHelper 实例并进行初始化:

package main

import (
	"github.com/go-redis/redis/v8"
	"github.com/yourusername/diststat"
	"time"
)

func main() {
	rds := redis.NewClient(&redis.Options{
		Addr: "localhost:6379",
	})

	statHelper := &diststat.StatHelper{
		Rds:           rds,
		StatKeyPrefix: "myapp:stats",
		Period:        1 * time.Minute,
		PeriodStart:   time.Now().Truncate(time.Hour),
		StateKeyTTL:   24 * time.Hour,
		FlushPeriod:   1 * time.Second,
	}

	err := statHelper.Init()
	if err != nil {
		panic(err)
	}

	// 使用计数器
	statHelper.CounterIncr("example_counter")
}

配置参数

  • Rds: Redis 客户端实例。
  • StatKeyPrefix: 统计数据的键前缀。
  • Period: 统计周期,例如 1 分钟。
  • PeriodStart: 统计周期的起始时间。
  • StateKeyTTL: 统计数据在 Redis 中的存活时间。
  • FlushPeriod: 刷新计数器数据到 Redis 的周期,默认为 1 秒。

增加计数器

使用 CounterIncr 方法增加计数器:

statHelper.CounterIncr("example_counter")

统计分布

为了统计 diststat 库产生的数据,使用者可以基于 pylib/stat_dist.py 脚本进行改造。

该脚本从 Redis 中获取统计数据,并将其格式化为 CSV 文件。

当前脚本获取的是一个统计周期内,按照实验、轮次、道具ID的进行统计。

用户可以自己设计 key 前缀和子标签的格式,丰富统计维度。

最佳实践

有一个推荐活动,活动会产出共20个左右的道具排序。

有 dev 和 online 两个环境。每个环境有三个实验,每个实验会使用不同算法、根据不同的用户信息产生不同的道具排序。

而道具落到具体的位置,又会有不同的原因,比如新品置顶、固定位置、算法打分、特殊置底等。

预期能统计每个时间段,按照环境、实验维度,统计不同位置的道具、原因的分布情况。

我们可以进行如下的key前缀和子标签的设计,达到统计的效果。

  • key前缀:{recommend_app_id}:{online}
  • 子标签:{experiment_id}:{reason}:{index}:{item_id}

以上的设计,就和我们提供的 [exp_dist_hour_stat_test.go](exp_dist_hour_stat_test.go) 文件 以及 [stat_dist.py](stat_dist.py) 文件相对应。

如果道具数量较多,我们可以将不同实验,放到 key 前缀中,减少子标签的数据量,从而减少每个hash中的元素个数。 但在统计时,需要知道具体有哪些实验ID,以汇总统计。

# Structs

No description provided by the author