class Kuroko2::ExecutionLogger::CloudWatchLogs

def put_logs(events)

def put_logs(events)
  exception_cb = lambda do |exception|
    Kuroko2.logger.warn("#{exception.class} #{exception.message} #{events}")
    case exception
    when Aws::CloudWatchLogs::Errors::InvalidSequenceTokenException
      old_token = @put_log_token
      new_token = exception.message.match(%r{\AThe given sequenceToken is invalid. The next expected sequenceToken is:\s*(\w+)\z})[1]
      if new_token
        @put_log_token = new_token
        Kuroko2.logger.warn("Refreshed sequenceToken from '#{old_token}' to '#{@put_log_token}'")
      end
    when Aws::CloudWatchLogs::Errors::ResourceNotFoundException
      create_log_stream
    when Aws::CloudWatchLogs::Errors::ThrottlingException
      sleep(0.5)
    end
  end
  retry_options = {
    exception_cb: exception_cb,
    on: RETRY_ERRORS,
    tries: MAX_RETRY_COUNT,
    sleep: 0,
  }
  Retryable.retryable(retry_options) do
    response = client.put_log_events(
      log_group_name: @group_name,
      log_stream_name: @stream_name,
      log_events: events,
      sequence_token: @put_log_token,
    )
    @put_log_token = response.data[:next_sequence_token]
    Kuroko2.logger.debug("Put logs: #{@group_name} #{@stream_name} / #{response.data}")
    response
  end
end