doggy 0.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +26 -11
- data/README.md +0 -23
- data/Rakefile +4 -3
- data/bin/console +8 -0
- data/bin/setup +2 -0
- data/doggy.gemspec +9 -7
- data/exe/doggy +2 -10
- data/lib/doggy.rb +47 -87
- data/lib/doggy/cli.rb +31 -73
- data/lib/doggy/cli/edit.rb +32 -5
- data/lib/doggy/cli/mute.rb +4 -9
- data/lib/doggy/cli/pull.rb +20 -12
- data/lib/doggy/cli/push.rb +17 -19
- data/lib/doggy/cli/unmute.rb +5 -9
- data/lib/doggy/model.rb +155 -0
- data/lib/doggy/models/dashboard.rb +37 -0
- data/lib/doggy/models/monitor.rb +82 -0
- data/lib/doggy/models/screen.rb +37 -0
- data/lib/doggy/version.rb +1 -1
- metadata +45 -39
- data/examples/my-monitor.rb +0 -14
- data/lib/doggy/cli/delete.rb +0 -21
- data/lib/doggy/cli/sha.rb +0 -12
- data/lib/doggy/cli/version.rb +0 -7
- data/lib/doggy/client.rb +0 -46
- data/lib/doggy/definition.rb +0 -9
- data/lib/doggy/dsl.rb +0 -73
- data/lib/doggy/errors.rb +0 -12
- data/lib/doggy/friendly_errors.rb +0 -76
- data/lib/doggy/model/dash.rb +0 -93
- data/lib/doggy/model/monitor.rb +0 -142
- data/lib/doggy/model/screen.rb +0 -80
- data/lib/doggy/serializer/json.rb +0 -15
- data/lib/doggy/serializer/yaml.rb +0 -15
- data/lib/doggy/shared_helpers.rb +0 -63
- data/lib/doggy/worker.rb +0 -31
@@ -0,0 +1,37 @@
|
|
1
|
+
module Doggy
|
2
|
+
module Models
|
3
|
+
class Screen < Doggy::Model
|
4
|
+
attribute :id, Integer
|
5
|
+
attribute :board_title, String
|
6
|
+
|
7
|
+
attribute :board_bgtype, String
|
8
|
+
attribute :templated, Boolean
|
9
|
+
attribute :widgets, Array[Hash]
|
10
|
+
attribute :height, String
|
11
|
+
attribute :width, String
|
12
|
+
|
13
|
+
def self.resource_url(id = nil)
|
14
|
+
"https://app.datadoghq.com/api/v1/screen".tap do |base_url|
|
15
|
+
base_url << "/#{ id }" if id
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def managed?
|
20
|
+
!(board_title =~ Doggy::DOG_SKIP_REGEX)
|
21
|
+
end
|
22
|
+
|
23
|
+
def ensure_managed_emoji!
|
24
|
+
return unless managed?
|
25
|
+
self.board_title += " \xF0\x9F\x90\xB6"
|
26
|
+
end
|
27
|
+
|
28
|
+
def human_url
|
29
|
+
"https://app.datadoghq.com/screen/#{ id }"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Screens don't have a direct edit URL
|
33
|
+
alias_method :human_edit_url, :human_url
|
34
|
+
end # Screen
|
35
|
+
end # Models
|
36
|
+
end # Doggy
|
37
|
+
|
data/lib/doggy/version.rb
CHANGED
metadata
CHANGED
@@ -1,108 +1,126 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doggy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vlad Gorodetsky
|
8
|
+
- Andre Medeiros
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-10-05 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
+
name: json
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
20
|
+
version: 1.8.3
|
21
|
+
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
+
version: 1.8.3
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: parallel
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
32
|
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
34
|
+
version: 1.6.1
|
35
|
+
type: :runtime
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
+
version: 1.6.1
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: thor
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
46
|
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
+
version: 0.19.1
|
48
49
|
type: :runtime
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
+
version: 0.19.1
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
+
name: virtus
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
60
|
- - "~>"
|
60
61
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
+
version: 1.0.5
|
62
63
|
type: :runtime
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
67
|
- - "~>"
|
67
68
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
+
version: 1.0.5
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
+
name: bundler
|
71
72
|
requirement: !ruby/object:Gem::Requirement
|
72
73
|
requirements:
|
73
74
|
- - "~>"
|
74
75
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
-
type: :
|
76
|
+
version: '1.10'
|
77
|
+
type: :development
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
81
|
- - "~>"
|
81
82
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
+
version: '1.10'
|
83
84
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
85
|
+
name: rake
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
86
87
|
requirements:
|
87
88
|
- - "~>"
|
88
89
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
90
|
-
type: :
|
90
|
+
version: '10.0'
|
91
|
+
type: :development
|
91
92
|
prerelease: false
|
92
93
|
version_requirements: !ruby/object:Gem::Requirement
|
93
94
|
requirements:
|
94
95
|
- - "~>"
|
95
96
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
97
|
+
version: '10.0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: minitest
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
97
112
|
description: Syncs DataDog dashboards, alerts, screenboards, and monitors.
|
98
113
|
email:
|
99
114
|
- v@gor.io
|
115
|
+
- me@andremedeiros.info
|
100
116
|
executables:
|
101
117
|
- doggy
|
102
118
|
extensions: []
|
103
119
|
extra_rdoc_files: []
|
104
120
|
files:
|
105
121
|
- ".gitignore"
|
122
|
+
- ".travis.yml"
|
123
|
+
- CODE_OF_CONDUCT.md
|
106
124
|
- Gemfile
|
107
125
|
- Gemfile.lock
|
108
126
|
- LICENSE.txt
|
@@ -111,31 +129,19 @@ files:
|
|
111
129
|
- bin/console
|
112
130
|
- bin/setup
|
113
131
|
- doggy.gemspec
|
114
|
-
- examples/my-monitor.rb
|
115
132
|
- exe/doggy
|
116
133
|
- lib/doggy.rb
|
117
134
|
- lib/doggy/cli.rb
|
118
|
-
- lib/doggy/cli/delete.rb
|
119
135
|
- lib/doggy/cli/edit.rb
|
120
136
|
- lib/doggy/cli/mute.rb
|
121
137
|
- lib/doggy/cli/pull.rb
|
122
138
|
- lib/doggy/cli/push.rb
|
123
|
-
- lib/doggy/cli/sha.rb
|
124
139
|
- lib/doggy/cli/unmute.rb
|
125
|
-
- lib/doggy/
|
126
|
-
- lib/doggy/
|
127
|
-
- lib/doggy/
|
128
|
-
- lib/doggy/
|
129
|
-
- lib/doggy/errors.rb
|
130
|
-
- lib/doggy/friendly_errors.rb
|
131
|
-
- lib/doggy/model/dash.rb
|
132
|
-
- lib/doggy/model/monitor.rb
|
133
|
-
- lib/doggy/model/screen.rb
|
134
|
-
- lib/doggy/serializer/json.rb
|
135
|
-
- lib/doggy/serializer/yaml.rb
|
136
|
-
- lib/doggy/shared_helpers.rb
|
140
|
+
- lib/doggy/model.rb
|
141
|
+
- lib/doggy/models/dashboard.rb
|
142
|
+
- lib/doggy/models/monitor.rb
|
143
|
+
- lib/doggy/models/screen.rb
|
137
144
|
- lib/doggy/version.rb
|
138
|
-
- lib/doggy/worker.rb
|
139
145
|
homepage: http://github.com/bai/doggy
|
140
146
|
licenses:
|
141
147
|
- MIT
|
data/examples/my-monitor.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
created_at = Time.parse('2015-01-01 14:00:01').to_i * 1000
|
2
|
-
|
3
|
-
query <<-QUERY
|
4
|
-
sum(last_1m):sum:Engine.current_thrust.status{status:error}.as_count() < 50
|
5
|
-
QUERY
|
6
|
-
|
7
|
-
obj({
|
8
|
-
created_at: created_at,
|
9
|
-
id: 100500,
|
10
|
-
message: "Houston, we have a problem @pagerduty-Houston",
|
11
|
-
name: "Engine thrust",
|
12
|
-
query: query,
|
13
|
-
type: "query alert"
|
14
|
-
})
|
data/lib/doggy/cli/delete.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Doggy
|
2
|
-
class CLI::Delete
|
3
|
-
attr_reader :options, :ids
|
4
|
-
|
5
|
-
def initialize(options, ids)
|
6
|
-
@options = options
|
7
|
-
@ids = ids
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
begin
|
12
|
-
Doggy::Dash.delete(ids)
|
13
|
-
Doggy::Monitor.delete(ids)
|
14
|
-
Doggy::Screen.delete(ids)
|
15
|
-
rescue DoggyError
|
16
|
-
puts "Delete failed."
|
17
|
-
exit 1
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/doggy/cli/sha.rb
DELETED
data/lib/doggy/cli/version.rb
DELETED
data/lib/doggy/client.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
class Dogapi::APIService
|
2
|
-
attr_reader :api_key, :application_key # as they are useless in the parent class
|
3
|
-
end
|
4
|
-
|
5
|
-
module Doggy
|
6
|
-
class Client
|
7
|
-
def api_key
|
8
|
-
@api_key ||= ENV.fetch('DATADOG_API_KEY', ejson_config[:datadog_api_key])
|
9
|
-
rescue => e
|
10
|
-
puts "[DogSync#api_key] Exception: #{e.message}"
|
11
|
-
raise
|
12
|
-
end
|
13
|
-
|
14
|
-
def app_key
|
15
|
-
@app_key ||= ENV.fetch('DATADOG_APP_KEY', ejson_config[:datadog_app_key])
|
16
|
-
rescue => e
|
17
|
-
puts "[DogSync#app_key] Exception: #{e.message}"
|
18
|
-
raise
|
19
|
-
end
|
20
|
-
|
21
|
-
def dog
|
22
|
-
@dog ||= Dogapi::Client.new(api_key, app_key)
|
23
|
-
end
|
24
|
-
|
25
|
-
def api_service
|
26
|
-
@api_service ||= Dogapi::APIService.new(api_key, app_key)
|
27
|
-
end
|
28
|
-
|
29
|
-
def api_service_params
|
30
|
-
@api_service_params ||= { api_key: Doggy.client.api_service.api_key, application_key: Doggy.client.api_service.application_key }
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def ejson_config
|
36
|
-
@ejson_config ||= begin
|
37
|
-
if File.exists?('secrets.json')
|
38
|
-
secrets = JSON.parse(File.read('secrets.json'))
|
39
|
-
{ datadog_api_key: secrets['datadog_api_key'], datadog_app_key: secrets['datadog_app_key'] }
|
40
|
-
else
|
41
|
-
{}
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/lib/doggy/definition.rb
DELETED
data/lib/doggy/dsl.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
module Doggy
|
2
|
-
class Dsl
|
3
|
-
def self.evaluate(object_file)
|
4
|
-
builder = new
|
5
|
-
builder.eval_file(object_file)
|
6
|
-
builder.to_definition
|
7
|
-
end
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@obj = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def eval_file(object_file, contents = nil)
|
14
|
-
contents ||= File.open(object_file.to_s, "rb") { |f| f.read }
|
15
|
-
instance_eval(contents, object_file.to_s, 1)
|
16
|
-
rescue Exception => e
|
17
|
-
message = "There was an error " \
|
18
|
-
"#{e.is_a?(ObjectFileEvalError) ? "evaluating" : "parsing"} " \
|
19
|
-
"`#{File.basename object_file.to_s}`: #{e.message}"
|
20
|
-
|
21
|
-
raise DSLError.new(message, object_file, e.backtrace, contents)
|
22
|
-
end
|
23
|
-
|
24
|
-
def obj(structure)
|
25
|
-
@obj = structure
|
26
|
-
end
|
27
|
-
|
28
|
-
# @return [Definition] the parsed object definition.
|
29
|
-
def to_definition
|
30
|
-
Definition.new(@obj)
|
31
|
-
end
|
32
|
-
|
33
|
-
def method_missing(name, *args)
|
34
|
-
raise Doggy::ObjectFileError, "Undefined local variable or method `#{name}' for object file"
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
class DSLError < Doggy::ObjectFileError
|
40
|
-
# @return [String] the message that should be presented to the user.
|
41
|
-
attr_reader :message
|
42
|
-
|
43
|
-
# @return [String] the path of the dsl file that raised the exception.
|
44
|
-
attr_reader :dsl_path
|
45
|
-
|
46
|
-
# @return [Exception] the backtrace of the exception raised by the evaluation of the dsl file.
|
47
|
-
attr_reader :backtrace
|
48
|
-
|
49
|
-
# @param [Exception] backtrace @see backtrace
|
50
|
-
# @param [String] dsl_path @see dsl_path
|
51
|
-
def initialize(message, dsl_path, backtrace, contents = nil)
|
52
|
-
@status_code = $!.respond_to?(:status_code) && $!.status_code
|
53
|
-
|
54
|
-
@message = message
|
55
|
-
@dsl_path = dsl_path
|
56
|
-
@backtrace = backtrace
|
57
|
-
@contents = contents
|
58
|
-
end
|
59
|
-
|
60
|
-
def status_code
|
61
|
-
@status_code || super
|
62
|
-
end
|
63
|
-
|
64
|
-
# @return [String] the contents of the DSL that cause the exception to
|
65
|
-
# be raised.
|
66
|
-
def contents
|
67
|
-
@contents ||= begin
|
68
|
-
dsl_path && File.exist?(dsl_path) && File.read(dsl_path)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/lib/doggy/errors.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module Doggy
|
2
|
-
class DoggyError < StandardError
|
3
|
-
def self.status_code(code)
|
4
|
-
define_method(:status_code) { code }
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
class ObjectFileError < DoggyError; status_code(12); end
|
9
|
-
class ObjectFileEvalError < DoggyError; status_code(11); end
|
10
|
-
class InvalidOption < DoggyError; status_code(15); end
|
11
|
-
class InvalidItemType < DoggyError; status_code(10); end
|
12
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'thor'
|
3
|
-
require 'doggy'
|
4
|
-
|
5
|
-
module Doggy
|
6
|
-
def self.with_friendly_errors
|
7
|
-
yield
|
8
|
-
rescue Doggy::Dsl::DSLError => e
|
9
|
-
puts e.message
|
10
|
-
exit e.status_code
|
11
|
-
rescue Doggy::DoggyError => e
|
12
|
-
puts e.message
|
13
|
-
puts e
|
14
|
-
exit e.status_code
|
15
|
-
rescue Thor::AmbiguousTaskError => e
|
16
|
-
puts e.message
|
17
|
-
exit 15
|
18
|
-
rescue Thor::UndefinedTaskError => e
|
19
|
-
puts e.message
|
20
|
-
exit 15
|
21
|
-
rescue Thor::Error => e
|
22
|
-
puts e.message
|
23
|
-
exit 1
|
24
|
-
rescue Interrupt => e
|
25
|
-
puts "\nQuitting..."
|
26
|
-
puts e
|
27
|
-
exit 1
|
28
|
-
rescue SystemExit => e
|
29
|
-
exit e.status
|
30
|
-
rescue Exception => e
|
31
|
-
request_issue_report_for(e)
|
32
|
-
exit 1
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.request_issue_report_for(e)
|
36
|
-
puts <<-EOS.gsub(/^ {6}/, "")
|
37
|
-
--- ERROR REPORT TEMPLATE -------------------------------------------------------
|
38
|
-
- What did you do?
|
39
|
-
|
40
|
-
I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}`
|
41
|
-
|
42
|
-
- What did you expect to happen?
|
43
|
-
|
44
|
-
I expected Doggy to...
|
45
|
-
|
46
|
-
- What happened instead?
|
47
|
-
|
48
|
-
Instead, what actually happened was...
|
49
|
-
|
50
|
-
|
51
|
-
Error details
|
52
|
-
|
53
|
-
#{e.class}: #{e.message}
|
54
|
-
#{e.backtrace.join("\n ")}
|
55
|
-
|
56
|
-
--- TEMPLATE END ----------------------------------------------------------------
|
57
|
-
|
58
|
-
EOS
|
59
|
-
|
60
|
-
puts "Unfortunately, an unexpected error occurred, and Doggy cannot continue."
|
61
|
-
|
62
|
-
puts <<-EOS.gsub(/^ {6}/, "")
|
63
|
-
|
64
|
-
First, try this link to see if there are any existing issue reports for this error:
|
65
|
-
#{issues_url(e)}
|
66
|
-
|
67
|
-
If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
|
68
|
-
https://github.com/bai/doggy/issues/new
|
69
|
-
EOS
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.issues_url(exception)
|
73
|
-
"https://github.com/bai/doggy/search?q=" \
|
74
|
-
"#{CGI.escape(exception.message.lines.first.chomp)}&type=Issues"
|
75
|
-
end
|
76
|
-
end
|