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
@@ -4,10 +4,10 @@ module TraceViz
|
|
4
4
|
module Formatters
|
5
5
|
module Helpers
|
6
6
|
module TimeHelper
|
7
|
-
def execution_time_representation
|
7
|
+
def execution_time_representation(trace_data)
|
8
8
|
return unless config.execution[:show_time] && trace_data.duration
|
9
9
|
|
10
|
-
"in
|
10
|
+
format("in %.6fms", trace_data.duration)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../base_formatter_factory"
|
4
|
+
require_relative "method_call_formatter"
|
5
|
+
require_relative "method_return_formatter"
|
6
|
+
require_relative "summary_group_formatter"
|
7
|
+
|
8
|
+
module TraceViz
|
9
|
+
module Formatters
|
10
|
+
module Log
|
11
|
+
class FormatterFactory < BaseFormatterFactory
|
12
|
+
def initialize
|
13
|
+
super(
|
14
|
+
call: Log::MethodCallFormatter.new,
|
15
|
+
return: Log::MethodReturnFormatter.new,
|
16
|
+
summary_group: Log::SummaryGroupFormatter.new
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "verbose_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Log
|
8
|
+
class MethodCallFormatter < VerboseFormatter
|
9
|
+
include Helpers::Log::ParamsHelper
|
10
|
+
include Helpers::Log::ResultHelper
|
11
|
+
|
12
|
+
def call(trace_data)
|
13
|
+
[
|
14
|
+
indent_representation(trace_data),
|
15
|
+
format_depth(trace_data, config),
|
16
|
+
format_method_name(trace_data, config),
|
17
|
+
colorize_for(source_location_representation(trace_data), :trace_source_location),
|
18
|
+
format_params(trace_data, config),
|
19
|
+
format_result(trace_data, config),
|
20
|
+
colorize_for(execution_time_representation(trace_data), :trace_execution_time),
|
21
|
+
].compact.join(" ")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def format_result(trace_data, config)
|
27
|
+
return unless trace_data.method_return
|
28
|
+
|
29
|
+
super(trace_data.method_return, config)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "verbose_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Log
|
8
|
+
class MethodReturnFormatter < VerboseFormatter
|
9
|
+
include Helpers::Log::ResultHelper
|
10
|
+
|
11
|
+
def call(trace_data)
|
12
|
+
[
|
13
|
+
indent_representation(trace_data),
|
14
|
+
format_depth(trace_data, config),
|
15
|
+
format_method_name(trace_data, config),
|
16
|
+
format_result(trace_data, config),
|
17
|
+
colorize_for(source_location_representation(trace_data), :trace_source_location),
|
18
|
+
colorize_for(execution_time_representation(trace_data), :trace_execution_time),
|
19
|
+
].compact.join(" ")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Log
|
8
|
+
class SummaryGroupFormatter < BaseFormatter
|
9
|
+
include Helpers::Log::DepthHelper
|
10
|
+
include Helpers::Log::MethodNameHelper
|
11
|
+
include Helpers::Log::Summary::ParamsHelper
|
12
|
+
|
13
|
+
def call(trace_data)
|
14
|
+
[
|
15
|
+
indent_representation(trace_data),
|
16
|
+
format_depth(trace_data, config),
|
17
|
+
Defaults::Actions.emoji_for(:processing),
|
18
|
+
format_method_name(trace_data, config),
|
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
|
+
colorize(
|
28
|
+
"[Summary: #{trace_data.count} calls | Avg Time: #{format(
|
29
|
+
"in %.6fms",
|
30
|
+
trace_data.duration,
|
31
|
+
)}]",
|
32
|
+
:bold,
|
33
|
+
:italic,
|
34
|
+
:yellow,
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Formatters
|
7
|
+
module Log
|
8
|
+
class VerboseFormatter < BaseFormatter
|
9
|
+
include Helpers::Log::DepthHelper
|
10
|
+
include Helpers::Log::MethodNameHelper
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base_formatter"
|
4
|
+
require_relative "helpers"
|
5
|
+
|
6
|
+
module TraceViz
|
7
|
+
module Formatters
|
8
|
+
class TraceDataFormatter < BaseFormatter
|
9
|
+
#
|
10
|
+
# General formatting methods for TraceData::Base
|
11
|
+
# These methods are used to format the output of the trace data
|
12
|
+
# based on the configuration settings.
|
13
|
+
#
|
14
|
+
|
15
|
+
include Helpers::IndentHelper
|
16
|
+
include Helpers::DepthHelper
|
17
|
+
include Helpers::TimeHelper
|
18
|
+
include Helpers::ParamsHelper
|
19
|
+
include Helpers::SourceHelper
|
20
|
+
include Helpers::ResultHelper
|
21
|
+
include Helpers::MethodDetailsHelper
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/context"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Helpers
|
7
|
+
module ConfigHelper
|
8
|
+
def config
|
9
|
+
Context.for(:config).configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
def fetch_general_config(key)
|
13
|
+
config.general[key]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Helpers
|
5
|
+
module TracePoint
|
6
|
+
module ParamHelper
|
7
|
+
IGNORED_VARIABLES = [
|
8
|
+
"__ENCODING__", "__LINE__", "__FILE__",
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
IGNORED_METHODS = [
|
12
|
+
"initialize",
|
13
|
+
"inspect",
|
14
|
+
"object_id",
|
15
|
+
"to_s",
|
16
|
+
"class",
|
17
|
+
"method",
|
18
|
+
"instance_variable_get",
|
19
|
+
"instance_variable_set",
|
20
|
+
"instance_variables",
|
21
|
+
"public_methods",
|
22
|
+
"private_methods",
|
23
|
+
"protected_methods",
|
24
|
+
"respond_to?",
|
25
|
+
"send",
|
26
|
+
].freeze
|
27
|
+
|
28
|
+
def extract_params(binding, method_name)
|
29
|
+
method = fetch_method_via_instance_method(binding, method_name)
|
30
|
+
return {} unless method
|
31
|
+
|
32
|
+
extract_parameters_from_signature(method.parameters, binding)
|
33
|
+
end
|
34
|
+
|
35
|
+
def fetch_method_via_instance_method(binding, method_name)
|
36
|
+
klass_instance = safe_eval(binding, "self")
|
37
|
+
return unless klass_instance
|
38
|
+
|
39
|
+
klass = klass_instance.class
|
40
|
+
klass.instance_method(method_name)
|
41
|
+
rescue StandardError
|
42
|
+
# TraceViz.logger.error("Failed to fetch method #{method_name}: #{e.message}")
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def extract_parameters_from_signature(parameters, binding)
|
47
|
+
parameters.each_with_object({}) do |(_, name), hash|
|
48
|
+
next unless name
|
49
|
+
next if should_ignore_parameter?(name)
|
50
|
+
|
51
|
+
hash[name] = safe_local_variable_get(binding, name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def safe_local_variable_get(binding, name)
|
56
|
+
binding.local_variable_get(name)
|
57
|
+
rescue NameError
|
58
|
+
# class_name = safe_eval(binding, "self.class") || "unknown class"
|
59
|
+
# TraceViz.logger.error("Failed to get local variable '#{name}' in #{class_name}: #{e.message}")
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def safe_eval(binding, expression)
|
64
|
+
binding.eval(expression)
|
65
|
+
rescue StandardError => e
|
66
|
+
TraceViz.logger.error("Failed to eval expression #{expression}: #{e.message}")
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def should_ignore_parameter?(parameter_name)
|
71
|
+
parameter_name_str = parameter_name.to_s
|
72
|
+
return true if should_ignore_variable?(parameter_name_str)
|
73
|
+
return true if should_ignore_method?(parameter_name_str)
|
74
|
+
return true if splat_parameter?(parameter_name_str)
|
75
|
+
return true if placeholder_parameter?(parameter_name_str)
|
76
|
+
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
def should_ignore_variable?(variable_name_str)
|
81
|
+
IGNORED_VARIABLES.include?(variable_name_str)
|
82
|
+
end
|
83
|
+
|
84
|
+
def should_ignore_method?(method_name_str)
|
85
|
+
IGNORED_METHODS.include?(method_name_str)
|
86
|
+
end
|
87
|
+
|
88
|
+
def splat_parameter?(parameter_name_str)
|
89
|
+
parameter_name_str.include?("*")
|
90
|
+
end
|
91
|
+
|
92
|
+
def placeholder_parameter?(parameter_name_str)
|
93
|
+
parameter_name_str.start_with?("_")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/context"
|
4
|
+
|
5
|
+
module TraceViz
|
6
|
+
module Helpers
|
7
|
+
module TrackingHelper
|
8
|
+
def tracker
|
9
|
+
Context.for(:tracking)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Helper methods to access tracker attributes
|
13
|
+
def active_call_stack
|
14
|
+
tracker.active_calls
|
15
|
+
end
|
16
|
+
|
17
|
+
def current_call
|
18
|
+
tracker.current_call
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_depth
|
22
|
+
tracker.current_depth
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/trace_viz/logger.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "trace_viz/utils/colorize"
|
4
|
+
|
3
5
|
module TraceViz
|
4
6
|
class Logger
|
5
|
-
LEVELS = Defaults.
|
7
|
+
LEVELS = Defaults::Actions.keys.freeze
|
6
8
|
|
7
9
|
def initialize(output: $stdout)
|
8
10
|
@output = output
|
@@ -18,11 +20,11 @@ module TraceViz
|
|
18
20
|
validate_message!(message)
|
19
21
|
validate_level!(level)
|
20
22
|
|
21
|
-
|
22
|
-
emoji = emoji_for(level)
|
23
|
+
colors = Defaults::Actions.colors_for(level)
|
24
|
+
emoji = Defaults::Actions.emoji_for(level)
|
23
25
|
|
24
26
|
raw_message = build_message(message, level, emoji)
|
25
|
-
formatted_message =
|
27
|
+
formatted_message = apply_colors(raw_message, colors)
|
26
28
|
|
27
29
|
@output.puts(formatted_message)
|
28
30
|
end
|
@@ -37,27 +39,14 @@ module TraceViz
|
|
37
39
|
raise ArgumentError, "Invalid log level: #{level}" unless LEVELS.include?(level)
|
38
40
|
end
|
39
41
|
|
40
|
-
def color_for(level)
|
41
|
-
color_key = Defaults.action_colors.fetch(level)
|
42
|
-
Defaults.colors.fetch(color_key)
|
43
|
-
end
|
44
|
-
|
45
|
-
def default_color
|
46
|
-
color_for(:default)
|
47
|
-
end
|
48
|
-
|
49
|
-
def emoji_for(level)
|
50
|
-
Defaults.action_emojis.fetch(level, "")
|
51
|
-
end
|
52
|
-
|
53
42
|
def build_message(message, level, emoji)
|
54
43
|
level_str = level == :default ? "" : "[#{level.to_s.upcase}]"
|
55
44
|
merged_emoji_level = "#{emoji} #{level_str}".strip
|
56
|
-
format("
|
45
|
+
format("%s%s", merged_emoji_level, message)
|
57
46
|
end
|
58
47
|
|
59
|
-
def
|
60
|
-
|
48
|
+
def apply_colors(message, colors)
|
49
|
+
Utils::Colorize.colorize(message, *colors)
|
61
50
|
end
|
62
51
|
end
|
63
52
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Loggers
|
5
|
+
class BaseLogger
|
6
|
+
def initialize
|
7
|
+
@logger = TraceViz.logger
|
8
|
+
end
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def log(*args)
|
12
|
+
new(*args).log
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def log
|
17
|
+
raise NotImplementedError
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :logger
|
23
|
+
|
24
|
+
def log_message(level, message)
|
25
|
+
logger.send(level, message)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TraceViz
|
4
|
+
module Loggers
|
5
|
+
class LogLevelResolver
|
6
|
+
LOG_LEVELS = {
|
7
|
+
call: :start,
|
8
|
+
return: :finish,
|
9
|
+
}.freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def resolve(trace_data)
|
13
|
+
LOG_LEVELS[trace_data.event] || :info
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/helpers"
|
4
|
+
require_relative "trace_logger"
|
5
|
+
require_relative "post_collection_logger"
|
6
|
+
require_relative "trace_stats_logger"
|
7
|
+
|
8
|
+
module TraceViz
|
9
|
+
module Loggers
|
10
|
+
class LoggingManager
|
11
|
+
include Helpers::ConfigHelper
|
12
|
+
|
13
|
+
def log_runtime_trace(trace_data)
|
14
|
+
return unless runtime_logging_enabled?
|
15
|
+
|
16
|
+
TraceLogger.log(trace_data)
|
17
|
+
end
|
18
|
+
|
19
|
+
def log_stats(collector)
|
20
|
+
return unless stats_logging_enabled?
|
21
|
+
|
22
|
+
TraceStatsLogger.log(collector)
|
23
|
+
end
|
24
|
+
|
25
|
+
def log_post_collection(collector)
|
26
|
+
return unless post_collection_logging_enabled?
|
27
|
+
|
28
|
+
PostCollectionLogger.log(collector)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def runtime_logging_enabled?
|
34
|
+
config.log[:enabled] && config.log[:runtime]
|
35
|
+
end
|
36
|
+
|
37
|
+
def post_collection_logging_enabled?
|
38
|
+
config.log[:enabled] && config.log[:post_collection]
|
39
|
+
end
|
40
|
+
|
41
|
+
def stats_logging_enabled?
|
42
|
+
config.log[:enabled] && config.log[:stats]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "trace_viz/formatters/log/formatter_factory"
|
4
|
+
require "trace_viz/renderers/renderer_builder"
|
5
|
+
require "trace_viz/shared"
|
6
|
+
require_relative "base_logger"
|
7
|
+
require_relative "log_level_resolver"
|
8
|
+
|
9
|
+
module TraceViz
|
10
|
+
module Loggers
|
11
|
+
class PostCollectionLogger < BaseLogger
|
12
|
+
include Helpers::ConfigHelper
|
13
|
+
include Shared::RendererHelper
|
14
|
+
|
15
|
+
def initialize(collector)
|
16
|
+
super()
|
17
|
+
|
18
|
+
@collector = collector
|
19
|
+
|
20
|
+
@renderer = Renderers::RendererBuilder.build(
|
21
|
+
collector,
|
22
|
+
key: fetch_general_config(:mode),
|
23
|
+
formatter_factory: Formatters::Log::FormatterFactory.new,
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def log
|
28
|
+
process_lines(renderer.to_lines) { |line| log_line(line) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
attr_reader :collector, :renderer
|
34
|
+
|
35
|
+
def log_line(line)
|
36
|
+
log_message(resolve_log_level(line[:data]), line[:line])
|
37
|
+
end
|
38
|
+
|
39
|
+
def resolve_log_level(trace_data)
|
40
|
+
LogLevelResolver.resolve(trace_data)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,37 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "base_logger"
|
4
|
+
require_relative "log_level_resolver"
|
5
|
+
require "trace_viz/formatters/log/formatter_factory"
|
4
6
|
|
5
7
|
module TraceViz
|
6
8
|
module Loggers
|
7
|
-
class TraceLogger
|
8
|
-
LOG_LEVELS = {
|
9
|
-
call: :start,
|
10
|
-
return: :finish,
|
11
|
-
}.freeze
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def log(trace_data)
|
15
|
-
new(trace_data).log
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
9
|
+
class TraceLogger < BaseLogger
|
19
10
|
def initialize(trace_data)
|
20
|
-
|
11
|
+
super()
|
12
|
+
|
21
13
|
@trace_data = trace_data
|
14
|
+
@formatter_factory = Formatters::Log::FormatterFactory.new
|
22
15
|
end
|
23
16
|
|
24
17
|
def log
|
25
|
-
log_level
|
26
|
-
logger.send(log_level, formatted_message)
|
18
|
+
log_message(log_level, formatted_message)
|
27
19
|
end
|
28
20
|
|
29
21
|
private
|
30
22
|
|
31
|
-
attr_reader :
|
23
|
+
attr_reader :trace_data, :formatter_factory
|
24
|
+
|
25
|
+
def log_level
|
26
|
+
LogLevelResolver.resolve(trace_data)
|
27
|
+
end
|
32
28
|
|
33
29
|
def formatted_message
|
34
|
-
|
30
|
+
formatter_factory.fetch_formatter(trace_data.key).call(trace_data)
|
35
31
|
end
|
36
32
|
end
|
37
33
|
end
|
@@ -1,32 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "base_logger"
|
4
4
|
|
5
5
|
module TraceViz
|
6
6
|
module Loggers
|
7
|
-
class TraceStatsLogger
|
8
|
-
class << self
|
9
|
-
def log(collector)
|
10
|
-
new(collector).log
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
7
|
+
class TraceStatsLogger < BaseLogger
|
14
8
|
def initialize(collector)
|
15
|
-
|
9
|
+
super()
|
10
|
+
@collector = collector
|
16
11
|
@stats = collector.stats
|
17
12
|
end
|
18
13
|
|
19
14
|
def log
|
20
|
-
logger.stats(
|
15
|
+
logger.stats(format_stats)
|
21
16
|
end
|
22
17
|
|
23
18
|
private
|
24
19
|
|
25
|
-
attr_reader :
|
20
|
+
attr_reader :stats
|
21
|
+
|
22
|
+
def format_stats
|
23
|
+
[
|
24
|
+
total_traces_info,
|
25
|
+
max_depth_info,
|
26
|
+
event_counts_info,
|
27
|
+
].join(" | ")
|
28
|
+
end
|
29
|
+
|
30
|
+
def total_traces_info
|
31
|
+
"Total Traces: #{stats.total_traces}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def max_depth_info
|
35
|
+
"Max Depth: #{stats.max_depth}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def event_counts_info
|
39
|
+
"Event Counts: [#{formatted_event_counts}]"
|
40
|
+
end
|
26
41
|
|
27
|
-
def
|
28
|
-
|
29
|
-
"Total Traces: #{stats.total_traces} | Max Depth: #{stats.max_depth} | Event Counts: [#{event_counts}]"
|
42
|
+
def formatted_event_counts
|
43
|
+
stats.event_counts.map { |event, count| "#{event.capitalize}: #{count}" }.join(", ")
|
30
44
|
end
|
31
45
|
end
|
32
46
|
end
|