适用版本: 6.8-8.9
1. 错误异常的基本描述 #
could not parse [daily] schedule. invalid time value for field [field] - [token] 是 Elasticsearch Watcher 在解析 daily 类型调度时抛出的异常。该错误表明:解析器已经识别到了字段名(通常是 at),但对应的值不符合 DayTimes 所要求的时间格式,导致解析失败。
常见现象 #
- 在创建或更新 Watcher 时,Elasticsearch 返回
400 Bad Request,响应体中包含上述异常信息。 - Kibana 的 Watcher 管理界面无法保存包含
daily调度的配置,并提示调度解析失败。 - 日志中可以看到完整的异常栈,指向
DailySchedule或DayTimes.parse相关代码。
典型报错示例 #
{
"error": {
"root_cause": [
{
"type": "parse_exception",
"reason": "could not parse [daily] schedule. invalid time value for field [at] - [START_OBJECT]"
}
],
"type": "parse_exception",
"reason": "could not parse [daily] schedule. invalid time value for field [at] - [START_OBJECT]"
},
"status": 400
}
2. 为什么会发生这个错误 #
该异常的根本原因是 daily 调度中某个字段的值不符合 Elasticsearch 期望的时间格式。daily 调度支持通过 at 字段指定每天触发的时间点,其值必须是合法的时间字符串(如 HH:mm 格式)或该格式字符串组成的数组。
常见触发原因包括:
at字段的值不是HH:mm格式,例如写了"25:00"、"12:70"等非法时间。at字段的值类型错误,例如传入了对象{}、布尔值true、数字123等,而非字符串。at字段是一个数组,但数组中混入了非字符串元素,例如["10:00", true, {}]。- 将
daily调度与其他调度类型(如cron、interval)的语法混淆,导致字段结构错误。 - 动态生成 Watcher 配置的代码未对时间值做格式校验,传入了空字符串、
null或格式错误的变量值。
3. 如何排查这个异常 #
建议按以下步骤定位问题:
- 从异常信息中提取被点名的字段名
[field],通常是at。 - 检查触发异常的完整 Watcher 定义,定位
trigger.schedule.daily部分。 - 确认
at字段的值类型:- 如果是字符串,检查是否符合
HH:mm的 24 小时制格式。 - 如果是数组,逐个检查每个元素是否为合法的时间字符串。
- 如果是字符串,检查是否符合
- 如果配置是通过代码或模板动态生成的,检查生成逻辑中时间值的来源和格式校验。
- 使用 Elasticsearch 的
_validateAPI 或先在开发环境测试 Watcher 配置,避免直接在生产环境修改。
排查时需要注意的问题 #
- 不要把数组中的第一个错误元素当成唯一问题,必须检查数组中的所有元素。
- 异常信息中的
[token]部分可以提示实际解析到的内容类型(如START_OBJECT、VALUE_NUMBER等),对照源码可快速定位类型错误。 - 如果使用了 Kibana 的 Watcher UI,注意 UI 对时间格式有额外限制,建议对照官方文档确认格式。
4. 如何解决这个错误 #
常用修复方式 #
- 将
at字段的值修正为符合HH:mm格式的字符串,例如"10:30"、"23:59"。 - 如果
at是数组,确保每个元素都是合法的时间字符串,例如["10:00", "18:00"]。 - 检查并移除配置中的错误类型值(对象、布尔值、数字等),只保留字符串类型的时间值。
- 在生成 Watcher 配置的代码层面增加时间格式校验,避免非法值被写入。
正确配置示例 #
{
"trigger": {
"schedule": {
"daily": {
"at": "10:30"
}
}
}
}
多时间点配置示例 #
{
"trigger": {
"schedule": {
"daily": {
"at": ["09:00", "12:00", "18:00"]
}
}
}
}
借助 INFINI 产品提升排障效率 #
- INFINI Console 可以查看集群中的 Watcher 配置、执行状态和失败记录,帮助快速确认是哪个 Watcher 的配置存在问题。
- INFINI Gateway 可以拦截并观测发往 Elasticsearch 的请求,在 Watcher 配置更新时捕获完整的请求体和响应体,便于定位格式问题。
5. 小结 #
could not parse [daily] schedule. invalid time value for field [field] 是一个典型的配置解析错误,问题几乎总是出现在 at 字段的值上。排查时只要抓住字段名和 token 类型两个关键信息,就能快速定位是格式错误还是类型错误。修复的核心是确保所有时间值都严格符合 HH:mm 格式,并在代码层面做好输入校验。
相关错误 #
附:日志上下文 #
下面保留当前页面中的源码片段,便于结合异常调用栈定位问题:
} else if (AT_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
if (token != XContentParser.Token.START_ARRAY) {
try {
times.add(DayTimes.parse(parser, token));
} catch (ElasticsearchParseException pe) {
throw new ElasticsearchParseException("could not parse [{}] schedule. invalid time value for field [{}] - [{}]",
pe, TYPE, currentFieldName, token);
}
} else {
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
try {





