kennel 1.119.0 → 1.120.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/filter.rb +27 -14
- data/lib/kennel/models/monitor.rb +19 -1
- data/lib/kennel/version.rb +1 -1
- data/lib/kennel.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cbbb48418612701154d8a4aef95ef0267ca8993425b23977f550b91f185a0cb
|
4
|
+
data.tar.gz: d50f6890094e8af69346047cdae827ea5ca63d28e119c0de58792f7dc969a11d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eac3443d6277ff33da2c1b4dec30ad389ecae8b6c211b65eb6e5b4c19404d2b32adc1299d6d207de58839b321f1343ee3186f2b488d375db92db411735e3bf69
|
7
|
+
data.tar.gz: 83e9083b77bbe269985986478a2a021ee32f9ac88712e662b3e817c6a70f1020ac68f0484944d8c9e7e4920c88440baf5e4cd111cc7be80bb943fdfd17f3a854
|
data/lib/kennel/filter.rb
CHANGED
@@ -2,35 +2,48 @@
|
|
2
2
|
|
3
3
|
module Kennel
|
4
4
|
class Filter
|
5
|
+
attr_reader :project_filter, :tracking_id_filter
|
6
|
+
|
5
7
|
def initialize
|
6
|
-
|
7
|
-
tracking_id_filter
|
8
|
+
# build early so we fail fast on invalid user input
|
9
|
+
@tracking_id_filter = build_tracking_id_filter
|
10
|
+
@project_filter = build_project_filter
|
11
|
+
end
|
12
|
+
|
13
|
+
def filter_projects(projects)
|
14
|
+
filter_resources(projects, :kennel_id, project_filter, "projects", "PROJECT")
|
8
15
|
end
|
9
16
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
def filter_parts(parts)
|
18
|
+
filter_resources(parts, :tracking_id, tracking_id_filter, "resources", "TRACKING_ID")
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def build_project_filter
|
24
|
+
project_names = ENV["PROJECT"]&.split(",")&.sort&.uniq
|
25
|
+
tracking_project_names = tracking_id_filter&.map { |id| id.split(":", 2).first }&.sort&.uniq
|
26
|
+
if project_names && tracking_project_names && project_names != tracking_project_names
|
14
27
|
raise "do not set PROJECT= when using TRACKING_ID="
|
15
28
|
end
|
16
|
-
(
|
29
|
+
(project_names || tracking_project_names)
|
17
30
|
end
|
18
31
|
|
19
|
-
def
|
32
|
+
def build_tracking_id_filter
|
20
33
|
(tracking_id = ENV["TRACKING_ID"]) && tracking_id.split(",").sort.uniq
|
21
34
|
end
|
22
35
|
|
23
|
-
def
|
24
|
-
return unless
|
36
|
+
def filter_resources(resources, by, expected, name, env)
|
37
|
+
return resources unless expected
|
25
38
|
|
26
|
-
|
39
|
+
expected = expected.uniq
|
27
40
|
before = resources.dup
|
28
|
-
resources.select
|
41
|
+
resources = resources.select { |p| expected.include?(p.send(by)) }
|
29
42
|
keeping = resources.uniq(&by).size
|
30
|
-
return if keeping ==
|
43
|
+
return resources if keeping == expected.size
|
31
44
|
|
32
45
|
raise <<~MSG.rstrip
|
33
|
-
#{env}=#{
|
46
|
+
#{env}=#{expected.join(",")} matched #{keeping} #{name}, try any of these:
|
34
47
|
#{before.map(&by).sort.uniq.join("\n")}
|
35
48
|
MSG
|
36
49
|
end
|
@@ -27,11 +27,12 @@ module Kennel
|
|
27
27
|
}.freeze
|
28
28
|
DEFAULT_ESCALATION_MESSAGE = ["", nil].freeze
|
29
29
|
ALLOWED_PRIORITY_CLASSES = [NilClass, Integer].freeze
|
30
|
+
ALLOWED_UNLINKED = [] # rubocop:disable Style/MutableConstant placeholder for custom overrides
|
30
31
|
|
31
32
|
settings(
|
32
33
|
:query, :name, :message, :escalation_message, :critical, :type, :renotify_interval, :warning, :timeout_h, :evaluation_delay,
|
33
34
|
:ok, :no_data_timeframe, :notify_no_data, :notify_audit, :tags, :critical_recovery, :warning_recovery, :require_full_window,
|
34
|
-
:threshold_windows, :new_host_delay, :new_group_delay, :priority
|
35
|
+
:threshold_windows, :new_host_delay, :new_group_delay, :priority, :validate_using_links
|
35
36
|
)
|
36
37
|
|
37
38
|
defaults(
|
@@ -238,6 +239,8 @@ module Kennel
|
|
238
239
|
validate_message_variables(data)
|
239
240
|
end
|
240
241
|
|
242
|
+
validate_using_links(data)
|
243
|
+
|
241
244
|
if type == "service check" && !data[:query].to_s.include?(".by(")
|
242
245
|
invalid! "query must include a .by() at least .by(\"*\")"
|
243
246
|
end
|
@@ -286,6 +289,21 @@ module Kennel
|
|
286
289
|
Group or filter the query by #{forbidden.map { |f| f.sub(".name", "") }.join(", ")} to use it.
|
287
290
|
MSG
|
288
291
|
end
|
292
|
+
|
293
|
+
def validate_using_links(data)
|
294
|
+
case data[:type]
|
295
|
+
when "composite" # TODO: add slo to mirror resolve_linked_tracking_ids! logic
|
296
|
+
ids = data[:query].tr("-", "_").scan(/\b\d+\b/)
|
297
|
+
ids.reject! { |id| ALLOWED_UNLINKED.include?([tracking_id, id]) }
|
298
|
+
if ids.any?
|
299
|
+
invalid! <<~MSG.rstrip
|
300
|
+
Used #{ids} in the query, but should only use links in the form of %{<project id>:<monitor id>}
|
301
|
+
If that is not possible, add `validate_using_links: ->(*){} # linked monitors are not in kennel
|
302
|
+
MSG
|
303
|
+
end
|
304
|
+
else # do nothing
|
305
|
+
end
|
306
|
+
end
|
289
307
|
end
|
290
308
|
end
|
291
309
|
end
|
data/lib/kennel/version.rb
CHANGED
data/lib/kennel.rb
CHANGED
@@ -101,10 +101,10 @@ module Kennel
|
|
101
101
|
@generated ||= begin
|
102
102
|
Progress.progress "Generating" do
|
103
103
|
projects = projects_provider.projects
|
104
|
-
|
104
|
+
projects = filter.filter_projects projects
|
105
105
|
|
106
106
|
parts = Utils.parallel(projects, &:validated_parts).flatten(1)
|
107
|
-
|
107
|
+
parts = filter.filter_parts parts
|
108
108
|
|
109
109
|
parts.group_by(&:tracking_id).each do |tracking_id, same|
|
110
110
|
next if same.size == 1
|