创建统计工程
系统使用"统计工程 - 统计组 - 统计项"的三层结构管理所有的数据指标。
- 每个统计工程可包含若干个统计项,基于同一份元数据的多个统计项叫做一个统计组。
- 在系统中可以创建无限数量的统计工程、统计组和统计项。
- 统计组有相应的字段结构定义,类似数据库中的表,但它与数据库中的表不同,统计组是一个虚拟的、轻量级概念,统计组没有必要与接入方自己的业务表结构保持相同,只需要创建与统计相关的字段即可。此外对于一个业务场景,如果一个统计组不容易解决所有问题,可以拆分成多个统计组解决,比如实际业务逻辑中有很多"一对多"、"多对多"的关系,就像订单和每个订单中的商品,如果需要实现订单维度的指标和商品维度的指标就可以拆分成两个统计组来完成。
- 每个数据需求叫做一个统计项。
创建统计工程需要指定如下信息:
- 工程名称
- 所在部门
- 描述信息
创建统计组
点击“工程列表” -> 选择所创建的工程 -> 点击“管理”按钮进入“工程管理”页面,点击“创建统计组”按钮。
创建时需要指定以下信息:
1、Token
- 格式为: (N4C:order_stat),其中N4C为系统部署时随机生成的域前缀,order_stat为统计组标识,限定输入英文、数字和下划线;
2、字段信息
- 字段名称使用英文、数字和下划线表示,区分大小写;
- 字段类型分为String和Number两种类型,务必注意:对于需要进行sum、max、min、seq、avg等数值运算的字段,必须指定为Number类型,比如本示例中的订单金额amount字段);
- 已经在统计项中被使用的字段不能进行修改,如需要修改,请先将相关统计项删除后再操作;
3、描述信息
创建统计项
统计组创建完成后,即可在统计组下创建统计项,并可根据业务需要停止、删除、重启每个统计项。
统计项创建需要指定如下信息:
1、统计模板(Template)
- 用于描述统计项的计算规则。
# 参考示例
<stat-item title="每分钟_次数计算" stat="count()" />
更多配置规则,请您参考:XL-Formula标准定义
2、统计周期(TimeParam)
- 包含分钟级、小时级和天级等时间粒度,对应统计计算的时间窗口,请根据实际需要选择;
3、数据过期时间(Expired)
- 统计结果的过期时间设置
4、描述信息
原始消息数据上报
完成以上创建后即可上报原始消息数据。您可以选择JavaSDK或HttpAPI的接入方式,两种接入方式在项目com.dtstep.lighthouse.core.test.api都包含相关单元测试,修改IP和统计组Token、秘钥、字段信息后可直接运行。
如果您通过公网测试,请首先确保已对公网开放4061端口和18101端口(系统默认的RPC服务端口号,暂不支持修改)。
在数据上报完成后,查看统计结果约有1分钟左右的延迟。
JavaSDK数据上报方式
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位时间戳
HttpAPI数据上报方式
Http受限于数据传输特性,它的上报效率相对于JavaRPC要低,对于大批量的原始消息上报推荐选择JavaSDK(后续会分别提供C语言和Go语言版本的SDK)。
Http上报方案的优点在于接入简单灵活,适合中小企业或业务接入(一般来说每秒上报3~5万条原始消息内的业务,Http请求方式都足以支撑),如果您选择Http方式,建议使用批量上报接口。
以下使用lighthouse-ips代指您的部署节点IP。如果为集群模式,可使用集群的所有节点IP,可以使用轮询请求方式避免热点问题,如果为单机模式则为当前部署节点IP。
单条消息上报接口
1、接口地址
2、包体参数格式(请使用Post请求方式,以下格式参数放在包体中)
{
"params": {
"amount": "235.954",
"biz": "Ac",
"order_id": "O64fA6",
"user_id": "CaKXwO"
},
"secretKey": "YEWU3tGjNQL1AevvC9FjNj9SCuvzpYPmLY5akKYz",
"timestamp": 1729334972612,
"token": "N4C:order_stat"
}
批量消息上报接口
1、接口地址
批量上报接口一般每次请求传输数据量在50k ~ 100k之间较为适中,如果您每条消息平均约为100Byte,则建议您每次请求上报约500~1000条原始记录。每次传输数据量太大,容易导致网络阻塞,传输太小则会频繁建立Http连接,影响上报效率,请根据自身情况进行调整。
2、包体参数格式(请使用Post请求方式,以下格式参数放在包体中)
[{
"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模拟调用
增加数据指标
对于已经存在的统计组,如果需要新增统计项:
- 如果要增加的统计项所依赖的字段在当前统计组中已存在,则直接创建统计项即可,统计项创建完成后统计任务立即生效。
- 如果要增加的统计项所依赖的字段在当前统计组中不存在,则需要进行以下操作:
- 修改统计组信息,增加相应字段;
- 在上报的原始消息中增加该字段数据;
- 创建统计项。
如果您在使用中有任何问题,请您及时联系开发者~