kennel 1.100.0 → 1.103.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.
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