适用版本: 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_timeout、read_timeout 等字段的值格式不符合 Elasticsearch 的时间值语法要求。
常见现象 #
- 创建或更新 Watcher 时返回
400错误,提示无法解析 HTTP request template。 - Kibana 的 Watcher 管理界面保存配置失败,提示模板解析错误。
- Elasticsearch 日志中出现
ElasticsearchParseException,并附带could not parse http request template信息。 - Watcher 的
_executeAPI 返回失败,提示时间字段解析异常。
典型报错与异常栈 #
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,或使用了不存在的单位如30sec、30seconds。 - 格式非法:传入了对象、数组或自然语言字符串(如
"thirty seconds"),而非标准的时间值格式。 - null 或空字符串:字段值为
null、空字符串""或仅包含空格,导致解析器无法处理。 - 混用字段:同时配置了
connection_timeout和connection_timeout_in_millis等数值版字段,且两者格式存在冲突。 - 模板渲染结果异常:当使用 Mustache 模板动态渲染 timeout 值时,渲染结果产生了非预期的内容(例如空值或错误格式)。
Elasticsearch 内部通过 WatcherDateTimeUtils.parseTimeValue 方法解析这些字段,该方法只接受形如 30s、1m、500ms 这样的标准时间字符串,其他格式均会抛出 ElasticsearchParseException。
3. 如何排查这个异常 #
建议按以下顺序进行排查:
- 确认报错字段名:从异常信息中找到
invalid time value for [field]中的具体字段名,常见字段包括connection_timeout、read_timeout。 - 定位 HTTP request template 配置:在 Watcher 定义中找到
actions.<action_id>.request下的对应字段。 - 检查字段值格式:确认值是否为合法的时间字符串,支持的单位包括:
ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)。 - 检查是否存在混用:确认没有同时配置带单位和不带单位的同名超时字段,避免解析冲突。
- 检查模板渲染结果:如果使用了 Mustache 模板动态生成 timeout 值,在
_execute时观察渲染后的实际内容。
排查时需要注意的问题 #
- 不要只看
400响应,需要查看完整的异常栈,确认具体是哪个字段解析失败。 - 如果 Watcher 是通过 Kibana 界面或 API 动态生成的,需要检查生成逻辑是否正确拼接了时间单位。
- 注意区分
http request template的超时字段与 Watcher 级别的timeout字段,两者位置和格式要求不同。
4. 如何解决这个错误 #
常用修复思路 #
- 修正时间值格式:将非法的时间值改为标准格式,例如
30s、1m、500ms。 - 补充缺失的单位:如果原值是纯数字,补充对应的时间单位,例如
30→30s。 - 移除非字符串类型的值:确保 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 配置中统一使用标准时间格式(
30s、1m、500ms),避免自定义或自然语言写法。 - 对动态生成 timeout 值的模板,增加渲染结果的格式校验,确保输出始终为合法的时间字符串。
- 使用
_executeAPI 在正式保存 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 时统一使用 30s、1m、500ms 这类标准格式,就可以完全避免此类问题。
相关错误 #
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
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);
}





