创建第一个数据指标

创建统计工程

XL-LightHouse使用"统计工程 - 统计组 - 统计项"的三层结构管理所有的数据指标。

  • 一个统计工程可以包含若干个统计项,基于同一份元数据的多个统计项叫做一个统计组。
  • 在系统中可以创建无限数量的统计工程、统计组和统计项。
  • 每个统计组都有自己的字段结构定义,类似数据库中的表,但是它与数据库中的表不同,统计组是一个虚拟的、轻量级的概念,对于一类问题,如果一个统计组不容易解决所有的问题,可以拆分成多个统计组来解决。比如实际业务逻辑中有很多"一对多"、"多对多"的关系, 就像订单和每个订单中的商品,如果要实现订单量、订单金额数据指标以及每个商品的购买量、每个商品的下单用户数就可以拆分成两个统计组来完成。
  • 统计组没有必要与接入方自己的业务表结构保持相同,您只需要创建与统计指标相关的字段即可。
  • 每个数据指标叫做一个统计项。

创建统计工程需要指定的信息:

  • 工程名称
  • 所在部门
  • 描述信息

XL-LightHouse

创建统计组

进入工程管理页面,点击创建统计组按钮。

创建时需要指定以下信息:

1、Token

  • 格式为: (N4C:order_stat),其中N4C为系统部署时随机生成的域前缀,order_stat为统计组标识,限定输入英文、数字和下划线;

2、字段信息

  • 字段名称请使用英文、数字和下划线表示,区分大小写;
  • 字段类型分为String和Number两种类型,务必注意:对于需要进行sum、max、min、seq、avg等数值运算的字段,必须指定为Number类型,比如本示例中的订单金额amount字段);
  • 已经在统计项中被使用的字段不能进行修改字段名称和字段类型,如需要修改,请先将相关统计项删除后再操作(删除操作会使该统计项之前的统计数据失效,请谨慎操作);

3、描述信息

XL-LightHouse

创建统计项

统计组创建完成后,即可在统计组下创建统计项,已存在的统计组可以随时新增统计项,并可根据业务需要停止、删除、重启每个统计项。

统计项创建需要指定如下信息:

1、统计模板(Template)

  • 用于描述统计项的计算规则。
<stat-item title="每分钟_次数计算" stat="count()" />

更多配置规则,请您参考:XL-Formula标准定义

2、统计周期(TimeParam)

  • 包含分钟级、小时级和天级等时间粒度,请根据实际需要选择即可;

3、数据过期时间(Expired)

  • 统计结果的过期时间设置

4、描述信息

XL-LightHouse

JavaSDK数据上报方式

完成以上创建,即可上报原始数据。您可以选择JavaSDK或HttpAPI的数据接入方式,两种接入方式在项目源码com.dtstep.lighthouse.core.test.api都包含相关单元测试,修改IP和统计组Token、秘钥、字段信息后,可以直接运行。

如果您通过公网测试,请首先确保已对公网开放4061端口(系统默认的RPC服务端口号,暂不支持修改)和18101端口(系统默认Http服务端口号,暂不支持修改)。

数据上报时使用的secretKey为统计组秘钥,在工程管理页面 -> 选择相应统计组 -> 点击"更多"按钮 ,即可查看当前统计组的秘钥。

  • 为了测试方便,您可以直接在工程单元测试的基础上修改,然后运行即可;
  • 数据指标查看约有1分钟左右的延迟;

请参考:com.dtstep.lighthouse.core.test.api单元测试。

package com.dtstep.lighthouse.core.test.api;

import com.dtstep.lighthouse.client.LightHouse;
import com.dtstep.lighthouse.common.random.RandomID;
import org.junit.Test;

import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;

public class RpcAPITest {

    static {
        try{
            //修改rpc服务注册中心地址,集群模式为一主一从,默认为部署集群的前两个节点IP,使用逗号分割,单机模式为当前节点IP
            //LightHouse.init("10.206.6.11:4061,10.206.6.12:4061");//集群模式初始化
            LightHouse.init("10.206.6.31:4061");//单机模式初始化
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

    @Test
    public void orderStat() throws Exception {
        long t = System.currentTimeMillis();
        for(int i=0;i<81657;i++){
            HashMap<String,Object> paramMap = new HashMap<>();
            paramMap.put("order_id", RandomID.id(6));
            paramMap.put("biz", RandomID.id(2));
            paramMap.put("user_id", RandomID.id(6));
            Double d = ThreadLocalRandom.current().nextDouble(1000);
            paramMap.put("amount",String.format("%.3f", d));//防止上面随机数出现科学计数法
            LightHouse.stat("N4C:order_stat","mfbWuKc17e8hGNwGRlR2JGSfS2GgvqD0wIxjMuqm",paramMap,t);
        }
        System.out.println("send ok!");
        Thread.sleep(30000);//client为异步发送,防止进程结束时内存中部分消息没有发送出去
    }
}

参数说明:

1、token:统计组标识
2、secretKey:当前统计组秘钥[在工程管理页面可以查看到该信息]
3、paramMap:字段信息
4、timestamp:消息事件13位时间戳

Http数据上报方式

Http受限于数据传输的特性,它的数据上报效率相对于JavaRPC要低,对于大批量的原始数据上报推荐您选择JavaSDK(后续xl-lighthouse会提供c语言和go语言版本的sdk)。Http上报方案的优势在于接入比较简单灵活,适合中小业务接入(一般来说每秒上报3~5万条原始消息内的业务,Http请求方式都足以支撑), 如果您选择Http,建议您使用Http批量上报接口。

如果您通过公网测试,请首先确保已对公网开放4061端口(系统默认的RPC服务端口号,暂不支持修改)和18101端口(系统默认Http服务端口号,暂不支持修改)。

数据上报时使用的secretKey为统计组秘钥,在工程管理页面 -> 选择相应统计组 -> 点击"更多"按钮 ,即可查看当前统计组的秘钥。

  • 单条消息上报接口: http://10.206.6.31:18101/api/rpc/v1/stat
  • 批量消息上报接口:http://10.206.6.31:18101/api/rpc/v1/stats
  • 请求参数请使用JSON格式放入到请求包体中,只允许POST请求方式。
  • 请优先选用批量上报接口,批量上报接口一般每次http请求传输数据量在50k~100k之间较为适中,如果您每条消息平均约为100Byte,则建议您每次请求上报约500~1000条原始记录。每次传输数据量太大,容易导致网络阻塞,传输太小则会频繁建立Http连接,影响上报效率,您可以根据自身情况进行调整。

单条消息上报(不建议使用)

包体参数格式如下:

{
    "params": {
        "amount": "235.954",
        "biz": "Ac",
        "order_id": "O64fA6",
        "user_id": "CaKXwO"
    },
    "secretKey": "YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz",
    "timestamp": 1729334972612,
    "token": "N4C:order_stat"
}

以下使用Java代码模拟Http单条消息上报接口的调用

请参考:com.dtstep.lighthouse.core.test.api单元测试。

@Test
    public void testStat() throws Exception {
        String apiUrl = "http://10.206.6.31:18101/api/rpc/v1/stat";
        long t = System.currentTimeMillis();
        for(int i=0;i<1676;i++){
            Map<String,Object> requestMap = new HashMap<>();
            requestMap.put("token","N4C:order_stat");
            requestMap.put("secretKey","YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz");
            requestMap.put("timestamp",t);
            Map<String,Object> paramsMap = new HashMap<>();
            paramsMap.put("order_id", RandomID.id(6));
            paramsMap.put("biz", RandomID.id(2));
            paramsMap.put("user_id", RandomID.id(6));
            Double d = ThreadLocalRandom.current().nextDouble(1000);
            paramsMap.put("amount",String.format("%.3f", d));//防止上面随机数出现科学计数法
            requestMap.put("params",paramsMap);
            String requestParams = JsonUtil.toJSONString(requestMap);
            System.out.println("Send Params:" + JsonUtil.toJSONString(requestParams));
            String response = OkHttpUtil.post(apiUrl,requestParams);
            System.out.println("Send Index:" + i + ",response:" + response);
        }
        System.out.println("Send OK!");
    }

批量消息上报(推荐使用)

包体参数格式如下:

[{
    "params": {
        "amount": "959.589",
        "biz": "eR",
        "order_id": "ZqrGWY",
        "user_id": "f2ZWg3"
    },
    "secretKey": "YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz",
    "timestamp": 1729335961033,
    "token": "N4C:order_stat"
}, {
    "params": {
        "amount": "96.575",
        "biz": "91",
        "order_id": "KlPtEZ",
        "user_id": "yqTv7t"
    },
    "secretKey": "YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz",
    "timestamp": 1729335961033,
    "token": "N4C:order_stat"
}, {
    "params": {
        "amount": "868.763",
        "biz": "G6",
        "order_id": "A1tqqe",
        "user_id": "td6s5I"
    },
    "secretKey": "YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz",
    "timestamp": 1729335961033,
    "token": "N4C:order_stat"
}]

以下使用Java代码模拟Http批量接口的调用

    @Test
    public void testStats() throws Exception{
        long t = System.currentTimeMillis();
        String apiUrl = "http://10.206.6.31:18101/api/rpc/v1/stats";
        for(int m=0;m<100;m++){
            List<Map<String,Object>> requestList = new ArrayList<>();
            for(int n=0;n<300;n++){
                Map<String,Object> requestMap = new HashMap<>();
                requestMap.put("token","N4C:order_stat");
                requestMap.put("secretKey","YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz");
                requestMap.put("timestamp",t);
                Map<String,Object> paramsMap = new HashMap<>();
                paramsMap.put("order_id", RandomID.id(6));
                paramsMap.put("biz", RandomID.id(2));
                paramsMap.put("user_id", RandomID.id(6));
                Double d = ThreadLocalRandom.current().nextDouble(1000);
                paramsMap.put("amount",String.format("%.3f", d));//防止上面随机数出现科学计数法
                requestMap.put("params",paramsMap);
                requestList.add(requestMap);
            }
            String requestParams = JsonUtil.toJSONString(requestList);
            System.out.println("Send Params:" + JsonUtil.toJSONString(requestParams));
            String response = OkHttpUtil.post(apiUrl,requestParams);
            System.out.println("Send Index:" + m + ",response:" + response);
        }
        System.out.println("Send OK!");
    }

参数说明:

1、token:统计组标识
2、secretKey:当前统计组秘钥[在工程管理页面可以查看到该信息]
3、params:字段信息
4、timestamp:消息事件13位时间戳

使用Postman模拟调用

XL-LightHouse

如果您在使用中有任何问题,请您及时联系开发者~

results matching ""

    No results matching ""