Kibana经典查询语句解析之---http客户端类型统计

环境

Kibana : v 8.1.1

ElasticSearch :v 8.1.1

背景

1、应用rest/http等接口调用记录都有通过拦截器记录到ES 中(其中就包含了请求header头信息)

2、header头信息整个以字符串的形式记录(header中的key,如agent 没有以独立的字段记在es中)

需求

统计所某天所有调用的http客户端类型

分析

因在 Kibana 的 KQL(Kibana Query Language)中,‌不能直接使用字符串索引函数‌。

KQL 的设计目的是提供一种简单直观的方式来过滤 Elasticsearch 数据,它支持基本的字段查询、短语匹配、范围查询等功能,但‌不支持复杂的字符串处理函数 ‌,如 indexOfsubstring 等。

如果需要实现类似字符串位置查找的功能,可以使用 ‌script 查询‌ 来完成。通过在查询中嵌入脚本,可以利用 Elasticsearch 的脚本语言(如 Painless)来执行字符串操作。

因此,虽然 KQL 本身不支持索引函数,但可以通过结合使用 script 查询来实现更复杂的字符串匹配逻辑。

结论:不能直接分组查出所有客户端类型,只能一个个找出来。下面我们找出一个在查询条件中排除一个。

Kibana查询

查询Postman工具调用记录

javascript 复制代码
GET /hlog-***-comm-undef.2026.01.16/_search
{
  "from":0,
  "size":8,
  "_source":{
  },
  "query": {
      "bool": {
        
          "filter": [
              {
                  "range": {
                     
                      "lctTime": {
                          "gte": "2026-01-16T00:00:00",
                          "lt": "2026-01-16T23:00:00"
                      }
                  }
              },
              {
                  "exists": {
                      "field": "logObj.header"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"PostmanRuntime"
                  }
              },
              {
                  "term": {
                      "logObj.app.keyword": "channel-***-service该条件按需添加"
                  }  
              },
              {
                  "match_phrase": {
                      "logObj.uri": "/staff/methodName该条件按需添加"
                  }  
              }
          ]
      }
  }
}

查询出所有客户端类型

(上面说过)这里不能直接输出,可使用上面的查询去掉postman条件查看结果后,把看到的客户端类型(user-agent)记下来然后在查询条件中排除该类型,然后继续查询,最终得下面的的查询

javascript 复制代码
GET /hlog-***-comm-undef.2026.01.16/_search
{
  "from":0,
  "size":8,
  "_source":{
  },
  "query": {
      "bool": {
          "must_not": [
              {
                  "match_phrase": {
                      "logObj.header": "Mozilla"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "okhttp"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "Commons-HttpClient"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "Apache-HttpClient"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"Java"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"3gpp-gba"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"CommCenter"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"CPM-client"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"ReactorNetty"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"IM-client"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"python-requests"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"p220041401"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"P220041701"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"Telecom API Gateway"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"CRM"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \"Axis"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"x-frame-options\" : \"SAMEORIGIN"
                  }
              }
          ],
          "filter": [
              {
                  "range": {
                     
                      "lctTime": {
                          "gte": "2026-01-16T00:00:00",
                          "lt": "2026-01-16T23:00:00"
                      }
                  }
              },
              {
                  "exists": {
                      "field": "logObj.header"
                  }
              },
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\" : \""
                  }
              },
              {
              "term": {
                    "logObj.app.keyword": "channel-view-service"
                }  
              },
              {
              "match_phrase": {
                    "logObj.uri": "/staff/issueStaffInfo"
                }  
              }
          ]
      }
  }
}

查询header字段中没有agent属性的数据

javascript 复制代码
GET /hlog-***-comm-undef.2026.01.18/_search
{
  "from":0,
  "size":2,
  "_source":{ 
  },
  "query": {
      "bool": {
          "must_not": [
              {
                  "match_phrase": {
                      "logObj.header": "\"user-agent\""
                  }
              }
          ],
          "filter": [
              {
                  "range": {
                     
                      "lctTime": {
                          "gte": "2026-01-18T00:00:00",
                          "lt": "2026-01-18T23:00:00"
                      }
                  }
              },
              {
                  "exists": {
                      "field": "logObj.header"
                  }
              }
          ]
      }
  }
}

客户端类型汇总(含工具)

附件一:Kibana查询知识总结

查询语法核心

Kibana主要支持三种查询方式,各有侧重:

  1. ‌**KQL (Kibana Query Language)**‌:最常用,语法简洁,适合快速过滤和全文搜索。
  2. Lucene Query String‌:功能更强大,支持布尔逻辑、通配符和正则表达式,适合复杂查询。
  3. ‌**JSON DSL (Query DSL)**‌:最灵活,通过JSON结构构建复杂查询,常用于Kibana高级功能或API调用。

KQL 语法详解

KQL是Kibana的默认查询语言,易于上手。

  • 字段搜索 ‌:field_name: value,例如 status: 200
  • 通配符 ‌:*匹配多个字符,?匹配单个字符,例如 user.name: jo*
  • 范围查询 ‌:[起始 TO 结束],例如 bytes: [1000 TO 5000]
  • 布尔操作 ‌:ANDORNOT,例如 status: 200 AND method: GET
  • 存在查询 ‌:_exists_: field_name
  • 模糊查询 ‌:field_name: value~,支持拼写容错。

Lucene 语法详解

Lucene语法功能更强大,适合复杂场景。

  • 短语搜索 ‌:用双引号",例如 "error occurred"
  • 正则表达式 ‌:用/包裹,例如 message: /error.*/
  • 距离查询 ‌:field_name: "word1 word2"~n,指定单词间最大间隔。
  • 提升权重 ‌:field_name: value^2,提高匹配文档的相关性评分。

实战技巧

  • 组合查询 ‌:在KQL中使用ANDOR组合多个条件。
  • 时间范围‌:利用Kibana的时间选择器快速过滤日志。
  • 调试查询‌:使用Kibana的"Dev Tools"或"Search Profiler"分析查询性能。

语法对比

特性 KQL Lucene Query String
易用性 简单直观 稍复杂
功能 基础过滤、全文搜索 通配符、正则、布尔逻辑
适用场景 快速查询、日常过滤 复杂日志分析、精确匹配

附件二:Kibana基础知识及示例

Kibana是Elastic Stack的核心组件,用于可视化和分析Elasticsearch中的数据。以下是其核心概念和使用示例:

  1. 基本概念

    • Kibana提供Web界面,用于搜索、过滤和可视化Elasticsearch数据
    • 支持多种可视化类型,如柱状图、折线图、饼图等
    • 提供Discover、Visualize、Dashboard三大核心功能模块
  2. 常用查询语法

    • KQL(Kibana Query Language):简单直观的查询语言
    • Lucene查询语法:支持复杂布尔逻辑和正则表达式
    • DSL查询:JSON格式的完整查询定义
  3. 典型使用场景

    • 日志分析和监控
    • 业务数据可视化
    • 实时数据仪表板构建
javascript 复制代码
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "timestamp": {
              "gte": "now-1h",
              "lt": "now"
            }
          }
        }
      ]
    }
  }
}

代码说明:

  1. 该示例展示了一个基本的Kibana查询结构,用于筛选最近一小时内的数据。

  2. 使用了bool查询中的filter条件来限定时间范围。

  3. 这是构建Kibana仪表板的基础查询模板。

相关推荐
J_bean2 年前
ES的常用查询
大数据·elasticsearch·搜索引擎·es查询