监控P99时延与HTTP状态码
在日常运维或开发工作中,您可能需要实时掌握Elasticsearch集群的查询性能和接口健康状况。开源Elasticsearch仅提供平均延迟指标,无法反映慢请求对用户体验的真实影响;同时,Elasticsearch对HTTP请求的状态码缺少原生统计能力,难以监测错误率突增或限流频次等异常情况。为此,CSS服务引入了P99时延与HTTP状态码监控,帮助您量化搜索性能波动、快速感知接口异常,为容量规划和故障排查提供数据支撑。
功能介绍
P99 时延(第 99 百分位延迟) 是指在统计周期内,99%的搜索请求其响应时间都低于或等于该值。与平均时延不同,P99时延能够准确反映慢查询对整体服务水平的实际影响——即使平均时延看似正常,少数高延迟请求也可能导致大量用户感知到明显卡顿。当P99时延与中位数(P50)差值过大时,通常表示集群中存在严重的慢查询或资源争抢,需要立即介入排查。
HTTP状态码监控通过统计Elasticsearch接口返回的各HTTP状态码(200、201、400、404、429 等)的出现频次,帮助您了解集群对外服务状况。例如,客户端错误(4xx)突增可能表示上游应用提交了无效请求,服务端错误(5xx)则暗示节点可能处于异常状态。通过持续跟踪状态码分布,可以快速发现应用侧的问题并及时介入。
约束限制
- 集群版本要求:仅Elasticsearch 7.6.2和7.10.2支持P99时延监控和HTTP状态码监控。两个版本的HTTP状态码查询命令不同,请注意区分。
- 数据重置:集群重启后,P99时延的所有统计数据(overall/last_one_day/latest)将全部清零。
- 近似计算:P99时延为近似值,非精确统计,越靠近边界百分位(如P99、P1)精度越高。
登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
控制台左侧是命令输入框,其右侧的三角形图标为执行按钮,右侧区域则显示执行结果。
监控P99时延
- 查询全量百分位时延
获取集群当前的完整百分位时延分布,快速判断是否存在慢查询异常。
执行以下命令:
GET /search/stats/percentile
返回示例:
{ "overall" : { "1.0" : 2.0, "5.0" : 2.0, "25.0" : 6.5, "50.0" : 19.5, "75.0" : 111.0, "95.0" : 169.0, "99.0" : 169.0, "max" : 169.0, "min" : 2.0 }, "last_one_day" : { "1.0" : 2.0, "5.0" : 2.0, "25.0" : 6.5, "50.0" : 19.5, "75.0" : 111.0, "95.0" : 169.0, "99.0" : 169.0, "max" : 169.0, "min" : 2.0 }, "latest" : { "1.0" : 26.0, "5.0" : 26.0, "25.0" : 26.0, "50.0" : 26.0, "75.0" : 26.0, "95.0" : 26.0, "99.0" : 26.0, "max" : 26.0, "min" : 26.0 } }本例中P99=P50,说明无极端异常慢查询。
表1 返回参数说明 参数
说明
overall
集群从启动至今所有search请求的百分位分布。用于评估集群历史整体性能基线。
单位为毫秒(ms),表示该百分位的请求耗时。
last_one_day
最近24小时的百分位分布。用于日常巡检,监控近期性能趋势。
单位为毫秒(ms),表示该百分位的请求耗时。
latest
上次执行reset操作至今的百分位分布。用于进行运维操作前后的性能对比验证。
单位为毫秒(ms),表示该百分位的请求耗时。
- 自定义百分位查询
按需指定关注的百分位区间,减少无关数据干扰,聚焦特定性能指标。
执行以下命令,查询1%、50%和90%的时延数据:
GET /search/stats/percentile { "percents": [1, 50, 90] }percents数组支持0~100之间的任意数值,可根据业务SLA要求自定义监控阈值(如SLA要求P95 < 500ms,则重点监控P95)。
返回示例:
{ "overall" : { "1.0" : 0.0, "50.0" : 0.0, "90.0" : 0.0, "max" : 146.0, "min" : 0.0 }, "last_one_day" : { "1.0" : 0.0, "50.0" : 0.0, "90.0" : 0.0, "max" : 146.0, "min" : 0.0 }, "latest" : { "1.0" : 0.0, "50.0" : 0.0, "90.0" : 0.0, "max" : 146.0, "min" : 0.0 } } - 重置latest统计值
在执行集群变更(如扩容、参数调整)前后,通过重置latest统计基准,精确对比变更前后的性能差异。
执行以下命令:
POST /search/stats/reset
重置操作仅清空latest统计块,overall和last_one_day不受影响。
返回示例:
{ "nodes" : { "css-c9c8-ess-esn-1-1" : "ok" } }各节点状态为“ok”,表示重置成功。
监控HTTP状态码
获取集群各节点的HTTP状态码累计统计,了解请求成功率及异常分布。
- Elasticsearch 7.10.2集群
执行以下命令:
GET /_nodes/stats/http
返回示例:
{ ... "cluster_name" : "css-2985", "nodes" : { ... "omvR9_W-TsGApraMApREjA" : { ... "http" : { "current_open" : 4, "total_opened" : 37, "http_code" : { "200" : 25, "201" : 7, "429" : 0, "400" : 3, "404" : 0, "405" : 0 }, "http_worker_pending_tasks" : { "elasticsearch[css-xxx-ess-esn-1-1][transport_worker][T#1]" : 0, "elasticsearch[css-xxx-ess-esn-1-1][transport_worker][T#2]" : 0 } } } } }表2 返回参数说明 参数
说明
current_open
当前节点正在维持的HTTP连接数。持续偏高(如 > 1000)可能说明客户端存在连接泄漏。
total_opened
节点历史累计建立的HTTP连接总数,与“current_open”对比可评估连接复用率。
http_code
各HTTP状态码的累计请求次数(从节点启动至今)。
http_worker_pending_tasks
HTTP工作线程的待处理任务数。每个transport_worker线程的待处理任务数,持续偏高可能说明节点存在请求处理瓶颈。
- Elasticsearch 7.6.2集群
执行以下命令:
GET /_nodes/http_stats
返回示例:
{ "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "css-8362", "nodes" : { "F9IFdQPARaOJI7oL7HOXtQ" : { "http_code" : { "200" : 114, "201" : 5, "429" : 0, "400" : 7, "404" : 0, "405" : 0 } } } }表3 返回参数说明 参数
说明
http_code
各HTTP状态码的累计请求次数(从节点启动至今)。
HTTP状态码分布健康评估参考:
- 200/201占绝大多数(>95%):正常。
- 400少量出现(< 1%):可接受,少量客户端语法错误。
- 404少量出现:可接受。
- 429持续增多:集群过载被限流,建议:
- 检查是否存在大查询或全量扫描。
- 考虑扩容数据节点。
- 评估是否需要设置索引级别的限流策略。
- 400大量增多:客户端代码存在DSL语法问题,建议检查客户端代码。
- 5xx出现:集群内部错误,建议立即查看集群日志和节点状态。
P99时延与HTTP状态码联合监控
P99时延与HTTP状态码监控可结合使用,快速定位性能问题,如表4所示列举一些常见现象组合及其原因。