埋点事件处理器
2025年10月13日大约 3 分钟
埋点事件处理器
我们AIAB系统中目前有三种事件,一种是用户请求事件,用来收集如请求响应时间、消耗token数等指标;另一种是用户评价事件,用来收集用户在使用过程中的用户反馈;同时,我们也支持埋点事件,用于收集一些埋点数据。下面介绍埋点事件处理器。
工具概述
埋点事件处理器核心定位为 Kafka 消费者,用于从 Kafka 消息中心订阅埋点消息,经过解析、过滤、格式转换后,将消息发送至 AB 实验消息接收服务器,支撑 AB 实验的数据采集与分析。工具以 JAR 包形式存在(如kafka-event-processor-1.0.0.jar),可在 PaaS 环境或服务器中运行。
工具启动与配置
启动方式
通过命令行启动 JAR 包,需指定配置文件路径,命令格式如下:
java -jar kafka-event-processor-1.0.0.jar --spring.config.location=application-maidian.yml核心配置
配置文件需重点设置 Kafka 服务、属性服务、事件接收地址等信息,关键配置项如下:
| 配置模块 | 配置项 | 说明 | 示例 | 
|---|---|---|---|
| Kafka 多数据源 | bootstrap-servers | Kafka 服务访问地址 | 127.0.0.1:9092 | 
| group-id | 消费组 ID | test92 | |
| topics | 订阅的 Kafka 主题 | test,topic1 | |
| 服务地址 | config-url | 属性服务配置文件地址 | https://cdn.eyeofcloud.com/datafiles/%s.json | 
| event-endpoint | AB 实验事件接收器地址 订阅的 Kafka 主题 | https://event.eyeofcloud.com/v1/events | |
| 项目与属性 | projectkeyLis | AB 系统项目 SDKKey | 1_ad1ba589aa210d26 | 
| eventProperties | eventProperties | areaname,word3 | 
编码实现要点
程序包引入
需在项目依赖中添加工具所需第三方包,关键依赖如下:
<dependencies>
    <!-- AB实验核心依赖 -->
    <dependency>
        <groupId>com.eyeofcloud.ab</groupId>
        <artifactId>core-api</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>com.eyeofcloud.ab</groupId>
        <artifactId>core-httpclient-impl</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
</dependency>
    <!-- Kafka与JSON处理依赖 -->
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.10.1</version>
    </dependency>
</dependencies>关键API调用示例
package com.eyeofcloud;
import java.util.ArrayList;
import java.util.List;
public class Example {
    public static void main(String[] args) throws InterruptedException {
        // 1. 初始化处理器与解析器
        MaidianProcessor mp = new MaidianProcessor();
        GongHangMaidianParser parser = new GongHangMaidianParser();
        mp.setMaidianParser(parser);
        // 2. 配置服务地址与项目Key
        mp.setConfigUrlFormat("https://cdn.eyeofcloud.com/datafiles/%s.json");
        mp.setEventEndPoint("http://localhost/v1/events");
        List<String> projectKeyList = new ArrayList<>();
        projectKeyList.add("1_a5487b8eaf69c9e1");
        mp.setProjectKeyList(projectKeyList);
        // 3. 处理埋点消息(需满足10条或30秒触发发送)
        String maidianEventExample = "xxxxxxx"; // 实际埋点消息
        mp.process(maidianEventExample);
        // 4. 等待发送完成(默认30秒间隔)
        Thread.sleep(30 * 1000);
    }
}埋点事件解析器设置
需自定义解析器实现MaidianParser接口,核心逻辑为解析埋点消息并生成ParsedResult(含用户 ID、事件键、事件属性),示例如下:
public class GongHangMaidianParser implements MaidianParser {
    @Override
    public ParsedResult parse(String maidian) {
        Map map = new HashMap<>();
        Gson gson = new Gson();
        try {
            map = gson.fromJson(maidian, Map.class);
        } catch (Exception e) {
            log.error("解析埋点消息失败:" + e.getMessage());
            return null;
        }
        ParsedResult result = new ParsedResult();
        if (map.get("maincis") == null || map.get("event_type") == null) {
            return null;
        }
        // 设置用户ID(示例用maincis字段)
        result.setUserId(map.get("maincis").toString());
        // 生成事件Id
        String eventId = parametersJoin(map.get("event_type"), map);
        result.setEventKey(eventId);
        // 设置事件属性
        Map<String, Object> eventTag = new HashMap<>();
        eventTag = generateEventTage(map);
        result.setEventTag(eventTag);
        return result;
    }
    // 事件键拼接逻辑(需按业务需求修改)
    private String parametersJoin(Object eventType, Map map) {
        if ("启动".equals(eventType)) return "start_app";
        if ("浏览".equals(eventType)) return "browse_" + map.get("srcpageno") + "_to_" + map.get("curpageno") + "_in_" + map.get("curmenuid");
        if ("点击".equals(eventType)) return "click_" + map.get("buttonno") + "_in_" + map.get("buttonseq") + "_in_" + map.get("curpageno");
        return eventType.toString();
    }
}