Module: Lapsoss::Adapters::Concerns::EnvelopeBuilder

Extended by:
ActiveSupport::Concern
Included in:
OtlpAdapter, RollbarAdapter, SentryAdapter
Defined in:
lib/lapsoss/adapters/concerns/envelope_builder.rb

Constant Summary collapse

GZIP_THRESHOLD =
30.kilobytes

Instance Method Summary collapse

Instance Method Details

#build_envelope_wrapper(event) ⇒ Object

Build envelope with common structure



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/lapsoss/adapters/concerns/envelope_builder.rb', line 24

def build_envelope_wrapper(event)
  envelope = {
    id: event.fingerprint.presence || SecureRandom.uuid,
    timestamp: format_timestamp(event.timestamp),
    environment: event.environment.presence || "production",
    level: map_level(event.level),
    platform: "ruby",
    sdk: sdk_info
  }

  # Add event-specific data
  envelope.merge!(build_event_data(event))

  # Add context data
  envelope.merge!(
    tags: event.tags.presence,
    user: event.user_context.presence,
    extra: event.extra.presence,
    breadcrumbs: format_breadcrumbs(event.breadcrumbs)
  ).compact_blank
end

#format_breadcrumbs(breadcrumbs) ⇒ Object

Format breadcrumbs consistently



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/lapsoss/adapters/concerns/envelope_builder.rb', line 53

def format_breadcrumbs(breadcrumbs)
  return nil if breadcrumbs.blank?

  breadcrumbs.map do |crumb|
    {
      timestamp: format_timestamp(crumb[:timestamp]),
      type: crumb[:type].presence || "default",
      message: crumb[:message],
      data: crumb.except(:timestamp, :type, :message).presence
    }.compact_blank
  end
end

#format_timestamp(time) ⇒ Object

Format timestamp using AS helpers



47
48
49
50
# File 'lib/lapsoss/adapters/concerns/envelope_builder.rb', line 47

def format_timestamp(time)
  time = Time.current if time.blank?
  time.in_time_zone("UTC").iso8601
end

#sdk_infoObject

SDK info for all adapters



67
68
69
70
71
72
73
74
75
76
# File 'lib/lapsoss/adapters/concerns/envelope_builder.rb', line 67

def sdk_info
  {
    name: "lapsoss",
    version: Lapsoss::VERSION,
    packages: [ {
      name: "lapsoss-ruby",
      version: Lapsoss::VERSION
    } ]
  }
end

#serialize_payload(data, compress: :auto) ⇒ Object

Serialize and optionally compress



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/lapsoss/adapters/concerns/envelope_builder.rb', line 79

def serialize_payload(data, compress: :auto)
  json = ActiveSupport::JSON.encode(data)

  should_compress = case compress
  when :auto then json.bytesize >= compress_threshold
  when true then true
  else false
  end

  if should_compress
    [ ActiveSupport::Gzip.compress(json), true ]
  else
    [ json, false ]
  end
end