trace_viz 0.0.1 → 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/CONTRIBUTING.md +34 -0
- data/README.md +134 -39
- data/Steepfile +34 -0
- data/examples/eu_central_bank.rb +69 -0
- data/examples/example.cast +189 -0
- data/examples/example.rb +94 -23
- data/lib/trace_viz/adapters/base_adapter.rb +23 -2
- data/lib/trace_viz/adapters/trace_point_adapter.rb +10 -11
- data/lib/trace_viz/collectors/base_collector.rb +90 -0
- 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 +17 -0
- data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
- data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +15 -0
- data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +34 -0
- data/lib/trace_viz/collectors/filters/exclude_gems_filter.rb +30 -0
- data/lib/trace_viz/collectors/filters/exclude_internal_call_filter.rb +31 -0
- data/lib/trace_viz/collectors/filters/exclude_rails_framework_filter.rb +38 -0
- data/lib/trace_viz/collectors/filters/include_classes_filter.rb +15 -0
- data/lib/trace_viz/collectors/filters/include_gems_filter.rb +54 -0
- data/lib/trace_viz/collectors/filters/registry.rb +59 -0
- 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 +38 -0
- data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +26 -0
- 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/steps/hidden_step.rb +25 -0
- data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
- data/lib/trace_viz/collectors/steps/validation_step.rb +33 -0
- 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 +41 -0
- data/lib/trace_viz/collectors/trace_stats.rb +21 -0
- data/lib/trace_viz/config/copier.rb +38 -0
- data/lib/trace_viz/config/validator.rb +75 -0
- data/lib/trace_viz/configuration.rb +36 -30
- data/lib/trace_viz/context/config_context.rb +1 -1
- data/lib/trace_viz/context/manager.rb +17 -21
- data/lib/trace_viz/context/map.rb +29 -0
- data/lib/trace_viz/context/registry.rb +37 -0
- data/lib/trace_viz/context/tracking/active_calls.rb +37 -0
- data/lib/trace_viz/context/tracking_context.rb +11 -2
- data/lib/trace_viz/context.rb +2 -2
- data/lib/trace_viz/core/tracer.rb +3 -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 +20 -0
- data/lib/trace_viz/exporters/base_exporter.rb +81 -0
- 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 +37 -0
- data/lib/trace_viz/formatters/base_formatter.rb +15 -0
- 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 +15 -0
- data/lib/trace_viz/formatters/helpers/indent_helper.rb +15 -0
- 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 +15 -0
- data/lib/trace_viz/formatters/helpers/params_helper.rb +43 -0
- data/lib/trace_viz/formatters/helpers/result_helper.rb +21 -0
- data/lib/trace_viz/formatters/helpers/source_helper.rb +22 -0
- 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 +15 -0
- 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 +28 -49
- 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 +37 -0
- data/lib/trace_viz/loggers/trace_stats_logger.rb +47 -0
- 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 +49 -0
- 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 +59 -0
- data/lib/trace_viz/trace_data/trace_point/method_call.rb +47 -0
- data/lib/trace_viz/trace_data/trace_point/method_return.rb +45 -0
- data/lib/trace_viz/trace_data/trace_point_builder.rb +23 -0
- 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 +12 -23
- 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 +24 -0
- 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 +140 -16
- data/lib/trace_viz/adapters/trace_point/depth_manager.rb +0 -34
- data/lib/trace_viz/adapters/trace_point/event_handler.rb +0 -36
- data/lib/trace_viz/adapters/trace_point/trace_data.rb +0 -89
- data/lib/trace_viz/adapters/trace_point/trace_formatter.rb +0 -95
- data/lib/trace_viz/adapters/trace_point/trace_logger.rb +0 -44
- data/lib/trace_viz/context/manager/context_map.rb +0 -31
- data/lib/trace_viz/context/manager/context_operations.rb +0 -60
- data/lib/trace_viz/context/manager/context_registry.rb +0 -20
- data/lib/trace_viz/context/manager/context_validation.rb +0 -34
@@ -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,89 @@
|
|
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
|
+
},
|
25
|
+
result: {
|
26
|
+
show: true,
|
27
|
+
truncate_length: 50,
|
28
|
+
},
|
29
|
+
execution: {
|
30
|
+
show_time: true,
|
31
|
+
show_trace_events: [:call, :return],
|
32
|
+
},
|
33
|
+
filters: [
|
34
|
+
:exclude_internal_call,
|
35
|
+
# :exclude_default_classes,
|
36
|
+
# :exclude_rails_framework,
|
37
|
+
# include_classes: {
|
38
|
+
# classes: [],
|
39
|
+
# },
|
40
|
+
# exclude_classes: {
|
41
|
+
# classes: [],
|
42
|
+
# },
|
43
|
+
# include_gems: {
|
44
|
+
# app_running: true,
|
45
|
+
# app_path: Dir.pwd,
|
46
|
+
# gems: [],
|
47
|
+
# },
|
48
|
+
# exclude_gems: {
|
49
|
+
# gems: [],
|
50
|
+
# },
|
51
|
+
],
|
52
|
+
log: {
|
53
|
+
enabled: true,
|
54
|
+
runtime: false,
|
55
|
+
post_collection: true,
|
56
|
+
stats: true,
|
57
|
+
},
|
58
|
+
export: {
|
59
|
+
enabled: true,
|
60
|
+
path: "tmp",
|
61
|
+
format: :txt,
|
62
|
+
overwrite: false,
|
63
|
+
},
|
64
|
+
}.freeze
|
65
|
+
|
66
|
+
class << self
|
67
|
+
def fetch
|
68
|
+
DEFAULTS.dup
|
69
|
+
end
|
70
|
+
|
71
|
+
def valid_param_modes
|
72
|
+
[:name_and_value, :name_only, :value_only].freeze
|
73
|
+
end
|
74
|
+
|
75
|
+
def valid_param_mode?(mode)
|
76
|
+
valid_param_modes.include?(mode)
|
77
|
+
end
|
78
|
+
|
79
|
+
def valid_export_formats
|
80
|
+
[:txt, :json, :yaml].freeze
|
81
|
+
end
|
82
|
+
|
83
|
+
def valid_export_format?(format)
|
84
|
+
valid_export_formats.include?(format)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Defaults
|
5
|
+
class Themes
|
6
|
+
SOLARIZED = {
|
7
|
+
base03: :color_234,
|
8
|
+
base02: :color_235,
|
9
|
+
base01: :color_240,
|
10
|
+
base00: :color_241,
|
11
|
+
base0: :color_244,
|
12
|
+
base1: :color_245,
|
13
|
+
base2: :color_254,
|
14
|
+
base3: :color_230,
|
15
|
+
yellow: :color_136,
|
16
|
+
orange: :color_166,
|
17
|
+
red: :color_160,
|
18
|
+
magenta: :color_125,
|
19
|
+
violet: :color_61,
|
20
|
+
blue: :color_33,
|
21
|
+
cyan: :color_37,
|
22
|
+
green: :color_64,
|
23
|
+
}.freeze
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def solarized
|
27
|
+
SOLARIZED
|
28
|
+
end
|
29
|
+
|
30
|
+
def apply_solarized_theme
|
31
|
+
colors = {
|
32
|
+
default: SOLARIZED[:base0],
|
33
|
+
info: SOLARIZED[:blue],
|
34
|
+
success: SOLARIZED[:green],
|
35
|
+
error: SOLARIZED[:red],
|
36
|
+
warn: SOLARIZED[:yellow],
|
37
|
+
start: SOLARIZED[:blue],
|
38
|
+
processing: SOLARIZED[:base01],
|
39
|
+
finish: SOLARIZED[:magenta],
|
40
|
+
exported: SOLARIZED[:green],
|
41
|
+
skipped: SOLARIZED[:base01],
|
42
|
+
stats: [:bold, :underline, SOLARIZED[:base2]],
|
43
|
+
trace_indent: SOLARIZED[:base03],
|
44
|
+
trace_depth: SOLARIZED[:blue],
|
45
|
+
trace_depth_prefix: [:italic, SOLARIZED[:base02]],
|
46
|
+
trace_depth_open: SOLARIZED[:base02],
|
47
|
+
trace_depth_value: SOLARIZED[:red],
|
48
|
+
trace_depth_close: SOLARIZED[:base03],
|
49
|
+
trace_method_name: SOLARIZED[:cyan],
|
50
|
+
trace_method_class: [:bold, SOLARIZED[:green]],
|
51
|
+
trace_method_sign: SOLARIZED[:violet],
|
52
|
+
trace_method_action: [:bold, SOLARIZED[:blue]],
|
53
|
+
trace_source_location: SOLARIZED[:base01],
|
54
|
+
trace_params_key: SOLARIZED[:orange],
|
55
|
+
trace_params_value: SOLARIZED[:base00],
|
56
|
+
trace_result_prefix: SOLARIZED[:base1],
|
57
|
+
trace_result_value: SOLARIZED[:base3],
|
58
|
+
trace_execution_time: SOLARIZED[:cyan],
|
59
|
+
}
|
60
|
+
|
61
|
+
Defaults.action_colors = colors
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "defaults/config"
|
4
|
+
require_relative "defaults/colors"
|
5
|
+
require_relative "defaults/themes"
|
6
|
+
require_relative "defaults/actions"
|
7
|
+
|
8
|
+
module TraceViz
|
9
|
+
module Defaults
|
10
|
+
@action_colors = Actions::COLORS.dup
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_reader :action_colors
|
14
|
+
|
15
|
+
def action_colors=(new_colors)
|
16
|
+
@action_colors.merge!(new_colors)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "trace_viz/helpers"
|
5
|
+
require "trace_viz/shared"
|
6
|
+
|
7
|
+
module TraceViz
|
8
|
+
module Exporters
|
9
|
+
class BaseExporter
|
10
|
+
include Helpers::ConfigHelper
|
11
|
+
include Shared::RendererHelper
|
12
|
+
|
13
|
+
def initialize(collector)
|
14
|
+
@export_config = config.export
|
15
|
+
@logger = config.logger
|
16
|
+
|
17
|
+
@collector = collector
|
18
|
+
end
|
19
|
+
|
20
|
+
def export
|
21
|
+
unless export_enabled?
|
22
|
+
logger.warn("Export is disabled in configuration. Skipping export process.")
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
ensure_directory_exists
|
27
|
+
return if handle_empty_content == :skip
|
28
|
+
return if handle_existing_file == :skip
|
29
|
+
|
30
|
+
write_file(content)
|
31
|
+
|
32
|
+
logger.exported("Data successfully exported to #{file_path}")
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :export_config, :logger, :collector
|
38
|
+
|
39
|
+
def content
|
40
|
+
raise NotImplementedError
|
41
|
+
end
|
42
|
+
|
43
|
+
def export_enabled?
|
44
|
+
export_config[:enabled]
|
45
|
+
end
|
46
|
+
|
47
|
+
def ensure_directory_exists
|
48
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
49
|
+
end
|
50
|
+
|
51
|
+
def handle_existing_file
|
52
|
+
return unless File.exist?(file_path)
|
53
|
+
|
54
|
+
if export_config[:overwrite]
|
55
|
+
logger.processing("Overwriting existing file: #{file_path}")
|
56
|
+
else
|
57
|
+
logger.skipped("File already exists and overwrite is disabled: #{file_path}. Export skipped.")
|
58
|
+
:skip
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def handle_empty_content
|
63
|
+
if content.nil? || content.strip.empty?
|
64
|
+
logger.skipped("Export content is empty. Export skipped.")
|
65
|
+
:skip
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def file_path
|
70
|
+
format = export_config[:format]
|
71
|
+
path = export_config[:path]
|
72
|
+
|
73
|
+
"#{path}/trace_output.#{format}"
|
74
|
+
end
|
75
|
+
|
76
|
+
def write_file(data)
|
77
|
+
File.write(file_path, data)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/helpers"
|
4
|
+
require_relative "registry"
|
5
|
+
|
6
|
+
module TraceViz
|
7
|
+
module Exporters
|
8
|
+
class ExportManager
|
9
|
+
include Helpers::ConfigHelper
|
10
|
+
|
11
|
+
def export(collector)
|
12
|
+
return unless export_enabled?
|
13
|
+
|
14
|
+
exporter = build_exporter(collector)
|
15
|
+
exporter.export
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def build_exporter(collector)
|
21
|
+
Registry.build(export_format, collector)
|
22
|
+
end
|
23
|
+
|
24
|
+
def export_format
|
25
|
+
config.export[:format]
|
26
|
+
end
|
27
|
+
|
28
|
+
def export_enabled?
|
29
|
+
config.export[:enabled]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "text_exporter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Exporters
|
7
|
+
class Registry
|
8
|
+
EXPORTS = {
|
9
|
+
txt: TextExporter,
|
10
|
+
}
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def build(format, *options)
|
14
|
+
raise ArgumentError unless supported_formats.include?(format)
|
15
|
+
|
16
|
+
EXPORTS[format].new(*options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def supported_formats
|
20
|
+
EXPORTS.keys
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_exporter"
|
4
|
+
require "trace_viz/renderers/renderer_factory"
|
5
|
+
require "trace_viz/renderers/render_context"
|
6
|
+
require "trace_viz/formatters/export/formatter_factory"
|
7
|
+
|
8
|
+
module TraceViz
|
9
|
+
module Exporters
|
10
|
+
class TextExporter < BaseExporter
|
11
|
+
def initialize(collector)
|
12
|
+
super(collector)
|
13
|
+
|
14
|
+
@renderer = build_renderer(collector, Formatters::Export::FormatterFactory)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :renderer
|
20
|
+
|
21
|
+
def content
|
22
|
+
data.join("\n")
|
23
|
+
end
|
24
|
+
|
25
|
+
def data
|
26
|
+
process_lines(renderer.to_lines) { |line| process_line(line) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def process_line(line)
|
30
|
+
[
|
31
|
+
line[:line],
|
32
|
+
*process_lines(line[:nested_lines]) { |nested| process_line(nested) },
|
33
|
+
].compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "method_call_formatter"
|
4
|
+
require_relative "method_return_formatter"
|
5
|
+
require_relative "summary_group_formatter"
|
6
|
+
|
7
|
+
module TraceViz
|
8
|
+
module Formatters
|
9
|
+
module Export
|
10
|
+
class FormatterFactory
|
11
|
+
FORMATTERS = {
|
12
|
+
call: MethodCallFormatter.new,
|
13
|
+
return: MethodReturnFormatter.new,
|
14
|
+
summary_group: SummaryGroupFormatter.new,
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def fetch_formatter(key)
|
19
|
+
FORMATTERS.fetch(key) do
|
20
|
+
raise ArgumentError, "Unsupported factory key: #{key}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Export
|
8
|
+
class MethodCallFormatter < BaseFormatter
|
9
|
+
def call(trace_data)
|
10
|
+
[
|
11
|
+
indent_representation(trace_data),
|
12
|
+
depth_representation(trace_data),
|
13
|
+
method_name_representation(trace_data),
|
14
|
+
source_location_representation(trace_data),
|
15
|
+
params_representation(trace_data),
|
16
|
+
].compact.join(" ")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Export
|
8
|
+
class MethodReturnFormatter < BaseFormatter
|
9
|
+
def call(trace_data)
|
10
|
+
[
|
11
|
+
indent_representation(trace_data),
|
12
|
+
depth_representation(trace_data),
|
13
|
+
method_name_representation(trace_data),
|
14
|
+
result_representation(trace_data),
|
15
|
+
source_location_representation(trace_data),
|
16
|
+
execution_time_representation(trace_data),
|
17
|
+
].compact.join(" ")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Export
|
8
|
+
class SummaryGroupFormatter < BaseFormatter
|
9
|
+
include Helpers::Summary::ParamsHelper
|
10
|
+
include Helpers::Summary::SourceHelper
|
11
|
+
|
12
|
+
def call(trace_data)
|
13
|
+
[
|
14
|
+
indent_representation(trace_data),
|
15
|
+
depth_representation(trace_data),
|
16
|
+
Defaults::Actions.emoji_for(:processing),
|
17
|
+
method_name_representation(trace_data),
|
18
|
+
source_location_representation(trace_data),
|
19
|
+
format_params_template(trace_data, config),
|
20
|
+
summary_info(trace_data),
|
21
|
+
].compact.join(" ")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def summary_info(trace_data)
|
27
|
+
"[Summary: #{trace_data.count} calls | Avg Time: #{format(
|
28
|
+
"in %.6fms",
|
29
|
+
trace_data.average_duration,
|
30
|
+
)}]"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Formatters
|
5
|
+
module Helpers
|
6
|
+
module DepthHelper
|
7
|
+
def depth_representation(trace_data)
|
8
|
+
return unless config.general[:show_depth]
|
9
|
+
|
10
|
+
"depth[#{trace_data.depth}]"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Formatters
|
5
|
+
module Helpers
|
6
|
+
module IndentHelper
|
7
|
+
def indent_representation(trace_data)
|
8
|
+
return unless config.general[:show_indent] && config.general[:show_depth]
|
9
|
+
|
10
|
+
" " * (config.general[:tab_size] * trace_data.depth)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/utils/colorize"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Helpers
|
8
|
+
module Log
|
9
|
+
module ColorHelper
|
10
|
+
def colorize_for(text, action)
|
11
|
+
colors = Defaults::Actions.colors_for(action)
|
12
|
+
|
13
|
+
colorize(text, *colors)
|
14
|
+
end
|
15
|
+
|
16
|
+
def colorize(text, *colors)
|
17
|
+
Utils::Colorize.colorize(text, *colors)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Formatters
|
5
|
+
module Helpers
|
6
|
+
module Log
|
7
|
+
module DepthHelper
|
8
|
+
def format_depth(trace_data, config)
|
9
|
+
return unless config.general[:show_depth]
|
10
|
+
|
11
|
+
prefix = colorize_for("depth", :trace_depth_prefix)
|
12
|
+
open_block = colorize_for("[", :trace_depth_open)
|
13
|
+
number = colorize_for(trace_data.depth, :trace_depth_value)
|
14
|
+
close_block = colorize_for("]", :trace_depth_close)
|
15
|
+
|
16
|
+
[prefix, open_block, number, close_block].join
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Formatters
|
5
|
+
module Helpers
|
6
|
+
module Log
|
7
|
+
module MethodNameHelper
|
8
|
+
def format_method_name(trace_data, config)
|
9
|
+
return unless config.general[:show_method_name]
|
10
|
+
|
11
|
+
"#{format_class_name(trace_data)}#{format_action_name(trace_data)}"
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def format_class_name(trace_data)
|
17
|
+
klass = colorize_for(trace_data.klass, :trace_method_class)
|
18
|
+
method_sign = colorize_for("#", :trace_method_sign)
|
19
|
+
[klass, method_sign].join
|
20
|
+
end
|
21
|
+
|
22
|
+
def format_action_name(trace_data)
|
23
|
+
colorize_for(trace_data.action, :trace_method_action)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|