logstruct 0.0.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -22
  3. data/README.md +25 -2
  4. data/lib/log_struct/boot_buffer.rb +28 -0
  5. data/lib/log_struct/builders/active_job.rb +84 -0
  6. data/lib/log_struct/concerns/configuration.rb +126 -13
  7. data/lib/log_struct/concerns/error_handling.rb +3 -7
  8. data/lib/log_struct/concerns/logging.rb +5 -5
  9. data/lib/log_struct/config_struct/filters.rb +18 -0
  10. data/lib/log_struct/config_struct/integrations.rb +16 -12
  11. data/lib/log_struct/configuration.rb +13 -0
  12. data/lib/log_struct/enums/event.rb +13 -0
  13. data/lib/log_struct/enums/log_field.rb +154 -0
  14. data/lib/log_struct/enums/source.rb +4 -1
  15. data/lib/log_struct/formatter.rb +29 -17
  16. data/lib/log_struct/integrations/action_mailer/error_handling.rb +3 -11
  17. data/lib/log_struct/integrations/action_mailer/event_logging.rb +22 -12
  18. data/lib/log_struct/integrations/active_job/log_subscriber.rb +52 -48
  19. data/lib/log_struct/integrations/active_model_serializers.rb +49 -0
  20. data/lib/log_struct/integrations/active_record.rb +35 -5
  21. data/lib/log_struct/integrations/active_storage.rb +59 -20
  22. data/lib/log_struct/integrations/ahoy.rb +54 -0
  23. data/lib/log_struct/integrations/carrierwave.rb +13 -16
  24. data/lib/log_struct/integrations/dotenv.rb +278 -0
  25. data/lib/log_struct/integrations/good_job/log_subscriber.rb +86 -136
  26. data/lib/log_struct/integrations/good_job/logger.rb +8 -10
  27. data/lib/log_struct/integrations/good_job.rb +5 -7
  28. data/lib/log_struct/integrations/host_authorization.rb +25 -4
  29. data/lib/log_struct/integrations/lograge.rb +20 -14
  30. data/lib/log_struct/integrations/puma.rb +482 -0
  31. data/lib/log_struct/integrations/rack_error_handler/middleware.rb +11 -18
  32. data/lib/log_struct/integrations/shrine.rb +44 -19
  33. data/lib/log_struct/integrations/sorbet.rb +48 -0
  34. data/lib/log_struct/integrations.rb +25 -0
  35. data/lib/log_struct/log/action_mailer/delivered.rb +99 -0
  36. data/lib/log_struct/log/action_mailer/delivery.rb +99 -0
  37. data/lib/log_struct/log/action_mailer.rb +30 -45
  38. data/lib/log_struct/log/active_job/enqueue.rb +125 -0
  39. data/lib/log_struct/log/active_job/finish.rb +130 -0
  40. data/lib/log_struct/log/active_job/schedule.rb +125 -0
  41. data/lib/log_struct/log/active_job/start.rb +130 -0
  42. data/lib/log_struct/log/active_job.rb +41 -54
  43. data/lib/log_struct/log/active_model_serializers.rb +94 -0
  44. data/lib/log_struct/log/active_storage/delete.rb +87 -0
  45. data/lib/log_struct/log/active_storage/download.rb +103 -0
  46. data/lib/log_struct/log/active_storage/exist.rb +93 -0
  47. data/lib/log_struct/log/active_storage/metadata.rb +93 -0
  48. data/lib/log_struct/log/active_storage/stream.rb +93 -0
  49. data/lib/log_struct/log/active_storage/upload.rb +118 -0
  50. data/lib/log_struct/log/active_storage/url.rb +93 -0
  51. data/lib/log_struct/log/active_storage.rb +32 -68
  52. data/lib/log_struct/log/ahoy.rb +88 -0
  53. data/lib/log_struct/log/carrierwave/delete.rb +115 -0
  54. data/lib/log_struct/log/carrierwave/download.rb +131 -0
  55. data/lib/log_struct/log/carrierwave/upload.rb +141 -0
  56. data/lib/log_struct/log/carrierwave.rb +37 -72
  57. data/lib/log_struct/log/dotenv/load.rb +76 -0
  58. data/lib/log_struct/log/dotenv/restore.rb +76 -0
  59. data/lib/log_struct/log/dotenv/save.rb +76 -0
  60. data/lib/log_struct/log/dotenv/update.rb +76 -0
  61. data/lib/log_struct/log/dotenv.rb +12 -0
  62. data/lib/log_struct/log/error.rb +58 -46
  63. data/lib/log_struct/log/good_job/enqueue.rb +126 -0
  64. data/lib/log_struct/log/good_job/error.rb +151 -0
  65. data/lib/log_struct/log/good_job/finish.rb +136 -0
  66. data/lib/log_struct/log/good_job/log.rb +131 -0
  67. data/lib/log_struct/log/good_job/schedule.rb +136 -0
  68. data/lib/log_struct/log/good_job/start.rb +136 -0
  69. data/lib/log_struct/log/good_job.rb +40 -141
  70. data/lib/log_struct/log/interfaces/additional_data_field.rb +1 -17
  71. data/lib/log_struct/log/interfaces/common_fields.rb +1 -39
  72. data/lib/log_struct/log/interfaces/public_common_fields.rb +4 -0
  73. data/lib/log_struct/log/interfaces/request_fields.rb +1 -33
  74. data/lib/log_struct/log/plain.rb +59 -34
  75. data/lib/log_struct/log/puma/shutdown.rb +80 -0
  76. data/lib/log_struct/log/puma/start.rb +120 -0
  77. data/lib/log_struct/log/puma.rb +10 -0
  78. data/lib/log_struct/log/request.rb +132 -48
  79. data/lib/log_struct/log/security/blocked_host.rb +141 -0
  80. data/lib/log_struct/log/security/csrf_violation.rb +131 -0
  81. data/lib/log_struct/log/security/ip_spoof.rb +141 -0
  82. data/lib/log_struct/log/security.rb +40 -70
  83. data/lib/log_struct/log/shared/add_request_fields.rb +1 -26
  84. data/lib/log_struct/log/shared/merge_additional_data_fields.rb +1 -25
  85. data/lib/log_struct/log/shared/serialize_common.rb +1 -33
  86. data/lib/log_struct/log/shared/serialize_common_public.rb +44 -0
  87. data/lib/log_struct/log/shrine/delete.rb +85 -0
  88. data/lib/log_struct/log/shrine/download.rb +90 -0
  89. data/lib/log_struct/log/shrine/exist.rb +90 -0
  90. data/lib/log_struct/log/shrine/metadata.rb +90 -0
  91. data/lib/log_struct/log/shrine/upload.rb +105 -0
  92. data/lib/log_struct/log/shrine.rb +10 -67
  93. data/lib/log_struct/log/sidekiq.rb +65 -26
  94. data/lib/log_struct/log/sql.rb +113 -106
  95. data/lib/log_struct/log.rb +31 -32
  96. data/lib/log_struct/multi_error_reporter.rb +80 -22
  97. data/lib/log_struct/param_filters.rb +50 -7
  98. data/lib/log_struct/rails_boot_banner_silencer.rb +123 -0
  99. data/lib/log_struct/railtie.rb +71 -0
  100. data/lib/log_struct/semantic_logger/formatter.rb +4 -2
  101. data/lib/log_struct/semantic_logger/setup.rb +34 -18
  102. data/lib/log_struct/shared/interfaces/additional_data_field.rb +22 -0
  103. data/lib/log_struct/shared/interfaces/common_fields.rb +39 -0
  104. data/lib/log_struct/shared/interfaces/public_common_fields.rb +29 -0
  105. data/lib/log_struct/shared/interfaces/request_fields.rb +39 -0
  106. data/lib/log_struct/shared/shared/add_request_fields.rb +28 -0
  107. data/lib/log_struct/shared/shared/merge_additional_data_fields.rb +27 -0
  108. data/lib/log_struct/shared/shared/serialize_common.rb +58 -0
  109. data/lib/log_struct/version.rb +1 -1
  110. data/lib/log_struct.rb +22 -4
  111. data/logstruct.gemspec +3 -0
  112. metadata +108 -5
  113. data/lib/log_struct/log/interfaces/message_field.rb +0 -20
  114. data/lib/log_struct/log_keys.rb +0 -102
@@ -0,0 +1,76 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class Dotenv
23
+ class Save < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::Dotenv, default: Source::Dotenv
33
+ const :event, Event, default: Event::Save
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ # Event-specific fields
38
+ const :snapshot, T::Boolean
39
+
40
+ # Additional data
41
+
42
+ # Request fields (optional)
43
+
44
+ # Serialize shared fields
45
+ include LogStruct::Log::Interfaces::CommonFields
46
+ include LogStruct::Log::Shared::SerializeCommon
47
+
48
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
49
+ def self.base_hash
50
+ {}
51
+ end
52
+
53
+ sig {
54
+ params(snapshot: T.untyped,
55
+ additional_data: T.untyped,
56
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
57
+ }
58
+ def self.build(snapshot:,
59
+ additional_data: nil,
60
+ timestamp: Time.now)
61
+ h = base_hash
62
+ h[LogField::Snapshot] = snapshot
63
+ h
64
+ end
65
+
66
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
67
+ def to_h
68
+ self.class.build(
69
+ snapshot: snapshot,
70
+ timestamp: timestamp
71
+ )
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,76 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class Dotenv
23
+ class Update < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::Dotenv, default: Source::Dotenv
33
+ const :event, Event, default: Event::Update
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ # Event-specific fields
38
+ const :vars, T::Array[String]
39
+
40
+ # Additional data
41
+
42
+ # Request fields (optional)
43
+
44
+ # Serialize shared fields
45
+ include LogStruct::Log::Interfaces::CommonFields
46
+ include LogStruct::Log::Shared::SerializeCommon
47
+
48
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
49
+ def self.base_hash
50
+ {}
51
+ end
52
+
53
+ sig {
54
+ params(vars: T.untyped,
55
+ additional_data: T.untyped,
56
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
57
+ }
58
+ def self.build(vars:,
59
+ additional_data: nil,
60
+ timestamp: Time.now)
61
+ h = base_hash
62
+ h[LogField::Vars] = vars
63
+ h
64
+ end
65
+
66
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
67
+ def to_h
68
+ self.class.build(
69
+ vars: vars,
70
+ timestamp: timestamp
71
+ )
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,12 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/source_parent.rb.erb
8
+
9
+ require_relative "dotenv/load"
10
+ require_relative "dotenv/update"
11
+ require_relative "dotenv/save"
12
+ require_relative "dotenv/restore"
@@ -1,74 +1,86 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative "interfaces/common_fields"
5
- require_relative "interfaces/additional_data_field"
6
- require_relative "interfaces/message_field"
7
- require_relative "shared/serialize_common"
8
- require_relative "shared/merge_additional_data_fields"
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
9
15
  require_relative "../enums/source"
10
16
  require_relative "../enums/event"
11
17
  require_relative "../enums/level"
12
- require_relative "../log_keys"
18
+ require_relative "../enums/log_field"
13
19
 
14
20
  module LogStruct
15
21
  module Log
16
- # Exception log entry for Ruby exceptions with class, message, and backtrace
17
22
  class Error < T::Struct
18
- extend T::Sig
23
+ # typed: strict
24
+ # frozen_string_literal: true
19
25
 
20
- include Interfaces::CommonFields
21
- include Interfaces::AdditionalDataField
22
- include Interfaces::MessageField
23
- include MergeAdditionalDataFields
26
+ extend T::Sig
24
27
 
25
- ErrorEvent = T.type_alias {
26
- Event::Error
27
- }
28
+ extend T::Sig
28
29
 
29
- # Common fields
30
- const :source, Source # Used by all sources, should not have a default.
31
- const :event, ErrorEvent, default: T.let(Event::Error, ErrorEvent)
30
+ # Shared/common fields
31
+ const :source, Source
32
+ const :event, Event, default: Event::Error
32
33
  const :timestamp, Time, factory: -> { Time.now }
33
- const :level, Level, default: T.let(Level::Error, Level)
34
+ const :level, Level, default: Level::Info
34
35
 
35
- # Exception-specific fields
36
+ # Event-specific fields
36
37
  const :err_class, T.class_of(StandardError)
37
38
  const :message, String
38
39
  const :backtrace, T.nilable(T::Array[String]), default: nil
39
- const :additional_data, T::Hash[Symbol, T.untyped], default: {}
40
40
 
41
- # Convert the log entry to a hash for serialization
42
- sig { override.params(strict: T::Boolean).returns(T::Hash[Symbol, T.untyped]) }
43
- def serialize(strict = true)
44
- hash = serialize_common(strict)
45
- merge_additional_data_fields(hash)
41
+ # Additional data
42
+ include LogStruct::Log::Interfaces::AdditionalDataField
43
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
44
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
45
+
46
+ # Request fields (optional)
46
47
 
47
- # Add exception-specific fields
48
- hash[LOG_KEYS.fetch(:err_class)] = err_class.name
49
- hash[LOG_KEYS.fetch(:message)] = message
50
- if backtrace.is_a?(Array) && backtrace&.any?
51
- hash[LOG_KEYS.fetch(:backtrace)] = backtrace&.first(10)
52
- end
48
+ # Serialize shared fields
49
+ include LogStruct::Log::Interfaces::CommonFields
50
+ include LogStruct::Log::Shared::SerializeCommon
53
51
 
54
- hash
52
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
53
+ def self.base_hash
54
+ {}
55
55
  end
56
56
 
57
- # Create an Error log from a Ruby StandardError
58
57
  sig {
59
- params(
60
- source: Source,
61
- ex: StandardError,
62
- additional_data: T::Hash[Symbol, T.untyped]
63
- ).returns(Log::Error)
58
+ params(err_class: T.untyped,
59
+ message: T.untyped,
60
+ backtrace: T.untyped,
61
+ additional_data: T.untyped,
62
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
64
63
  }
65
- def self.from_exception(source, ex, additional_data = {})
66
- new(
67
- source: source,
68
- message: ex.message,
69
- err_class: ex.class,
70
- backtrace: ex.backtrace,
71
- additional_data: additional_data
64
+ def self.build(err_class:,
65
+ message:,
66
+ backtrace: nil,
67
+ additional_data: nil,
68
+ timestamp: Time.now)
69
+ h = base_hash
70
+ h[LogField::ErrClass] = err_class
71
+ h[LogField::Message] = message
72
+ h[LogField::Backtrace] = backtrace unless backtrace.nil?
73
+ h
74
+ end
75
+
76
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
77
+ def to_h
78
+ self.class.build(
79
+ err_class: err_class,
80
+ message: message,
81
+ backtrace: backtrace,
82
+ additional_data: additional_data,
83
+ timestamp: timestamp
72
84
  )
73
85
  end
74
86
  end
@@ -0,0 +1,126 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class GoodJob
23
+ class Enqueue < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::Job, default: Source::Job
33
+ const :event, Event, default: Event::Enqueue
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ const :job_id, T.nilable(String), default: nil
38
+ const :job_class, T.nilable(String), default: nil
39
+ const :queue_name, T.nilable(String), default: nil
40
+ const :arguments, T.nilable(T::Array[T.untyped]), default: nil
41
+ const :executions, T.nilable(Integer), default: nil
42
+
43
+ # Event-specific fields
44
+ const :duration_ms, Float
45
+ const :scheduled_at, T.nilable(Time), default: nil
46
+
47
+ # Additional data
48
+ include LogStruct::Log::Interfaces::AdditionalDataField
49
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
50
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
51
+
52
+ # Request fields (optional)
53
+
54
+ # Serialize shared fields
55
+ include LogStruct::Log::Interfaces::CommonFields
56
+ include LogStruct::Log::Shared::SerializeCommon
57
+
58
+ sig {
59
+ params(job_id: T.untyped,
60
+ job_class: T.untyped,
61
+ queue_name: T.untyped,
62
+ arguments: T.untyped,
63
+ executions: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
64
+ }
65
+ def self.base_hash(job_id: nil,
66
+ job_class: nil,
67
+ queue_name: nil,
68
+ arguments: nil,
69
+ executions: nil)
70
+ h = {}
71
+ h[LogField::JobId] = job_id unless job_id.nil?
72
+ h[LogField::JobClass] = job_class unless job_class.nil?
73
+ h[LogField::QueueName] = queue_name unless queue_name.nil?
74
+ h[LogField::Arguments] = arguments unless arguments.nil?
75
+ h[LogField::Executions] = executions unless executions.nil?
76
+ h
77
+ end
78
+
79
+ sig {
80
+ params(duration_ms: T.untyped,
81
+ job_id: T.untyped,
82
+ job_class: T.untyped,
83
+ queue_name: T.untyped,
84
+ arguments: T.untyped,
85
+ executions: T.untyped,
86
+ scheduled_at: T.untyped,
87
+ additional_data: T.untyped,
88
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
89
+ }
90
+ def self.build(duration_ms:,
91
+ job_id: nil,
92
+ job_class: nil,
93
+ queue_name: nil,
94
+ arguments: nil,
95
+ executions: nil,
96
+ scheduled_at: nil,
97
+ additional_data: nil,
98
+ timestamp: Time.now)
99
+ h = base_hash(job_id: job_id,
100
+ job_class: job_class,
101
+ queue_name: queue_name,
102
+ arguments: arguments,
103
+ executions: executions)
104
+ h[LogField::DurationMs] = duration_ms
105
+ h[LogField::ScheduledAt] = scheduled_at unless scheduled_at.nil?
106
+ h
107
+ end
108
+
109
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
110
+ def to_h
111
+ self.class.build(
112
+ job_id: job_id,
113
+ job_class: job_class,
114
+ queue_name: queue_name,
115
+ arguments: arguments,
116
+ executions: executions,
117
+ duration_ms: duration_ms,
118
+ scheduled_at: scheduled_at,
119
+ additional_data: additional_data,
120
+ timestamp: timestamp
121
+ )
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,151 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class GoodJob
23
+ class Error < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::Job, default: Source::Job
33
+ const :event, Event, default: Event::Error
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ const :job_id, T.nilable(String), default: nil
38
+ const :job_class, T.nilable(String), default: nil
39
+ const :queue_name, T.nilable(String), default: nil
40
+ const :arguments, T.nilable(T::Array[T.untyped]), default: nil
41
+ const :executions, T.nilable(Integer), default: nil
42
+
43
+ # Event-specific fields
44
+ const :err_class, String
45
+ const :error_message, String
46
+ const :duration_ms, T.nilable(Float), default: nil
47
+ const :process_id, Integer
48
+ const :thread_id, String
49
+ const :exception_executions, T.nilable(Integer), default: nil
50
+ const :backtrace, T.nilable(T::Array[String]), default: nil
51
+
52
+ # Additional data
53
+ include LogStruct::Log::Interfaces::AdditionalDataField
54
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
55
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
56
+
57
+ # Request fields (optional)
58
+
59
+ # Serialize shared fields
60
+ include LogStruct::Log::Interfaces::CommonFields
61
+ include LogStruct::Log::Shared::SerializeCommon
62
+
63
+ sig {
64
+ params(job_id: T.untyped,
65
+ job_class: T.untyped,
66
+ queue_name: T.untyped,
67
+ arguments: T.untyped,
68
+ executions: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
69
+ }
70
+ def self.base_hash(job_id: nil,
71
+ job_class: nil,
72
+ queue_name: nil,
73
+ arguments: nil,
74
+ executions: nil)
75
+ h = {}
76
+ h[LogField::JobId] = job_id unless job_id.nil?
77
+ h[LogField::JobClass] = job_class unless job_class.nil?
78
+ h[LogField::QueueName] = queue_name unless queue_name.nil?
79
+ h[LogField::Arguments] = arguments unless arguments.nil?
80
+ h[LogField::Executions] = executions unless executions.nil?
81
+ h
82
+ end
83
+
84
+ sig {
85
+ params(err_class: T.untyped,
86
+ error_message: T.untyped,
87
+ process_id: T.untyped,
88
+ thread_id: T.untyped,
89
+ job_id: T.untyped,
90
+ job_class: T.untyped,
91
+ queue_name: T.untyped,
92
+ arguments: T.untyped,
93
+ executions: T.untyped,
94
+ duration_ms: T.untyped,
95
+ exception_executions: T.untyped,
96
+ backtrace: T.untyped,
97
+ additional_data: T.untyped,
98
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
99
+ }
100
+ def self.build(err_class:,
101
+ error_message:,
102
+ process_id:,
103
+ thread_id:,
104
+ job_id: nil,
105
+ job_class: nil,
106
+ queue_name: nil,
107
+ arguments: nil,
108
+ executions: nil,
109
+ duration_ms: nil,
110
+ exception_executions: nil,
111
+ backtrace: nil,
112
+ additional_data: nil,
113
+ timestamp: Time.now)
114
+ h = base_hash(job_id: job_id,
115
+ job_class: job_class,
116
+ queue_name: queue_name,
117
+ arguments: arguments,
118
+ executions: executions)
119
+ h[LogField::ErrClass] = err_class
120
+ h[LogField::ErrorMessage] = error_message
121
+ h[LogField::DurationMs] = duration_ms unless duration_ms.nil?
122
+ h[LogField::ProcessId] = process_id
123
+ h[LogField::ThreadId] = thread_id
124
+ h[LogField::ExceptionExecutions] = exception_executions unless exception_executions.nil?
125
+ h[LogField::Backtrace] = backtrace unless backtrace.nil?
126
+ h
127
+ end
128
+
129
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
130
+ def to_h
131
+ self.class.build(
132
+ job_id: job_id,
133
+ job_class: job_class,
134
+ queue_name: queue_name,
135
+ arguments: arguments,
136
+ executions: executions,
137
+ err_class: err_class,
138
+ error_message: error_message,
139
+ duration_ms: duration_ms,
140
+ process_id: process_id,
141
+ thread_id: thread_id,
142
+ exception_executions: exception_executions,
143
+ backtrace: backtrace,
144
+ additional_data: additional_data,
145
+ timestamp: timestamp
146
+ )
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end