opanalytics

package
v1.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: Apache-2.0 Imports: 26 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ETL

type ETL struct {
	log.Log
	// contains filtered or unexported fields
}

ETL 看板预聚合任务(增量水位,幂等)。

抽取模型:不再按 timestamp 全表扫 message 分片(无该索引),改为按主键 id keyset 分页 流式增量读取,每条消息精确一次累加进 ③;首次运行从 id=0 自动全量回填,之后每次只读新增。 稳定性闸门(created_at ≤ DB_NOW-lag)杜绝"低 id 晚提交被游标越过"的并发漏扫(见 etlLagSeconds)。

口径语义(事件处理时口径 / event-time semantics):③/④ 是按消息处理当时的维表(成员类型、 排除名单、群成员构成)累加的不可变事实。事后变更维表(如 user.category 改 system、系统 bot 名单扩展、robot 更正、群成员增减)只影响**之后**处理的新消息,不回溯已写入的历史行。如需让 维表变更追溯既往,调用 Rebuild() 安全重建(清事实+水位,下轮用当前维表全量重算)。

func NewETL

func NewETL(ctx *config.Context) *ETL

NewETL 创建 ETL。

func (*ETL) Rebuild

func (e *ETL) Rebuild() error

Rebuild 安全重建:清空事实表(③/④)、抽取水位与脏日队列,再用**当前**维表从 id=0 全量重算。

用途——口径回溯(event-time 语义的逃生门):当成员类型/排除名单/群成员构成等维度发生历史性 修正,需要让既往统计也按新口径重算时,运行此入口。注意这是一次性重读全部 message 历史的重操作, 应在低峰由运维显式触发(非定时路径)。

运维亦可等价地手工执行:TRUNCATE octo_fact_member_channel_daily / octo_fact_channel_daily / octo_etl_message_cursor / octo_etl_dirty_day,下一次定时 RunIncremental 会自动全量回填。

注意:本方法**不持** scheduler 的 Redis ETL 锁。当前未接任何入口(仅供运维/测试直接调用), 故安全。将来若挂到 ops 端点,必须先获取同一把锁(并暂停 cron),否则与定时跑并发会在清空游标 与增量重算之间互相踩踏。

func (*ETL) RunIncremental

func (e *ETL) RunIncremental() error

RunIncremental 增量跑一轮:刷新维表 → 逐分片按水位流式抽取并累加 ③ → 标脏日 → 由 ③ 重算 ④。

幂等:游标保证已处理消息不重复计入(精确一次);重复调用在无新消息时为空操作。 崩溃安全:③ 累加与游标推进同事务提交;④ 经持久化脏日队列由本轮或下轮重算,最终一致。

type Manager

type Manager struct {
	log.Log
	// contains filtered or unexported fields
}

Manager 运营分析看板(管理端 superAdmin 跨 space 只读)。

func New

func New(ctx *config.Context) *Manager

New 创建看板 Manager。生产环境(非测试)自启动每日 ETL 调度器。

func (*Manager) Route

func (m *Manager) Route(r *wkhttp.WKHttp)

Route 配置路由。统一前缀 /v1/manager/dashboard;逐 handler 校验 superAdmin。 SharedUIDRateLimiter 挂在 AuthMiddleware 之后(须先解析出 uid):这些是跨 Space 聚合的重查询, 防管理端误刷/脚本轮询/token 泄漏把 DB 打满(每登录用户共享桶,见 pkg/wkhttp/ratelimit_helper.go)。

type Scheduler

type Scheduler struct {
	log.Log
	// contains filtered or unexported fields
}

Scheduler 看板增量 ETL 的每日定时调度器(仿 modules/backup/scheduler.go)。 多副本部署时由 Redis 锁保证同一时刻只有一个实例真正执行(验收④)。

func NewScheduler

func NewScheduler(ctx *config.Context, etl *ETL) *Scheduler

NewScheduler 创建调度器。

func (*Scheduler) Start

func (s *Scheduler) Start() error

Start 启动调度器(幂等)。出错只返回 error,由调用方记日志,不 panic。

func (*Scheduler) Stop

func (s *Scheduler) Stop()

Stop 停止调度器并释放锁连接。

func (*Scheduler) TriggerManualRun

func (s *Scheduler) TriggerManualRun() (bool, error)

TriggerManualRun 抢同一把 ETL 分布式锁,抢到后异步跑一轮增量 ETL。 返回 (false,nil) 表示已有 cron 或手动任务在运行。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL