ELK Stack新手求助:Kibana实现每日计数与前一日差值计算
计算Kibana仪表盘中日度计数与前一日的差值(Delta)
嘿,作为ELK Stack新手能写出这样的聚合查询已经挺不错了!要实现每日计数和前一日的差值,咱们可以借助Elasticsearch的derivative聚合来搞定——这正是专门用来计算相邻时间桶之间数值变化的工具。下面我来帮你调整现有查询,并一步步解释怎么实现:
调整后的查询语句
我简化并优化了你的查询,核心是添加差值计算的逻辑,让结构更清晰易懂:
{ "size": 0, "_source": { "excludes": [] }, "stored_fields": ["*"], "docvalue_fields": [ { "field": "deploy_date_asset_tag", "format": "date_time" }, { "field": "deploy_date_localtime", "format": "date_time" }, { "field": "install_date", "format": "date_time" }, { "field": "timestamp", "format": "date_time" }, { "field": "ui_legacy_access", "format": "date_time" }, { "field": "ui_satori_access", "format": "date_time" } ], "query": { "bool": { "must": [ { "match_all": {} }, { "range": { "timestamp": { "gte": 1408458089497, "lte": 1566224489497, "format": "epoch_millis" } } } ] } }, "aggs": { "daily_installs": { "date_histogram": { "field": "install_date", "interval": "1d", "time_zone": "America/New_York", "min_doc_count": 1 }, "aggs": { "by_version": { "terms": { "field": "version.keyword", "size": 50, "order": { "_key": "desc" }, "script": "( _value.indexOf('-') > 0 ? _value.substring(0, _value.indexOf('-')+2) : _value )" }, "aggs": { "version_daily_count": { "value_count": { "field": "install_date" } }, "day_over_day_delta": { "derivative": { "buckets_path": "version_daily_count", "gap_policy": "skip" } } } } } } } }
关键改动说明
- 我把聚合命名改成了更直观的
daily_installs、by_version这类名称,后续维护起来更省心。 - 用
value_count直接统计每日每个版本的安装数,替代了你原来嵌套的date_histogram+sum_bucket,逻辑更简洁高效。 - 核心新增的
day_over_day_delta聚合:buckets_path指定要计算差值的目标字段(这里是每日版本安装数version_daily_count)gap_policy设为skip,如果某天没有数据,会跳过这个空桶,避免算出异常的差值。
在Kibana中展示差值
- 把调整后的查询粘贴到Kibana的Dev Tools里运行,确认能得到包含
day_over_day_delta的结果。 - 创建可视化面板时,推荐选折线图或柱状图:
- X轴选择
daily_installs对应的日期字段 - Y轴可以同时添加
version_daily_count(每日计数)和day_over_day_delta(差值) - 拆分系列选择
by_version的版本字段,这样就能直观看到每个版本的每日销量和日环比变化了。
- X轴选择
如果运行查询时遇到版本字段的脚本异常,可以先单独测试脚本逻辑,确保它能正确提取你需要的版本前缀。
内容的提问来源于stack exchange,提问作者couch_potato
相关产品推荐
相关产品推荐

