更新时间:2026-07-07 GMT+08:00
分享

监控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为例介绍配置指导。

  1. 登录云搜索服务管理控制台
  2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
  3. 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
  4. 在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所示列举一些常见现象组合及其原因。

表4 P99时延与HTTP状态码联合监控

现象组合

可能原因

建议操作

P99升高 + 429增多

集群资源不足,慢查询堆积触发限流。

优化慢查询DSL,考虑扩容。

P99升高 + 200正常

存在复杂查询或数据倾斜。

开启慢查询日志定位具体慢查询。

P99正常 + 400增多

客户端代码问题,但未影响成功请求。

检查客户端日志,修复DSL语法。

P99正常 + 429出现

突发流量峰值,但大多数请求仍正常。

评估是否需要流量削峰或扩容。

相关文档