在仪表板中使用时间过滤器更改 Kibana 中 Vega 的范围

Posted

技术标签:

【中文标题】在仪表板中使用时间过滤器更改 Kibana 中 Vega 的范围【英文标题】:Using time filter in dashboard to change range of Vega in Kibana 【发布时间】:2020-03-18 00:51:16 【问题描述】:

我使用的是 Kibana 7.1。

我已成功创建 Vega 线图。我可以让它显示月份的数据,但是我希望用户在仪表板中使用时间过滤器并允许 vega 可视化随之改变。

从https://www.elastic.co/blog/getting-started-with-vega-visualizations-in-kibana 和 Vega 文档中我读到了插入

  "%context%": true,
  "%timefield%": "@timestamp"

inside url 将解决这个问题,但是当我这样做时,它给了我 url.%context% and url.%timefield% must not be used when url.body.query is set

我的完整 elasticsearch 代码如下所示:

  "data": 
    "url": 
      "%context%":"true",
      "index": "access_log",
      "body": 
        "query": 
          "bool": 
            "must": [
              "term": "request_1": "rent",
              "term": "status": 200
            ]
          
        ,
        "aggs": 
          "histo": 
            "date_histogram": 
              "field": "date",
              "interval": "day"
            ,
            "aggs": 
              "start_agg": 
                "filter": 
                  "term": "request_2": "start"
                
              ,
              "check_agg": 
                "filter": 
                  "term": "request_2": "check"
                
              ,
              "start_check": 
                "bucket_script": 
                  "buckets_path": 
                    "start_count": "start_agg._count",
                    "check_count": "check_agg._count"
                  ,
                  "script": "params.start_count / params.check_count"
                
              
            
          
        
      
    ,
    "format": 
      "property": "aggregations.histo.buckets"
    
  ,
  "mark": 
    "type":"line"
  ,
  "encoding": 
    "x": 
      "field": "key",
      "type": "temporal",
      "axis": "title": false
    ,
    "y": 
      "field": "start_check.value",
      "type": "quantitative",
      "axis": "title": "Document count"
    ,
    "tooltip":[
      "field":"start_check.value", 
       "type" : "quantitative",
      "field":"key",
       "type" :"temporal"
    ]
  

【问题讨论】:

【参考方案1】:

引用Elastic's Vega reference for Kibana:

使用"%context%": true 或为"%timefield%" 定义值时,正文不能包含查询。要在 VEGA 规范中自定义查询(例如,添加额外的过滤器,或移动时间过滤器),请定义您的查询并使用上述示例中的占位符。一旦解析,占位符将被仪表板或可视化的实际上下文替换。

他们所说的“上面的例子”如下:


  body: 
    query: 
      bool: 
        must: [
          // This string will be replaced
          // with the auto-generated "MUST" clause
          "%dashboard_context-must_clause%"
          
            range: 
              // apply timefilter (upper right corner)
              // to the @timestamp variable
              @timestamp: 
                // "%timefilter%" will be replaced with
                // the current values of the time filter
                // (from the upper right corner)
                "%timefilter%": true
                // Only work with %timefilter%
                // Shift current timefilter by 10 units back
                shift: 10
                // week, day (default), hour, minute, second
                unit: minute
              
            
          
        ]
        must_not: [
          // This string will be replaced with
          // the auto-generated "MUST-NOT" clause
          "%dashboard_context-must_not_clause%"
        ]
        filter: [
          // This string will be replaced
          // with the auto-generated "FILTER" clause
          "%dashboard_context-filter_clause%"
        ]
      
    
  

而且,正如文档中已经定义的那样:

"%dashboard_context-must_clause%": 字符串被包含过滤器的对象替换 "%dashboard_context-filter_clause%": 字符串被包含过滤器的对象替换 "%dashboard_context-must_not_clause%": 字符串被包含过滤器的对象替换

因此,如果您想同时使用用户定义的过滤器或具有自定义查询的时间过滤器,则必须使用这三个字符串而不是"%context%": true。它们将由 Kibana 解析并由 Elasticsearch 查询对象替换:一个用于“MUST”,一个用于“FILTER”,一个用于“MUST_NOT”。

像这样的简单架构可能会很有用:


  body: 
    query: 
      bool: 
        must: [
          // 
          //   A "MUST" clause of yours
          // ,
          "%dashboard_context-must_clause%"
        ]
        must_not: [
          // 
          //   A "MUST_NOT" clause of yours
          // ,
          "%dashboard_context-must_not_clause%"
        ]
        filter: [
          // 
          //   A "FILTER" clause of yours
          // ,
          "%dashboard_context-filter_clause%"
        ]
      
    
  

如果您在某些类别中没有任何子句,只需将相应的 "%dashboard_context-XXXXX_clause%" 字符串保留为没有其他对象 - 就像在“FILTER”或“MUST_NOT”的第一个示例中一样。

【讨论】:

【参考方案2】:

插入"%timefiled%":"date" 其中日期是我的工作领域之一。

【讨论】:

您在该字符串中有错字。你确定它能解决你的问题吗?每当设置时间域时,它似乎都会出错。

以上是关于在仪表板中使用时间过滤器更改 Kibana 中 Vega 的范围的主要内容,如果未能解决你的问题,请参考以下文章

时间过滤器快捷方式如何在 KIbana 中工作?

如何在 Kibana/ELK 中进行“where not exists”类型过滤?

Kibana 仪表板按关键字内容过滤

Kibana查询说明

使用 Kibana API 导出的仪表板无法在 Kibana UI 中手动导入

Tableau 实时更改复制