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

适用版本: 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 调度的配置,并提示调度解析失败。
  • 日志中可以看到完整的异常栈,指向 DailyScheduleDayTimes.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 调度与其他调度类型(如 croninterval)的语法混淆,导致字段结构错误。
  • 动态生成 Watcher 配置的代码未对时间值做格式校验,传入了空字符串、null 或格式错误的变量值。

3. 如何排查这个异常 #

建议按以下步骤定位问题:

  1. 从异常信息中提取被点名的字段名 [field],通常是 at
  2. 检查触发异常的完整 Watcher 定义,定位 trigger.schedule.daily 部分。
  3. 确认 at 字段的值类型:
    • 如果是字符串,检查是否符合 HH:mm 的 24 小时制格式。
    • 如果是数组,逐个检查每个元素是否为合法的时间字符串。
  4. 如果配置是通过代码或模板动态生成的,检查生成逻辑中时间值的来源和格式校验。
  5. 使用 Elasticsearch 的 _validate API 或先在开发环境测试 Watcher 配置,避免直接在生产环境修改。

排查时需要注意的问题 #

  • 不要把数组中的第一个错误元素当成唯一问题,必须检查数组中的所有元素。
  • 异常信息中的 [token] 部分可以提示实际解析到的内容类型(如 START_OBJECTVALUE_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 {