kennel 1.100.0 → 1.103.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97207492f3f5afd31ab4d3b16db46f8b70a772c101c57bc26c7d135c9ece6a75
4
- data.tar.gz: 6a2c515b9116f1da7764a0a509886fee28ec36241e982b425843f6bc64c02067
3
+ metadata.gz: 1325abc55c593c6537608b629a7a98de7ce05487bc3a066782bb1be1164268dd
4
+ data.tar.gz: 966282e916764aaaae5b6718a72d4070070d1ad3c2f6a43bbdf01c10e325d63c
5
5
  SHA512:
6
- metadata.gz: a4304111e6d35d92ed2b1adbba277a39eb67e7b2e697a5b2cbd031731a1aa968477249f13a18377f7ea4af49bfafd8742060a3ab6c7b7161bb78fd9b63889972
7
- data.tar.gz: 8a5588b35ef64e8a91354a5554866f5a59ca354d850ecd96c7d2d164cf79ffe8f6b8cf79ff0c3bc5d4108cba4a600211492ccd0c7033725dc3e2c0a4197e55ef
6
+ metadata.gz: fec764b934ecad2aa76a9282eb937ceef1774d19d50b56d1597846c04afd050dac9fcc51566618169929eb0da77c25d6eb3ac18c9993872229d5404b5d6e3127
7
+ data.tar.gz: 85201a83ceed329e4bf71b4392ec086c3d18714d5f76eda00dbe2fa6a7e05482523b91e40405241241666f9982eddb5c167bd6b3bd9448a56d39f30392ccadba
data/lib/kennel/id_map.rb CHANGED
@@ -15,10 +15,6 @@ module Kennel
15
15
  @map[type][tracking_id] = id
16
16
  end
17
17
 
18
- def set_new(type, tracking_id)
19
- @map[type][tracking_id] = NEW
20
- end
21
-
22
18
  def new?(type, tracking_id)
23
19
  @map[type][tracking_id] == NEW
24
20
  end
data/lib/kennel/syncer.rb CHANGED
@@ -18,6 +18,7 @@ module Kennel
18
18
  if noop?
19
19
  Kennel.out.puts Utils.color(:green, "Nothing to do")
20
20
  else
21
+ @warnings.each { |message| Kennel.out.puts Utils.color(:yellow, "Warning: #{message}") }
21
22
  print_plan "Create", @create, :green
22
23
  print_plan "Update", @update, :yellow
23
24
  print_plan "Delete", @delete, :red
@@ -120,6 +121,7 @@ module Kennel
120
121
  end
121
122
 
122
123
  def calculate_diff
124
+ @warnings = []
123
125
  @update = []
124
126
  @delete = []
125
127
  @id_map = IdMap.new
@@ -181,7 +183,11 @@ module Kennel
181
183
  @expected.each do |e|
182
184
  next unless id = e.id
183
185
  resource = e.class.api_resource
184
- raise "Unable to find existing #{resource} with id #{id}\nIf the #{resource} was deleted, remove the `id: -> { #{e.id} }` line."
186
+ if Kennel.strict_imports
187
+ raise "Unable to find existing #{resource} with id #{id}\nIf the #{resource} was deleted, remove the `id: -> { #{id} }` line."
188
+ else
189
+ @warnings << "#{resource} #{e.tracking_id} specifies id #{id}, but no such #{resource} exists. 'id' will be ignored. Remove the `id: -> { #{id} }` line."
190
+ end
185
191
  end
186
192
  end
187
193
 
@@ -254,13 +260,28 @@ module Kennel
254
260
  end
255
261
 
256
262
  def populate_id_map(expected, actual)
263
+ # mark everything as new
257
264
  expected.each do |e|
258
- @id_map.set_new(e.class.api_resource, e.tracking_id)
265
+ @id_map.set(e.class.api_resource, e.tracking_id, IdMap::NEW)
266
+ if e.class.api_resource == "synthetics/tests"
267
+ @id_map.set(Kennel::Models::Monitor.api_resource, e.tracking_id, IdMap::NEW)
268
+ end
259
269
  end
260
270
 
271
+ # override resources that exist with their id
272
+ project_prefix = @project_filter && "#{@project_filter}:"
261
273
  actual.each do |a|
274
+ # ignore when not managed by kennel
262
275
  next unless tracking_id = a.fetch(:tracking_id)
263
- @id_map.set(a.fetch(:klass).api_resource, tracking_id, a.fetch(:id))
276
+
277
+ # ignore when deleted from the codebase
278
+ # (when running with project filter we cannot see the other resources in the codebase)
279
+ api_resource = a.fetch(:klass).api_resource
280
+ next if
281
+ !@id_map.get(api_resource, tracking_id) &&
282
+ (!project_prefix || tracking_id.start_with?(project_prefix))
283
+
284
+ @id_map.set(api_resource, tracking_id, a.fetch(:id))
264
285
  if a[:klass].api_resource == "synthetics/tests"
265
286
  @id_map.set(Kennel::Models::Monitor.api_resource, tracking_id, a.fetch(:monitor_id))
266
287
  end
data/lib/kennel/tasks.rb CHANGED
@@ -3,6 +3,7 @@ require "English"
3
3
  require "kennel"
4
4
  require "kennel/unmuted_alerts"
5
5
  require "kennel/importer"
6
+ require "json"
6
7
 
7
8
  module Kennel
8
9
  module Tasks
@@ -75,6 +76,7 @@ namespace :kennel do
75
76
  is_push = (ENV["TRAVIS_PULL_REQUEST"] == "false" || ENV["GITHUB_EVENT_NAME"] == "push")
76
77
  task_name =
77
78
  if on_default_branch && is_push
79
+ Kennel.strict_imports = false
78
80
  "kennel:update_datadog"
79
81
  else
80
82
  "kennel:plan" # show plan in CI logs
@@ -89,7 +91,7 @@ namespace :kennel do
89
91
  Kennel::UnmutedAlerts.print(Kennel.send(:api), tag)
90
92
  end
91
93
 
92
- desc "show monitors with no data by TAG, for example TAG=team:foo"
94
+ desc "show monitors with no data by TAG, for example TAG=team:foo [THRESHOLD_DAYS=7] [FORMAT=json]"
93
95
  task nodata: :environment do
94
96
  tag = ENV["TAG"] || Kennel::Tasks.abort("Call with TAG=foo:bar")
95
97
  monitors = Kennel.send(:api).list("monitor", monitor_tags: tag, group_states: "no data")
@@ -97,16 +99,45 @@ namespace :kennel do
97
99
  monitors.reject! { |m| m[:tags].include? "nodata:ignore" }
98
100
  if monitors.any?
99
101
  Kennel.err.puts <<~TEXT
100
- This is a useful task to find monitors that have mis-spelled metrics or never received data at any time.
101
- To ignore monitors with nodata, tag the monitor with "nodata:ignore"
102
+ To ignore monitors with expected nodata, tag it with "nodata:ignore"
102
103
 
103
104
  TEXT
104
105
  end
105
106
 
107
+ now = Time.now
106
108
  monitors.each do |m|
107
- Kennel.out.puts m[:name]
108
- Kennel.out.puts Kennel::Utils.path_to_url("/monitors/#{m[:id]}")
109
- Kennel.out.puts
109
+ m[:days_in_no_data] =
110
+ if m[:overall_state_modified]
111
+ since = Date.parse(m[:overall_state_modified]).to_time
112
+ ((now - since) / (24 * 60 * 60)).to_i
113
+ else
114
+ 999
115
+ end
116
+ end
117
+
118
+ if threshold = ENV["THRESHOLD_DAYS"]
119
+ monitors.select! { |m| m[:days_in_no_data] > Integer(threshold) }
120
+ end
121
+
122
+ monitors.each { |m| m[:url] = Kennel::Utils.path_to_url("/monitors/#{m[:id]}") }
123
+
124
+ if ENV["FORMAT"] == "json"
125
+ report = monitors.map do |m|
126
+ match = m[:message].to_s.match(/-- Managed by kennel (\S+:\S+) in (\S+), /) || []
127
+ m.slice(:url, :name, :tags, :days_in_no_data).merge(
128
+ kennel_tracking_id: match[1],
129
+ kennel_source: match[2]
130
+ )
131
+ end
132
+
133
+ Kennel.out.puts JSON.pretty_generate(report)
134
+ else
135
+ monitors.each do |m|
136
+ Kennel.out.puts m[:name]
137
+ Kennel.out.puts Kennel::Utils.path_to_url("/monitors/#{m[:id]}")
138
+ Kennel.out.puts "No data since #{m[:days_in_no_data]}d"
139
+ Kennel.out.puts
140
+ end
110
141
  end
111
142
  end
112
143
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
- VERSION = "1.100.0"
3
+ VERSION = "1.103.0"
4
4
  end
data/lib/kennel.rb CHANGED
@@ -42,9 +42,10 @@ module Kennel
42
42
 
43
43
  @out = $stdout
44
44
  @err = $stderr
45
+ @strict_imports = true
45
46
 
46
47
  class << self
47
- attr_accessor :out, :err
48
+ attr_accessor :out, :err, :strict_imports
48
49
 
49
50
  def generate
50
51
  store generated
@@ -70,7 +71,8 @@ module Kennel
70
71
  path = "generated/#{part.tracking_id.tr("/", ":").sub(":", "/")}.json"
71
72
  used << File.dirname(path) # only 1 level of sub folders, so this is safe
72
73
  used << path
73
- write_file_if_necessary(path, JSON.pretty_generate(part.as_json) << "\n")
74
+ payload = part.as_json.merge(api_resource: part.class.api_resource)
75
+ write_file_if_necessary(path, JSON.pretty_generate(payload) << "\n")
74
76
  end
75
77
 
76
78
  # deleting all is slow, so only delete the extras
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.100.0
4
+ version: 1.103.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: 2021-11-06 00:00:00.000000000 Z
11
+ date: 2021-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday