trace_viz 0.0.2 → 1.0.1
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 +68 -43
- 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/builders/base_builder.rb +11 -0
- data/lib/trace_viz/builders/diagram/base_builder.rb +10 -0
- data/lib/trace_viz/builders/diagram/message_builder.rb +96 -0
- data/lib/trace_viz/builders/diagram/sequence_builder.rb +50 -0
- data/lib/trace_viz/collectors/base_collector.rb +42 -35
- data/lib/trace_viz/collectors/filters/base_class_filter.rb +31 -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 +91 -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 +31 -13
- data/lib/trace_viz/exporters/export_manager.rb +33 -0
- data/lib/trace_viz/exporters/mermaid_exporter.rb +17 -0
- data/lib/trace_viz/exporters/registry.rb +27 -0
- data/lib/trace_viz/exporters/text_exporter.rb +2 -2
- data/lib/trace_viz/extractors/base_extractor.rb +17 -0
- data/lib/trace_viz/extractors/diagram/base_extractor.rb +18 -0
- data/lib/trace_viz/extractors/diagram/box_extractor.rb +50 -0
- data/lib/trace_viz/extractors/diagram/message_extractor.rb +23 -0
- data/lib/trace_viz/extractors/diagram/participant_extractor.rb +37 -0
- data/lib/trace_viz/extractors/diagram/processors/message_processor.rb +93 -0
- data/lib/trace_viz/formatters/base_formatter.rb +4 -30
- data/lib/trace_viz/formatters/base_formatter_factory.rb +23 -0
- data/lib/trace_viz/formatters/diagram/sequence/base_formatter.rb +14 -0
- data/lib/trace_viz/formatters/diagram/sequence/message_formatter.rb +37 -0
- data/lib/trace_viz/formatters/diagram_formatter.rb +10 -0
- data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
- data/lib/trace_viz/formatters/export/formatter_factory.rb +22 -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/digram/action_helper.rb +17 -0
- data/lib/trace_viz/formatters/helpers/digram/result_helper.rb +39 -0
- 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 +55 -0
- data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
- data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +57 -0
- data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/params_helper.rb +30 -9
- data/lib/trace_viz/formatters/helpers/result_helper.rb +5 -4
- data/lib/trace_viz/formatters/helpers/source_helper.rb +6 -4
- data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +45 -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 +22 -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 +17 -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 +44 -0
- data/lib/trace_viz/loggers/trace_logger.rb +14 -18
- data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
- data/lib/trace_viz/managers/diagram/participant_manager.rb +23 -0
- data/lib/trace_viz/models/box.rb +19 -0
- data/lib/trace_viz/models/diagram.rb +27 -0
- data/lib/trace_viz/models/message.rb +16 -0
- data/lib/trace_viz/models/participant.rb +18 -0
- data/lib/trace_viz/models.rb +8 -0
- data/lib/trace_viz/renderers/base_renderer.rb +27 -0
- data/lib/trace_viz/renderers/diagram/sequence_renderer.rb +59 -0
- data/lib/trace_viz/renderers/render_context.rb +17 -0
- data/lib/trace_viz/renderers/renderer_builder.rb +20 -0
- data/lib/trace_viz/renderers/renderer_factory.rb +29 -0
- data/lib/trace_viz/renderers/summary_renderer.rb +34 -0
- data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
- data/lib/trace_viz/shared/renderer_helper.rb +25 -0
- data/lib/trace_viz/shared.rb +8 -0
- data/lib/trace_viz/syntax/mermaid/sequence_syntax.rb +99 -0
- data/lib/trace_viz/trace_data/base.rb +22 -22
- data/lib/trace_viz/trace_data/node.rb +39 -0
- data/lib/trace_viz/trace_data/root_node.rb +24 -0
- data/lib/trace_viz/trace_data/summary_node.rb +45 -0
- data/lib/trace_viz/trace_data/trace_point/base.rb +26 -31
- data/lib/trace_viz/trace_data/trace_point/method_call.rb +25 -16
- 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/transformers/base_transformer.rb +29 -0
- data/lib/trace_viz/transformers/summary_transformer.rb +70 -0
- data/lib/trace_viz/utils/alias_generator.rb +58 -0
- data/lib/trace_viz/utils/colorize.rb +6 -6
- data/lib/trace_viz/utils/format/key_value_formatter.rb +42 -0
- data/lib/trace_viz/utils/format/value_truncator.rb +123 -0
- data/lib/trace_viz/utils/id_generator.rb +35 -0
- data/lib/trace_viz/utils.rb +8 -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 +124 -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
- data/lib/trace_viz/utils/format_utils.rb +0 -67
@@ -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
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/context"
|
4
|
+
require_relative "base_step"
|
5
|
+
|
6
|
+
module TraceViz
|
7
|
+
module Collectors
|
8
|
+
module Steps
|
9
|
+
class LinkingStep < BaseStep
|
10
|
+
def call(trace_data)
|
11
|
+
valid?(trace_data) ? linking_trace(trace_data) : trace_data
|
12
|
+
rescue StandardError => e
|
13
|
+
logger.error("Linking failed for trace_data ID: #{trace_data.id} - #{e.message}")
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def valid?(trace_data)
|
20
|
+
return false unless current_call
|
21
|
+
|
22
|
+
[
|
23
|
+
trace_data.event == :return,
|
24
|
+
current_call.event == :call,
|
25
|
+
trace_data.action_id == current_call.action_id,
|
26
|
+
].all?
|
27
|
+
end
|
28
|
+
|
29
|
+
def linking_trace(trace_data)
|
30
|
+
trace_data.link(current_call)
|
31
|
+
trace_data
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,26 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "trace_viz/collectors/filters/registry"
|
4
|
-
require_relative "
|
4
|
+
require_relative "base_step"
|
5
5
|
|
6
6
|
module TraceViz
|
7
7
|
module Collectors
|
8
|
-
module
|
9
|
-
class
|
8
|
+
module Steps
|
9
|
+
class ValidationStep < BaseStep
|
10
10
|
def initialize
|
11
11
|
super()
|
12
|
-
|
13
12
|
@filters = build_filters.freeze
|
14
13
|
end
|
15
14
|
|
16
|
-
def
|
17
|
-
|
15
|
+
def call(trace_data)
|
16
|
+
trace_data if pass?(trace_data)
|
18
17
|
end
|
19
18
|
|
20
19
|
private
|
21
20
|
|
22
21
|
attr_reader :filters
|
23
22
|
|
23
|
+
def pass?(trace_data)
|
24
|
+
filters.all? { |filter| filter.apply?(trace_data) }
|
25
|
+
end
|
26
|
+
|
24
27
|
def build_filters
|
25
28
|
Collectors::Filters::Registry.build(config.filters)
|
26
29
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Collectors
|
5
|
+
class TracePipeline
|
6
|
+
def initialize
|
7
|
+
@steps = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_step(step)
|
11
|
+
@steps << step
|
12
|
+
end
|
13
|
+
|
14
|
+
def process(trace_data)
|
15
|
+
@steps.each do |step|
|
16
|
+
trace_data = step.call(trace_data)
|
17
|
+
return nil unless trace_data
|
18
|
+
end
|
19
|
+
trace_data
|
20
|
+
rescue StandardError => e
|
21
|
+
TraceViz.logger.error("Pipeline processing failed for trace_data ID: #{trace_data.id} - #{e.message}")
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "trace_pipeline"
|
4
|
+
require_relative "steps"
|
5
|
+
|
6
|
+
module TraceViz
|
7
|
+
module Collectors
|
8
|
+
class TracePipelineBuilder
|
9
|
+
class << self
|
10
|
+
def build
|
11
|
+
TracePipeline.new.tap do |pipeline|
|
12
|
+
pipeline.add_step(Steps::ValidationStep.new)
|
13
|
+
|
14
|
+
#
|
15
|
+
# Those actions require access to the current call,
|
16
|
+
# so it needs to be run before current call is updated
|
17
|
+
#
|
18
|
+
pipeline.add_step(Steps::BuildHierarchyStep.new)
|
19
|
+
pipeline.add_step(Steps::LinkingStep.new)
|
20
|
+
|
21
|
+
pipeline.add_step(Steps::AssignDepthForCallStep.new)
|
22
|
+
pipeline.add_step(Steps::AssignDepthForReturnStep.new)
|
23
|
+
pipeline.add_step(Steps::HiddenStep.new)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -4,8 +4,6 @@ require "trace_viz/trace_data/trace_point_builder"
|
|
4
4
|
require_relative "base_collector"
|
5
5
|
require_relative "matchers/trace_point_action_matcher"
|
6
6
|
require_relative "matchers/within_depth_matcher"
|
7
|
-
require_relative "depth_manager"
|
8
|
-
require_relative "trace_stats"
|
9
7
|
|
10
8
|
module TraceViz
|
11
9
|
module Collectors
|
@@ -21,7 +19,7 @@ module TraceViz
|
|
21
19
|
|
22
20
|
attr_reader :action_matcher, :within_depth_matcher
|
23
21
|
|
24
|
-
def
|
22
|
+
def can_collect?(trace_point)
|
25
23
|
within_depth? || match_action?(trace_point)
|
26
24
|
end
|
27
25
|
|
@@ -29,10 +27,6 @@ module TraceViz
|
|
29
27
|
TraceData::TracePointBuilder.build(trace_point)
|
30
28
|
end
|
31
29
|
|
32
|
-
def update_trace_depth(trace_data)
|
33
|
-
depth_manager.align(trace_data)
|
34
|
-
end
|
35
|
-
|
36
30
|
def match_action?(trace_point)
|
37
31
|
action_matcher.matches?(trace_point)
|
38
32
|
end
|
@@ -42,10 +36,6 @@ module TraceViz
|
|
42
36
|
|
43
37
|
within_depth_matcher.matches?(depth)
|
44
38
|
end
|
45
|
-
|
46
|
-
def depth_manager
|
47
|
-
@depth_manager ||= DepthManager.new
|
48
|
-
end
|
49
39
|
end
|
50
40
|
end
|
51
41
|
end
|
@@ -27,8 +27,9 @@ module TraceViz
|
|
27
27
|
|
28
28
|
def validate_params(value)
|
29
29
|
mode = value[:mode]
|
30
|
-
unless Defaults.
|
31
|
-
raise ArgumentError,
|
30
|
+
unless Defaults::Config.valid_param_mode?(mode)
|
31
|
+
raise ArgumentError,
|
32
|
+
"Invalid param mode: #{mode}. Valid modes are #{Defaults::Config.valid_param_modes.join(", ")}."
|
32
33
|
end
|
33
34
|
|
34
35
|
if value[:truncate_values] && (!value[:truncate_values].is_a?(Integer) || value[:truncate_values] <= 0)
|
@@ -37,7 +38,7 @@ module TraceViz
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def validate_result(value)
|
40
|
-
if value[:
|
41
|
+
if value[:truncate_value] && !value[:truncate_value].is_a?(Integer)
|
41
42
|
raise ArgumentError, "Truncate values must be a positive integer."
|
42
43
|
end
|
43
44
|
end
|
@@ -64,9 +65,9 @@ module TraceViz
|
|
64
65
|
end
|
65
66
|
|
66
67
|
format = value[:format]
|
67
|
-
unless Defaults.
|
68
|
+
unless Defaults::Config.valid_export_format?(format)
|
68
69
|
raise ArgumentError,
|
69
|
-
"Invalid export format: #{format}. Valid formats are #{Defaults.valid_export_formats.join(", ")}."
|
70
|
+
"Invalid export format: #{format}. Valid formats are #{Defaults::Config.valid_export_formats.join(", ")}."
|
70
71
|
end
|
71
72
|
end
|
72
73
|
end
|
@@ -7,12 +7,12 @@ require "trace_viz/config/copier"
|
|
7
7
|
module TraceViz
|
8
8
|
class Configuration
|
9
9
|
attr_reader :logger, :settings
|
10
|
-
attr_reader(*Defaults.
|
10
|
+
attr_reader(*Defaults::Config.fetch.keys)
|
11
11
|
|
12
12
|
def initialize
|
13
13
|
@logger = Logger.new
|
14
14
|
@validator = Config::Validator.new
|
15
|
-
@settings = Defaults.
|
15
|
+
@settings = Defaults::Config.fetch
|
16
16
|
define_dynamic_accessors
|
17
17
|
end
|
18
18
|
|
@@ -32,7 +32,7 @@ module TraceViz
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def reset_defaults
|
35
|
-
@settings = Defaults.
|
35
|
+
@settings = Defaults::Config.fetch
|
36
36
|
end
|
37
37
|
|
38
38
|
def dup
|
@@ -10,6 +10,8 @@ module TraceViz
|
|
10
10
|
module Core
|
11
11
|
class Tracer
|
12
12
|
def trace(**options, &block)
|
13
|
+
Defaults::Themes.apply_solarized_theme
|
14
|
+
|
13
15
|
Context::Manager.with_contexts(config: options, tracking: {}) do
|
14
16
|
adapter = Adapters::TracePointAdapter.new
|
15
17
|
adapter.trace(&block)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Defaults
|
5
|
+
class Actions
|
6
|
+
EMOJIS = {
|
7
|
+
default: "",
|
8
|
+
info: "ℹ️",
|
9
|
+
success: "✅",
|
10
|
+
error: "❌",
|
11
|
+
warn: "⚠️",
|
12
|
+
start: "🚀",
|
13
|
+
processing: "🔄",
|
14
|
+
finish: "🏁",
|
15
|
+
exported: "📤",
|
16
|
+
skipped: "⏩",
|
17
|
+
stats: "📊",
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
COLORS = {
|
21
|
+
# Default actions
|
22
|
+
default: :reset,
|
23
|
+
info: :cyan,
|
24
|
+
success: :green,
|
25
|
+
error: :bright_red,
|
26
|
+
warn: :yellow,
|
27
|
+
|
28
|
+
# Processing actions
|
29
|
+
start: :bright_cyan,
|
30
|
+
processing: [:dim, :bright_white],
|
31
|
+
finish: :bright_magenta,
|
32
|
+
|
33
|
+
# Export & stats actions
|
34
|
+
exported: :bright_green,
|
35
|
+
skipped: :bright_white,
|
36
|
+
stats: [:bold, :underline, :bright_white],
|
37
|
+
|
38
|
+
# Trace data actions
|
39
|
+
trace_indent: :dim,
|
40
|
+
trace_depth: :blue,
|
41
|
+
trace_depth_prefix: [:dim, :italic, :blue],
|
42
|
+
trace_depth_open: [:dim, :bright_blue],
|
43
|
+
trace_depth_value: :bright_red,
|
44
|
+
trace_depth_close: [:dim, :bright_blue],
|
45
|
+
trace_method_name: :bright_cyan,
|
46
|
+
trace_method_class: :bright_green,
|
47
|
+
trace_method_sign: :blue,
|
48
|
+
trace_method_action: [:bold, :bright_cyan],
|
49
|
+
trace_source_location: [:dim, :bright_white],
|
50
|
+
trace_params_key: :bright_yellow,
|
51
|
+
trace_params_value: [:dim, :bright_yellow],
|
52
|
+
trace_result_prefix: [:italic, :bright_blue],
|
53
|
+
trace_result_value: :bright_white,
|
54
|
+
trace_execution_time: [:dim, :bright_red],
|
55
|
+
}.freeze
|
56
|
+
|
57
|
+
class << self
|
58
|
+
def emojis
|
59
|
+
EMOJIS
|
60
|
+
end
|
61
|
+
|
62
|
+
def colors
|
63
|
+
COLORS
|
64
|
+
end
|
65
|
+
|
66
|
+
def keys
|
67
|
+
colors.keys
|
68
|
+
end
|
69
|
+
|
70
|
+
def emoji_for(action)
|
71
|
+
EMOJIS.fetch(action, EMOJIS[:default])
|
72
|
+
end
|
73
|
+
|
74
|
+
def source_colors
|
75
|
+
Defaults.action_colors || COLORS
|
76
|
+
end
|
77
|
+
|
78
|
+
def colors_for(action)
|
79
|
+
Array(source_colors.fetch(action, source_colors[:default]))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Defaults
|
5
|
+
class Colors
|
6
|
+
COLORS = {
|
7
|
+
reset: "\e[0m",
|
8
|
+
bold: "\e[1m",
|
9
|
+
dim: "\e[2m",
|
10
|
+
italic: "\e[3m",
|
11
|
+
underline: "\e[4m",
|
12
|
+
reverse: "\e[7m",
|
13
|
+
hidden: "\e[8m",
|
14
|
+
strikethrough: "\e[9m",
|
15
|
+
}
|
16
|
+
|
17
|
+
# Reference ASCII color codes
|
18
|
+
# https://talyian.github.io/ansicolors/
|
19
|
+
|
20
|
+
# Map 256-color ANSI codes
|
21
|
+
(0..255).each do |i|
|
22
|
+
COLORS["color_#{i}".to_sym] = "\e[38;5;#{i}m"
|
23
|
+
end
|
24
|
+
|
25
|
+
# To add background colors
|
26
|
+
(0..255).each do |i|
|
27
|
+
COLORS["bg_color_#{i}".to_sym] = "\e[48;5;#{i}m"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Predefined names
|
31
|
+
COLORS.merge!({
|
32
|
+
black: "\e[30m",
|
33
|
+
red: "\e[31m",
|
34
|
+
green: "\e[32m",
|
35
|
+
yellow: "\e[33m",
|
36
|
+
blue: "\e[34m",
|
37
|
+
magenta: "\e[35m",
|
38
|
+
cyan: "\e[36m",
|
39
|
+
white: "\e[37m",
|
40
|
+
bright_black: "\e[90m",
|
41
|
+
bright_red: "\e[91m",
|
42
|
+
bright_green: "\e[92m",
|
43
|
+
bright_yellow: "\e[93m",
|
44
|
+
bright_blue: "\e[94m",
|
45
|
+
bright_magenta: "\e[95m",
|
46
|
+
bright_cyan: "\e[96m",
|
47
|
+
bright_white: "\e[97m",
|
48
|
+
})
|
49
|
+
|
50
|
+
class << self
|
51
|
+
def all
|
52
|
+
COLORS
|
53
|
+
end
|
54
|
+
|
55
|
+
def fetch(color)
|
56
|
+
COLORS.fetch(color, COLORS[:reset])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Defaults
|
5
|
+
class Config
|
6
|
+
DEFAULTS = {
|
7
|
+
general: {
|
8
|
+
tab_size: 2,
|
9
|
+
mode: :summary, # :summary, :verbose
|
10
|
+
group_keys: [:event, :klass, :action],
|
11
|
+
show_indent: true,
|
12
|
+
show_depth: true,
|
13
|
+
max_display_depth: 3,
|
14
|
+
show_method_name: true,
|
15
|
+
},
|
16
|
+
source_location: {
|
17
|
+
show: false,
|
18
|
+
truncate_length: 100,
|
19
|
+
},
|
20
|
+
params: {
|
21
|
+
show: true,
|
22
|
+
mode: :name_and_value,
|
23
|
+
truncate_values: 10,
|
24
|
+
truncate_length: -1,
|
25
|
+
},
|
26
|
+
result: {
|
27
|
+
show: true,
|
28
|
+
truncate_value: 50,
|
29
|
+
truncate_length: 30,
|
30
|
+
},
|
31
|
+
execution: {
|
32
|
+
show_time: true,
|
33
|
+
show_trace_events: [:call, :return],
|
34
|
+
},
|
35
|
+
filters: [
|
36
|
+
:exclude_internal_call,
|
37
|
+
# :exclude_default_classes,
|
38
|
+
# :exclude_rails_framework,
|
39
|
+
# include_classes: {
|
40
|
+
# classes: [],
|
41
|
+
# },
|
42
|
+
# exclude_classes: {
|
43
|
+
# classes: [],
|
44
|
+
# },
|
45
|
+
# include_gems: {
|
46
|
+
# app_running: true,
|
47
|
+
# app_path: Dir.pwd,
|
48
|
+
# gems: [],
|
49
|
+
# },
|
50
|
+
# exclude_gems: {
|
51
|
+
# gems: [],
|
52
|
+
# },
|
53
|
+
],
|
54
|
+
log: {
|
55
|
+
enabled: true,
|
56
|
+
runtime: false,
|
57
|
+
post_collection: true,
|
58
|
+
stats: true,
|
59
|
+
},
|
60
|
+
export: {
|
61
|
+
enabled: true,
|
62
|
+
path: "tmp",
|
63
|
+
format: :txt,
|
64
|
+
overwrite: false,
|
65
|
+
},
|
66
|
+
}.freeze
|
67
|
+
|
68
|
+
class << self
|
69
|
+
def fetch
|
70
|
+
DEFAULTS.dup
|
71
|
+
end
|
72
|
+
|
73
|
+
def valid_param_modes
|
74
|
+
[:name_and_value, :name_only, :value_only].freeze
|
75
|
+
end
|
76
|
+
|
77
|
+
def valid_param_mode?(mode)
|
78
|
+
valid_param_modes.include?(mode)
|
79
|
+
end
|
80
|
+
|
81
|
+
def valid_export_formats
|
82
|
+
[:txt, :json, :yaml, :mermaid].freeze
|
83
|
+
end
|
84
|
+
|
85
|
+
def valid_export_format?(format)
|
86
|
+
valid_export_formats.include?(format)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|