基于日志在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
相关产品推荐
相关产品推荐

