AWS-CloudWatch: InvalidSequenceTokenException

У меня есть php работник, где я регистрирую события, чтобы AWS мог наблюдать.
К сожалению, я получил следующую ошибку, когда я пытаюсь отправить его.

InvalidSequenceTokenException Ошибка выполнения «PutLogEvents» на
«https://logs.eu-west-1.amazonaws.com«; Ошибка HTTP AWS: ошибка клиента:
POST https://logs.eu-west-1.amazonaws.com привело к 400 Bad
Request
ответ:
{ «__Type»: «InvalidSequenceTokenException», «expectedSequenceToken»: «999999999999990356407851919528174
(усечено …) InvalidSequenceTokenException (client): данный
sequenceToken является недействительным. Следующая ожидаемая последовательность:
495599999999988500356407851919528174642 —
{ «__Type»: «InvalidSequenceTokenException», «expectedSequenceToken»: «495573099999999900356407851919528174642», «сообщение»: »
данный sequenceToken является недействительным. Следующая ожидаемая последовательность:
495579999999900356407851919528174642″ }

и это мой код

 $date = new DateTime();
$instance= = new CloudWatchLogsClient([
'region' => 'eu-west-1',
'version' => 'latest',
'credentials' => [
'key' => 'XXX',
'secret' => 'XXXX'
]
]);
$instance->putLogEvents([
'logGroupName' => "WorkerLog",
'logStreamName' => "log",
'logEvents' => [
[
'timestamp' => $date->getTimestamp(),
'message' => "test log"]
]
]);

5

Решение

http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html

Вы должны включить токен последовательности в ваш запрос. Если у вас его нет, вы должны использовать descriptionLogStreams (http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogStreams.html) чтобы получить последовательность потоков.

Когда вы сделаете вызов putLogEvents, вы получите nextToken в ответе. Вы также должны быть готовы к тому случаю, когда кто-то еще отправляет поток и делает недействительным nextToken. (в этом случае вам нужно снова описать поток, чтобы получить обновленный токен).

6

Другие решения

Это мое рабочее решение: перед отправкой новых putLogEvents вы должны взять последний uploadSequenceToken.

    try {
$client = \Aws\CloudWatchLogs\CloudWatchLogsClient::factory($configCloudWatch);

$logStreamName = 'testLogStream';
$logGroupName = 'testGroupName';

$result = $client->describeLogStreams([
'logGroupName' => $logGroupName,
'logStreamNamePrefix' => $logStreamName,
]);
$logStreams=$result->get('logStreams');
if (!$logStreams)
throw new \Exception('No log stream found');
if (count($logStreams)!=1)
throw new \Exception('Multiple log stream found');
$uploadSequenceToken = $logStreams[0]['uploadSequenceToken'];

$client->putLogEvents([
'logGroupName' => $logGroupName,
'logStreamName' => $logStreamName,
'logEvents' => [
[
'timestamp' => round(microtime(true) * 1000),
// message is required
'message' => json_encode([ ... ]
),
],
],
'sequenceToken' => $uploadSequenceToken,
]);
} catch (\Exception $e) {
\Log::error(__METHOD__, ['exception' => $e]);
}
0