You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日志在Kibana实现API调用统计与性能可视化的技术咨询

问题解答

1. 需求是否可在Kibana中实现?

完全可以。Kibana的可视化组件(折线图、条形图等)结合Elasticsearch的聚合分析能力,能够轻松实现指定URL的时序响应分析、百分位数计算,以及按百分位数排序的Top API统计。

2. 如何优化日志格式以支持可视化?

当前日志的核心问题是message字段嵌套了JSON结构,Elasticsearch会将其识别为字符串类型,无法直接对内部的path、time等字段做聚合分析。优化方案有两种:

方案一:修改Log4j2配置,直接输出顶层字段

调整Log4j2的JsonLayout配置,将请求路径、响应时间等关键字段直接放到日志JSON的顶层,而非嵌套在message中。示例配置:

<JsonLayout compact="true" eventEol="true">
  <!-- 自定义添加请求相关字段 -->
  <KeyValuePair key="path" value="$${ctx:requestPath}"/>
  <KeyValuePair key="responseTime" value="$${ctx:responseTime}"/>
  <KeyValuePair key="requestParams" value="$${ctx:requestParams}"/>
  <KeyValuePair key="statusCode" value="$${ctx:responseStatus}"/>
  <!-- 保留原有日志字段 -->
  <KeyValuePair key="thread" value="%t"/>
  <KeyValuePair key="level" value="%level"/>
  <KeyValuePair key="appName" value="request-tracing"/>
</JsonLayout>

注:$${ctx:xxx}需要你在拦截器中将对应值存入Log4j的线程上下文(比如ThreadContext.put("requestPath", request.getRequestURI()))。

方案二:在Logstash中解析嵌套的message字段

如果暂时无法修改日志输出格式,可以在Logstash的过滤阶段解析message字段,将嵌套的JSON展开为顶层字段。示例Logstash配置:

filter {
  json {
    source => "message"  # 解析message字段中的JSON
    target => ""         # 将解析后的字段直接放到顶层
    remove_field => ["message"]  # 可选:移除原message字段,减少冗余
  }
}

优化后,Elasticsearch会自动将path识别为keyword类型(适合分组),responseTime、statusCode识别为数值类型(适合聚合计算)。

3. Kibana中制作图表的步骤

(1)指定URL的时序响应分析图表

  • 进入Kibana的可视化库,创建折线图
  • 选择对应的Elasticsearch索引模式作为数据源
  • X轴:选择时间字段(如@timestamp,Logstash通常会自动将timeMillis转换为该字段),设置合适的时间间隔(如1分钟、5分钟)
  • Y轴添加3个聚合:
    • 聚合类型选平均值,字段选responseTime,命名为「平均响应时间」
    • 聚合类型选百分位数,字段选responseTime,设置百分位数为90,命名为「90百分位响应时间」
    • 聚合类型选百分位数,字段选responseTime,设置百分位数为99,命名为「99百分位响应时间」
  • 筛选器:添加条件path: "/user/test"(替换为你需要监控的URL),仅展示该URL的数据
  • 调整图表样式(如线条颜色、图例位置)后,保存到仪表盘

(2)Top 90/99百分位数API调用图表

  • 创建水平条形图(或表格)
  • 选择对应索引模式作为数据源
  • X轴(或表格度量):聚合类型选百分位数,字段选responseTime,设置目标百分位数(90或99),命名为「90百分位响应时间」
  • Y轴(或表格行):聚合类型选术语,字段选path,设置排序方式为「按刚才的百分位数聚合结果降序」,数量设为你需要的Top N(如Top 10)
  • 可选添加筛选器(如statusCode: 200)过滤特定状态码的请求,调整样式后保存到仪表盘

无需实际日志的探索方法

可以直接在Elasticsearch中插入模拟测试数据,然后在Kibana中操作练习。示例用ES Bulk API插入数据:

POST /request-tracing/_bulk
{"index":{}}
{"@timestamp":"2024-01-01T10:00:00.000Z","path":"/user/test","responseTime":26,"statusCode":200,"appName":"request-tracing"}
{"index":{}}
{"@timestamp":"2024-01-01T10:01:00.000Z","path":"/user/test","responseTime":35,"statusCode":200,"appName":"request-tracing"}
{"index":{}}
{"@timestamp":"2024-01-01T10:00:00.000Z","path":"/user/list","responseTime":120,"statusCode":200,"appName":"request-tracing"}
{"index":{}}
{"@timestamp":"2024-01-01T10:02:00.000Z","path":"/user/detail","responseTime":89,"statusCode":200,"appName":"request-tracing"}

插入后在Kibana中创建对应索引模式,即可开始练习制作可视化图表。

内容的提问来源于stack exchange,提问作者ranban282

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:32:22