写点什么

KairosDB Client 使用总结

用户头像
刘先强
关注
发布于: 2020 年 06 月 23 日

版本号 kairosdb 1.1.3-1 client 2.2.0

KairosDB client是什么,引用官方原话

The KairosDB client is a Java library that makes sending metrics and querying the KairosDB server simple. The HttpClient class is used to push metrics or query the KairosDB server. The library uses the builder pattern to simplify the task of creating the JSON that is used by the client. If an error occurs an UnexpectedResponseException is thrown which contains the HTTP response code.



kairosdb里面的开始时间结束时间是闭区间。查询、删除、聚合的时候都会包含开始时间点和结束时间点。



DataPoint 支持的数据类型 long double Object; 就是是对象,保存的时候也会转换成long或者double



MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue").addDataPoint(milli, 1.2);

metricBuilder.addMetric("metric").addTag("tagName","tagValue").addDataPoint(milli, 1);

client.pushMetrics(metricBuilder);



metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 1.2).addDataPoint(milli, 1); 与上面等价



metric相同,tag相同,时间戳相同,会保存两个值,一个long类型,一个double类型。

1.2与"1.2"可以替换,1与"1"可以替换。

单个metric后加的同名tag会覆盖掉之前加的tag

同一个时间点同时存在long类型和double类型的值,查询时是升序排列的。



QueryTagBuilder 看文档感觉是设置时间范围获取tag,但设置时间也不管用,在项目中修改成了查询数据,从response里自己获取tag。

单个保存就这样,多个保存的时候有点意思。没搞清楚规律,暂时不考虑在项目中使用

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 1.2).addDataPoint(milli, 1.7);

client.pushMetrics(metricBuilder);

保存结果 1.7

-----------

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 1.2).addDataPoint(milli, 511.9);

client.pushMetrics(metricBuilder);

保存结果 511.9

------

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 1.2).addDataPoint(milli, 512.0);

client.pushMetrics(metricBuilder);

保存结果 512.0

-------

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 12.2).addDataPoint(milli, 512.0);

client.pushMetrics(metricBuilder);

保存结果 12.2



大致效果是这样的:毫无头绪,不明白这样设计的初衷是啥。有机会一定得看看源代码研究研究。



long 类型的大致跟double的效果差不多,不想多次保存同一个时间点。



单个tag

插入数据

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue")

.addDataPoint(milli, 1);

client.pushMetrics(metricBuilder);

查询方式:

QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric");

QueryResponse query = client.query(queryBuilder);



QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric").addTag("tagName","tagValue");

QueryResponse query = client.query(queryBuilder);

删除方式

其余同查询方式

client.delete(queryBuilder);



多个tag

插入数据

MetricBuilder metricBuilder = MetricBuilder.getInstance();

metricBuilder.addMetric("metric").addTag("tagName","tagValue").addTag("tagName1","tagValue1")

.addDataPoint(milli, 1);

client.pushMetrics(metricBuilder);

查询方式:

QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric");

QueryResponse query = client.query(queryBuilder);



QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric").addTag("tagName","tagValue");

QueryResponse query = client.query(queryBuilder);



QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric").addTag("tagName1","tagValue1");

QueryResponse query = client.query(queryBuilder);



QueryBuilder queryBuilder = QueryBuilder.getInstance();

queryBuilder.setStart(new Date(milli-1)).setEnd(new Date(milli+1));

queryBuilder.addMetric("metric").addTag("tagName","tagValue").addTag("tagName1","tagValue1");

QueryResponse query = client.query(queryBuilder);



删除:

跟查询差不多,就是最后调用的方法不一样。



聚合操作: 先根据时间序列分组,然后统计每个组的数据,返回的时间为每组中第一个有数据的时间。

聚合操作一般都是针对的有数据的DataPoint。

假设开始时间为1,结束时间为10; 单位毫秒

时间序列[1,2,3,4,5,6,7,8,9,10]

假设数据跟时间点一致,有数据的时间序列[2,4,5,6],



AggregatorFactory.createCountAggregator(3, TimeUnit.MILLISECONDS)

查询每毫秒内的存在数据的时间点的个数。

先把时间序列分组 [1,2,3] [4,5,6] [7,8,9] [10]

再分别统计各个分组中的个数。

返回的结果: 2:1 4:3 这样的两组key(时间)value(个数)数据



AggregatorFactory.createLastAggregator(3, TimeUnit.MILLISECONDS)

时间序列分组 [1,2,3] [4,5,6] [7,8,9] [10]

取每组中最后一个

返回: 2:2 ,4:6

其余聚合器原理一样。



效率问题:

单个精准查询的话可能是ns级别的。

一般的普通查询20毫秒左右。

如果同时进行1000个普通查询,采用多线程不如直接进行范围查询,我本地进行一年内的数据查询耗时差不多是两三个普通查询的耗时。

没事儿不要删除,可以选择性替换,或者标记。官方也不推荐删除吧,虽然提供了删除的方法。删除的话之前的预统计之类的肯定都得重新计算。也可以局部删除失败,最后导致数据重新同步,跟没删一样。



用户头像

刘先强

关注

还未添加个人签名 2018.01.05 加入

还未添加个人简介

评论

发布
暂无评论
KairosDB Client使用总结