logster 2.1.2 → 2.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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,21 +1,21 @@
1
- class SidekiqLogsterReporter
2
- def call(ex, context = {})
3
- # Pass context to Logster
4
- fake_env = {}
5
- context.each do |key, value|
6
- Logster.add_to_env(fake_env, key, value)
7
- end
8
-
9
- text = "Job exception: #{ex}\n"
10
- if ex.backtrace
11
- Logster.add_to_env(fake_env, :backtrace, ex.backtrace)
12
- end
13
-
14
- Thread.current[Logster::Logger::LOGSTER_ENV] = fake_env
15
- Logster.logger.error(text)
16
- rescue => e
17
- Logster.logger.fatal("Failed to log exception #{ex} #{hash}\nReason: #{e.class} #{e}\n#{e.backtrace.join("\n")}")
18
- ensure
19
- Thread.current[Logster::Logger::LOGSTER_ENV] = nil
20
- end
21
- end
1
+ class SidekiqLogsterReporter
2
+ def call(ex, context = {})
3
+ # Pass context to Logster
4
+ fake_env = {}
5
+ context.each do |key, value|
6
+ Logster.add_to_env(fake_env, key, value)
7
+ end
8
+
9
+ text = "Job exception: #{ex}\n"
10
+ if ex.backtrace
11
+ Logster.add_to_env(fake_env, :backtrace, ex.backtrace)
12
+ end
13
+
14
+ Thread.current[Logster::Logger::LOGSTER_ENV] = fake_env
15
+ Logster.logger.error(text)
16
+ rescue => e
17
+ Logster.logger.fatal("Failed to log exception #{ex} #{hash}\nReason: #{e.class} #{e}\n#{e.backtrace.join("\n")}")
18
+ ensure
19
+ Thread.current[Logster::Logger::LOGSTER_ENV] = nil
20
+ end
21
+ end
@@ -1,54 +1,59 @@
1
- require 'logster/logger'
2
- require 'logster/message'
3
- require 'logster/configuration'
4
- require 'logster/web'
5
- require 'logster/ignore_pattern'
6
-
7
- if defined? Redis
8
- require 'logster/redis_store'
9
- else
10
- STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
11
- exit
12
- end
13
-
14
- module Logster
15
- def self.logger=(logger)
16
- @logger = logger
17
- end
18
-
19
- def self.logger
20
- @logger
21
- end
22
-
23
- def self.store=(store)
24
- @store = store
25
- end
26
-
27
- def self.store
28
- @store
29
- end
30
-
31
- def self.config=(config)
32
- @config = config
33
- end
34
-
35
- def self.config
36
- @config ||= Configuration.new
37
- end
38
-
39
- def self.add_to_env(env, key, value)
40
- logster_env = Logster::Message.populate_from_env(env)
41
- logster_env[key] = value
42
- end
43
-
44
- def self.set_environments(envs)
45
- config.environments = envs
46
- end
47
- end
48
-
49
- # check logster/configuration.rb for config options
50
- # Logster.config.environments << :staging
51
-
52
- if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
53
- require 'logster/rails/railtie'
54
- end
1
+ require 'logster/logger'
2
+ require 'logster/message'
3
+ require 'logster/configuration'
4
+ require 'logster/web'
5
+ require 'logster/ignore_pattern'
6
+ require 'logster/pattern'
7
+ require 'logster/suppression_pattern'
8
+ require 'logster/cache'
9
+
10
+ if defined? Redis
11
+ require 'logster/redis_store'
12
+ else
13
+ STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
14
+ exit
15
+ end
16
+
17
+ module Logster
18
+ PATTERNS = [SuppressionPattern]
19
+
20
+ def self.logger=(logger)
21
+ @logger = logger
22
+ end
23
+
24
+ def self.logger
25
+ @logger
26
+ end
27
+
28
+ def self.store=(store)
29
+ @store = store
30
+ end
31
+
32
+ def self.store
33
+ @store
34
+ end
35
+
36
+ def self.config=(config)
37
+ @config = config
38
+ end
39
+
40
+ def self.config
41
+ @config ||= Configuration.new
42
+ end
43
+
44
+ def self.add_to_env(env, key, value)
45
+ logster_env = Logster::Message.populate_from_env(env)
46
+ logster_env[key] = value
47
+ end
48
+
49
+ def self.set_environments(envs)
50
+ config.environments = envs
51
+ end
52
+ end
53
+
54
+ # check logster/configuration.rb for config options
55
+ # Logster.config.environments << :staging
56
+
57
+ if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
58
+ require 'logster/rails/railtie'
59
+ end
@@ -1,141 +1,169 @@
1
- module Logster
2
- class BaseStore
3
-
4
- attr_accessor :level, :max_retention, :skip_empty, :ignore
5
-
6
- def initialize
7
- @max_retention = 60 * 60 * 24 * 7
8
- @skip_empty = true
9
- end
10
-
11
- # Save a new message at the front of the latest list.
12
- def save(message)
13
- not_implemented
14
- end
15
-
16
- # Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
17
- def replace_and_bump(message, save_env: true)
18
- not_implemented
19
- end
20
-
21
- # Check if another message with the same grouping_key is already stored.
22
- # Returns the similar message's message.key
23
- def similar_key(message)
24
- not_implemented
25
- end
26
-
27
- # The number of messages currently stored.
28
- def count
29
- not_implemented
30
- end
31
-
32
- # Delete all unprotected messages in the store.
33
- def clear
34
- not_implemented
35
- end
36
-
37
- # Delete all messages, including protected messages.
38
- def clear_all
39
- not_implemented
40
- end
41
-
42
- # Get a message by its message_key
43
- def get(message_key, load_env: true)
44
- not_implemented
45
- end
46
-
47
- # Get a group of messages by their message_keys
48
- def bulk_get(message_keys)
49
- not_implemented
50
- end
51
-
52
- # Get a message's env by its message_key
53
- def get_env(message_key)
54
- not_implemented
55
- end
56
-
57
- # Mark a message as protected; i.e. it is not deleted by the #clear method
58
- def protect(message_key)
59
- not_implemented
60
- end
61
-
62
- def delete(message_key)
63
- not_implemented
64
- end
65
-
66
- # Clear the protected mark for a message.
67
- def unprotect(message_key)
68
- not_implemented
69
- end
70
-
71
- # Solve a particular message, causing all old messages with matching version and backtrace
72
- # to be deleted (report should delete any solved messages when called)
73
- def solve(message_key)
74
- not_implemented
75
- end
76
-
77
- # Registers a rate limit on the given severities of logs
78
- def register_rate_limit(severities, limit, duration, &block)
79
- not_implemented
80
- end
81
-
82
- # Checks all the existing rate limiters to check if any has been exceeded
83
- def check_rate_limits(severity)
84
- not_implemented
85
- end
86
-
87
- def report(severity, progname, msg, opts = {})
88
- return if (!msg || (String === msg && msg.empty?)) && skip_empty
89
- return if level && severity < level
90
-
91
- message = Logster::Message.new(severity, progname, msg, opts[:timestamp], count: opts[:count])
92
-
93
- env = opts[:env] || {}
94
- backtrace = opts[:backtrace]
95
- if Hash === env && env[:backtrace]
96
- # Special - passing backtrace through env
97
- backtrace = env.delete(:backtrace)
98
- end
99
-
100
- message.populate_from_env(env)
101
-
102
- if backtrace
103
- if backtrace.respond_to? :join
104
- backtrace = backtrace.join("\n")
105
- end
106
- message.backtrace = backtrace
107
- else
108
- message.backtrace = caller.join("\n")
109
- end
110
-
111
- return if ignore && ignore.any? { |pattern| message =~ pattern }
112
-
113
- similar = nil
114
-
115
- if Logster.config.allow_grouping
116
- key = self.similar_key(message)
117
- similar = get(key, load_env: false) if key
118
- end
119
-
120
- if similar
121
- has_env = !similar.env.nil? && !similar.env.empty?
122
- if similar.count < Logster::MAX_GROUPING_LENGTH && !has_env
123
- similar.env = get_env(similar.key) || {}
124
- end
125
- save_env = similar.merge_similar_message(message)
126
-
127
- replace_and_bump(similar, save_env: save_env || has_env)
128
- similar
129
- else
130
- save message
131
- message
132
- end
133
- end
134
-
135
- private
136
-
137
- def not_implemented
138
- raise "Not Implemented"
139
- end
140
- end
141
- end
1
+ module Logster
2
+ class BaseStore
3
+
4
+ attr_accessor :level, :max_retention, :skip_empty, :ignore, :allow_custom_patterns
5
+
6
+ def initialize
7
+ @max_retention = 60 * 60 * 24 * 7
8
+ @skip_empty = true
9
+ @allow_custom_patterns = false
10
+ @patterns_cache = Logster::Cache.new
11
+ end
12
+
13
+ # Save a new message at the front of the latest list.
14
+ def save(message)
15
+ not_implemented
16
+ end
17
+
18
+ # Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
19
+ def replace_and_bump(message, save_env: true)
20
+ not_implemented
21
+ end
22
+
23
+ # Check if another message with the same grouping_key is already stored.
24
+ # Returns the similar message's message.key
25
+ def similar_key(message)
26
+ not_implemented
27
+ end
28
+
29
+ # The number of messages currently stored.
30
+ def count
31
+ not_implemented
32
+ end
33
+
34
+ # Delete all unprotected messages in the store.
35
+ def clear
36
+ not_implemented
37
+ end
38
+
39
+ # Delete all messages, including protected messages.
40
+ def clear_all
41
+ not_implemented
42
+ end
43
+
44
+ # Get a message by its message_key
45
+ def get(message_key, load_env: true)
46
+ not_implemented
47
+ end
48
+
49
+ # Get a group of messages by their message_keys
50
+ def bulk_get(message_keys)
51
+ not_implemented
52
+ end
53
+
54
+ # Get a message's env by its message_key
55
+ def get_env(message_key)
56
+ not_implemented
57
+ end
58
+
59
+ # Mark a message as protected; i.e. it is not deleted by the #clear method
60
+ def protect(message_key)
61
+ not_implemented
62
+ end
63
+
64
+ def delete(message_key)
65
+ not_implemented
66
+ end
67
+
68
+ # Clear the protected mark for a message.
69
+ def unprotect(message_key)
70
+ not_implemented
71
+ end
72
+
73
+ # Solve a particular message, causing all old messages with matching version and backtrace
74
+ # to be deleted (report should delete any solved messages when called)
75
+ def solve(message_key)
76
+ not_implemented
77
+ end
78
+
79
+ # Registers a rate limit on the given severities of logs
80
+ def register_rate_limit(severities, limit, duration, &block)
81
+ not_implemented
82
+ end
83
+
84
+ # Checks all the existing rate limiters to check if any has been exceeded
85
+ def check_rate_limits(severity)
86
+ not_implemented
87
+ end
88
+
89
+ # takes a string as `pattern` and places it under the set `set_name`
90
+ def insert_pattern(set_name, pattern)
91
+ not_implemented
92
+ end
93
+
94
+ # takes a string as `pattern` and removes it from the set `set_name`
95
+ def remove_pattern(set_name, pattern)
96
+ not_implemented
97
+ end
98
+
99
+ # returns an array of strings each of which must be convertible to regexp
100
+ def get_patterns(set_name)
101
+ not_implemented
102
+ end
103
+
104
+ def report(severity, progname, msg, opts = {})
105
+ return if (!msg || (String === msg && msg.empty?)) && skip_empty
106
+ return if level && severity < level
107
+
108
+ message = Logster::Message.new(severity, progname, msg, opts[:timestamp], count: opts[:count])
109
+
110
+ env = opts[:env] || {}
111
+ backtrace = opts[:backtrace]
112
+ if Hash === env && env[:backtrace]
113
+ # Special - passing backtrace through env
114
+ backtrace = env.delete(:backtrace)
115
+ end
116
+
117
+ message.populate_from_env(env)
118
+
119
+ if backtrace
120
+ if backtrace.respond_to? :join
121
+ backtrace = backtrace.join("\n")
122
+ end
123
+ message.backtrace = backtrace
124
+ else
125
+ message.backtrace = caller.join("\n")
126
+ end
127
+
128
+ return if ignore && ignore.any? { |pattern| message =~ pattern }
129
+
130
+ if Logster.config.enable_custom_patterns_via_ui || allow_custom_patterns
131
+ custom_ignore = @patterns_cache.fetch do
132
+ Logster::SuppressionPattern.find_all(store: self)
133
+ end
134
+ return if custom_ignore.any? { |pattern| message =~ pattern }
135
+ end
136
+
137
+ similar = nil
138
+
139
+ if Logster.config.allow_grouping
140
+ key = self.similar_key(message)
141
+ similar = get(key, load_env: false) if key
142
+ end
143
+
144
+ if similar
145
+ has_env = !similar.env.nil? && !similar.env.empty?
146
+ if similar.count < Logster::MAX_GROUPING_LENGTH && !has_env
147
+ similar.env = get_env(similar.key) || {}
148
+ end
149
+ save_env = similar.merge_similar_message(message)
150
+
151
+ replace_and_bump(similar, save_env: save_env || has_env)
152
+ similar
153
+ else
154
+ save message
155
+ message
156
+ end
157
+ end
158
+
159
+ def clear_suppression_patterns_cache
160
+ @patterns_cache.clear
161
+ end
162
+
163
+ private
164
+
165
+ def not_implemented
166
+ raise "Not Implemented"
167
+ end
168
+ end
169
+ end