lib/aws_lambda_ric/telemetry_log_sink.rb (25 lines of code) (raw):
# frozen_string_literal: true
require 'logger'
require 'time'
class TelemetryLogSink < Logger::LogDevice
# TelemetryLogSink implements the logging contract between runtimes and the platform. It implements a simple
# framing protocol so message boundaries can be determined. Each frame can be visualized as follows:
#
# +----------------------+------------------------+---------------------+-------------------------+
# | Frame Type - 4 bytes | Length (len) - 4 bytes | Timestamp - 8 bytes | Message - \'len\' bytes |
# +----------------------+------------------------+---------------------+-------------------------+
#
# The first 4 bytes indicate the type of the frame - log frames have a type defined as the hex value 0xa55a0003. The
# second 4 bytes should indicate the message\'s length. Next, the timestamp in microsecond precision, and finally
# \'len\' bytes contain the message. The byte order is big-endian.
def initialize(file:)
@file = file
end
FRAME_BYTES = [0xa55a0003].pack('L>')
def write(msg)
@semaphore ||= Mutex.new
if @file.nil? || @file.closed?
$stdout.write(msg)
else
@semaphore.synchronize do
@file.write(FRAME_BYTES)
@file.write([msg.bytesize].pack('L>'))
@file.write([(Time.new.to_f*1000000).to_i].pack('Q>'))
@file.write(msg)
end
end
end
def reopen(log = nil)
# do nothing
end
def close
# do nothing
end
end