scout_apm_logging 0.0.12 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -4
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +8 -0
  5. data/NOTICE +4 -0
  6. data/lib/scout_apm/logging/config.rb +5 -131
  7. data/lib/scout_apm/logging/loggers/capture.rb +8 -6
  8. data/lib/scout_apm/logging/loggers/formatter.rb +21 -2
  9. data/lib/scout_apm/logging/loggers/opentelemetry/LICENSE +201 -0
  10. data/lib/scout_apm/logging/loggers/opentelemetry/NOTICE +9 -0
  11. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs/log_record.rb +18 -0
  12. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs/logger.rb +64 -0
  13. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs/logger_provider.rb +31 -0
  14. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs/severity_number.rb +43 -0
  15. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs/version.rb +18 -0
  16. data/lib/scout_apm/logging/loggers/opentelemetry/api/logs.rb +28 -0
  17. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/exporter/otlp/logs_exporter.rb +389 -0
  18. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/exporter/otlp/version.rb +20 -0
  19. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/proto/collector/logs/v1/logs_service_pb.rb +43 -0
  20. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/proto/common/v1/common_pb.rb +58 -0
  21. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/proto/logs/v1/logs_pb.rb +91 -0
  22. data/lib/scout_apm/logging/loggers/opentelemetry/exporter/proto/resource/v1/resource_pb.rb +33 -0
  23. data/lib/scout_apm/logging/loggers/opentelemetry/opentelemetry.rb +62 -0
  24. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/export/batch_log_record_processor.rb +225 -0
  25. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/export/log_record_exporter.rb +64 -0
  26. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/export.rb +34 -0
  27. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/log_record.rb +115 -0
  28. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/log_record_data.rb +31 -0
  29. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/log_record_processor.rb +53 -0
  30. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/logger.rb +94 -0
  31. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/logger_provider.rb +158 -0
  32. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs/version.rb +20 -0
  33. data/lib/scout_apm/logging/loggers/opentelemetry/sdk/logs.rb +28 -0
  34. data/lib/scout_apm/logging/loggers/patches/rails_logger.rb +17 -0
  35. data/lib/scout_apm/logging/loggers/proxy.rb +22 -5
  36. data/lib/scout_apm/logging/loggers/swaps/rails.rb +4 -12
  37. data/lib/scout_apm/logging/loggers/swaps/scout.rb +2 -10
  38. data/lib/scout_apm/logging/loggers/swaps/sidekiq.rb +2 -6
  39. data/lib/scout_apm/logging/utils.rb +0 -69
  40. data/lib/scout_apm/logging/version.rb +1 -1
  41. data/lib/scout_apm_logging.rb +3 -12
  42. data/scout_apm_logging.gemspec +7 -0
  43. data/spec/data/config_test_1.yml +0 -1
  44. data/spec/data/mock_config.yml +0 -3
  45. data/spec/integration/rails/lifecycle_spec.rb +57 -23
  46. data/spec/spec_helper.rb +0 -12
  47. data/spec/unit/config_spec.rb +0 -12
  48. data/spec/unit/loggers/capture_spec.rb +0 -6
  49. metadata +127 -39
  50. data/bin/scout_apm_logging_monitor +0 -6
  51. data/lib/scout_apm/logging/monitor/_rails.rb +0 -22
  52. data/lib/scout_apm/logging/monitor/collector/checksum.rb +0 -51
  53. data/lib/scout_apm/logging/monitor/collector/configuration.rb +0 -150
  54. data/lib/scout_apm/logging/monitor/collector/downloader.rb +0 -78
  55. data/lib/scout_apm/logging/monitor/collector/extractor.rb +0 -37
  56. data/lib/scout_apm/logging/monitor/collector/manager.rb +0 -57
  57. data/lib/scout_apm/logging/monitor/monitor.rb +0 -216
  58. data/lib/scout_apm/logging/monitor_manager/manager.rb +0 -162
  59. data/lib/scout_apm/logging/state.rb +0 -69
  60. data/spec/data/empty_logs_config.yml +0 -0
  61. data/spec/data/logs_config.yml +0 -3
  62. data/spec/data/state_file.json +0 -3
  63. data/spec/integration/loggers/capture_spec.rb +0 -68
  64. data/spec/integration/monitor/collector/downloader/will_verify_checksum.rb +0 -49
  65. data/spec/integration/monitor/collector_healthcheck_spec.rb +0 -29
  66. data/spec/integration/monitor/continuous_state_collector_spec.rb +0 -31
  67. data/spec/integration/monitor/previous_collector_setup_spec.rb +0 -45
  68. data/spec/integration/monitor_manager/disable_agent_spec.rb +0 -30
  69. data/spec/integration/monitor_manager/monitor_pid_file_spec.rb +0 -38
  70. data/spec/integration/monitor_manager/single_monitor_spec.rb +0 -53
  71. data/spec/unit/monitor/collector/configuration_spec.rb +0 -64
  72. data/spec/unit/state_spec.rb +0 -20
  73. data/tooling/checksums.rb +0 -106
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aea114282e91583732d4a4b3246273d0b18ae3b2e5b784366b5a18691889391b
4
- data.tar.gz: dd625a2eb6bede54138bb05ef3671ad1a98995d59f1c5de28d033fd617d156b6
3
+ metadata.gz: 715fd7db3c4042b700482e55ad0d29298a3084d49e2997e0dc0fa5c46654edb6
4
+ data.tar.gz: '018ca5a3d37c221d864e37d5d95a624920ab9636803cd7c1b7eb6637c61a4826'
5
5
  SHA512:
6
- metadata.gz: 4d62832832aa309c9bd66c5cabe2d6c4c23472452bd0f3b9874741febd5f0a5f6716dfea8ff5e929075424ea998a89eb0edb947da9959d0bf03da334a9502158
7
- data.tar.gz: 94ab281a893c87b2d1b979b4b8fa7c9c2bd0e467983b302c0f0931b04f582dc6dc2c6b9c3c19b83ad14b79ece26a6b4a5f0c7e6cda492b6b840c133ec9d7d5f2
6
+ metadata.gz: 216a75a3dc38b61318dc554277211f8722aa359f142efb7f6f04e28661c06e3d94a4ca43535b3094532e85aceb868e4309d2c07d4fe734beebd86368977c14f0
7
+ data.tar.gz: 020d7b793d0c8bf5d1c2cfa904783e9fb230232e17dafb826d071af1ff00d8a0fda78b74ea6a9c3579f69e9a70df38f4b069135ee442854d1fa46877f9fd7e84
data/.gitignore CHANGED
@@ -7,7 +7,3 @@ gems/*.lock
7
7
  .idea
8
8
  # Ignore log files
9
9
  log/*.log
10
- # Ignore checksum files
11
- tooling/*
12
- !tooling/*.md
13
- !tooling/*.rb
data/.rubocop.yml CHANGED
@@ -3,10 +3,10 @@ AllCops:
3
3
  - "bin/*"
4
4
  - "tmp/**/*"
5
5
  - "vendor/**/*"
6
+ - lib/scout_apm/logging/loggers/opentelemetry/**/*
6
7
  - "spec/spec_helper.rb"
7
8
  - "gems/*"
8
9
  - "Rakefile"
9
- - "tooling/*"
10
10
  NewCops: disable
11
11
  TargetRubyVersion: 2.6
12
12
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 1.0.0
2
+ * Vendor OpenTelemetry SDK and remove the use of the collector and monitor processes.
3
+
4
+ ## 0.0.13
5
+ * Add ability to handle other libraries setting the Rails logger.
6
+ * Overwrite comparability methods on the proxy class. Have proxy class inherit from Object again.
7
+ * Clone original log instances.
8
+
1
9
  ## 0.0.12
2
10
  * Prevent certain attributes from being changed on created FileLogger.
3
11
  * Update proxy class to inherit from BasicObject to relay class comparison methods
data/NOTICE ADDED
@@ -0,0 +1,4 @@
1
+ This project contains third-party libraries licensed under the Apache License 2.0:
2
+
3
+ - opentelemetry-logs-sdk: Licensed under the Apache License 2.0
4
+ See lib/scout_apm/logging/loggers/opentelemetry/LICENSE for details.
@@ -48,35 +48,18 @@ module ScoutApm
48
48
  log_file_path
49
49
  log_class
50
50
  logs_monitor
51
- logs_monitored
52
51
  logs_ingest_key
53
52
  logs_capture_level
54
53
  logs_config
55
54
  logs_reporting_endpoint
55
+ logs_reporting_endpoint_http
56
56
  logs_proxy_log_dir
57
57
  logs_log_file_size
58
- manager_lock_file
59
- monitor_pid_file
60
- monitor_state_file
61
- monitor_interval
62
- monitor_interval_delay
63
- collector_sending_queue_storage_dir
64
- collector_offset_storage_dir
65
- collector_pid_file
66
- collector_download_dir
67
- collector_config_file
68
- collector_log_level
69
- collector_version
70
- health_check_port
71
58
  ].freeze
72
59
 
73
60
  SETTING_COERCIONS = {
74
61
  'logs_monitor' => BooleanCoercion.new,
75
- 'logs_monitored' => JsonCoercion.new,
76
- 'logs_log_file_size' => IntegerCoercion.new,
77
- 'monitor_interval' => IntegerCoercion.new,
78
- 'monitor_interval_delay' => IntegerCoercion.new,
79
- 'health_check_port' => IntegerCoercion.new
62
+ 'logs_log_file_size' => IntegerCoercion.new
80
63
  }.freeze
81
64
 
82
65
  # The bootstrapped, and initial config that we attach to the context. Will be swapped out by
@@ -95,18 +78,12 @@ module ScoutApm
95
78
  overlays = [
96
79
  ConfigEnvironment.new,
97
80
  ConfigFile.new(context, file_path, config),
98
- ConfigDynamic.new,
99
- ConfigState.new(context),
100
81
  ConfigDefaults.new,
101
82
  ConfigNull.new
102
83
  ]
103
84
  new(context, overlays)
104
85
  end
105
86
 
106
- def state
107
- @overlays.find { |overlay| overlay.is_a? ConfigState }
108
- end
109
-
110
87
  def value(key)
111
88
  unless KNOWN_CONFIG_OPTIONS.include?(key)
112
89
  logger.debug("Requested looking up a unknown configuration key: #{key} (not a problem. Evaluate and add to config.rb)")
@@ -131,119 +108,16 @@ module ScoutApm
131
108
  end
132
109
  end
133
110
 
134
- # Dynamically set state based on the application.
135
- class ConfigDynamic
136
- @values_to_set = {
137
- 'health_check_port': nil
138
- }
139
-
140
- class << self
141
- attr_reader :values_to_set
142
-
143
- def set_value(key, value)
144
- @values_to_set[key] = value
145
- end
146
- end
147
-
148
- def value(key)
149
- self.class.values_to_set[key]
150
- end
151
-
152
- def has_key?(key)
153
- self.class.values_to_set.key?(key)
154
- end
155
-
156
- def name
157
- 'dynamic'
158
- end
159
- end
160
-
161
- # State that is persisted and communicated upon by multiple processes.
162
- class ConfigState
163
- @values_to_set = {
164
- 'logs_monitored': [],
165
- 'health_check_port': nil
166
- }
167
-
168
- class << self
169
- attr_reader :values_to_set
170
-
171
- def set_value(key, value)
172
- @values_to_set[key] = value
173
- end
174
-
175
- def get_values_to_set
176
- @values_to_set.keys.map(&:to_s)
177
- end
178
- end
179
-
180
- attr_reader :context, :state
181
-
182
- def initialize(context)
183
- @context = context
184
-
185
- # Note, the config on the context we are passing in here comes from the Config.without_file. We
186
- # won't be aware of a state file that was defined in a config file, but this would be a very
187
- # rare thing to have happen as this is more of an internal config value.
188
- @state = State.new(context)
189
-
190
- set_values_from_state
191
- end
192
-
193
- def value(key)
194
- self.class.values_to_set[key]
195
- end
196
-
197
- def has_key?(key)
198
- self.class.values_to_set.key?(key)
199
- end
200
-
201
- def name
202
- 'state'
203
- end
204
-
205
- def flush_state!
206
- state.flush_to_file!
207
- end
208
-
209
- def add_log_locations!(updated_log_locations)
210
- state.flush_to_file!(updated_log_locations)
211
- end
212
-
213
- private
214
-
215
- def set_values_from_state
216
- data = state.load_state_from_file
217
-
218
- return unless data
219
-
220
- data.each do |key, value|
221
- self.class.set_value(key, value)
222
- end
223
- end
224
- end
225
-
226
111
  # Defaults in case no config file has been found.
227
112
  class ConfigDefaults
228
113
  DEFAULTS = {
229
114
  'log_level' => 'info',
230
- 'logs_monitored' => [],
231
115
  'logs_capture_level' => 'debug',
116
+ 'logs_ingest_key' => '',
232
117
  'logs_reporting_endpoint' => 'https://otlp.scoutotel.com:4317',
118
+ 'logs_reporting_endpoint_http' => 'https://otlp.scoutotel.com:4318/v1/logs',
233
119
  'logs_proxy_log_dir' => '/tmp/scout_apm/logs/',
234
- 'logs_log_file_size' => 1024 * 1024 * 10,
235
- 'manager_lock_file' => '/tmp/scout_apm/monitor_lock_file.lock',
236
- 'monitor_pid_file' => '/tmp/scout_apm/scout_apm_log_monitor.pid',
237
- 'monitor_state_file' => '/tmp/scout_apm/scout_apm_log_monitor_state.json',
238
- 'monitor_interval' => 60,
239
- 'monitor_interval_delay' => 60,
240
- 'collector_log_level' => 'error',
241
- 'collector_offset_storage_dir' => '/tmp/scout_apm/file_storage/receiver/',
242
- 'collector_sending_queue_storage_dir' => '/tmp/scout_apm/file_storage/otc/',
243
- 'collector_pid_file' => '/tmp/scout_apm/scout_apm_otel_collector.pid',
244
- 'collector_download_dir' => '/tmp/scout_apm/',
245
- 'collector_config_file' => '/tmp/scout_apm/config.yml',
246
- 'collector_version' => '0.102.1'
120
+ 'logs_log_file_size' => 1024 * 1024 * 10
247
121
  }.freeze
248
122
 
249
123
  def value(key)
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'logger'
4
4
 
5
+ require_relative './opentelemetry/opentelemetry'
5
6
  require_relative './formatter'
6
7
  require_relative './logger'
7
8
  require_relative './proxy'
@@ -30,6 +31,8 @@ module ScoutApm
30
31
  def setup!
31
32
  return unless context.config.value('logs_monitor')
32
33
 
34
+ OpenTelemetry.setup(context)
35
+
33
36
  create_proxy_log_dir!
34
37
 
35
38
  add_logging_patches!
@@ -42,10 +45,11 @@ module ScoutApm
42
45
  Utils.ensure_directory_exists(context.config.value('logs_proxy_log_dir'))
43
46
  end
44
47
 
45
- def add_logging_patches!
48
+ def add_logging_patches! # rubocop:disable Metrics/AbcSize
49
+ require_relative './patches/rails_logger' unless ::Rails.logger.respond_to?(:broadcasts)
46
50
  # We can't swap out the logger similar to that of Rails and Sidekiq, as
47
51
  # the TaggedLogging logger is dynamically generated.
48
- return unless Rails.logger.respond_to?(:tagged)
52
+ return unless ::Rails.logger.respond_to?(:tagged)
49
53
 
50
54
  ::ActiveSupport::TaggedLogging.prepend(Patches::TaggedLogging)
51
55
 
@@ -53,9 +57,9 @@ module ScoutApm
53
57
  # This appears to be an issue in Ruby 2.7 with the broadcast logger.
54
58
  ruby_version = Gem::Version.new(RUBY_VERSION)
55
59
  isruby27 = (ruby_version >= Gem::Version.new('2.7') && ruby_version < Gem::Version.new('3.0'))
56
- return unless isruby27 && Rails.logger.respond_to?(:broadcasts)
60
+ return unless isruby27 && ::Rails.logger.respond_to?(:broadcasts)
57
61
 
58
- Rails.logger.broadcasts.each do |logger|
62
+ ::Rails.logger.broadcasts.each do |logger|
59
63
  logger.extend ::ActiveSupport::TaggedLogging
60
64
  end
61
65
  end
@@ -66,8 +70,6 @@ module ScoutApm
66
70
  logger.new(context).update_logger! if logger.present?
67
71
  end
68
72
  updated_log_locations.compact!
69
-
70
- context.config.state.add_log_locations!(updated_log_locations)
71
73
  end
72
74
  end
73
75
  end
@@ -16,7 +16,6 @@ module ScoutApm
16
16
  attributes_to_log = {
17
17
  severity: severity,
18
18
  time: format_datetime(time),
19
- pid: Process.pid.to_s,
20
19
  msg: msg2str(msg)
21
20
  }
22
21
 
@@ -29,7 +28,21 @@ module ScoutApm
29
28
  # Naive local benchmarks show this takes around 200 microseconds. As such, we only apply it to WARN and above.
30
29
  attributes_to_log.merge!(local_log_location) if ::Logger::Severity.const_get(severity) >= ::Logger::Severity::WARN
31
30
 
32
- "#{attributes_to_log.to_json}\n"
31
+ message = "#{attributes_to_log.to_json}\n"
32
+ attributes_to_log['raw_bytes'] = message
33
+
34
+ ScoutApm::Logging::Loggers::OpenTelemetry.logger_provider.logger(
35
+ name: 'scout_apm',
36
+ version: '0.1.0'
37
+ ).on_emit(
38
+ severity_text: severity,
39
+ severity_number: ::Logger::Severity.const_get(severity),
40
+ attributes: attributes_to_log,
41
+ timestamp: time,
42
+ body: msg,
43
+ context: ::OpenTelemetry::Context.current
44
+ )
45
+ message
33
46
  end
34
47
 
35
48
  private
@@ -86,6 +99,12 @@ module ScoutApm
86
99
  { 'log_location' => last_local_location }
87
100
  end
88
101
 
102
+ def context
103
+ ScoutApm::Logging::Context.new.tap do |context|
104
+ context.config = ScoutApm::Logging::Config.with_file(context, context.config.value('config_file'))
105
+ end
106
+ end
107
+
89
108
  # We may need to clean this up a bit.
90
109
  def service_name
91
110
  $PROGRAM_NAME
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,9 @@
1
+ This product includes software developed by The OpenTelemetry Authors
2
+ under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0).
3
+
4
+ Modifications:
5
+ The following modifications were made on Sep 17 2024 by Jack Rothrock.
6
+ - Modified the protobuf definitions to prevent collisions.
7
+ - Decreased default BLRP Export Batch Size from 512 to 256.
8
+ - Update logger to use the Scout Logging internal logger.
9
+ - Update logic around logger_provider setting on the OpenTelemetry Module.
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module ScoutApm
8
+ module Logging
9
+ module Loggers
10
+ module OpenTelemetry
11
+ module Logs
12
+ # No-op implementation of an emitted log and its associated attributes.
13
+ class LogRecord; end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module ScoutApm
8
+ module Logging
9
+ module Loggers
10
+ module OpenTelemetry
11
+ module Logs
12
+ # No-op implementation of logger.
13
+ class Logger
14
+ # rubocop:disable Style/EmptyMethod
15
+
16
+ # Emit a {LogRecord} to the processing pipeline.
17
+ #
18
+ # @param timestamp [optional Time] Time when the event occurred.
19
+ # @param observed_timestamp [optional Time] Time when the event was
20
+ # observed by the collection system.
21
+ # @param context [optional Context] The Context to associate with the
22
+ # LogRecord. Intended default: OpenTelemetry::Context.current
23
+ # @param severity_number [optional Integer] Numerical value of the
24
+ # severity. Smaller numerical values correspond to less severe events
25
+ # (such as debug events), larger numerical values correspond to more
26
+ # severe events (such as errors and critical events).
27
+ # @param [optional String] severity_text Original string representation of
28
+ # the severity as it is known at the source. Also known as log level.
29
+ # @param [optional String, Numeric, Boolean, Array<String, Numeric,
30
+ # Boolean>, Hash{String => String, Numeric, Boolean, Array<String,
31
+ # Numeric, Boolean>}] body A value containing the body of the log record.
32
+ # @param [optional String] trace_id The trace ID associated with the
33
+ # current context.
34
+ # @param [optional String] span_id The span ID associated with the
35
+ # current context.
36
+ # @param [optional TraceFlags] trace_flags The trace flags associated
37
+ # with the current context.
38
+ # @param [optional Hash{String => String, Numeric, Boolean,
39
+ # Array<String, Numeric, Boolean>}] attributes Additional information
40
+ # about the event.
41
+ # @param [optional Context] context The Context to associate with the
42
+ # LogRecord. Intended default: OpenTelemetry::Context.current
43
+ #
44
+ # @api public
45
+ def on_emit(
46
+ timestamp: nil,
47
+ observed_timestamp: nil,
48
+ severity_number: nil,
49
+ severity_text: nil,
50
+ body: nil,
51
+ trace_id: nil,
52
+ span_id: nil,
53
+ trace_flags: nil,
54
+ attributes: nil,
55
+ context: nil
56
+ )
57
+ end
58
+ # rubocop:enable Style/EmptyMethod
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module ScoutApm
8
+ module Logging
9
+ module Loggers
10
+ module OpenTelemetry
11
+ module Logs
12
+ # No-op implementation of a logger provider.
13
+ class LoggerProvider
14
+ NOOP_LOGGER = OpenTelemetry::Logs::Logger.new
15
+ private_constant :NOOP_LOGGER
16
+
17
+ # Returns an {OpenTelemetry::Logs::Logger} instance.
18
+ #
19
+ # @param [optional String] name Instrumentation package name
20
+ # @param [optional String] version Instrumentation package version
21
+ #
22
+ # @return [OpenTelemetry::Logs::Logger]
23
+ def logger(name = nil, version = nil)
24
+ @logger ||= NOOP_LOGGER
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end