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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -43
  3. data/Steepfile +34 -0
  4. data/examples/eu_central_bank.rb +69 -0
  5. data/examples/example.cast +189 -285
  6. data/lib/trace_viz/adapters/base_adapter.rb +24 -1
  7. data/lib/trace_viz/adapters/trace_point_adapter.rb +3 -10
  8. data/lib/trace_viz/builders/base_builder.rb +11 -0
  9. data/lib/trace_viz/builders/diagram/base_builder.rb +10 -0
  10. data/lib/trace_viz/builders/diagram/message_builder.rb +96 -0
  11. data/lib/trace_viz/builders/diagram/sequence_builder.rb +50 -0
  12. data/lib/trace_viz/collectors/base_collector.rb +42 -35
  13. data/lib/trace_viz/collectors/filters/base_class_filter.rb +31 -0
  14. data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
  15. data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
  16. data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
  17. data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
  18. data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
  19. data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
  20. data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
  21. data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
  22. data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
  23. data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
  24. data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
  25. data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
  26. data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
  27. data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
  28. data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
  29. data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
  30. data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
  31. data/lib/trace_viz/collectors/steps.rb +10 -0
  32. data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
  33. data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
  34. data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
  35. data/lib/trace_viz/config/validator.rb +6 -5
  36. data/lib/trace_viz/configuration.rb +3 -3
  37. data/lib/trace_viz/context/tracking_context.rb +4 -0
  38. data/lib/trace_viz/core/tracer.rb +2 -0
  39. data/lib/trace_viz/defaults/actions.rb +84 -0
  40. data/lib/trace_viz/defaults/colors.rb +61 -0
  41. data/lib/trace_viz/defaults/config.rb +91 -0
  42. data/lib/trace_viz/defaults/themes.rb +66 -0
  43. data/lib/trace_viz/defaults.rb +10 -129
  44. data/lib/trace_viz/exporters/base_exporter.rb +31 -13
  45. data/lib/trace_viz/exporters/export_manager.rb +33 -0
  46. data/lib/trace_viz/exporters/mermaid_exporter.rb +17 -0
  47. data/lib/trace_viz/exporters/registry.rb +27 -0
  48. data/lib/trace_viz/exporters/text_exporter.rb +2 -2
  49. data/lib/trace_viz/extractors/base_extractor.rb +17 -0
  50. data/lib/trace_viz/extractors/diagram/base_extractor.rb +18 -0
  51. data/lib/trace_viz/extractors/diagram/box_extractor.rb +50 -0
  52. data/lib/trace_viz/extractors/diagram/message_extractor.rb +23 -0
  53. data/lib/trace_viz/extractors/diagram/participant_extractor.rb +37 -0
  54. data/lib/trace_viz/extractors/diagram/processors/message_processor.rb +93 -0
  55. data/lib/trace_viz/formatters/base_formatter.rb +4 -30
  56. data/lib/trace_viz/formatters/base_formatter_factory.rb +23 -0
  57. data/lib/trace_viz/formatters/diagram/sequence/base_formatter.rb +14 -0
  58. data/lib/trace_viz/formatters/diagram/sequence/message_formatter.rb +37 -0
  59. data/lib/trace_viz/formatters/diagram_formatter.rb +10 -0
  60. data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
  61. data/lib/trace_viz/formatters/export/formatter_factory.rb +22 -0
  62. data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
  63. data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
  64. data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
  65. data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
  66. data/lib/trace_viz/formatters/helpers/digram/action_helper.rb +17 -0
  67. data/lib/trace_viz/formatters/helpers/digram/result_helper.rb +39 -0
  68. data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
  69. data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
  70. data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
  71. data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
  72. data/lib/trace_viz/formatters/helpers/log/params_helper.rb +55 -0
  73. data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
  74. data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +57 -0
  75. data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
  76. data/lib/trace_viz/formatters/helpers/params_helper.rb +30 -9
  77. data/lib/trace_viz/formatters/helpers/result_helper.rb +5 -4
  78. data/lib/trace_viz/formatters/helpers/source_helper.rb +6 -4
  79. data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +45 -0
  80. data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
  81. data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
  82. data/lib/trace_viz/formatters/helpers.rb +10 -0
  83. data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
  84. data/lib/trace_viz/formatters/log/formatter_factory.rb +22 -0
  85. data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
  86. data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
  87. data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
  88. data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
  89. data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
  90. data/lib/trace_viz/helpers/config_helper.rb +17 -0
  91. data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
  92. data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
  93. data/lib/trace_viz/helpers.rb +9 -0
  94. data/lib/trace_viz/logger.rb +9 -20
  95. data/lib/trace_viz/loggers/base_logger.rb +29 -0
  96. data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
  97. data/lib/trace_viz/loggers/logging_manager.rb +46 -0
  98. data/lib/trace_viz/loggers/post_collection_logger.rb +44 -0
  99. data/lib/trace_viz/loggers/trace_logger.rb +14 -18
  100. data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
  101. data/lib/trace_viz/managers/diagram/participant_manager.rb +23 -0
  102. data/lib/trace_viz/models/box.rb +19 -0
  103. data/lib/trace_viz/models/diagram.rb +27 -0
  104. data/lib/trace_viz/models/message.rb +16 -0
  105. data/lib/trace_viz/models/participant.rb +18 -0
  106. data/lib/trace_viz/models.rb +8 -0
  107. data/lib/trace_viz/renderers/base_renderer.rb +27 -0
  108. data/lib/trace_viz/renderers/diagram/sequence_renderer.rb +59 -0
  109. data/lib/trace_viz/renderers/render_context.rb +17 -0
  110. data/lib/trace_viz/renderers/renderer_builder.rb +20 -0
  111. data/lib/trace_viz/renderers/renderer_factory.rb +29 -0
  112. data/lib/trace_viz/renderers/summary_renderer.rb +34 -0
  113. data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
  114. data/lib/trace_viz/shared/renderer_helper.rb +25 -0
  115. data/lib/trace_viz/shared.rb +8 -0
  116. data/lib/trace_viz/syntax/mermaid/sequence_syntax.rb +99 -0
  117. data/lib/trace_viz/trace_data/base.rb +22 -22
  118. data/lib/trace_viz/trace_data/node.rb +39 -0
  119. data/lib/trace_viz/trace_data/root_node.rb +24 -0
  120. data/lib/trace_viz/trace_data/summary_node.rb +45 -0
  121. data/lib/trace_viz/trace_data/trace_point/base.rb +26 -31
  122. data/lib/trace_viz/trace_data/trace_point/method_call.rb +25 -16
  123. data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
  124. data/lib/trace_viz/traits/depth_trackable.rb +13 -0
  125. data/lib/trace_viz/traits/identifiable.rb +25 -0
  126. data/lib/trace_viz/traits/time_trackable.rb +13 -0
  127. data/lib/trace_viz/traits.rb +10 -0
  128. data/lib/trace_viz/transformers/base_transformer.rb +29 -0
  129. data/lib/trace_viz/transformers/summary_transformer.rb +70 -0
  130. data/lib/trace_viz/utils/alias_generator.rb +58 -0
  131. data/lib/trace_viz/utils/colorize.rb +6 -6
  132. data/lib/trace_viz/utils/format/key_value_formatter.rb +42 -0
  133. data/lib/trace_viz/utils/format/value_truncator.rb +123 -0
  134. data/lib/trace_viz/utils/id_generator.rb +35 -0
  135. data/lib/trace_viz/utils.rb +8 -0
  136. data/lib/trace_viz/version.rb +1 -1
  137. data/sig/adapters/base_adapter.rbs +11 -0
  138. data/sig/adapters/trace_point_adapter.rbs +13 -0
  139. data/sig/collectors/filters/registry.rbs +13 -0
  140. data/sig/collectors/trace_point_collector.rbs +17 -0
  141. data/sig/config/copier.rbs +15 -0
  142. data/sig/config/validator.rbs +18 -0
  143. data/sig/configuration.rbs +22 -0
  144. data/sig/context/base_context.rbs +9 -0
  145. data/sig/context/config_context.rbs +13 -0
  146. data/sig/context/manager.rbs +10 -0
  147. data/sig/context/map.rbs +13 -0
  148. data/sig/context.rbs +5 -0
  149. data/sig/core/tracer.rbs +7 -0
  150. data/sig/core.rbs +4 -0
  151. data/sig/defaults.rbs +17 -0
  152. data/sig/errors.rbs +13 -0
  153. data/sig/logger.rbs +33 -0
  154. data/sig/trace_viz.rbs +1 -2
  155. data/sig/utils/colorize.rbs +8 -0
  156. data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
  157. data/sig/utils/format_utils/value_truncator.rbs +19 -0
  158. data/sig/utils/format_utils.rbs +8 -0
  159. data/sig/version.rbs +3 -0
  160. metadata +124 -18
  161. data/lib/trace_viz/collectors/depth_manager.rb +0 -37
  162. data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
  163. data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
  164. data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
  165. data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
  166. data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
  167. data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
  168. data/lib/trace_viz/loggers/trace_builder.rb +0 -30
  169. data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
  170. data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
  171. data/lib/trace_viz/loggers/trace_formatters/method_return_formatter.rb +0 -22
  172. 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 #{trace_data.duration}ms"
10
+ format("in %.6fms", trace_data.duration)
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir[File.join(__dir__, "helpers/**/*.rb")].each { |file| require_relative file }
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Helpers
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../trace_data_formatter"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Log
8
+ class BaseFormatter < TraceDataFormatter
9
+ include Helpers::Log::ColorHelper
10
+ end
11
+ end
12
+ end
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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helpers/config_helper"
4
+ require_relative "helpers/tracking_helper"
5
+
6
+ module TraceViz
7
+ module Helpers
8
+ end
9
+ end
@@ -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.action_colors.keys.freeze
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
- color = color_for(level)
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 = wrap_in_color(raw_message, color)
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("%-12s %s", merged_emoji_level, message)
45
+ format("%s%s", merged_emoji_level, message)
57
46
  end
58
47
 
59
- def wrap_in_color(message, color)
60
- "#{color}#{message}#{default_color}"
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 "trace_builder"
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
- @logger = TraceViz.logger
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 = LOG_LEVELS[trace_data.event] || :info
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 :logger, :trace_data
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
- Loggers::TraceBuilder.new(trace_data).build
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 "trace_builder"
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
- @logger = TraceViz.logger
9
+ super()
10
+ @collector = collector
16
11
  @stats = collector.stats
17
12
  end
18
13
 
19
14
  def log
20
- logger.stats(formatted_stats)
15
+ logger.stats(format_stats)
21
16
  end
22
17
 
23
18
  private
24
19
 
25
- attr_reader :logger, :stats
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 formatted_stats
28
- event_counts = stats.event_counts.map { |event, count| "#{event.capitalize}: #{count}" }.join(", ")
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