
# 监控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. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
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
  ```
  ![](https://support.huaweicloud.com/usermanual-css/public_sys-resources/note_3.0-zh-cn.png)
  重置操作仅清空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状态码的累计请求次数（从节点启动至今）。 |
     
  
![](https://support.huaweicloud.com/usermanual-css/public_sys-resources/note_3.0-zh-cn.png)
**HTTP状态码分布健康评估参考：**
- 200/201占绝大多数（\>95%）：正常。
- 400少量出现（\< 1%）：可接受，少量客户端语法错误。
- 404少量出现：可接受。
- 429持续增多：集群过载被限流，建议：
  - 检查是否存在大查询或全量扫描。
  
  - 考虑扩容数据节点。
  
  - 评估是否需要设置索引级别的限流策略。
   
- 400大量增多：客户端代码存在DSL语法问题，建议检查客户端代码。
- 5xx出现：集群内部错误，建议立即查看集群日志和节点状态。
 
#### P99时延与HTTP状态码联合监控
P99时延与HTTP状态码监控可结合使用，快速定位性能问题，如[表4]所示列举一些常见现象组合及其原因。
 表4P99时延与HTTP状态码联合监控 
| 现象组合          | 可能原因              | 建议操作             |
|:---|:---|:---|
| P99升高 + 429增多 | 集群资源不足，慢查询堆积触发限流。 | 优化慢查询DSL，考虑扩容。   |
| P99升高 + 200正常 | 存在复杂查询或数据倾斜。      | 开启慢查询日志定位具体慢查询。  |
| P99正常 + 400增多 | 客户端代码问题，但未影响成功请求。 | 检查客户端日志，修复DSL语法。 |
| P99正常 + 429出现 | 突发流量峰值，但大多数请求仍正常。 | 评估是否需要流量削峰或扩容。   |
   
