Class: Fluent::Plugin::AzureLogsIngestion::PayloadBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/fluent/plugin/azure_logs_ingestion/payload_builder.rb

Defined Under Namespace

Classes: Result

Constant Summary collapse

MAX_BYTES =
1_048_576

Instance Method Summary collapse

Constructor Details

#initialize(gzip:) ⇒ PayloadBuilder

Returns a new instance of PayloadBuilder.



28
29
30
# File 'lib/fluent/plugin/azure_logs_ingestion/payload_builder.rb', line 28

def initialize(gzip:)
  @gzip = gzip
end

Instance Method Details

#build(chunk) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/fluent/plugin/azure_logs_ingestion/payload_builder.rb', line 32

def build(chunk)
  raw_file = Tempfile.new('azure-logs-ingestion-raw')
  raw_file.binmode
  gzip_file = nil

  raw_size = 0
  record_count = 0
  first_record = true

  raw_size += write_bytes(raw_file, '[')
  chunk.each do |_event_time, record|
    json = JSON.generate(record.dup)
    raw_size += write_bytes(raw_file, ',') unless first_record
    raw_size += write_bytes(raw_file, json)
    first_record = false
    record_count += 1
  end
  raw_size += write_bytes(raw_file, ']')
  raw_file.flush
  raw_file.rewind

  gzip_size = nil
  io = raw_file
  content_encoding = nil
  content_length = raw_size

  if @gzip
    gzip_file, gzip_size = gzip_file_from(raw_file)
    io = gzip_file
    content_encoding = 'gzip'
    content_length = gzip_size
    raw_file.close!
  end

  validate!(raw_size: raw_size, gzip_size: gzip_size)

  Result.new(
    io: io,
    content_encoding: content_encoding,
    content_length: content_length,
    raw_size: raw_size,
    gzip_size: gzip_size,
    record_count: record_count
  )
rescue StandardError
  gzip_file.close! if gzip_file
  raw_file.close! if raw_file
  raise
end