kennel 1.30.0 → 1.31.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kennel/importer.rb +30 -18
- data/lib/kennel/models/monitor.rb +20 -11
- data/lib/kennel/syncer.rb +1 -0
- data/lib/kennel/utils.rb +11 -1
- data/lib/kennel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82e31f58b23229f5a5408eb59cf577f2ce23956dc5083a3e389bc35a3294a422
|
4
|
+
data.tar.gz: 8f5d346672553ad42bec0f19dd23bc2a39032f845d3e930d77698385c4abf8a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab0964256569162a0aaac2c3b6c65c289b85a4815c307134eec882aaf4b2251686b880572d8c72e2516616df88ce53b91945d1f14940cab1e44c9b2a7c7f23e7
|
7
|
+
data.tar.gz: 7c19c8896b1cdac2ee8dc3830af85cbc36e355ebcd1ac4df262ab20396644662b0bfc0204a2953776f174b7d19ef3ec7bb757abb9dba21e700e8fb2d8f38f2ec
|
data/lib/kennel/importer.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
module Kennel
|
4
4
|
class Importer
|
5
|
-
|
5
|
+
TITLES = [:name, :title, :board_title].freeze
|
6
|
+
SORT_ORDER = [*TITLES, :id, :kennel_id, :type, :tags, :query, :message, :description, :template_variables].freeze
|
6
7
|
|
7
8
|
def initialize(api)
|
8
9
|
@api = api
|
@@ -21,19 +22,27 @@ module Kennel
|
|
21
22
|
id = data.fetch(:id) # store numerical id returned from the api
|
22
23
|
model.normalize({}, data)
|
23
24
|
data[:id] = id
|
24
|
-
data[:kennel_id] =
|
25
|
+
data[:kennel_id] = Kennel::Utils.parameterize(data.fetch(TITLES.detect { |t| data[t] }))
|
25
26
|
|
26
|
-
# flatten monitor options so they are all on the base
|
27
27
|
if resource == "monitor"
|
28
|
+
# flatten monitor options so they are all on the base
|
28
29
|
data.merge!(data.delete(:options))
|
29
30
|
data.merge!(data.delete(:thresholds) || {})
|
30
31
|
data = data.slice(*model.instance_methods)
|
32
|
+
|
33
|
+
# make query use critical method if it matches
|
34
|
+
critical = data[:critical]
|
35
|
+
query = data[:query]
|
36
|
+
if query && critical
|
37
|
+
query.sub!(/([><=]) (#{Regexp.escape(critical.to_f.to_s)}|#{Regexp.escape(critical.to_i.to_s)})$/, "\\1 \#{critical}")
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
41
|
+
pretty = pretty_print(data).lstrip.gsub("\\#", "#")
|
33
42
|
<<~RUBY
|
34
43
|
#{model.name}.new(
|
35
44
|
self,
|
36
|
-
#{
|
45
|
+
#{pretty}
|
37
46
|
)
|
38
47
|
RUBY
|
39
48
|
end
|
@@ -43,20 +52,23 @@ module Kennel
|
|
43
52
|
def pretty_print(hash)
|
44
53
|
list = hash.sort_by { |k, _| [SORT_ORDER.index(k) || 999, k] } # important to the front and rest deterministic
|
45
54
|
list.map do |k, v|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
pretty_value =
|
56
|
+
if v.is_a?(Hash) || (v.is_a?(Array) && !v.all? { |e| e.is_a?(String) })
|
57
|
+
# update answer here when changing https://stackoverflow.com/questions/8842546/best-way-to-pretty-print-a-hash
|
58
|
+
# (exclude last indent gsub)
|
59
|
+
pretty = JSON.pretty_generate(v)
|
60
|
+
.gsub(": null", ": nil")
|
61
|
+
.gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:") # "foo": 1 -> foo: 1
|
62
|
+
.gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1
|
63
|
+
.gsub(/^/, " ") # indent
|
64
|
+
|
65
|
+
"\n#{pretty}\n "
|
66
|
+
elsif k == :message
|
67
|
+
"\n <<~TEXT\n#{v.each_line.map { |l| l.strip.empty? ? "\n" : " #{l}" }.join}\n TEXT\n "
|
68
|
+
else
|
69
|
+
" #{v.inspect} "
|
70
|
+
end
|
71
|
+
" #{k}: -> {#{pretty_value}}"
|
60
72
|
end.join(",\n")
|
61
73
|
end
|
62
74
|
end
|
@@ -9,30 +9,35 @@ module Kennel
|
|
9
9
|
QUERY_INTERVALS = ["1m", "5m", "10m", "15m", "30m", "1h", "2h", "4h", "1d"].freeze
|
10
10
|
OPTIONAL_SERVICE_CHECK_THRESHOLDS = [:ok, :warning].freeze
|
11
11
|
READONLY_ATTRIBUTES = Base::READONLY_ATTRIBUTES + [:multi]
|
12
|
-
|
13
|
-
escalation_message: nil,
|
12
|
+
MONITOR_OPTION_DEFAULTS = {
|
14
13
|
evaluation_delay: nil,
|
15
|
-
|
14
|
+
timeout_h: 0,
|
15
|
+
renotify_interval: 120,
|
16
|
+
notify_audit: true,
|
17
|
+
notify_no_data: true,
|
18
|
+
no_data_timeframe: nil # this works out ok since if notify_no_data is on, it would never be nil
|
16
19
|
}.freeze
|
20
|
+
DEFAULT_ESCALATION_MESAGE = ["", nil].freeze
|
17
21
|
|
18
22
|
settings(
|
19
23
|
:query, :name, :message, :escalation_message, :critical, :kennel_id, :type, :renotify_interval, :warning, :timeout_h, :evaluation_delay,
|
20
24
|
:ok, :id, :no_data_timeframe, :notify_no_data, :notify_audit, :tags, :critical_recovery, :warning_recovery, :require_full_window,
|
21
25
|
:threshold_windows
|
22
26
|
)
|
27
|
+
|
23
28
|
defaults(
|
24
29
|
message: -> { "\n\n@slack-#{project.slack}" },
|
25
|
-
escalation_message: -> {
|
26
|
-
renotify_interval: -> {
|
30
|
+
escalation_message: -> { DEFAULT_ESCALATION_MESAGE.first },
|
31
|
+
renotify_interval: -> { MONITOR_OPTION_DEFAULTS.fetch(:renotify_interval) },
|
27
32
|
warning: -> { nil },
|
28
33
|
ok: -> { nil },
|
29
34
|
id: -> { nil },
|
30
|
-
notify_no_data: -> {
|
35
|
+
notify_no_data: -> { MONITOR_OPTION_DEFAULTS.fetch(:notify_no_data) },
|
31
36
|
no_data_timeframe: -> { notify_no_data ? 60 : nil },
|
32
|
-
notify_audit: -> {
|
37
|
+
notify_audit: -> { MONITOR_OPTION_DEFAULTS.fetch(:notify_audit) },
|
33
38
|
tags: -> { @project.tags },
|
34
|
-
timeout_h: -> {
|
35
|
-
evaluation_delay: -> {
|
39
|
+
timeout_h: -> { MONITOR_OPTION_DEFAULTS.fetch(:timeout_h) },
|
40
|
+
evaluation_delay: -> { MONITOR_OPTION_DEFAULTS.fetch(:evaluation_delay) },
|
36
41
|
critical_recovery: -> { nil },
|
37
42
|
warning_recovery: -> { nil },
|
38
43
|
threshold_windows: -> { nil }
|
@@ -113,7 +118,6 @@ module Kennel
|
|
113
118
|
super
|
114
119
|
options = actual.fetch(:options)
|
115
120
|
options.delete(:silenced) # we do not manage silenced, so ignore it when diffing
|
116
|
-
options[:escalation_message] ||= nil # unset field is not returned and would break the diff
|
117
121
|
|
118
122
|
# fields are not returned when set to true
|
119
123
|
if ["service check", "event alert"].include?(actual[:type])
|
@@ -136,7 +140,12 @@ module Kennel
|
|
136
140
|
# nil / "" / 0 are not returned from the api when set via the UI
|
137
141
|
options[:evaluation_delay] ||= nil
|
138
142
|
|
139
|
-
|
143
|
+
expected_options = expected[:options] || {}
|
144
|
+
ignore_default(expected_options, options, MONITOR_OPTION_DEFAULTS)
|
145
|
+
if DEFAULT_ESCALATION_MESAGE.include?(options[:escalation_message])
|
146
|
+
options.delete(:escalation_message)
|
147
|
+
expected_options.delete(:escalation_message)
|
148
|
+
end
|
140
149
|
end
|
141
150
|
|
142
151
|
private
|
data/lib/kennel/syncer.rb
CHANGED
@@ -208,6 +208,7 @@ module Kennel
|
|
208
208
|
def add_tracking_id(e)
|
209
209
|
json = e.as_json
|
210
210
|
field = tracking_field(json)
|
211
|
+
raise "remove \"-- Managed by kennel\" line it from #{field} to copy a resource" if tracking_value(json[field])
|
211
212
|
json[field] = "#{json[field]}\n-- Managed by kennel #{e.tracking_id} in #{e.project.class.file_location}, do not modify manually".lstrip
|
212
213
|
end
|
213
214
|
|
data/lib/kennel/utils.rb
CHANGED
@@ -15,12 +15,22 @@ module Kennel
|
|
15
15
|
|
16
16
|
class << self
|
17
17
|
def snake_case(string)
|
18
|
-
string
|
18
|
+
string
|
19
|
+
.gsub(/::/, "_") # Foo::Bar -> foo_bar
|
19
20
|
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') # FOOBar -> foo_bar
|
20
21
|
.gsub(/([a-z\d])([A-Z])/, '\1_\2') # fooBar -> foo_bar
|
21
22
|
.downcase
|
22
23
|
end
|
23
24
|
|
25
|
+
# simplified version of https://apidock.com/rails/ActiveSupport/Inflector/parameterize
|
26
|
+
def parameterize(string)
|
27
|
+
string
|
28
|
+
.downcase
|
29
|
+
.gsub(/[^a-z0-9\-_]+/, "-") # remove unsupported
|
30
|
+
.gsub(/-{2,}/, "-") # remove duplicates
|
31
|
+
.gsub(/^-|-$/, "") # remove leading/trailing
|
32
|
+
end
|
33
|
+
|
24
34
|
def presence(value)
|
25
35
|
value.nil? || value.empty? ? nil : value
|
26
36
|
end
|
data/lib/kennel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kennel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.31.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|