trace-util-adv 0.1.1 → 0.2.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.
- data/CHANGELOG +7 -0
- data/VERSION +1 -1
- data/lib/README +87 -0
- data/lib/TODO.txt +12 -0
- data/lib/action_handler.rb +99 -0
- data/lib/appenders/appender.rb +97 -0
- data/lib/appenders/appender_registration.rb +16 -0
- data/lib/appenders/base_appender.rb +82 -0
- data/lib/appenders/file_appender.rb +72 -0
- data/lib/appenders/html_appender.rb +94 -0
- data/lib/appenders/logger_appender.rb +84 -0
- data/lib/appenders/stream_appender.rb +37 -0
- data/lib/appenders/template_log_appender.rb +28 -0
- data/lib/appenders/xml_appender.rb +75 -0
- data/lib/core_extensions.rb +101 -0
- data/lib/filters/base_filters.rb +178 -0
- data/lib/filters/composite_filters.rb +71 -0
- data/lib/filters/filter_factory.rb +17 -0
- data/lib/filters/message_filters.rb +35 -0
- data/lib/filters/tracing_filter.rb +88 -0
- data/lib/output_templates.rb +5 -0
- data/lib/rule_match.rb +38 -0
- data/lib/sample_filters.rb +95 -0
- data/lib/templates/base_template.rb +21 -0
- data/lib/templates/html_template.rb +48 -0
- data/lib/templates/string_template.rb +30 -0
- data/lib/templates/trace_output_handler.rb +47 -0
- data/lib/templates/xml_template.rb +36 -0
- data/lib/test_action_handler.rb +34 -0
- data/lib/test_appender.rb +29 -0
- data/lib/test_file_appender.rb +32 -0
- data/lib/test_filters.rb +112 -0
- data/lib/test_filters_chain.rb +100 -0
- data/lib/test_filters_create.rb +28 -0
- data/lib/test_html_appender.rb +66 -0
- data/lib/test_special_filters.rb +78 -0
- data/lib/test_xml_appender.rb +66 -0
- data/lib/test_xml_gen.rb +46 -0
- data/lib/trace_appenders.rb +9 -0
- data/lib/trace_calls.rb +86 -0
- data/lib/trace_ext.rb +57 -0
- data/lib/trace_filters.rb +4 -0
- data/trace-util-adv.gemspec +98 -0
- metadata +44 -2
@@ -0,0 +1,71 @@
|
|
1
|
+
module Tracing
|
2
|
+
class CompositeClassFilter < BaseFilter
|
3
|
+
def initialize(options)
|
4
|
+
super(options)
|
5
|
+
@rules = options || {}
|
6
|
+
end
|
7
|
+
|
8
|
+
# filter on class names and then methods within those classes
|
9
|
+
def allow?(msg, context)
|
10
|
+
# class name of context
|
11
|
+
class_name = context[:class_name]
|
12
|
+
rules[:classes].each do |clazz|
|
13
|
+
names=clazz[:names]
|
14
|
+
next if !names.matches_any?(name)
|
15
|
+
# if name matches rule
|
16
|
+
method_filter = MethodFilter.new(clazz)
|
17
|
+
return false if !method_filter.allow?(msg, context)
|
18
|
+
end
|
19
|
+
return true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class CompositeModuleFilter < BaseFilter
|
24
|
+
def initialize(options)
|
25
|
+
super(options)
|
26
|
+
@rules = options || {}
|
27
|
+
end
|
28
|
+
|
29
|
+
# filter on module names and then on class names and methods within those modules
|
30
|
+
def allow?(msg, context)
|
31
|
+
modules_name = context[:full_module_name]
|
32
|
+
rules[:modules].each do |_module|
|
33
|
+
# get names of modules to match
|
34
|
+
names = _module[:names]
|
35
|
+
# test if current module name matches any of the module names for this rule
|
36
|
+
next if !names.matches_any?(modules_name)
|
37
|
+
# if name matches rule
|
38
|
+
if _module[:classes]
|
39
|
+
composite_class_filter = CompositeClassFilter.new(_module)
|
40
|
+
return false if !composite_class_filter.allow?(msg, context)
|
41
|
+
end
|
42
|
+
if _module[:class_rules]
|
43
|
+
class_filter = ClassFilter.new(_module)
|
44
|
+
return false if !class_filter.allow?(msg, context)
|
45
|
+
end
|
46
|
+
if _module[:method_rules]
|
47
|
+
method_filter = MethodFilter.new(_module)
|
48
|
+
return false if !method_filter.allow?(msg, context)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
# log it!
|
52
|
+
true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class CompositeInstanceVarFilter < BaseFilter
|
57
|
+
def initialize(options)
|
58
|
+
super(options)
|
59
|
+
@rules = options || {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def allow?(msg, context)
|
63
|
+
rules[:vars].each do |var|
|
64
|
+
var_filter = InstanceVarFilter.new(var)
|
65
|
+
return false if !var_filter.allow?(msg, context)
|
66
|
+
end
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# convenience methods to create and operate on filters, fx merge filters into composites, extract filters from composites etc
|
2
|
+
|
3
|
+
module Tracing::Filter
|
4
|
+
|
5
|
+
def self.create_filter(name_hash)
|
6
|
+
# puts "TRY create_filter: " + name_hash.inspect
|
7
|
+
[:module_filter, :class_filter, :method_filter].each do |symbol|
|
8
|
+
# puts "symbol:" + symbol.to_s
|
9
|
+
res = name_hash.try_create_filter(symbol)
|
10
|
+
# puts "Filter created:" + res.inspect
|
11
|
+
return res if res
|
12
|
+
end
|
13
|
+
# puts "no filter could be created :("
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# various alternative ways to provide include/exclude filters
|
2
|
+
|
3
|
+
# interface class
|
4
|
+
module Tracing
|
5
|
+
class MsgFilter
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def allow?(msg, context)
|
11
|
+
true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# example of specific filter on instance variable
|
16
|
+
class RangeFilter < MsgFilter
|
17
|
+
def allow?(msg, context)
|
18
|
+
obj = context[:self]
|
19
|
+
var = obj.instance_variable_get @options[:var]
|
20
|
+
return @options[:range].include?(var)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# interface (abstract class)
|
25
|
+
# instances of this form can be used as filters inside include/exclude lists
|
26
|
+
class NameFilter
|
27
|
+
# return boolean
|
28
|
+
def allow?(name)
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# custom filter
|
35
|
+
my_msg_filter = Tracing::RangeFilter.new({:range => 0..10, :var => :rating})
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Tracing
|
2
|
+
module Filter
|
3
|
+
# enable registration of filters
|
4
|
+
module Registration
|
5
|
+
attr_accessor :filters
|
6
|
+
|
7
|
+
def create_filters(reg_filters)
|
8
|
+
if reg_filters.kind_of?(Array)
|
9
|
+
reg_filters.flatten!
|
10
|
+
new_filters = reg_filters.collect do |f|
|
11
|
+
if f.kind_of? Hash
|
12
|
+
Tracing::BaseFilter.create_filter(f)
|
13
|
+
elsif f.kind_of? Tracing::BaseFilter
|
14
|
+
f
|
15
|
+
end
|
16
|
+
end
|
17
|
+
new_filters
|
18
|
+
elsif filters.kind_of? Hash
|
19
|
+
Tracing::BaseFilter.create_filter(reg_filters)
|
20
|
+
else
|
21
|
+
reg_filters
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def register_filters(reg_filters)
|
26
|
+
@filters ||= []
|
27
|
+
|
28
|
+
# puts "Register filters, using: #{reg_filters.inspect}"
|
29
|
+
new_filters = create_filters(reg_filters)
|
30
|
+
|
31
|
+
# puts "New filters to register: #{new_filters.inspect}"
|
32
|
+
return if !new_filters
|
33
|
+
if new_filters
|
34
|
+
new_filters.compact!
|
35
|
+
return if !(new_filters.size > 0)
|
36
|
+
# puts "DO register filters: #{new_filters.inspect}"
|
37
|
+
@filters << new_filters.flatten!
|
38
|
+
# puts "Filters after reg: " + @filters.inspect
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def unregister_filters(filters)
|
43
|
+
filters.delete(filters)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# enable execution of filters
|
49
|
+
module Exec
|
50
|
+
def filters_allow?(msg, context)
|
51
|
+
# puts "method: filters_allow?"
|
52
|
+
|
53
|
+
@filters ||= Tracing::TraceExt.filters
|
54
|
+
return true if !@filters && !@filters.kind_of?(Array)
|
55
|
+
|
56
|
+
# default allow return value
|
57
|
+
allow = true
|
58
|
+
allow = false if (Tracing::TraceExt.final_yield_action == :exclude)
|
59
|
+
|
60
|
+
@filters.each do |_filter|
|
61
|
+
# apply filter
|
62
|
+
if _filter
|
63
|
+
res = _filter.allow_action(msg, context)
|
64
|
+
# puts "res: #{res}"
|
65
|
+
|
66
|
+
if (res == :include)
|
67
|
+
# puts "included - break"
|
68
|
+
allow = true
|
69
|
+
break
|
70
|
+
end
|
71
|
+
|
72
|
+
if (res == :exclude)
|
73
|
+
# puts "excluded - break"
|
74
|
+
allow = false
|
75
|
+
break
|
76
|
+
end
|
77
|
+
|
78
|
+
# puts "yielding..."
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
# puts "filters_allow?: #{allow}"
|
83
|
+
return allow
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
data/lib/rule_match.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Tracing
|
2
|
+
module RuleMatch
|
3
|
+
class RuleTypeError < RuntimeError; end
|
4
|
+
|
5
|
+
def matches_any?(name)
|
6
|
+
# puts "matches any: #{name}"
|
7
|
+
self.any? do |rule|
|
8
|
+
if rule.kind_of? Regexp
|
9
|
+
# match return position of match, or nil if no match
|
10
|
+
# here converted into boolean result
|
11
|
+
match = (name =~ rule)
|
12
|
+
# puts "matches regexp #{rule}: #{match}"
|
13
|
+
match
|
14
|
+
elsif rule.kind_of? String
|
15
|
+
match = (name == rule)
|
16
|
+
# puts "matches string #{rule}: #{match}"
|
17
|
+
match
|
18
|
+
elsif rule.kind_of? Proc
|
19
|
+
rule.call(name)
|
20
|
+
elsif rule.kind_of? NameFilter
|
21
|
+
rule.allow?(name)
|
22
|
+
else
|
23
|
+
raise RuleTypeError, "Bad rule type: must be Regexp, String, Proc or NameFilter"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def rules_allow_action(name)
|
29
|
+
self.each do |rule|
|
30
|
+
res = rule.rule_allow_action(name)
|
31
|
+
return :exclude if (res == :exclude)
|
32
|
+
return :include if (res == :include)
|
33
|
+
end
|
34
|
+
# default allow action
|
35
|
+
return :yield
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# my_instance_variables = {:template_path => 'taglibs/rapid_core.dryml'}
|
2
|
+
# args = {:a => 7}
|
3
|
+
# context = {
|
4
|
+
# :modules => cls_name.modules,
|
5
|
+
# :class_name => cls_name.class_name,
|
6
|
+
# :full_class_name => cls_name,
|
7
|
+
# :method_name => name,
|
8
|
+
# :args => args,
|
9
|
+
# :block => false,
|
10
|
+
# :vars => my_instance_variables # to carry @template_path etc.
|
11
|
+
# }
|
12
|
+
|
13
|
+
Module_filter_A = {
|
14
|
+
:name => 'my modules',
|
15
|
+
:module_rules => [{
|
16
|
+
# id of modules rule set
|
17
|
+
:name => ['my_modules'],
|
18
|
+
:include => [/Al/],
|
19
|
+
:exclude => [/Be/],
|
20
|
+
:default => true
|
21
|
+
}
|
22
|
+
]}
|
23
|
+
|
24
|
+
Class_filter_A = {
|
25
|
+
:name => 'my classes',
|
26
|
+
:class_rules => [{
|
27
|
+
# id of class rule set
|
28
|
+
:name => 'my_classes',
|
29
|
+
:include => [/MyCl/],
|
30
|
+
:exclude => [/NotMy/],
|
31
|
+
:default => false
|
32
|
+
}]
|
33
|
+
}
|
34
|
+
|
35
|
+
Method_filter_A = {
|
36
|
+
:name => 'my methods',
|
37
|
+
:method_rules => [{
|
38
|
+
# id of method rule set
|
39
|
+
:name => 'my_methods',
|
40
|
+
:include => [/by.*/, 'compile', 'do_it'],
|
41
|
+
:exclude => ['my.*'],
|
42
|
+
:default => false
|
43
|
+
}]
|
44
|
+
}
|
45
|
+
|
46
|
+
Class_composite_filter_A = {
|
47
|
+
# id of composite rule set
|
48
|
+
:name => 'Template stuff',
|
49
|
+
:classes => [{
|
50
|
+
:names => ['My', /My/],
|
51
|
+
:method_rules => {
|
52
|
+
:include => [/by.*/, 'DRYMLBuilder'],
|
53
|
+
:exclude => ['Taglib'],
|
54
|
+
:default => false
|
55
|
+
}
|
56
|
+
}]
|
57
|
+
}
|
58
|
+
|
59
|
+
Module_composite_filter_A = {
|
60
|
+
# id of composite rule set
|
61
|
+
:name => 'dryml_filter',
|
62
|
+
:modules => [{
|
63
|
+
:names => ['Hobo:Dryml', /Dryml/],
|
64
|
+
:class_rules => {
|
65
|
+
:include => [/Template.*/, 'DRYMLBuilder'],
|
66
|
+
:exclude => ['Taglib'],
|
67
|
+
:default => true
|
68
|
+
},
|
69
|
+
:method_rules => {
|
70
|
+
:include => [/Template.*/, 'DRYMLBuilder'],
|
71
|
+
:exclude => ['Taglib'],
|
72
|
+
:default => true
|
73
|
+
}
|
74
|
+
}]
|
75
|
+
}
|
76
|
+
|
77
|
+
|
78
|
+
# for specific instance_vars, match on values (after .to_s on var)
|
79
|
+
Var_composite_filter_A = {
|
80
|
+
:name => 'template_path',
|
81
|
+
:vars => [{
|
82
|
+
:name => 'template_path', :type => :string,
|
83
|
+
:var_rules => {
|
84
|
+
:include => [/.*\/taglib\/.*/],
|
85
|
+
:exclude => [/.*\/rapid_.*/]
|
86
|
+
}
|
87
|
+
},
|
88
|
+
{
|
89
|
+
:name => 'template_path',
|
90
|
+
:var_rules => {
|
91
|
+
:exclude => [/.*\/rapid_.*/],
|
92
|
+
:default => true
|
93
|
+
}
|
94
|
+
}]
|
95
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Tracing
|
2
|
+
module OutputTemplate
|
3
|
+
class BaseTrace
|
4
|
+
include Tracing::OutputHandler
|
5
|
+
|
6
|
+
def handle_after_call(context)
|
7
|
+
template = end_template(context)
|
8
|
+
output(template, context)
|
9
|
+
end
|
10
|
+
|
11
|
+
def handle_before_call(context)
|
12
|
+
template = before_template(context)
|
13
|
+
if context[:block]
|
14
|
+
template << before_block_template
|
15
|
+
end
|
16
|
+
output(template, context)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Tracing
|
2
|
+
module OutputTemplate
|
3
|
+
class HtmlTrace < BaseTrace
|
4
|
+
|
5
|
+
def before_template(context)
|
6
|
+
# method_name = context[:method_full_name]
|
7
|
+
# args = context[:args].inspect
|
8
|
+
template = <<-EOF
|
9
|
+
<div class="method-title"><%= context[:method_full_name] %></div>
|
10
|
+
<div class="method-body">
|
11
|
+
<div class="begin">
|
12
|
+
<div class="method-name"><%= context[:method_full_name] %> :: BEGIN</div>
|
13
|
+
<div class="args">
|
14
|
+
<div class="method-args"><%= context[:args] %> </div>
|
15
|
+
#block#
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
EOF
|
19
|
+
end
|
20
|
+
|
21
|
+
def before_block_template
|
22
|
+
template = <<-EOF
|
23
|
+
<div class="method block-arg">(and a block)</div>
|
24
|
+
EOF
|
25
|
+
end
|
26
|
+
|
27
|
+
def end_template(context)
|
28
|
+
# method_name = context[:method_full_name]
|
29
|
+
# result = context[:result].inspect
|
30
|
+
template = <<-EOF
|
31
|
+
<div class="end">
|
32
|
+
<div class="method-name"><%= context[:method_full_name] %> :: END</div>
|
33
|
+
<div class="method-result"><%= context[:result] %></div>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
EOF
|
37
|
+
end
|
38
|
+
|
39
|
+
# override
|
40
|
+
def handle_before_call(context)
|
41
|
+
template = before_template(context)
|
42
|
+
block_replace = context[:block] ? before_block_template : ""
|
43
|
+
template.gsub!(/#block#/, block_replace)
|
44
|
+
output(template, context)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Tracing
|
2
|
+
module OutputTemplate
|
3
|
+
class StringTrace < BaseTrace
|
4
|
+
def before_template(context)
|
5
|
+
template = <<-EOF
|
6
|
+
<<= <%= context[:method_full_name] %> : BEGIN
|
7
|
+
-----------------------------------------------
|
8
|
+
<%= context[:args].inspect %>
|
9
|
+
===============================================
|
10
|
+
EOF
|
11
|
+
end
|
12
|
+
|
13
|
+
def before_block_template
|
14
|
+
template = <<-EOF
|
15
|
+
(and a block)
|
16
|
+
-----------------------------------------------
|
17
|
+
EOF
|
18
|
+
end
|
19
|
+
|
20
|
+
def end_template(context)
|
21
|
+
template = <<-EOF
|
22
|
+
<<= <%= context[:method_full_name] %> : END
|
23
|
+
-----------------------------------------------
|
24
|
+
<%= context[:result] %>
|
25
|
+
===============================================
|
26
|
+
EOF
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|