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.
- checksums.yaml +4 -4
- data/README.md +40 -37
- data/Steepfile +34 -0
- data/examples/eu_central_bank.rb +69 -0
- data/examples/example.cast +189 -285
- data/lib/trace_viz/adapters/base_adapter.rb +24 -1
- data/lib/trace_viz/adapters/trace_point_adapter.rb +3 -10
- data/lib/trace_viz/collectors/base_collector.rb +42 -35
- data/lib/trace_viz/collectors/filters/base_class_filter.rb +29 -0
- data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
- data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
- data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
- data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
- data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
- data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
- data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
- data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
- data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
- data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
- data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
- data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
- data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
- data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
- data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
- data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
- data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
- data/lib/trace_viz/collectors/steps.rb +10 -0
- data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
- data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
- data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
- data/lib/trace_viz/config/validator.rb +6 -5
- data/lib/trace_viz/configuration.rb +3 -3
- data/lib/trace_viz/context/tracking_context.rb +4 -0
- data/lib/trace_viz/core/tracer.rb +2 -0
- data/lib/trace_viz/defaults/actions.rb +84 -0
- data/lib/trace_viz/defaults/colors.rb +61 -0
- data/lib/trace_viz/defaults/config.rb +89 -0
- data/lib/trace_viz/defaults/themes.rb +66 -0
- data/lib/trace_viz/defaults.rb +10 -129
- data/lib/trace_viz/exporters/base_exporter.rb +8 -11
- data/lib/trace_viz/exporters/export_manager.rb +33 -0
- data/lib/trace_viz/exporters/registry.rb +25 -0
- data/lib/trace_viz/exporters/text_exporter.rb +22 -0
- data/lib/trace_viz/formatters/base_formatter.rb +3 -30
- data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
- data/lib/trace_viz/formatters/export/formatter_factory.rb +27 -0
- data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
- data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
- data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
- data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
- data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
- data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
- data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
- data/lib/trace_viz/formatters/helpers/log/params_helper.rb +51 -0
- data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
- data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +53 -0
- data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/params_helper.rb +26 -9
- data/lib/trace_viz/formatters/helpers/result_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/source_helper.rb +2 -1
- data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +41 -0
- data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
- data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
- data/lib/trace_viz/formatters/helpers.rb +10 -0
- data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
- data/lib/trace_viz/formatters/log/formatter_factory.rb +27 -0
- data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
- data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
- data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
- data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
- data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
- data/lib/trace_viz/helpers/config_helper.rb +13 -0
- data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
- data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
- data/lib/trace_viz/helpers.rb +9 -0
- data/lib/trace_viz/logger.rb +9 -20
- data/lib/trace_viz/loggers/base_logger.rb +29 -0
- data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
- data/lib/trace_viz/loggers/logging_manager.rb +46 -0
- data/lib/trace_viz/loggers/post_collection_logger.rb +39 -0
- data/lib/trace_viz/loggers/trace_logger.rb +17 -18
- data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
- data/lib/trace_viz/renderers/base_renderer.rb +24 -0
- data/lib/trace_viz/renderers/render_context.rb +18 -0
- data/lib/trace_viz/renderers/renderer_factory.rb +41 -0
- data/lib/trace_viz/renderers/summary/node_processor.rb +82 -0
- data/lib/trace_viz/renderers/summary_renderer.rb +22 -0
- data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
- data/lib/trace_viz/shared/renderer_helper.rb +46 -0
- data/lib/trace_viz/shared.rb +8 -0
- data/lib/trace_viz/trace_data/base.rb +16 -23
- data/lib/trace_viz/trace_data/node.rb +33 -0
- data/lib/trace_viz/trace_data/root_node.rb +20 -0
- data/lib/trace_viz/trace_data/summary_node.rb +49 -0
- data/lib/trace_viz/trace_data/trace_point/base.rb +22 -31
- data/lib/trace_viz/trace_data/trace_point/method_call.rb +22 -17
- data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
- data/lib/trace_viz/traits/depth_trackable.rb +13 -0
- data/lib/trace_viz/traits/identifiable.rb +25 -0
- data/lib/trace_viz/traits/time_trackable.rb +13 -0
- data/lib/trace_viz/traits.rb +10 -0
- data/lib/trace_viz/utils/colorize.rb +6 -6
- data/lib/trace_viz/utils/format_utils/key_value_formatter.rb +37 -0
- data/lib/trace_viz/utils/format_utils/value_truncator.rb +74 -0
- data/lib/trace_viz/utils/format_utils.rb +10 -53
- data/lib/trace_viz/utils/id_generator.rb +35 -0
- data/lib/trace_viz/version.rb +1 -1
- data/sig/adapters/base_adapter.rbs +11 -0
- data/sig/adapters/trace_point_adapter.rbs +13 -0
- data/sig/collectors/filters/registry.rbs +13 -0
- data/sig/collectors/trace_point_collector.rbs +17 -0
- data/sig/config/copier.rbs +15 -0
- data/sig/config/validator.rbs +18 -0
- data/sig/configuration.rbs +22 -0
- data/sig/context/base_context.rbs +9 -0
- data/sig/context/config_context.rbs +13 -0
- data/sig/context/manager.rbs +10 -0
- data/sig/context/map.rbs +13 -0
- data/sig/context.rbs +5 -0
- data/sig/core/tracer.rbs +7 -0
- data/sig/core.rbs +4 -0
- data/sig/defaults.rbs +17 -0
- data/sig/errors.rbs +13 -0
- data/sig/logger.rbs +33 -0
- data/sig/trace_viz.rbs +1 -2
- data/sig/utils/colorize.rbs +8 -0
- data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
- data/sig/utils/format_utils/value_truncator.rbs +19 -0
- data/sig/utils/format_utils.rbs +8 -0
- data/sig/version.rbs +3 -0
- metadata +97 -18
- data/lib/trace_viz/collectors/depth_manager.rb +0 -37
- data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
- data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
- data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
- data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
- data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
- data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
- data/lib/trace_viz/loggers/trace_builder.rb +0 -30
- data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
- data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
- 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
|
-
|
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
|
-
|
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/
|
4
|
-
require "trace_viz/loggers/
|
5
|
-
require_relative "
|
6
|
-
require_relative "
|
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
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
setup_logger
|
21
|
+
setup_stats
|
22
|
+
setup_pipeline
|
23
|
+
setup_hierarchy
|
20
24
|
|
21
|
-
|
22
|
-
@hidden_evaluator = Evaluators::HiddenEvaluator.new
|
25
|
+
clear
|
23
26
|
end
|
24
27
|
|
25
28
|
def collect(event)
|
26
|
-
return unless
|
29
|
+
return unless can_collect?(event)
|
27
30
|
|
28
31
|
trace_data = build_trace(event)
|
29
|
-
|
32
|
+
processed_data = process_trace(trace_data)
|
30
33
|
|
31
|
-
|
32
|
-
return if hidden?(trace_data)
|
34
|
+
return unless processed_data
|
33
35
|
|
34
|
-
|
35
|
-
|
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 :
|
45
|
-
:filter_evaluator,
|
46
|
-
:hidden_evaluator
|
46
|
+
attr_reader :logger, :pipeline
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
raise NotImplementedError
|
48
|
+
def setup_logger
|
49
|
+
@logger = Loggers::LoggingManager.new
|
51
50
|
end
|
52
51
|
|
53
|
-
|
54
|
-
|
55
|
-
filter_evaluator.pass?(trace_data)
|
52
|
+
def setup_stats
|
53
|
+
@stats = TraceStats.new
|
56
54
|
end
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
hidden_evaluator.pass?(trace_data)
|
56
|
+
def setup_pipeline
|
57
|
+
@pipeline = TracePipelineBuilder.build
|
61
58
|
end
|
62
59
|
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
68
|
+
# Base on trace-event for specific adapter
|
69
|
+
def can_collect?(event)
|
69
70
|
raise NotImplementedError
|
70
71
|
end
|
71
72
|
|
72
|
-
|
73
|
-
|
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/
|
3
|
+
require "trace_viz/helpers"
|
4
4
|
|
5
5
|
module TraceViz
|
6
6
|
module Collectors
|
7
7
|
module Filters
|
8
8
|
class BaseFilter
|
9
|
-
|
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 "
|
3
|
+
require_relative "base_exclude_filter"
|
4
4
|
|
5
5
|
module TraceViz
|
6
6
|
module Collectors
|
7
7
|
module Filters
|
8
|
-
class ExcludeClassesFilter <
|
9
|
-
def initialize(
|
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
|
-
|
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 <
|
10
|
-
|
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
|
-
|
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
|
27
|
-
|
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 "
|
3
|
+
require_relative "base_include_filter"
|
4
4
|
|
5
5
|
module TraceViz
|
6
6
|
module Collectors
|
7
7
|
module Filters
|
8
|
-
class IncludeClassesFilter <
|
9
|
-
def initialize(
|
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
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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 "
|
3
|
+
require_relative "base_step"
|
4
4
|
|
5
5
|
module TraceViz
|
6
6
|
module Collectors
|
7
|
-
module
|
8
|
-
class
|
9
|
-
def
|
10
|
-
|
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
|