julewire-core 1.0.0 → 1.1.0

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/docs/advanced-configuration.md +2 -1
  4. data/docs/configuration.md +14 -7
  5. data/docs/context-and-propagation.md +26 -4
  6. data/docs/contracts.md +25 -50
  7. data/docs/extensions-and-api.md +87 -88
  8. data/docs/health-schema.md +12 -2
  9. data/docs/internals.md +24 -23
  10. data/docs/outputs-and-lifecycle.md +15 -8
  11. data/docs/records-and-data-policy.md +38 -7
  12. data/lib/julewire/core/cli/doctor.rb +20 -16
  13. data/lib/julewire/core/cli/line_helpers.rb +23 -12
  14. data/lib/julewire/core/cli/log_formats/core_json_decoder.rb +3 -3
  15. data/lib/julewire/core/cli/log_formats/record_decoder.rb +1 -1
  16. data/lib/julewire/core/cli/log_formats.rb +9 -9
  17. data/lib/julewire/core/cli/tail.rb +19 -14
  18. data/lib/julewire/core/cli/transcode.rb +4 -5
  19. data/lib/julewire/core/cli.rb +1 -1
  20. data/lib/julewire/core/configuration.rb +1 -1
  21. data/lib/julewire/core/context_store.rb +56 -87
  22. data/lib/julewire/core/destinations/chaos_output.rb +2 -2
  23. data/lib/julewire/core/destinations/collection.rb +8 -16
  24. data/lib/julewire/core/destinations/definition.rb +1 -9
  25. data/lib/julewire/core/destinations/destination.rb +16 -66
  26. data/lib/julewire/core/destinations/processor_handling.rb +78 -0
  27. data/lib/julewire/core/destinations/registry.rb +1 -1
  28. data/lib/julewire/core/destinations/sink.rb +0 -1
  29. data/lib/julewire/core/destinations/synchronized_output.rb +54 -17
  30. data/lib/julewire/core/destinations/tail_sampling.rb +18 -27
  31. data/lib/julewire/core/destinations/write_step.rb +5 -5
  32. data/lib/julewire/core/destinations.rb +0 -7
  33. data/lib/julewire/core/diagnostics/callback_notifier.rb +4 -2
  34. data/lib/julewire/core/diagnostics/doctor.rb +22 -15
  35. data/lib/julewire/core/diagnostics/failure_snapshot.rb +9 -3
  36. data/lib/julewire/core/diagnostics/health.rb +41 -57
  37. data/lib/julewire/core/diagnostics/integration_health_store.rb +11 -24
  38. data/lib/julewire/core/diagnostics/internal_records.rb +8 -12
  39. data/lib/julewire/core/diagnostics/invalid_severity_reporter.rb +16 -55
  40. data/lib/julewire/core/diagnostics/meta_observer.rb +37 -44
  41. data/lib/julewire/core/diagnostics/process_integration_health.rb +0 -5
  42. data/lib/julewire/core/diagnostics/tail/renderer.rb +1 -1
  43. data/lib/julewire/core/diagnostics/tail.rb +18 -22
  44. data/lib/julewire/core/execution/boundary.rb +2 -8
  45. data/lib/julewire/core/execution/handle.rb +14 -17
  46. data/lib/julewire/core/execution/lineage.rb +26 -62
  47. data/lib/julewire/core/execution/measurement_handle.rb +6 -10
  48. data/lib/julewire/core/execution/scope.rb +17 -22
  49. data/lib/julewire/core/execution/scope_fields.rb +4 -13
  50. data/lib/julewire/core/execution/scope_identity.rb +1 -9
  51. data/lib/julewire/core/execution/scope_snapshot.rb +18 -39
  52. data/lib/julewire/core/execution/summary_state.rb +16 -19
  53. data/lib/julewire/core/execution/view.rb +8 -17
  54. data/lib/julewire/core/facade_methods.rb +67 -65
  55. data/lib/julewire/core/fields/attribute_keys.rb +0 -2
  56. data/lib/julewire/core/fields/bags.rb +23 -27
  57. data/lib/julewire/core/fields/field_set.rb +52 -16
  58. data/lib/julewire/core/fields/field_stack.rb +69 -109
  59. data/lib/julewire/core/fields/internal/deletion.rb +6 -9
  60. data/lib/julewire/core/fields/internal.rb +35 -26
  61. data/lib/julewire/core/fields/lookup.rb +9 -13
  62. data/lib/julewire/core/fields/section_proxy.rb +1 -9
  63. data/lib/julewire/core/fields/stack_set.rb +9 -14
  64. data/lib/julewire/core/fields/static_labels.rb +1 -1
  65. data/lib/julewire/core/integration/configurable.rb +4 -3
  66. data/lib/julewire/core/integration/destination_health.rb +28 -7
  67. data/lib/julewire/core/integration/event_subscriber.rb +1 -1
  68. data/lib/julewire/core/integration/facade.rb +12 -15
  69. data/lib/julewire/core/integration/fork_hooks.rb +12 -36
  70. data/lib/julewire/core/integration/health.rb +0 -3
  71. data/lib/julewire/core/integration/ivar_state.rb +0 -5
  72. data/lib/julewire/core/integration/protocol.rb +20 -0
  73. data/lib/julewire/core/integration/settings.rb +4 -4
  74. data/lib/julewire/core/integration/subscriber_install.rb +2 -2
  75. data/lib/julewire/core/integration/subscription.rb +3 -2
  76. data/lib/julewire/core/integration/values.rb +0 -17
  77. data/lib/julewire/core/local_storage.rb +3 -19
  78. data/lib/julewire/core/processing/invalid_result_failure.rb +23 -0
  79. data/lib/julewire/core/processing/level_threshold.rb +7 -14
  80. data/lib/julewire/core/processing/match.rb +6 -4
  81. data/lib/julewire/core/processing/pipeline.rb +46 -40
  82. data/lib/julewire/core/processing/processor_chain.rb +22 -11
  83. data/lib/julewire/core/processing/processor_registry.rb +3 -4
  84. data/lib/julewire/core/processing/record_field_transform.rb +0 -4
  85. data/lib/julewire/core/processing/sampling.rb +1 -3
  86. data/lib/julewire/core/processing.rb +2 -2
  87. data/lib/julewire/core/propagation/carrier.rb +73 -19
  88. data/lib/julewire/core/propagation.rb +18 -4
  89. data/lib/julewire/core/records/build_input.rb +75 -0
  90. data/lib/julewire/core/records/console_formatter.rb +6 -6
  91. data/lib/julewire/core/records/deconstruct.rb +1 -1
  92. data/lib/julewire/core/records/display_message.rb +2 -4
  93. data/lib/julewire/core/records/draft.rb +127 -258
  94. data/lib/julewire/core/records/lazy_emit_input.rb +2 -12
  95. data/lib/julewire/core/records/metadata.rb +4 -3
  96. data/lib/julewire/core/records/public_projection.rb +2 -2
  97. data/lib/julewire/core/records/raw_input.rb +1 -1
  98. data/lib/julewire/core/records/record.rb +30 -18
  99. data/lib/julewire/core/records/severity.rb +7 -15
  100. data/lib/julewire/core/runtime.rb +87 -72
  101. data/lib/julewire/core/runtime_registry.rb +20 -15
  102. data/lib/julewire/core/runtime_state.rb +5 -3
  103. data/lib/julewire/core/scheduling/shared_scheduler.rb +28 -22
  104. data/lib/julewire/core/serialization/backtrace_limiter.rb +13 -9
  105. data/lib/julewire/core/serialization/bounded_transform.rb +3 -2
  106. data/lib/julewire/core/serialization/bounded_traversal.rb +72 -83
  107. data/lib/julewire/core/serialization/deep_compact_empty.rb +9 -11
  108. data/lib/julewire/core/serialization/deep_freeze.rb +45 -6
  109. data/lib/julewire/core/serialization/encoding_sanitizer.rb +2 -3
  110. data/lib/julewire/core/serialization/exception_shape.rb +7 -6
  111. data/lib/julewire/core/serialization/json_encoder.rb +10 -13
  112. data/lib/julewire/core/serialization/serializer.rb +22 -49
  113. data/lib/julewire/core/serialization/serializer_pool.rb +9 -0
  114. data/lib/julewire/core/serialization/text_encoder.rb +5 -5
  115. data/lib/julewire/core/serialization/truncation_metadata.rb +157 -0
  116. data/lib/julewire/core/serialization/value_copy.rb +183 -109
  117. data/lib/julewire/core/serialization/value_traversal.rb +10 -127
  118. data/lib/julewire/core/testing.rb +6 -56
  119. data/lib/julewire/core/validation.rb +2 -3
  120. data/lib/julewire/core/version.rb +1 -1
  121. data/lib/julewire/core.rb +2 -7
  122. metadata +7 -19
  123. data/lib/julewire/core/scheduling/deadline_scheduler.rb +0 -207
  124. data/lib/julewire/core/testing/chaos/catalog.rb +0 -72
  125. data/lib/julewire/core/testing/chaos/core_runtime.rb +0 -120
  126. data/lib/julewire/core/testing/chaos/destination.rb +0 -55
  127. data/lib/julewire/core/testing/chaos/emitter.rb +0 -20
  128. data/lib/julewire/core/testing/chaos/raising_output.rb +0 -42
  129. data/lib/julewire/core/testing/chaos.rb +0 -80
  130. data/lib/julewire/core/testing/contracts/component.rb +0 -162
  131. data/lib/julewire/core/testing/contracts/deadline_scheduler.rb +0 -59
  132. data/lib/julewire/core/testing/contracts/integration.rb +0 -166
  133. data/lib/julewire/core/testing/contracts/integration_fields.rb +0 -36
  134. data/lib/julewire/core/testing/contracts/record_draft.rb +0 -37
  135. data/lib/julewire/core/testing/contracts/runtime.rb +0 -178
  136. data/lib/julewire/core/testing/contracts/wire.rb +0 -60
  137. data/lib/julewire/core/testing/contracts.rb +0 -24
  138. data/lib/julewire/core/testing/coverage.rb +0 -58
  139. data/lib/julewire/core/testing/test_reports.rb +0 -78
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Julewire
4
- module Core
5
- module Testing
6
- module Contracts
7
- module Wire
8
- def assert_julewire_propagation_contract(key: Julewire::Core::Propagation::Carrier::DEFAULT_KEY)
9
- carrier = {}
10
- extracted = nil
11
- restored = nil
12
-
13
- Julewire.with_execution(type: :contract, id: "contract-1", emit_summary: false) do
14
- Julewire.context.add(request_id: "request-1")
15
- Julewire.carry.add(http: { request_headers: { traceparent: contract_traceparent } })
16
-
17
- assert_same carrier, Julewire::Core::Propagation::Carrier.inject(carrier, key: key)
18
-
19
- extracted = Julewire::Core::Propagation::Carrier.extract(carrier, key: key)
20
- assert_equal "request-1", extracted.dig(:context, :request_id)
21
- assert_equal contract_traceparent, extracted.dig(:carry, :http, :request_headers, :traceparent)
22
- assert_equal "contract-1", extracted.dig(:execution, :id)
23
-
24
- Julewire::Core::Propagation::Carrier.restore(carrier, key: key) do
25
- restored = Julewire::Core::Propagation.capture_local
26
- end
27
- end
28
-
29
- assert_equal "request-1", restored.dig(:context, :request_id)
30
- assert_equal contract_traceparent, restored.dig(:carry, :http, :request_headers, :traceparent)
31
- assert_equal "contract-1", restored.dig(:execution, :id)
32
- assert_oversize_carrier_clears_stale_value!(key)
33
-
34
- extracted
35
- end
36
-
37
- private
38
-
39
- def assert_oversize_carrier_clears_stale_value!(key)
40
- string_key = key.to_s
41
- symbol_key = key.is_a?(String) ? key.to_sym : key
42
- carrier = { string_key => "stale" }
43
- carrier[symbol_key] = "stale" if symbol_key != string_key
44
-
45
- result = Julewire::Core::Propagation::Carrier.inject(
46
- carrier,
47
- envelope: { context: { large: "x" * 64 } },
48
- key: key,
49
- max_bytes: 1
50
- )
51
-
52
- assert_nil result
53
- refute carrier.key?(string_key)
54
- refute carrier.key?(symbol_key) if symbol_key != string_key
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "contracts/component"
4
- require_relative "contracts/deadline_scheduler"
5
- require_relative "contracts/integration"
6
- require_relative "contracts/record_draft"
7
- require_relative "contracts/runtime"
8
- require_relative "contracts/wire"
9
-
10
- module Julewire
11
- module Core
12
- module Testing
13
- # @api extension
14
- module Contracts
15
- include Component
16
- include DeadlineScheduler
17
- include Integration
18
- include RecordDraft
19
- include Runtime
20
- include Wire
21
- end
22
- end
23
- end
24
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Julewire
4
- module Core
5
- module Testing
6
- # @api extension
7
- module Coverage
8
- DEFAULT_MINIMUM_LINE = 96
9
- DEFAULT_MINIMUM_BRANCH = 87
10
-
11
- class << self
12
- def start!(minimum_line: DEFAULT_MINIMUM_LINE, minimum_branch: DEFAULT_MINIMUM_BRANCH, filters: [])
13
- return unless ENV["COVERAGE"]
14
-
15
- require "simplecov"
16
- require "simplecov-lcov"
17
-
18
- configure_lcov_formatter
19
- configure_formatters
20
- start_simplecov(minimum_line: minimum_line, minimum_branch: minimum_branch, filters: filters)
21
- nil
22
- end
23
-
24
- def configure_lcov_formatter
25
- SimpleCov::Formatter::LcovFormatter.config do |config|
26
- config.report_with_single_file = true
27
- config.output_directory = "coverage/lcov"
28
- config.lcov_file_name = "lcov.info"
29
- config.single_report_path = "coverage/lcov/lcov.info"
30
- end
31
- end
32
-
33
- def configure_formatters
34
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
35
- [
36
- SimpleCov::Formatter::HTMLFormatter,
37
- SimpleCov::Formatter::LcovFormatter
38
- ]
39
- )
40
- end
41
-
42
- def start_simplecov(minimum_line:, minimum_branch:, filters:)
43
- SimpleCov.start do
44
- enable_coverage :branch
45
- minimum_coverage line: minimum_line, branch: minimum_branch if minimum_line || minimum_branch
46
- track_files "lib/**/*.rb"
47
- add_filter "/test/"
48
- add_filter "/lib/julewire/core/testing/coverage.rb"
49
- add_filter %r{/lib/julewire/[^/]+/version\.rb\z}
50
- add_filter %r{/lib/julewire-[^/]+\.rb\z}
51
- filters.each { add_filter(it) }
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Julewire
4
- module Core
5
- module Testing
6
- module TestReports
7
- module CodecovJUnitReportMethods
8
- def report
9
- return super unless @single_file
10
-
11
- puts "Writing XML reports to #{reports_path}"
12
- File.write(filename_for("minitest"), testsuites_xml)
13
- end
14
-
15
- private
16
-
17
- def testsuites_xml
18
- suites = tests.group_by { test_class(it) }
19
- result = analyze_suite(tests)
20
- xml = Builder::XmlMarkup.new(indent: 2)
21
- xml.instruct!
22
- xml.testsuites(testsuite_result_attributes(result)) do
23
- suites.each do |suite, suite_tests|
24
- parse_xml_for(xml, suite, suite_tests)
25
- end
26
- end
27
-
28
- xml.target!
29
- end
30
-
31
- def testsuite_result_attributes(result)
32
- {
33
- name: "minitest",
34
- skipped: result[:skip_count],
35
- failures: result[:fail_count],
36
- errors: result[:error_count],
37
- tests: result[:test_count],
38
- assertions: result[:assertion_count],
39
- time: result[:time]
40
- }
41
- end
42
- end
43
- private_constant :CodecovJUnitReportMethods
44
-
45
- module_function
46
-
47
- def start!(enabled: ENV.fetch("JULEWIRE_JUNIT", nil),
48
- reports_dir: ENV.fetch("JULEWIRE_JUNIT_DIR", "test/reports"))
49
- return unless enabled
50
-
51
- require "fileutils"
52
- require "minitest/reporters"
53
-
54
- FileUtils.mkdir_p(reports_dir)
55
- junit = junit_reporter_class.new(
56
- reports_dir,
57
- true,
58
- base_path: Dir.pwd,
59
- include_timestamp: true,
60
- single_file: true
61
- )
62
-
63
- Minitest::Reporters.use!(
64
- [Minitest::Reporters::DefaultReporter.new, junit],
65
- ENV,
66
- Minitest.backtrace_filter
67
- )
68
- end
69
-
70
- def junit_reporter_class
71
- @junit_reporter_class ||= Class.new(Minitest::Reporters::JUnitReporter) do
72
- include CodecovJUnitReportMethods
73
- end
74
- end
75
- end
76
- end
77
- end
78
- end