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
@@ -1,68 +0,0 @@
1
- require 'logger'
2
-
3
- require 'spec_helper'
4
-
5
- require_relative '../../../lib/scout_apm/logging/loggers/capture'
6
-
7
- describe ScoutApm::Logging::Loggers::Capture do
8
- it 'should find the logger, capture the log destination, and rotate collector configs' do
9
- ENV['SCOUT_MONITOR_INTERVAL'] = '10'
10
- ENV['SCOUT_MONITOR_INTERVAL_DELAY'] = '10'
11
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
12
-
13
- context = ScoutApm::Logging::MonitorManager.instance.context
14
-
15
- state_file_location = context.config.value('monitor_state_file')
16
- collector_pid_location = context.config.value('collector_pid_file')
17
- ScoutApm::Logging::Utils.ensure_directory_exists(state_file_location)
18
-
19
- first_logger = ScoutTestLogger.new('/tmp/first_file.log')
20
- first_logger_basename = File.basename(first_logger.instance_variable_get(:@logdev).filename.to_s)
21
- first_logger_updated_path = File.join(context.config.value('logs_proxy_log_dir'), first_logger_basename)
22
- TestLoggerWrapper.logger = first_logger
23
-
24
- similuate_railtie
25
-
26
- # Give the process time to initialize, download the collector, and start it
27
- wait_for_process_with_timeout!('otelcol-contrib', 20)
28
-
29
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
30
- collector_pid = File.read(collector_pid_location)
31
-
32
- content = File.read(state_file_location)
33
- data = JSON.parse(content)
34
- expect(data['logs_monitored']).to eq([first_logger_updated_path])
35
-
36
- second_logger = ScoutTestLogger.new('/tmp/second_file.log')
37
- second_logger_basename = File.basename(second_logger.instance_variable_get(:@logdev).filename.to_s)
38
- second_logger_updated_path = File.join(context.config.value('logs_proxy_log_dir'), second_logger_basename)
39
- TestLoggerWrapper.logger = second_logger
40
-
41
- similuate_railtie
42
-
43
- content = File.read(state_file_location)
44
- data = JSON.parse(content)
45
-
46
- expect(data['logs_monitored'].sort).to eq([first_logger_updated_path, second_logger_updated_path])
47
-
48
- # Need to wait for the delay first health check, next monitor interval to restart the collector, and then for
49
- # the collector to restart
50
- sleep 25
51
- wait_for_process_with_timeout!('otelcol-contrib', 20)
52
-
53
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
54
- new_collector_pid = File.read(collector_pid_location)
55
-
56
- # Should have restarted the collector based on the change
57
- expect(new_collector_pid).not_to eq(collector_pid)
58
- end
59
-
60
- private
61
-
62
- def similuate_railtie
63
- context = ScoutApm::Logging::MonitorManager.instance.context
64
-
65
- ScoutApm::Logging::Loggers::Capture.new(context).setup!
66
- ScoutApm::Logging::MonitorManager.new.setup!
67
- end
68
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../../../lib/scout_apm/logging/monitor/collector/downloader'
4
-
5
- describe ScoutApm::Logging::Collector::Downloader do
6
- it 'should validate checksum, and correct download if neccessary' do
7
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
8
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
9
-
10
- otelcol_contrib_path = '/tmp/scout_apm/otelcol-contrib'
11
- ScoutApm::Logging::Utils.ensure_directory_exists(otelcol_contrib_path)
12
-
13
- File.write(otelcol_contrib_path, 'fake content')
14
-
15
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
16
- ScoutApm::Logging::MonitorManager.instance.setup!
17
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
18
-
19
- # Give the process time to initialize, download the collector, and start it
20
- wait_for_process_with_timeout!('otelcol-contrib', 20)
21
-
22
- download_time = File.mtime(otelcol_contrib_path)
23
-
24
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
25
-
26
- ENV['SCOUT_LOGS_MONITOR'] = 'false'
27
-
28
- ScoutApm::Logging::MonitorManager.new.setup!
29
-
30
- sleep 5 # Give the process time to exit
31
-
32
- expect(File.exist?(ScoutApm::Logging::MonitorManager.instance.context.config.value('monitor_pid_file'))).to be_falsey
33
- expect(`pgrep otelcol-contrib --runstates D,R,S`).to be_empty
34
- expect(`pgrep scout_apm_log_monitor --runstates D,R,S`).to be_empty
35
-
36
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
37
-
38
- ScoutApm::Logging::MonitorManager.new.setup!
39
-
40
- # Give the process time to exit, and for the healthcheck to restart it
41
- wait_for_process_with_timeout!('otelcol-contrib', 30)
42
-
43
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
44
-
45
- recheck_time = File.mtime(otelcol_contrib_path)
46
-
47
- expect(download_time).to eq(recheck_time)
48
- end
49
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../lib/scout_apm/logging/monitor/monitor'
4
-
5
- describe ScoutApm::Logging::Monitor do
6
- it 'should recreate collector process on healthcheck if it has exited' do
7
- ENV['SCOUT_MONITOR_INTERVAL'] = '10'
8
- ENV['SCOUT_MONITOR_INTERVAL_DELAY'] = '10'
9
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
10
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
11
-
12
- ScoutApm::Logging::Utils.ensure_directory_exists('/tmp/scout_apm/scout_apm_log_monitor.pid')
13
-
14
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
15
- ScoutApm::Logging::MonitorManager.instance.setup!
16
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
17
-
18
- # Give the process time to initialize, download the collector, and start it
19
- wait_for_process_with_timeout!('otelcol-contrib', 20)
20
-
21
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
22
-
23
- # Bypass gracefull shutdown
24
- `pkill -9 otelcol-contrib`
25
-
26
- # Give the process time to exit, and for the healthcheck to restart it
27
- wait_for_process_with_timeout!('otelcol-contrib', 30)
28
- end
29
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../lib/scout_apm/logging/monitor/monitor'
4
-
5
- describe ScoutApm::Logging::Monitor do
6
- it "Should not restart the collector if the state hasn't changed" do
7
- ENV['SCOUT_MONITOR_INTERVAL'] = '10'
8
- ENV['SCOUT_MONITOR_INTERVAL_DELAY'] = '10'
9
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
10
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
11
-
12
- context = ScoutApm::Logging::MonitorManager.instance.context
13
- collector_pid_location = context.config.value('collector_pid_file')
14
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
15
- ScoutApm::Logging::MonitorManager.instance.setup!
16
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
17
- # Give the process time to initialize, download the collector, and start it
18
- wait_for_process_with_timeout!('otelcol-contrib', 20)
19
-
20
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
21
- collector_pid = File.read(collector_pid_location)
22
-
23
- # Give time for the monitor interval to run.
24
- sleep 30
25
-
26
- expect(`pgrep otelcol-contrib --runstates D,R,S`).not_to be_empty
27
- second_read_pid = File.read(collector_pid_location)
28
-
29
- expect(second_read_pid).to eq(collector_pid)
30
- end
31
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../lib/scout_apm/logging/monitor/monitor'
4
-
5
- describe ScoutApm::Logging::Monitor do
6
- it 'should use previous collector setup if monitor daemon exits' do
7
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
8
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
9
-
10
- monitor_pid_location = ScoutApm::Logging::MonitorManager.instance.context.config.value('monitor_pid_file')
11
- collector_pid_location = ScoutApm::Logging::MonitorManager.instance.context.config.value('collector_pid_file')
12
- ScoutApm::Logging::Utils.ensure_directory_exists(monitor_pid_location)
13
-
14
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
15
- ScoutApm::Logging::MonitorManager.instance.setup!
16
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
17
-
18
- # Give the process time to initialize, download the collector, and start it
19
- wait_for_process_with_timeout!('otelcol-contrib', 20)
20
-
21
- monitor_pid = File.read(monitor_pid_location)
22
-
23
- otelcol_pid = `pgrep otelcol-contrib --runstates D,R,S`.strip!
24
- stored_otelcol_pid = File.read(collector_pid_location)
25
- expect(otelcol_pid).to eq(stored_otelcol_pid)
26
-
27
- `kill -9 #{monitor_pid}`
28
-
29
- # Create a separate monitor manager instance, or else we won't reload
30
- # the configuraiton state.
31
- ScoutApm::Logging::MonitorManager.new.setup!
32
-
33
- sleep 5
34
-
35
- expect(`pgrep -f /app/bin/scout_apm_logging_monitor --runstates D,R,S`).not_to be_empty
36
-
37
- new_monitor_pid = File.read(monitor_pid_location)
38
- expect(new_monitor_pid).not_to eq(monitor_pid)
39
-
40
- should_be_same_otelcol_pid = `pgrep otelcol-contrib --runstates D,R,S`.strip!
41
- should_be_same_stored_otelcol_pid = File.read(collector_pid_location)
42
- expect(should_be_same_otelcol_pid).to eq(otelcol_pid)
43
- expect(should_be_same_stored_otelcol_pid).to eq(stored_otelcol_pid)
44
- end
45
- end
@@ -1,30 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../lib/scout_apm/logging/monitor/collector/manager'
4
-
5
- describe ScoutApm::Logging::Collector::Manager do
6
- it 'If monitor is false, it should remove the daemon and collector process if they are present' do
7
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
8
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
9
-
10
- expect(`pgrep otelcol-contrib --runstates D,R,S`).to be_empty
11
-
12
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
13
- ScoutApm::Logging::MonitorManager.instance.setup!
14
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
15
-
16
- wait_for_process_with_timeout!('otelcol-contrib', 20)
17
-
18
- ENV['SCOUT_LOGS_MONITOR'] = 'false'
19
-
20
- ScoutApm::Logging::MonitorManager.new.setup!
21
-
22
- sleep 5 # Give the process time to exit
23
-
24
- expect(File.exist?(ScoutApm::Logging::MonitorManager.instance.context.config.value('monitor_pid_file'))).to be_falsey
25
- expect(`pgrep otelcol-contrib --runstates D,R,S`).to be_empty
26
- expect(`pgrep scout_apm_log_monitor --runstates D,R,S`).to be_empty
27
-
28
- ENV.delete('SCOUT_LOGS_MONITOR')
29
- end
30
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require_relative '../../../lib/scout_apm/logging/monitor/collector/manager'
4
-
5
- describe ScoutApm::Logging::Collector::Manager do
6
- it 'should recreate the monitor process if monitor.pid file is errant' do
7
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
8
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
9
-
10
- ScoutApm::Logging::Utils.ensure_directory_exists('/tmp/scout_apm/scout_apm_log_monitor.pid')
11
-
12
- # A high enough number to not be a PID of a running process
13
- pid_file_path = '/tmp/scout_apm/scout_apm_log_monitor.pid'
14
- File.open(pid_file_path, 'w') do |file|
15
- file.write('123456')
16
- end
17
-
18
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time start: #{Time.now}"
19
- ScoutApm::Logging::MonitorManager.instance.setup!
20
- ScoutApm::Logging::MonitorManager.instance.context.logger.info "Time after setup: #{Time.now}"
21
-
22
- # Give the process time to initialize, download the collector, and start it
23
- wait_for_process_with_timeout!('otelcol-contrib', 20)
24
-
25
- new_pid = File.read(pid_file_path).to_i
26
-
27
- expect(new_pid).not_to eq(12_345)
28
-
29
- # Check if the process with the stored PID is running
30
- expect(Process.kill(0, new_pid)).to be_truthy
31
- ENV.delete('SCOUT_LOGS_MONITOR')
32
-
33
- # Kill the process and ensure PID file clean up
34
- Process.kill('TERM', new_pid)
35
- Process.kill('TERM', `pgrep otelcol-contrib --runstates D,R,S`.to_i)
36
- sleep 1 # Give the process time to exit
37
- end
38
- end
@@ -1,53 +0,0 @@
1
- # This is really meant to simulate multiple processes calling the MonitorManager setup.
2
- # Trying to create **multiple fake** rails environments is a bit challening
3
- # (such as a rails app and a couple rails runners).
4
-
5
- # See: https://github.com/rails/rails/blob/6d126e03dbbf5d30fa97b580f7dee46343537b7b/railties/test/isolation/abstract_unit.rb#L339
6
-
7
- # We simulate the ultimate outcome here -- ie Railtie invoking the setup.
8
- require 'spec_helper'
9
-
10
- describe ScoutApm::Logging do
11
- it 'Should only create a single monitor daemon if manager is called multiple times' do
12
- ENV['SCOUT_LOGS_MONITOR'] = 'true'
13
- ENV['SCOUT_LOGS_MONITORED'] = '["/tmp/test.log"]'
14
-
15
- pid_file = ScoutApm::Logging::MonitorManager.instance.context.config.value('monitor_pid_file')
16
- expect(File.exist?(pid_file)).to be_falsey
17
-
18
- context = ScoutApm::Logging::MonitorManager.instance.context
19
-
20
- pids = 3.times.map do
21
- fork do
22
- puts 'fork attempting to gain lock'
23
- ScoutApm::Logging::Utils.attempt_exclusive_lock(context) do
24
- puts 'obtained lock'
25
- ScoutApm::Logging::MonitorManager.new.setup!
26
- end
27
- end
28
- end
29
-
30
- pids.each { |pid| Process.wait(pid) }
31
-
32
- wait_for_process_with_timeout!('otelcol-contrib', 20)
33
-
34
- # The file lock really should be gone at this point.
35
- expect(File.exist?(context.config.value('manager_lock_file'))).to be_falsey
36
- expect(File.exist?(pid_file)).to be_truthy
37
-
38
- original_pid = File.read(pid_file).to_i
39
- expect(ScoutApm::Logging::Utils.check_process_liveliness(original_pid, 'scout_apm_logging_monitor')).to be_truthy
40
-
41
- # Another process comes in and tries to start it again
42
- ScoutApm::Logging::Utils.attempt_exclusive_lock(context) do
43
- puts 'obtained lock later on'
44
- ScoutApm::Logging::MonitorManager.new.setup!
45
- end
46
-
47
- expect(File.exist?(context.config.value('manager_lock_file'))).to be_falsey
48
- expect(File.exist?(pid_file)).to be_truthy
49
- updated_pid = File.read(pid_file).to_i
50
- expect(updated_pid).to eq(original_pid)
51
- expect(ScoutApm::Logging::Utils.check_process_liveliness(original_pid, 'scout_apm_logging_monitor')).to be_truthy
52
- end
53
- end
@@ -1,64 +0,0 @@
1
- require 'yaml'
2
-
3
- require 'spec_helper'
4
-
5
- require_relative '../../../../lib/scout_apm/logging/monitor/collector/configuration'
6
-
7
- describe ScoutApm::Logging::Collector::Configuration do
8
- it 'creates the correct configuration for the otelcol' do
9
- context = ScoutApm::Logging::Context.new
10
- setup_collector_config!(context)
11
-
12
- expect(File.exist?(context.config.value('collector_config_file'))).to be_truthy
13
- config = YAML.load_file(context.config.value('collector_config_file'))
14
-
15
- expect(config['exporters']['otlp']['endpoint']).to eq('https://otlp.scoutotel.com:4317')
16
- expect(config['exporters']['otlp']['headers']['x-telemetryhub-key']).to eq('00001000010000abc')
17
- expect(config['receivers']['filelog']['include']).to eq(['/tmp/fake_log_file.log'])
18
- end
19
-
20
- it 'merges in a logs config correctly' do
21
- ENV['SCOUT_LOGS_CONFIG'] = File.expand_path('../../../data/logs_config.yml', __dir__)
22
-
23
- context = ScoutApm::Logging::Context.new
24
- setup_collector_config!(context)
25
-
26
- expect(File.exist?(context.config.value('collector_config_file'))).to be_truthy
27
- config = YAML.load_file(context.config.value('collector_config_file'))
28
-
29
- expect(config['exporters']['otlp']['endpoint']).to eq('https://otlp.scoutotel.com:4317')
30
- expect(config['exporters']['otlp']['headers']['x-telemetryhub-key']).to eq('00001000010000abc')
31
- expect(config['receivers']['filelog']['include']).to eq(['/tmp/fake_log_file.log'])
32
-
33
- # Verify merge and consistent keys
34
- expect(config['extensions']['file_storage/otc']['directory']).to eq('/dev/null')
35
- expect(config['extensions']['file_storage/otc']['timeout']).to eq('10s')
36
- end
37
-
38
- it 'handles an empty logs config file well' do
39
- ENV['SCOUT_LOGS_CONFIG'] = File.expand_path('../../../data/empty_logs_config.yml', __dir__)
40
-
41
- context = ScoutApm::Logging::Context.new
42
- setup_collector_config!(context)
43
-
44
- expect(File.exist?(context.config.value('collector_config_file'))).to be_truthy
45
- config = YAML.load_file(context.config.value('collector_config_file'))
46
-
47
- expect(config['exporters']['otlp']['endpoint']).to eq('https://otlp.scoutotel.com:4317')
48
- expect(config['exporters']['otlp']['headers']['x-telemetryhub-key']).to eq('00001000010000abc')
49
- expect(config['receivers']['filelog']['include']).to eq(['/tmp/fake_log_file.log'])
50
- end
51
-
52
- private
53
-
54
- def setup_collector_config!(context)
55
- ENV['SCOUT_MONITOR_STATE_FILE'] = File.expand_path('../../../data/state_file.json', __dir__)
56
- conf_file = File.expand_path('../../../data/mock_config.yml', __dir__)
57
- context.config = ScoutApm::Logging::Config.with_file(context, conf_file)
58
-
59
- ScoutApm::Logging::Utils.ensure_directory_exists(context.config.value('collector_config_file'))
60
-
61
- collector_config = ScoutApm::Logging::Collector::Configuration.new(context)
62
- collector_config.setup!
63
- end
64
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ScoutApm::Logging::Config do
4
- it 'flushes and loads the state' do
5
- context = ScoutApm::Logging::Context.new
6
- conf_file = File.expand_path('../data/config_test_1.yml', __dir__)
7
- conf = ScoutApm::Logging::Config.with_file(context, conf_file)
8
-
9
- context.config = conf
10
-
11
- ScoutApm::Logging::Config::ConfigDynamic.set_value('health_check_port', 1234)
12
-
13
- context.config.state.flush_state!
14
-
15
- data = ScoutApm::Logging::Config::State.new(context).load_state_from_file
16
-
17
- expect(data['health_check_port']).to eq(context.config.value('health_check_port'))
18
- expect(data['logs_monitored']).to eq(context.config.value('logs_monitored'))
19
- end
20
- end
data/tooling/checksums.rb DELETED
@@ -1,106 +0,0 @@
1
- ###
2
- # Calculates the checksums for the otelcol-contrib files
3
- # Usage: ruby tooling/checksums.rb <version>
4
- ##
5
- # frozen_string_literal: true
6
-
7
- require 'digest'
8
- require 'fileutils'
9
- require 'net/http'
10
- require 'pp'
11
-
12
- DOUBLES = [
13
- 'darwin_amd64',
14
- 'darwin_arm64',
15
- 'linux_amd64',
16
- 'linux_arm64'
17
- ]
18
-
19
- version = ARGV[0]
20
-
21
- current_directory = Dir.pwd
22
- unless current_directory.include?("/tooling")
23
- tooling_directory = File.join(current_directory, "/tooling")
24
- FileUtils.cd(tooling_directory)
25
- end
26
-
27
- def download_source_checksums(url, destination)
28
- uri = URI(url)
29
-
30
- Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
31
- request = Net::HTTP::Get.new(uri)
32
- http.request(request) do |response|
33
- return download_source_checksums(response['location'], destination) if response.code == '302'
34
-
35
- File.open(destination, 'wb') do |file|
36
- response.read_body do |chunk|
37
- file.write(chunk)
38
- end
39
- end
40
- end
41
- end
42
- end
43
-
44
- def validate_and_return_checksums(version)
45
- checksum_file_url = "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v#{version}/opentelemetry-collector-releases_otelcol-contrib_checksums.txt"
46
- destination = "./opentelemetry-collector-releases_otelcol-contrib_checksums.txt"
47
-
48
- download_source_checksums(checksum_file_url, destination)
49
-
50
- contents = File.read(destination)
51
- lines = contents.split("\n")
52
- pairs = lines.each_with_object({}) do |item, hash|
53
- value, key = item.split
54
- hash[key] = value
55
- end
56
-
57
-
58
- relavent_pairs = {}
59
- DOUBLES.each do |double|
60
- file_name = "otelcol-contrib_#{version}_#{double}.tar.gz"
61
- file_location = "./#{file_name}"
62
-
63
- local_checksum = Digest::SHA256.file(file_location).hexdigest
64
- source_checksum = pairs[file_name]
65
-
66
- if source_checksum != local_checksum
67
- puts "#{double} contains different checksums: Local checksum #{local_checksum} -- Source checksum #{source_checksum}"
68
- raise "Different checksums for #{double}"
69
- end
70
-
71
- relavent_pairs[double] = local_checksum
72
- end
73
-
74
- relavent_pairs
75
- end
76
-
77
- def download_collector(url, destination)
78
- uri = URI(url)
79
-
80
- Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
81
- request = Net::HTTP::Get.new(uri)
82
- http.request(request) do |response|
83
- return download_collector(response['location'], destination) if response.code == '302'
84
-
85
- File.open(destination, 'wb') do |file|
86
- response.read_body do |chunk|
87
- file.write(chunk)
88
- end
89
- end
90
- end
91
- end
92
- end
93
-
94
- DOUBLES.each do |double|
95
- host_os, architecture = double.split('_')
96
-
97
- url = "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v#{version}/otelcol-contrib_#{version}_#{host_os}_#{architecture}.tar.gz"
98
-
99
- destination = "./otelcol-contrib_#{version}_#{host_os}_#{architecture}.tar.gz"
100
-
101
- download_collector(url, destination)
102
- end
103
-
104
- checksums = validate_and_return_checksums(version)
105
-
106
- pp checksums