一、评价:服务器的性能还算不错,但clinet端代码规范来看,不敢恭维,感觉是大佬带着校招实习生做的,用户体验有点差
简单的列举一下:
首先,提供的client端jar包中的代码,代码风格层次不齐,方法名有大写的情况。还有提供的getter和setter方法,但属性定义成为public的情况
其次,关于官方文档,关于Java SDK的代码示例,太过于敷衍,问题还是比较大的,代码也只是“能用”这一个优点
最后,官方文档错误百出,有些注释与功能完全不一致,甚至两个作用相反的注释都弄错了,例如:from_unixtime与to_unixtime
二、简介
刚接触的时候我也是一脸懵逼,所以这里我简单的介绍一下,可以方便理解,在服务器中存放的数据类型都是QueriedLog类型,有一些固定的字段,是官方定义的,一般可以不用管;还有就是需要的字段,是以key-value的方式存储,所以当你拿出来的时候(拿取方法在“使用”中),拿出后要根据自己的需要,进行数据转换。Log Service是一个生产者/消费者模式的,有点像Kafka
三、字段理解
1、endpoint(服务入口):是指数据是通过哪个服务入口,这个根据自己的情况从官网找,是XXXX.com的那些
网址:https://help.aliyun.com/document_detail/29008.html?spm=a2c4g.11186623.6.917.4aeb20casTRveb
2、accessKeyId(访问密钥Id):这个是到阿里注册才能拿到的
3、accessKeySecret(访问密钥):同上
4、project(项目):类似MySQL的库的概念
5、store(存储):类似MySQL的表的概念
6、topic(主题):类似Kafka的主题概念,当生产者在发送数据的时候指定了topic,消费者在消费时也要指定topic才能消费
四、使用,我对官网的代码做了修改,因为个别地方确实是问题太多
// 这里通过传值的方式,将client从上一层创建出来,这样可以不会频繁创建,request是我自己定义的
Client client = request.getClient();
// 项目名称
String project = request.getProject();
// 项目的库
String logStore = request.getLogStore();
// 这里是我自定义的字段,其实是存放query的代码
String query = request.getAliSql();
int startTime = request.getStartTime();
int endTime = request.getEndTime();
String topic = request.getTopic();
GetHistogramsResponse res3 = null;
histogramsRun = true;
// 查询日志分布情况
while (histogramsRun) {
GetHistogramsRequest req3 = new GetHistogramsRequest(project, logStore, topic, query, startTime, endTime);
try {
res3 = client.GetHistograms(req3);
} catch (LogException e) {
LOG.error(e.getMessage(), e);
break;
}
if (res3 != null && res3.IsCompleted()) {
//这里本身使用break是可以的,我这里做了代码保护,通过histogramsRun的boolean值来判断while是否运行
histogramsRun = false;
break;
}
}
// 获取相关记录的记录数
long totalLogLines = res3.GetTotalCount();
// 查询日志数据
List<QueriedLog> queriedLogList = new LinkedList<>();
// 上面的操作是不会查询出想要的数据的,下方的操作才是查询数据的
// 目的是当需求只是需要查询记录数,并且上面操作的记录与下方查出的记录数相同时,可以避免过多的操作,通过selected进行控制
if (request.isSelected()) {
int logOffset = 0;
logRun =true;
while (logRun) {
GetLogsResponse res4 = null;
GetLogsRequest req4 = null;
// 这里需要格外注意,当有query条件时,是不能通过offset的值进行分片查询的
if (!"".equalsIgnoreCase(query) && query != null) {
// 通过条件进行查询,这里可以待优化,通过limit做分片查询
query += (" limit " + totalLogLines);
req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query);
logRun = false;
} else {
// 通过offset进行分片查询,但当query有条件的时候,不能使用offset进行分片
req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query, logOffset, logLine, false);
}
try {
res4 = client.GetLogs(req4);
} catch (LogException e) {
LOG.error(e.getMessage(), e);
}
logOffset += logLine;
// 当查询不出值的时候要终止查询
if (res4 == null || (res4 != null && res4.GetLogs().isEmpty())) {
logRun = false;
}
// 将查询出来的值进行存储
if (res4 != null) {
queriedLogList.addAll(res4.GetLogs());
}
}
}