使用云观察代理时如何解决"Invalid Sequence Token"?



我在/var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log中看到以下警告:

2021-10-06T06:39:23Z W! [outputs.cloudwatchlogs] Invalid SequenceToken used, will use new token and retry: The given sequenceToken is invalid. The next expected sequenceToken is: 49619410836690261519535138406911035003981074860446093650

但是没有提到哪个文件是真正失败的文件。即使我把"debug": true加到/opt/aws/amazon-cloudwatch-agent/bin/config.json上也不行

cat /opt/aws/amazon-cloudwatch-agent/bin/config.json|jq .agent
{
"metrics_collection_interval": 60,
"debug": true,
"run_as_user": "root"
}

我有很多(28)文件在我config.json.logs.logs_collected.files.collect_list部分的文件,所以我怎么能找到文件正是制造麻烦?

截至2021年11月29日,改进日志消息的PR已合并到cloudwatch-agent中,但新版本的cloudwatch-agent尚未发布,v1.247349.0之后的下一个版本可能会包含对此的修复。

修复将更改日志语句为

  • INFO: First time sending logs to %v/%v since startup so sequenceToken is nil, learned new token: xxxx: yyyy:这是一个INFO消息,因为这个行为在启动时是预期的。
  • WARN: Invalid SequenceToken used (%v) while sending logs to %v/%v, will use new token and retry: xxxxxv:另一方面,这是不期望的,可能意味着其他人正在并发地写日志组/日志流。

如果这些警告在重新启动cloudwatch代理(cwagent)之后出现,那么您可以安全地忽略它们,这是预期行为. cloudwatch代理不会将下一个序列令牌保存在其持久状态中,因此在重新启动时它将"学习"。通过发出一个根本没有序列令牌的PutLogEvent来获取正确的序列号,该事件返回一个带有下一个要使用的序列令牌的InvalidSequenceTokenException。所以应该是为了在启动时看到这些,无论如何,我向amazon-cloudwatch-agent提出了一个PR来改进这些日志消息。

如果使用了无效的SequenceToken在重启后很长时间才看到,那么你可能有其他问题。

使用了无效的SequenceToken错误通常意味着2中提到的两个实体/源试图写入相同的日志组/日志流(这实际上是针对旧的awlogs代理,但仍然有用):

捕获异常:一个错误发生(InvalidSequenceTokenException)调用PutLogEvents操作时:给定的sequenceToken是-or-多个代理可能正在向日志发送日志事件stream[…]-你不能将日志从多个日志文件推送到一个日志文件日志流。更新您的配置,将每个日志推送到一个日志流-日志组组合。

我可能是亚马逊cloudwatch代理本身它试图上传相同的文件两次因为你在config.json中有重复。

所以首先打印config.json中所有的日志组/日志流对:

cat /opt/aws/amazon-cloudwatch-agent/bin/config.json|jq -r '.logs.logs_collected.files.collect_list[]|"(.log_group_name) (.log_stream_name)"'|sort

的输出类似于:

/tableauserver/apigateway apigateway_node5-0.log
/tableauserver/apigateway control_apigateway_node5-0.log
/tableauserver/appzookeeper appzookeeper-discovery_node5-1.log
...
/tableauserver/vizqlserver vizqlserver_node5-3.log

然后你可以使用uniq -d来查找该列表中的重复项:

cat /opt/aws/amazon-cloudwatch-agent/bin/config.json|jq -r '.logs.logs_collected.files.collect_list[]|"(.log_group_name) (.log_stream_name)"'|sort|uniq -d
# The list should be empty otherwise you have duplicates

如果该命令产生任何输出,则意味着您的配置中有副本。json collect_list.

我个人认为cwagent本身应该打印"冒犯"。我在amazon-cloudwatch-agent的GitHub页面中打开了loggroup/logstream的日志。

最新更新