Module: LogStruct::Integrations::ActiveStorage

Extended by:
IntegrationInterface, T::Sig
Defined in:
lib/log_struct/integrations/active_storage.rb

Overview

Integration for ActiveStorage structured logging

Class Method Summary collapse

Methods included from IntegrationInterface

setup

Class Method Details

.process_active_storage_event(event, config) ⇒ void

This method returns an undefined value.

Process ActiveStorage events and create structured logs

Parameters:



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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/log_struct/integrations/active_storage.rb', line 34

def self.process_active_storage_event(event, config)
  return unless config.enabled
  return unless config.integrations.enable_activestorage

  # Extract key information from the event
  event_name = event.name.sub(/\.active_storage$/, "")
  service_name = event.payload[:service]
  duration_ms = event.duration

  # Map service events to log event types
  event_type = case event_name
  when "service_upload"
    Event::Upload
  when "service_download"
    Event::Download
  when "service_delete"
    Event::Delete
  when "service_delete_prefixed"
    Event::Delete
  when "service_exist"
    Event::Exist
  when "service_url"
    Event::Url
  when "service_download_chunk"
    Event::Download
  when "service_stream"
    Event::Stream
  when "service_update_metadata"
    Event::Metadata
  else
    Event::Unknown
  end

  # Map the event name to an operation
  event_name.sub(/^service_/, "").to_sym

  # Create structured log event using generated classes
  log_data = case event_type
  when Event::Upload
    Log::ActiveStorage::Upload.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      checksum: event.payload[:checksum]&.to_s,
      duration_ms: duration_ms,
      metadata: event.payload[:metadata],
      filename: event.payload[:filename],
      mime_type: event.payload[:content_type],
      size: event.payload[:byte_size]
    )
  when Event::Download
    Log::ActiveStorage::Download.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      filename: event.payload[:filename],
      range: event.payload[:range],
      duration_ms: duration_ms
    )
  when Event::Delete
    Log::ActiveStorage::Delete.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s
    )
  when Event::Metadata
    Log::ActiveStorage::Metadata.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      metadata: event.payload[:metadata]
    )
  when Event::Exist
    Log::ActiveStorage::Exist.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      exist: event.payload[:exist]
    )
  when Event::Stream
    Log::ActiveStorage::Stream.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      prefix: event.payload[:prefix]
    )
  when Event::Url
    Log::ActiveStorage::Url.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      url: event.payload[:url]
    )
  else
    Log::ActiveStorage::Metadata.new(
      storage: service_name.to_sym,
      file_id: event.payload[:key]&.to_s,
      metadata: event.payload[:metadata]
    )
  end

  # Log structured data
  LogStruct.info(log_data)
end

.setup(config) ⇒ Boolean?

Set up ActiveStorage structured logging

Parameters:

Returns:

  • (Boolean, nil)


17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/log_struct/integrations/active_storage.rb', line 17

def self.setup(config)
  return nil unless defined?(::ActiveStorage)
  return nil unless config.enabled
  return nil unless config.integrations.enable_activestorage

  # Subscribe to all ActiveStorage service events
  ::ActiveSupport::Notifications.subscribe(/service_.*\.active_storage/) do |*args|
    process_active_storage_event(::ActiveSupport::Notifications::Event.new(*args), config)
  end

  true
end