好的想法是十分钱一打,真正无价的是能够实现这些想法的人。

pipeline 中的 derivative 如何为得到的结果再除时间跨度?

Elasticsearch | 作者 liujia | 发布于2018年11月07日 | 阅读数:2921

我采集了Kafka中的每个topic/partition的 logsize 存到了ES里面.  但是不是严格间隔一段时间采集的, 比如说第一次采集是 10:00, 下一次采集是 10:02, 再下一次采集是 10:05.   
 
我现在需要在Kibana里面展示 topic 的消息生产速度, 也就是每秒的logsize增加量. 第一反应是用pipeline里面的derivative aggregation , query 如下. 但是这样有一个问题, 因为采集时间有时候间隔2分钟, 有时候3分钟,有时候5分钟, 这就导致 derivative之后的差值也是2分钟的, 3分钟的 , 5分钟的. 在kibana上面展示出来的就忽大忽小, 不能一眼看出来生产速度是多少, 也不能看出来生产速度有没有增加或者减少.
 
"aggs": {
    "2": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1m",
        "time_zone": "Asia/Shanghai",
        "min_doc_count": 1
      },
      "aggs": {
        "1": {
          "derivative": {
            "buckets_path": "1-metric"
          }
        },
        "1-metric": {
          "sum": {
            "field": "logsize"
          }
        }
      }
    }
  }
 
response截取
[
        {
          "key_as_string": "2018-11-06T16:12:00.000+08:00",
          "key": 1541491920000,
          "doc_count": 30,
          "1-metric": {
            "value": 1028875959431
          }
        },
        {
          "1": {
            "value": 31658233
          },
          "key_as_string": "2018-11-06T16:20:00.000+08:00",
          "key": 1541492400000,
          "doc_count": 30,
          "1-metric": {
            "value": 1028907617664
          }
        },
        {
          "1": {
            "value": 10852752
          },
          "key_as_string": "2018-11-06T16:22:00.000+08:00",
          "key": 1541492520000,
          "doc_count": 30,
          "1-metric": {
            "value": 1028918470416
          }
        },
        {
          "1": {
            "value": 31959053
          },
          "key_as_string": "2018-11-06T16:30:00.000+08:00",
          "key": 1541493000000,
          "doc_count": 30,
          "1-metric": {
            "value": 1028950429469
          }
        }
]
 
我的需求是, 得到的 derivative 值, 可以再除以时间跨度之后再展示. 不管是 query dsl 里面实现也好, 还是 kibana 上面处理也好.  有啥方法吗?
已邀请:

rochy - rochy_he

赞同来自:

感觉无法通过 ES 直接实现,因为它无法计算时间跨度
欢迎高手解答

要回复问题请先登录注册