适用版本: 6.8-8.x
1. 错误说明 #
报错 failed to parse [<type>] action [<watch_id>/<action_id>]. unexpected token [<token>/<field>] 表示 Elasticsearch 在解析 action 配置时,读到了当前状态下不应该出现的 JSON token 或字段。
从附录代码看,这类异常通常出现在两种情况之后:一是某个字段解析失败,二是解析器继续向下读取时发现当前位置的 token 类型或字段名不符合当前 action 的结构要求。
2. 常见触发场景 #
- 本应写对象的地方写成了字符串或数组。
- 字段嵌套层级错误,导致解析器在错误位置读到字段名。
- JSON 少了花括号、逗号或闭合结构,令后续 token 序列错位。
错误示例:
{
"actions": {
"notify": {
"slack": [
{
"account": "team-default"
}
]
}
}
}
如果某个 action 期望对象,却收到数组起始 token,就可能触发该错误。
3. 排查方法 #
- 先看异常里给出的
token和field,确认解析器是在什么位置失步。 - 对照对应 action 的合法 JSON 结构,检查每一层是否用了正确的对象或数组。
- 将请求复制到 JSON 校验工具中,排除基础语法问题。
- 如果配置由程序动态生成,打印最终 payload,而不是只看中间对象。
4. 修复方法 #
- 把错误位置的数组、对象或标量类型改回接口要求的结构。
- 修正字段嵌套关系,避免把合法字段放到错误层级。
- 对生成逻辑增加结构测试,防止序列化后 token 顺序异常。
修正思路通常是把 action 重新整理成 Elasticsearch 文档要求的对象结构,再逐步加回可选字段。
5. 预防建议 #
- 对 Watcher action 使用固定模板,不要手工拼接片段。
- 对提交前的 JSON 做语法和结构双重校验。
- 出现此类错误时优先保留“最终发出的请求体”,这是定位根因最关键的证据。
相关错误 #
附:日志上下文 #
} catch (Exception e) {
throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. failed to parse [{}] field"; e; TYPE;
watchId; actionId; Field.FIELDS.getPreferredName());
}
} else {
throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. unexpected token [{}/{}]"; TYPE; watchId;
actionId; token; currentFieldName);
}
}
if (fields == null) {
fields = Collections.emptyMap();





