trace_viz 0.0.2 → 1.0.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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -37
  3. data/Steepfile +34 -0
  4. data/examples/eu_central_bank.rb +69 -0
  5. data/examples/example.cast +189 -285
  6. data/lib/trace_viz/adapters/base_adapter.rb +24 -1
  7. data/lib/trace_viz/adapters/trace_point_adapter.rb +3 -10
  8. data/lib/trace_viz/collectors/base_collector.rb +42 -35
  9. data/lib/trace_viz/collectors/filters/base_class_filter.rb +29 -0
  10. data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
  11. data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
  12. data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
  13. data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
  14. data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
  15. data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
  16. data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
  17. data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
  18. data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
  19. data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
  20. data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
  21. data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
  22. data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
  23. data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
  24. data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
  25. data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
  26. data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
  27. data/lib/trace_viz/collectors/steps.rb +10 -0
  28. data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
  29. data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
  30. data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
  31. data/lib/trace_viz/config/validator.rb +6 -5
  32. data/lib/trace_viz/configuration.rb +3 -3
  33. data/lib/trace_viz/context/tracking_context.rb +4 -0
  34. data/lib/trace_viz/core/tracer.rb +2 -0
  35. data/lib/trace_viz/defaults/actions.rb +84 -0
  36. data/lib/trace_viz/defaults/colors.rb +61 -0
  37. data/lib/trace_viz/defaults/config.rb +89 -0
  38. data/lib/trace_viz/defaults/themes.rb +66 -0
  39. data/lib/trace_viz/defaults.rb +10 -129
  40. data/lib/trace_viz/exporters/base_exporter.rb +8 -11
  41. data/lib/trace_viz/exporters/export_manager.rb +33 -0
  42. data/lib/trace_viz/exporters/registry.rb +25 -0
  43. data/lib/trace_viz/exporters/text_exporter.rb +22 -0
  44. data/lib/trace_viz/formatters/base_formatter.rb +3 -30
  45. data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
  46. data/lib/trace_viz/formatters/export/formatter_factory.rb +27 -0
  47. data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
  48. data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
  49. data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
  50. data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
  51. data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
  52. data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
  53. data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
  54. data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
  55. data/lib/trace_viz/formatters/helpers/log/params_helper.rb +51 -0
  56. data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
  57. data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +53 -0
  58. data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
  59. data/lib/trace_viz/formatters/helpers/params_helper.rb +26 -9
  60. data/lib/trace_viz/formatters/helpers/result_helper.rb +1 -1
  61. data/lib/trace_viz/formatters/helpers/source_helper.rb +2 -1
  62. data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +41 -0
  63. data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
  64. data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
  65. data/lib/trace_viz/formatters/helpers.rb +10 -0
  66. data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
  67. data/lib/trace_viz/formatters/log/formatter_factory.rb +27 -0
  68. data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
  69. data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
  70. data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
  71. data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
  72. data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
  73. data/lib/trace_viz/helpers/config_helper.rb +13 -0
  74. data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
  75. data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
  76. data/lib/trace_viz/helpers.rb +9 -0
  77. data/lib/trace_viz/logger.rb +9 -20
  78. data/lib/trace_viz/loggers/base_logger.rb +29 -0
  79. data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
  80. data/lib/trace_viz/loggers/logging_manager.rb +46 -0
  81. data/lib/trace_viz/loggers/post_collection_logger.rb +39 -0
  82. data/lib/trace_viz/loggers/trace_logger.rb +17 -18
  83. data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
  84. data/lib/trace_viz/renderers/base_renderer.rb +24 -0
  85. data/lib/trace_viz/renderers/render_context.rb +18 -0
  86. data/lib/trace_viz/renderers/renderer_factory.rb +41 -0
  87. data/lib/trace_viz/renderers/summary/node_processor.rb +82 -0
  88. data/lib/trace_viz/renderers/summary_renderer.rb +22 -0
  89. data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
  90. data/lib/trace_viz/shared/renderer_helper.rb +46 -0
  91. data/lib/trace_viz/shared.rb +8 -0
  92. data/lib/trace_viz/trace_data/base.rb +16 -23
  93. data/lib/trace_viz/trace_data/node.rb +33 -0
  94. data/lib/trace_viz/trace_data/root_node.rb +20 -0
  95. data/lib/trace_viz/trace_data/summary_node.rb +49 -0
  96. data/lib/trace_viz/trace_data/trace_point/base.rb +22 -31
  97. data/lib/trace_viz/trace_data/trace_point/method_call.rb +22 -17
  98. data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
  99. data/lib/trace_viz/traits/depth_trackable.rb +13 -0
  100. data/lib/trace_viz/traits/identifiable.rb +25 -0
  101. data/lib/trace_viz/traits/time_trackable.rb +13 -0
  102. data/lib/trace_viz/traits.rb +10 -0
  103. data/lib/trace_viz/utils/colorize.rb +6 -6
  104. data/lib/trace_viz/utils/format_utils/key_value_formatter.rb +37 -0
  105. data/lib/trace_viz/utils/format_utils/value_truncator.rb +74 -0
  106. data/lib/trace_viz/utils/format_utils.rb +10 -53
  107. data/lib/trace_viz/utils/id_generator.rb +35 -0
  108. data/lib/trace_viz/version.rb +1 -1
  109. data/sig/adapters/base_adapter.rbs +11 -0
  110. data/sig/adapters/trace_point_adapter.rbs +13 -0
  111. data/sig/collectors/filters/registry.rbs +13 -0
  112. data/sig/collectors/trace_point_collector.rbs +17 -0
  113. data/sig/config/copier.rbs +15 -0
  114. data/sig/config/validator.rbs +18 -0
  115. data/sig/configuration.rbs +22 -0
  116. data/sig/context/base_context.rbs +9 -0
  117. data/sig/context/config_context.rbs +13 -0
  118. data/sig/context/manager.rbs +10 -0
  119. data/sig/context/map.rbs +13 -0
  120. data/sig/context.rbs +5 -0
  121. data/sig/core/tracer.rbs +7 -0
  122. data/sig/core.rbs +4 -0
  123. data/sig/defaults.rbs +17 -0
  124. data/sig/errors.rbs +13 -0
  125. data/sig/logger.rbs +33 -0
  126. data/sig/trace_viz.rbs +1 -2
  127. data/sig/utils/colorize.rbs +8 -0
  128. data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
  129. data/sig/utils/format_utils/value_truncator.rbs +19 -0
  130. data/sig/utils/format_utils.rbs +8 -0
  131. data/sig/version.rbs +3 -0
  132. metadata +97 -18
  133. data/lib/trace_viz/collectors/depth_manager.rb +0 -37
  134. data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
  135. data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
  136. data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
  137. data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
  138. data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
  139. data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
  140. data/lib/trace_viz/loggers/trace_builder.rb +0 -30
  141. data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
  142. data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
  143. data/lib/trace_viz/loggers/trace_formatters/method_return_formatter.rb +0 -22
@@ -1,9 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require "trace_viz/exporters/export_manager"
6
+
3
7
  module TraceViz
4
8
  module Adapters
5
9
  class BaseAdapter
6
- def trace
10
+ include Helpers::ConfigHelper
11
+
12
+ def initialize
13
+ @logger = Loggers::LoggingManager.new
14
+ @exporter = Exporters::ExportManager.new
15
+ end
16
+
17
+ def trace(&block)
18
+ execute_trace(&block)
19
+ ensure
20
+ logger.log_post_collection(collector)
21
+ logger.log_stats(collector)
22
+ exporter.export(collector)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :logger, :exporter, :collector
28
+
29
+ def execute_trace
7
30
  raise NotImplementedError
8
31
  end
9
32
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  require "trace_viz/adapters/base_adapter"
4
4
  require "trace_viz/collectors/trace_point_collector"
5
- require "trace_viz/exporters/text_exporter"
6
- require "trace_viz/loggers/trace_stats_logger"
7
5
 
8
6
  module TraceViz
9
7
  module Adapters
@@ -14,18 +12,13 @@ module TraceViz
14
12
  @collector = Collectors::TracePointCollector.new
15
13
  end
16
14
 
17
- def trace(&block)
15
+ private
16
+
17
+ def execute_trace(&block)
18
18
  ::TracePoint.new(:call, :return) do |tp|
19
19
  collector.collect(tp)
20
20
  end.enable(&block)
21
- ensure
22
- Loggers::TraceStatsLogger.log(collector)
23
- Exporters::TextExporter.new(collector).export
24
21
  end
25
-
26
- private
27
-
28
- attr_reader :collector
29
22
  end
30
23
  end
31
24
  end
@@ -1,38 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/context"
4
- require "trace_viz/loggers/trace_logger"
5
- require_relative "evaluators/filter_evaluator"
6
- require_relative "evaluators/hidden_evaluator"
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require_relative "hierarchy_linker"
6
+ require_relative "trace_stats"
7
+ require_relative "trace_pipeline_builder"
7
8
 
8
9
  module TraceViz
9
10
  module Collectors
10
11
  class BaseCollector
11
- attr_reader :collection, :stats
12
+ include Helpers::ConfigHelper
13
+ include Helpers::TrackingHelper
14
+
15
+ attr_reader :collection, :hierarchy, :stats, :renderer
12
16
 
13
17
  # To implement collect trace data from the given event,
14
18
  # you need to enter the `config` context to perform the evaluation.
15
19
  def initialize
16
- @tracker = Context.for(:tracking)
17
- @stats = TraceStats.new
18
-
19
- @collection = []
20
+ setup_logger
21
+ setup_stats
22
+ setup_pipeline
23
+ setup_hierarchy
20
24
 
21
- @filter_evaluator = Evaluators::FilterEvaluator.new
22
- @hidden_evaluator = Evaluators::HiddenEvaluator.new
25
+ clear
23
26
  end
24
27
 
25
28
  def collect(event)
26
- return unless collectible?(event)
29
+ return unless can_collect?(event)
27
30
 
28
31
  trace_data = build_trace(event)
29
- return unless valid?(trace_data)
32
+ processed_data = process_trace(trace_data)
30
33
 
31
- trace_data = update_trace_depth(trace_data)
32
- return if hidden?(trace_data)
34
+ return unless processed_data
33
35
 
34
- log_trace(trace_data)
35
- store_trace(trace_data)
36
+ store_trace(processed_data)
37
+ link_to_hierarchy(processed_data)
36
38
  end
37
39
 
38
40
  def clear
@@ -41,43 +43,48 @@ module TraceViz
41
43
 
42
44
  private
43
45
 
44
- attr_reader :tracker,
45
- :filter_evaluator,
46
- :hidden_evaluator
46
+ attr_reader :logger, :pipeline
47
47
 
48
- # Checks if trace data is collectible.
49
- def collectible?(event)
50
- raise NotImplementedError
48
+ def setup_logger
49
+ @logger = Loggers::LoggingManager.new
51
50
  end
52
51
 
53
- # Validates trace data against filters.
54
- def valid?(trace_data)
55
- filter_evaluator.pass?(trace_data)
52
+ def setup_stats
53
+ @stats = TraceStats.new
56
54
  end
57
55
 
58
- # Checks if trace data should be hidden.
59
- def hidden?(trace_data)
60
- hidden_evaluator.pass?(trace_data)
56
+ def setup_pipeline
57
+ @pipeline = TracePipelineBuilder.build
61
58
  end
62
59
 
63
- # Builds trace data from the given data.
64
- def build_trace(event)
65
- raise NotImplementedError
60
+ def setup_hierarchy
61
+ @hierarchy = TraceData::HierarchyLinker.new
62
+ end
63
+
64
+ def process_trace(trace_data)
65
+ pipeline.process(trace_data)
66
66
  end
67
67
 
68
- def update_trace_depth(trace_data)
68
+ # Base on trace-event for specific adapter
69
+ def can_collect?(event)
69
70
  raise NotImplementedError
70
71
  end
71
72
 
72
- def log_trace(trace_data)
73
- Loggers::TraceLogger.log(trace_data)
73
+ # Builds trace data from the trace-event for specific adapter
74
+ def build_trace(event)
75
+ raise NotImplementedError
74
76
  end
75
77
 
76
78
  def store_trace(trace_data)
79
+ logger.log_runtime_trace(trace_data)
77
80
  stats.update(trace_data)
78
81
 
79
82
  @collection << trace_data
80
83
  end
84
+
85
+ def link_to_hierarchy(trace_data)
86
+ hierarchy.link(trace_data)
87
+ end
81
88
  end
82
89
  end
83
90
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseClassFilter < BaseFilter
9
+ def initialize(classes:)
10
+ super()
11
+ @classes_and_modules = classes.map(&:to_s).freeze
12
+ end
13
+
14
+ protected
15
+
16
+ attr_reader :classes_and_modules
17
+
18
+ def normalize_class_name(klass)
19
+ # Normalize class/module names to handle dynamic/nested representations
20
+ klass.to_s.gsub(/^#<Class:/, "").gsub(/>$/, "").strip
21
+ end
22
+
23
+ def matches_hierarchy?(klass_name, target_name)
24
+ klass_name == target_name || klass_name.start_with?("#{target_name}::")
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_class_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseExcludeFilter < BaseClassFilter
9
+ def apply?(trace_data)
10
+ klass_name = normalize_class_name(trace_data.klass)
11
+ !classes_and_modules.any? { |excluded| matches_hierarchy?(klass_name, excluded) }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,22 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/context"
3
+ require "trace_viz/helpers"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
8
  class BaseFilter
9
- def initialize
10
- @config = Context.for(:config).configuration
11
- end
9
+ include Helpers::ConfigHelper
12
10
 
13
11
  def apply?(trace_data)
14
12
  raise NotImplementedError
15
13
  end
16
-
17
- private
18
-
19
- attr_reader :config
20
14
  end
21
15
  end
22
16
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_class_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseIncludeFilter < BaseClassFilter
9
+ def apply?(trace_data)
10
+ klass_name = normalize_class_name(trace_data.klass)
11
+ classes_and_modules.any? { |allowed| matches_hierarchy?(klass_name, allowed) }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,26 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_filter"
3
+ require_relative "base_exclude_filter"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
- class ExcludeClassesFilter < BaseFilter
9
- def initialize(**options)
10
- super()
11
- @excluded_classes = options[:classes].map(&:to_s).freeze
12
- end
13
-
14
- def apply?(trace_data)
15
- !exclude_class?(trace_data.klass)
16
- end
17
-
18
- private
19
-
20
- attr_reader :excluded_classes
21
-
22
- def exclude_class?(klass)
23
- excluded_classes.include?(klass.to_s)
8
+ class ExcludeClassesFilter < BaseExcludeFilter
9
+ def initialize(classes:)
10
+ super(classes: classes)
24
11
  end
25
12
  end
26
13
  end
@@ -1,36 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "set"
4
- require_relative "base_filter"
3
+ require_relative "base_exclude_filter"
5
4
 
6
5
  module TraceViz
7
6
  module Collectors
8
7
  module Filters
9
- class ExcludeDefaultClassesFilter < BaseFilter
10
- RUBY_CORE_CLASSES = Set.new([
11
- Object,
12
- String,
13
- Array,
14
- Hash,
15
- Numeric,
16
- Integer,
17
- Float,
18
- Symbol,
19
- Kernel,
20
- Module,
21
- Class,
22
- Range,
23
- Regexp,
24
- ].map(&:to_s).freeze)
8
+ class ExcludeDefaultClassesFilter < BaseExcludeFilter
9
+ DEFAULT_CLASSES_AND_MODULES = [
10
+ "Object",
11
+ "String",
12
+ "Array",
13
+ "Hash",
14
+ "Numeric",
15
+ "Integer",
16
+ "Float",
17
+ "Symbol",
18
+ "Kernel",
19
+ "Module",
20
+ "Class",
21
+ "Range",
22
+ "Regexp",
23
+ "BigDecimal",
24
+ "Set",
25
+ "Gem",
26
+ ].freeze
25
27
 
26
- def apply?(trace_data)
27
- !excluded_class?(trace_data.klass)
28
- end
29
-
30
- private
31
-
32
- def excluded_class?(klass)
33
- RUBY_CORE_CLASSES.include?(klass.to_s)
28
+ def initialize
29
+ super(classes: DEFAULT_CLASSES_AND_MODULES)
34
30
  end
35
31
  end
36
32
  end
@@ -1,26 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_filter"
3
+ require_relative "base_include_filter"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
- class IncludeClassesFilter < BaseFilter
9
- def initialize(**options)
10
- super()
11
- @allowed_classes = options[:classes].map(&:to_s).freeze
12
- end
13
-
14
- def apply?(trace_data)
15
- include_class?(trace_data.klass)
16
- end
17
-
18
- private
19
-
20
- attr_reader :allowed_classes
21
-
22
- def include_class?(klass)
23
- allowed_classes.include?(klass.to_s)
8
+ class IncludeClassesFilter < BaseIncludeFilter
9
+ def initialize(classes:)
10
+ super(classes: classes)
24
11
  end
25
12
  end
26
13
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/trace_data/root_node"
4
+
5
+ module TraceViz
6
+ module TraceData
7
+ class HierarchyLinker
8
+ attr_reader :root
9
+
10
+ def initialize
11
+ @root = RootNode.new
12
+ end
13
+
14
+ def link(trace_data)
15
+ return unless valid?(trace_data)
16
+
17
+ root.add_child(trace_data)
18
+ end
19
+
20
+ private
21
+
22
+ def valid?(trace_data)
23
+ [
24
+ trace_data.event == :call,
25
+ trace_data.parent.nil?,
26
+ ].all?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Collectors
5
+ module Matchers
6
+ class BaseMatcher
7
+ def matches?
8
+ false
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/utils/id_generator"
4
+ require "trace_viz/helpers/tracking_helper"
5
+ require_relative "base_matcher"
6
+
3
7
  module TraceViz
4
8
  module Collectors
5
9
  module Matchers
6
- class TracePointActionMatcher
7
- def initialize
8
- @tracker = Context.for(:tracking)
9
- end
10
+ class TracePointActionMatcher < BaseMatcher
11
+ include Helpers::TrackingHelper
10
12
 
11
13
  def matches?(trace_point)
12
14
  current_action_id == build_action_id(trace_point)
@@ -14,8 +16,6 @@ module TraceViz
14
16
 
15
17
  private
16
18
 
17
- attr_reader :tracker
18
-
19
19
  def current_action
20
20
  tracker.active_calls.current
21
21
  end
@@ -25,11 +25,13 @@ module TraceViz
25
25
  end
26
26
 
27
27
  def build_action_id(trace_point)
28
- [
29
- trace_point.self.object_id,
30
- trace_point.callee_id,
31
- ].join("_")
28
+ Utils::IDGenerator.generate_action_id(
29
+ memory_id: trace_point.self.object_id,
30
+ action: trace_point.callee_id,
31
+ )
32
32
  end
33
+
34
+ private :tracker, :active_call_stack, :current_call, :current_depth
33
35
  end
34
36
  end
35
37
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/helpers/config_helper"
4
+ require_relative "base_matcher"
5
+
3
6
  module TraceViz
4
7
  module Collectors
5
8
  module Matchers
6
9
  class WithinDepthMatcher
7
- def initialize
8
- @config = Context.for(:config).configuration
9
- end
10
+ include Helpers::ConfigHelper
10
11
 
11
12
  def matches?(depth)
12
13
  depth <= max_depth
@@ -14,11 +15,11 @@ module TraceViz
14
15
 
15
16
  private
16
17
 
17
- attr_reader :config
18
-
19
18
  def max_depth
20
19
  config.general[:max_display_depth]
21
20
  end
21
+
22
+ private :config
22
23
  end
23
24
  end
24
25
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_step"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Steps
8
+ class AssignDepthForCallStep < BaseStep
9
+ def call(trace_data)
10
+ assign_depth(trace_data) if valid?(trace_data)
11
+ trace_data
12
+ rescue StandardError => e
13
+ logger.error("Depth assignment failed for trace_data ID: #{trace_data.id} - #{e.message}")
14
+ nil
15
+ end
16
+
17
+ private
18
+
19
+ def valid?(trace_data)
20
+ trace_data.event == :call
21
+ end
22
+
23
+ def assign_depth(trace_data)
24
+ trace_data.assign_depth(current_depth)
25
+ active_call_stack.push(trace_data)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_step"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Steps
8
+ class AssignDepthForReturnStep < BaseStep
9
+ def call(trace_data)
10
+ assign_depth(trace_data) if valid?(trace_data)
11
+ trace_data
12
+ rescue StandardError => e
13
+ logger.error("Depth assignment failed for trace_data ID: #{trace_data.id} - #{e.message}")
14
+ nil
15
+ end
16
+
17
+ private
18
+
19
+ def valid?(trace_data)
20
+ trace_data.event == :return
21
+ end
22
+
23
+ def call_matches?(trace_data)
24
+ trace_data.action_id == current_call&.action_id
25
+ end
26
+
27
+ def assign_depth(trace_data)
28
+ if call_matches?(trace_data)
29
+ active_call_stack.pop
30
+ else
31
+ logger.warn("Unmatched return event for trace_data ID #{trace_data.id}")
32
+ end
33
+
34
+ trace_data.assign_depth(current_depth)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/helpers/tracking_helper"
4
+ require "trace_viz/helpers/config_helper"
5
+
6
+ module TraceViz
7
+ module Collectors
8
+ module Steps
9
+ class BaseStep
10
+ include Helpers::TrackingHelper
11
+ include Helpers::ConfigHelper
12
+
13
+ def initialize
14
+ @logger = TraceViz.logger
15
+ end
16
+
17
+ def call
18
+ raise NotImplementedError
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :logger
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_step"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Steps
8
+ class BuildHierarchyStep < BaseStep
9
+ def call(trace_data)
10
+ link_to_parent(trace_data) if valid?(trace_data)
11
+
12
+ trace_data
13
+ rescue StandardError => e
14
+ logger.error("Hierarchy building failed for trace_data ID: #{trace_data.id} - #{e.message}")
15
+ nil
16
+ end
17
+
18
+ private
19
+
20
+ def valid?(trace_data)
21
+ trace_data.event == :call
22
+ end
23
+
24
+ def link_to_parent(trace_data)
25
+ return unless current_call
26
+
27
+ current_call.add_child(trace_data)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,17 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_evaluator"
3
+ require_relative "base_step"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
- module Evaluators
8
- class HiddenEvaluator < BaseEvaluator
9
- def pass?(trace_data)
10
- !allowed_events.include?(trace_data.event)
7
+ module Steps
8
+ class HiddenStep < BaseStep
9
+ def call(trace_data)
10
+ trace_data unless pass?(trace_data)
11
11
  end
12
12
 
13
13
  private
14
14
 
15
+ def pass?(trace_data)
16
+ !allowed_events.include?(trace_data.event)
17
+ end
18
+
15
19
  def allowed_events
16
20
  config.execution[:show_trace_events]
17
21
  end