📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-7.15

1. 错误异常的基本描述 #

could not parse http request template. invalid time value for [field] field 是 Elasticsearch Watcher 在解析 HTTP request template 时抛出的异常,表示模板中某个时间类型的字段值无法被正确解析为合法的 TimeValue

该错误通常发生在配置 Watcher 的 http 类型的 action 时,其中 connection_timeoutread_timeout 等字段的值格式不符合 Elasticsearch 的时间值语法要求。

常见现象 #

  • 创建或更新 Watcher 时返回 400 错误,提示无法解析 HTTP request template。
  • Kibana 的 Watcher 管理界面保存配置失败,提示模板解析错误。
  • Elasticsearch 日志中出现 ElasticsearchParseException,并附带 could not parse http request template 信息。
  • Watcher 的 _execute API 返回失败,提示时间字段解析异常。

典型报错与异常栈 #

ElasticsearchParseException[could not parse http request template. invalid time value for [connection_timeout] field]
Caused by: ElasticsearchParseException: invalid time value
at org.elasticsearch.xpack.watcher.actions.http.HttpRequestTemplate$Parser.parse(HttpRequestTemplate.java)

2. 为什么会发生这个错误 #

该异常的根本原因是 HTTP request template 中的时间字段值不符合 Elasticsearch TimeValue 的解析规则。常见触发场景包括:

  • 单位缺失或错误:时间值缺少合法单位,例如写成 30 而非 30s,或使用了不存在的单位如 30sec30seconds
  • 格式非法:传入了对象、数组或自然语言字符串(如 "thirty seconds"),而非标准的时间值格式。
  • null 或空字符串:字段值为 null、空字符串 "" 或仅包含空格,导致解析器无法处理。
  • 混用字段:同时配置了 connection_timeoutconnection_timeout_in_millis 等数值版字段,且两者格式存在冲突。
  • 模板渲染结果异常:当使用 Mustache 模板动态渲染 timeout 值时,渲染结果产生了非预期的内容(例如空值或错误格式)。

Elasticsearch 内部通过 WatcherDateTimeUtils.parseTimeValue 方法解析这些字段,该方法只接受形如 30s1m500ms 这样的标准时间字符串,其他格式均会抛出 ElasticsearchParseException

3. 如何排查这个异常 #

建议按以下顺序进行排查:

  1. 确认报错字段名:从异常信息中找到 invalid time value for [field] 中的具体字段名,常见字段包括 connection_timeoutread_timeout
  2. 定位 HTTP request template 配置:在 Watcher 定义中找到 actions.<action_id>.request 下的对应字段。
  3. 检查字段值格式:确认值是否为合法的时间字符串,支持的单位包括:ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)。
  4. 检查是否存在混用:确认没有同时配置带单位和不带单位的同名超时字段,避免解析冲突。
  5. 检查模板渲染结果:如果使用了 Mustache 模板动态生成 timeout 值,在 _execute 时观察渲染后的实际内容。

排查时需要注意的问题 #

  • 不要只看 400 响应,需要查看完整的异常栈,确认具体是哪个字段解析失败。
  • 如果 Watcher 是通过 Kibana 界面或 API 动态生成的,需要检查生成逻辑是否正确拼接了时间单位。
  • 注意区分 http request template 的超时字段与 Watcher 级别的 timeout 字段,两者位置和格式要求不同。

4. 如何解决这个错误 #

常用修复思路 #

  • 修正时间值格式:将非法的时间值改为标准格式,例如 30s1m500ms
  • 补充缺失的单位:如果原值是纯数字,补充对应的时间单位,例如 3030s
  • 移除非字符串类型的值:确保 timeout 字段的值是字符串类型,而非对象、数组或数值类型。
  • 统一字段使用方式:如果同时使用了 human 格式字段(如 connection_timeout)和数值格式字段(如 connection_timeout_in_millis),只保留其中一种写法。

修复示例 #

修复前(错误示例):

{
  "actions": {
    "my_webhook": {
      "webhook": {
        "method": "POST",
        "url": "https://example.com/hook",
        "connection_timeout": "thirty_seconds"
      }
    }
  }
}

修复后(正确示例):

{
  "actions": {
    "my_webhook": {
      "webhook": {
        "method": "POST",
        "url": "https://example.com/hook",
        "connection_timeout": "30s"
      }
    }
  }
}

后续注意事项与推荐建议 #

  • 在 Watcher 配置中统一使用标准时间格式(30s1m500ms),避免自定义或自然语言写法。
  • 对动态生成 timeout 值的模板,增加渲染结果的格式校验,确保输出始终为合法的时间字符串。
  • 使用 _execute API 在正式保存 Watcher 之前先验证配置的正确性,尽早发现格式问题。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 适合查看集群健康状态、Watcher 执行历史和失败记录,帮助快速定位是哪个 Watcher 的配置存在问题。
  • INFINI Gateway 可以部署在 Elasticsearch 前面,对 Watcher 触发的 HTTP 请求做观测和日志记录,辅助判断是配置问题还是目标服务响应问题。

5. 小结 #

could not parse http request template. invalid time value for [field] field 是一个典型的配置格式错误,并非运行时异常。排查的核心是确认具体哪个时间字段的值格式不合法,并将其修正为标准的时间值字符串。只要在配置 Watcher 时统一使用 30s1m500ms 这类标准格式,就可以完全避免此类问题。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

try {
    builder.connectionTimeout(WatcherDateTimeUtils.parseTimeValue(parser,
        HttpRequest.Field.CONNECTION_TIMEOUT.toString()));
} catch (ElasticsearchParseException pe) {
    throw new ElasticsearchParseException("could not parse http request template. invalid time value for [{}] field",
        pe, currentFieldName);
}