saba-webhook-gateway 1.1.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 +7 -0
- data/.rubocop.yml +306 -0
- data/Gemfile +2 -0
- data/Gemfile-lambda +3 -0
- data/LICENSE +21 -0
- data/README.md +144 -0
- data/Rakefile +15 -0
- data/exe/lambda-handler-googlechat.rb +26 -0
- data/exe/webhook-handler-googlechat.rb +30 -0
- data/googlechat.png +0 -0
- data/lib/saba-webhook-gateway/base.rb +359 -0
- data/lib/saba-webhook-gateway/googlechat.rb +326 -0
- data/lib/saba-webhook-gateway.rb +5 -0
- data/make-lambda-zip.sh +7 -0
- data/saba-webhook-gateway.gemspec +32 -0
- data/saba-webhook-gateway.png +0 -0
- data/webhooks/alert.json +887 -0
- data/webhooks/alertgroup.json +204 -0
- data/webhooks/host-register.json +305 -0
- data/webhooks/host-retire.json +279 -0
- data/webhooks/host-status.json +283 -0
- data/webhooks/monitor-create.json +580 -0
- data/webhooks/monitor-delete.json +545 -0
- data/webhooks/monitor-update.json +545 -0
- data/webhooks/sample.json +52 -0
- metadata +157 -0
@@ -0,0 +1,359 @@
|
|
1
|
+
# Saba Webhook Gateway base
|
2
|
+
# Copyright 2023 Kenshi Muto <kmuto@kmuto.jp>
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
# main namespace for Saba Webhook Gateway
|
6
|
+
module SabaWebhookGateway
|
7
|
+
class Base
|
8
|
+
# Initialize a new SabaWebhookGateway object.
|
9
|
+
#
|
10
|
+
# @return [SabaWebhookGateway::Base]
|
11
|
+
def initialize
|
12
|
+
@debug = ENV['DEBUG'] || nil
|
13
|
+
end
|
14
|
+
|
15
|
+
# Convert epoch to 'MM/DD hh:mm'.
|
16
|
+
#
|
17
|
+
# @param [Integer] :epoch Time epoch.
|
18
|
+
# @return [String]
|
19
|
+
def to_date(epoch)
|
20
|
+
Time.at(epoch.to_i).strftime('%m/%d %H:%M')
|
21
|
+
end
|
22
|
+
|
23
|
+
# Convert JSON to Ruby Hash.
|
24
|
+
#
|
25
|
+
# @param [String] :json JSON content.
|
26
|
+
# @return [Hash]
|
27
|
+
def parse(json)
|
28
|
+
begin
|
29
|
+
JSON.parse(json, symbolize_names: true)
|
30
|
+
rescue JSON::ParserError => e
|
31
|
+
if @debug
|
32
|
+
puts "[json error]\n#{e}"
|
33
|
+
end
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Process sample notifications.
|
39
|
+
#
|
40
|
+
# @param [Hash] :h Event Hash object.
|
41
|
+
# @return [String]
|
42
|
+
def sample(h)
|
43
|
+
puts "[sample]\n#{h}"
|
44
|
+
'{ "event": "sample" }'
|
45
|
+
end
|
46
|
+
|
47
|
+
# Process alert notifications.
|
48
|
+
#
|
49
|
+
# @param [Hash] :h Event Hash object.
|
50
|
+
# @return [String]
|
51
|
+
def alert(h)
|
52
|
+
puts "[alert]\n#{h}"
|
53
|
+
'{ "event": "alert" }'
|
54
|
+
end
|
55
|
+
|
56
|
+
# Process alert group notifications.
|
57
|
+
#
|
58
|
+
# @param [Hash] :h Event Hash object.
|
59
|
+
# @return [String]
|
60
|
+
def alert_group(h)
|
61
|
+
puts "[alert_group]\n#{h}"
|
62
|
+
'{ "event": "alertGroup" }'
|
63
|
+
end
|
64
|
+
|
65
|
+
# Process host registration notifications.
|
66
|
+
#
|
67
|
+
# @param [Hash] :h Event Hash object.
|
68
|
+
# @return [String]
|
69
|
+
def host_register(h)
|
70
|
+
puts "[host_register]\n#{h}"
|
71
|
+
'{ "event": "hostRegister" }'
|
72
|
+
end
|
73
|
+
|
74
|
+
# Process host status change notifications.
|
75
|
+
#
|
76
|
+
# @param [Hash] :h Event Hash object.
|
77
|
+
# @return [String]
|
78
|
+
def host_status(h)
|
79
|
+
puts "[host_status]\n#{h}"
|
80
|
+
'{ "event": "hostStatus" }'
|
81
|
+
end
|
82
|
+
|
83
|
+
# Process host retirement notifications.
|
84
|
+
#
|
85
|
+
# @param [Hash] :h Event Hash object.
|
86
|
+
# @return [String]
|
87
|
+
def host_retire(h)
|
88
|
+
puts "[host_retire]\n#{h}"
|
89
|
+
'{ "event": "hostRetire" }'
|
90
|
+
end
|
91
|
+
|
92
|
+
# Process monitor creation notifications.
|
93
|
+
#
|
94
|
+
# @param [Hash] :h Event Hash object.
|
95
|
+
# @return [String]
|
96
|
+
def monitor_create(h)
|
97
|
+
case h[:monitor][:type]
|
98
|
+
when 'host'
|
99
|
+
monitor_create_host(h)
|
100
|
+
when 'external'
|
101
|
+
monitor_create_external(h)
|
102
|
+
when 'expression'
|
103
|
+
monitor_create_expression(h)
|
104
|
+
when 'anomalyDetection'
|
105
|
+
monitor_create_anomaly_detection(h)
|
106
|
+
when 'service'
|
107
|
+
monitor_create_service(h)
|
108
|
+
when 'connectivity'
|
109
|
+
monitor_create_connectivity(h)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Process monitor creation (host) notifications.
|
114
|
+
#
|
115
|
+
# @param [Hash] :h Event Hash object.
|
116
|
+
# @return [String]
|
117
|
+
def monitor_create_host(h)
|
118
|
+
puts "[monitor_create_host]\n#{h}"
|
119
|
+
'{ "event": "monitorCreate/host" }'
|
120
|
+
end
|
121
|
+
|
122
|
+
# Process monitor creation (external) notifications.
|
123
|
+
#
|
124
|
+
# @param [Hash] :h Event Hash object.
|
125
|
+
# @return [String]
|
126
|
+
def monitor_create_external(h)
|
127
|
+
puts "[monitor_create_external]\n#{h}"
|
128
|
+
'{ "event": "monitorCreate/external" }'
|
129
|
+
end
|
130
|
+
|
131
|
+
# Process monitor creation (expression) notifications.
|
132
|
+
#
|
133
|
+
# @param [Hash] :h Event Hash object.
|
134
|
+
# @return [String]
|
135
|
+
def monitor_create_expression(h)
|
136
|
+
puts "[monitor_create_expression]\n#{h}"
|
137
|
+
'{ "event": "monitorCreate/expression" }'
|
138
|
+
end
|
139
|
+
|
140
|
+
# Process monitor creation (anomaly detection) notifications.
|
141
|
+
#
|
142
|
+
# @param [Hash] :h Event Hash object.
|
143
|
+
# @return [String]
|
144
|
+
def monitor_create_anomaly_detection(h)
|
145
|
+
puts "[monitor_create_anomaly_detection]\n#{h}"
|
146
|
+
'{ "event": "monitorCreate/anomalyDetection" }'
|
147
|
+
end
|
148
|
+
|
149
|
+
# Process monitor creation (service) notifications.
|
150
|
+
#
|
151
|
+
# @param [Hash] :h Event Hash object.
|
152
|
+
# @return [String]
|
153
|
+
def monitor_create_service(h)
|
154
|
+
puts "[monitor_create_service]\n#{h}"
|
155
|
+
'{ "event": "monitorCreate/service" }'
|
156
|
+
end
|
157
|
+
|
158
|
+
# Process monitor creation (connectivity) notifications.
|
159
|
+
#
|
160
|
+
# @param [Hash] :h Event Hash object.
|
161
|
+
# @return [String]
|
162
|
+
def monitor_create_connectivity(h)
|
163
|
+
puts "[monitor_create_connectivity]\n#{h}"
|
164
|
+
'{ "event": "monitorCreate/connectivity" }'
|
165
|
+
end
|
166
|
+
|
167
|
+
# Process monitor update notifications.
|
168
|
+
#
|
169
|
+
# @param [Hash] :h Event Hash object.
|
170
|
+
# @return [String]
|
171
|
+
def monitor_update(h)
|
172
|
+
case h[:monitor][:type]
|
173
|
+
when 'host'
|
174
|
+
monitor_update_host(h)
|
175
|
+
when 'external'
|
176
|
+
monitor_update_external(h)
|
177
|
+
when 'expression'
|
178
|
+
monitor_update_expression(h)
|
179
|
+
when 'anomalyDetection'
|
180
|
+
monitor_update_anomaly_detection(h)
|
181
|
+
when 'service'
|
182
|
+
monitor_update_service(h)
|
183
|
+
when 'connectivity'
|
184
|
+
monitor_update_connectivity(h)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# Process monitor update (host) notifications.
|
189
|
+
#
|
190
|
+
# @param [Hash] :h Event Hash object.
|
191
|
+
# @return [String]
|
192
|
+
def monitor_update_host(h)
|
193
|
+
puts "[monitor_update_host]\n#{h}"
|
194
|
+
'{ "event": "monitorUpdate/host" }'
|
195
|
+
end
|
196
|
+
|
197
|
+
# Process monitor update (external) notifications.
|
198
|
+
#
|
199
|
+
# @param [Hash] :h Event Hash object.
|
200
|
+
# @return [String]
|
201
|
+
def monitor_update_external(h)
|
202
|
+
puts "[monitor_update_external]\n#{h}"
|
203
|
+
'{ "event": "monitorUpdate/external" }'
|
204
|
+
end
|
205
|
+
|
206
|
+
# Process monitor update (expression) notifications.
|
207
|
+
#
|
208
|
+
# @param [Hash] :h Event Hash object.
|
209
|
+
# @return [String]
|
210
|
+
def monitor_update_expression(h)
|
211
|
+
puts "[monitor_update_expression]\n#{h}"
|
212
|
+
'{ "event": "monitorUpdate/expression" }'
|
213
|
+
end
|
214
|
+
|
215
|
+
# Process monitor update (anomaly detection) notifications.
|
216
|
+
#
|
217
|
+
# @param [Hash] :h Event Hash object.
|
218
|
+
# @return [String]
|
219
|
+
def monitor_update_anomaly_detection(h)
|
220
|
+
puts "[monitor_update_anomaly_detection]\n#{h}"
|
221
|
+
'{ "event": "monitorUpdate/anomalyDetection" }'
|
222
|
+
end
|
223
|
+
|
224
|
+
# Process monitor update (service) notifications.
|
225
|
+
#
|
226
|
+
# @param [Hash] :h Event Hash object.
|
227
|
+
# @return [String]
|
228
|
+
def monitor_update_service(h)
|
229
|
+
puts "[monitor_update_service]\n#{h}"
|
230
|
+
'{ "event": "monitorUpdate/service" }'
|
231
|
+
end
|
232
|
+
|
233
|
+
# Process monitor update (connectivity) notifications.
|
234
|
+
#
|
235
|
+
# @param [Hash] :h Event Hash object.
|
236
|
+
# @return [String]
|
237
|
+
def monitor_update_connectivity(h)
|
238
|
+
puts "[monitor_update_connectivity]\n#{h}"
|
239
|
+
'{ "event": "monitorUpdate/connectivity" }'
|
240
|
+
end
|
241
|
+
|
242
|
+
# Process monitor deletion notifications.
|
243
|
+
#
|
244
|
+
# @param [Hash] :h Event Hash object.
|
245
|
+
# @return [String]
|
246
|
+
def monitor_delete(h)
|
247
|
+
case h[:monitor][:type]
|
248
|
+
when 'host'
|
249
|
+
monitor_delete_host(h)
|
250
|
+
when 'external'
|
251
|
+
monitor_delete_external(h)
|
252
|
+
when 'expression'
|
253
|
+
monitor_delete_expression(h)
|
254
|
+
when 'anomalyDetection'
|
255
|
+
monitor_delete_anomaly_detection(h)
|
256
|
+
when 'service'
|
257
|
+
monitor_delete_service(h)
|
258
|
+
when 'connectivity'
|
259
|
+
monitor_delete_connectivity(h)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
# Process monitor deletion (host) notifications.
|
264
|
+
#
|
265
|
+
# @param [Hash] :h Event Hash object.
|
266
|
+
# @return [String]
|
267
|
+
def monitor_delete_host(h)
|
268
|
+
puts "[monitor_delete_host]\n#{h}"
|
269
|
+
'{ "event": "monitorDelete/host" }'
|
270
|
+
end
|
271
|
+
|
272
|
+
# Process monitor deletion (external) notifications.
|
273
|
+
#
|
274
|
+
# @param [Hash] :h Event Hash object.
|
275
|
+
# @return [String]
|
276
|
+
def monitor_delete_external(h)
|
277
|
+
puts "[monitor_delete_external]\n#{h}"
|
278
|
+
'{ "event": "monitorDelete/external" }'
|
279
|
+
end
|
280
|
+
|
281
|
+
# Process monitor deletion (expression) notifications.
|
282
|
+
#
|
283
|
+
# @param [Hash] :h Event Hash object.
|
284
|
+
# @return [String]
|
285
|
+
def monitor_delete_expression(h)
|
286
|
+
puts "[monitor_delete_expression]\n#{h}"
|
287
|
+
'{ "event": "monitorDelete/expression" }'
|
288
|
+
end
|
289
|
+
|
290
|
+
# Process monitor deletion (anomaly detection) notifications.
|
291
|
+
#
|
292
|
+
# @param [Hash] :h Event Hash object.
|
293
|
+
# @return [String]
|
294
|
+
def monitor_delete_anomaly_detection(h)
|
295
|
+
puts "[monitor_delete_anomaly_detection]\n#{h}"
|
296
|
+
'{ "event": "monitorDelete/anomalyDetection" }'
|
297
|
+
end
|
298
|
+
|
299
|
+
# Process monitor deletion (service) notifications.
|
300
|
+
#
|
301
|
+
# @param [Hash] :h Event Hash object.
|
302
|
+
# @return [String]
|
303
|
+
def monitor_delete_service(h)
|
304
|
+
puts "[monitor_delete_service]\n#{h}"
|
305
|
+
'{ "event": "monitorDelete/service" }'
|
306
|
+
end
|
307
|
+
|
308
|
+
# Process monitor deletion (connectivity) notifications.
|
309
|
+
#
|
310
|
+
# @param [Hash] :h Event Hash object.
|
311
|
+
# @return [String]
|
312
|
+
def monitor_delete_connectivity(h)
|
313
|
+
puts "[monitor_delete_connectivity]\n#{h}"
|
314
|
+
'{ "event": "monitorDelete/connectivity" }'
|
315
|
+
end
|
316
|
+
|
317
|
+
# Call the respective notification method according to the event.
|
318
|
+
#
|
319
|
+
# @param [Hash] :h Event Hash object.
|
320
|
+
# @return [String]
|
321
|
+
def handle_by_event(h)
|
322
|
+
case h[:event]
|
323
|
+
when 'sample'
|
324
|
+
sample(h)
|
325
|
+
when 'alert'
|
326
|
+
alert(h)
|
327
|
+
when 'alertGroup'
|
328
|
+
alert_group(h)
|
329
|
+
when 'hostRegister'
|
330
|
+
host_register(h)
|
331
|
+
when 'hostStatus'
|
332
|
+
host_status(h)
|
333
|
+
when 'hostRetire'
|
334
|
+
host_retire(h)
|
335
|
+
when 'monitorCreate'
|
336
|
+
monitor_create(h)
|
337
|
+
when 'monitorUpdate'
|
338
|
+
monitor_update(h)
|
339
|
+
when 'monitorDelete'
|
340
|
+
monitor_delete(h)
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# Post JSON to the target.
|
345
|
+
#
|
346
|
+
# @param [String] :json JSON content.
|
347
|
+
def post(json)
|
348
|
+
puts "[post]\n#{json}"
|
349
|
+
end
|
350
|
+
|
351
|
+
# Main routine. It receive and process event hash objects and make JSON post calls.
|
352
|
+
#
|
353
|
+
# @param [Hash] :h Event Hash object.
|
354
|
+
def run(h)
|
355
|
+
json = handle_by_event(h)
|
356
|
+
post(json) if json
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
@@ -0,0 +1,326 @@
|
|
1
|
+
# Saba Webhook Gateway for Google Chat
|
2
|
+
# Copyright 2023 Kenshi Muto <kmuto@kmuto.jp>
|
3
|
+
require_relative 'base'
|
4
|
+
require 'faraday'
|
5
|
+
|
6
|
+
module SabaWebhookGateway
|
7
|
+
class GoogleChat < Base
|
8
|
+
# Make Google Chat Card style JSON.
|
9
|
+
#
|
10
|
+
# @param [Hash] :header Header area Hash object.
|
11
|
+
# @param [Hash] :sections Section area Hash object.
|
12
|
+
# @return [String]
|
13
|
+
def googlechat_card(header, sections)
|
14
|
+
j = { cards: { header: header, sections: sections } }
|
15
|
+
JSON.generate(j)
|
16
|
+
end
|
17
|
+
|
18
|
+
def sample(h)
|
19
|
+
header = { title: 'notification test' }
|
20
|
+
widget1 = [{ textParagraph: { text: h[:message] } }]
|
21
|
+
sections = [{ widgets: widget1 }]
|
22
|
+
googlechat_card(header, sections)
|
23
|
+
end
|
24
|
+
|
25
|
+
def alert(h)
|
26
|
+
header = { title: %Q([#{h[:orgName]}] #{h[:alert][:status].upcase}: #{h[:alert][:monitorName]}) }
|
27
|
+
start_time = to_date(h[:alert][:openedAt])
|
28
|
+
end_time = h[:alert][:closedAt] ? to_date(h[:alert][:closedAt]) : nil
|
29
|
+
header[:subtitle] = if end_time
|
30
|
+
%Q(from #{start_time} to #{end_time})
|
31
|
+
else
|
32
|
+
%Q(from #{start_time})
|
33
|
+
end
|
34
|
+
|
35
|
+
sa = []
|
36
|
+
sa << %Q(<a href="#{h[:alert][:url]}">View Alert</a>)
|
37
|
+
|
38
|
+
if h[:host] && h[:host][:roles]
|
39
|
+
# Host
|
40
|
+
sa << %Q(Host: <a href="#{h[:host][:url]}">#{h[:host][:name]}</a>)
|
41
|
+
h[:host][:roles].each do |a|
|
42
|
+
sa << %Q(Role: [<a href="#{a[:serviceUrl]}">#{a[:serviceName]}</a>] <a href="#{a[:roleUrl]}">#{a[:roleName]}</a>)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if h[:service] && h[:service][:roles]
|
47
|
+
# Service
|
48
|
+
sa << %Q(Service: #{h[:service][:name]})
|
49
|
+
h[:service][:roles].each do |a|
|
50
|
+
sa << %Q(Role: [<a href="#{a[:serviceUrl]}">#{a[:serviceName]}</a>] <a href="#{a[:roleUrl]}">#{a[:roleName]}</a>)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if h[:alert][:metricLabel]
|
55
|
+
# Host, Service, Expression
|
56
|
+
if h[:alert][:status] == 'ok'
|
57
|
+
sa << %Q(Metric: #{h[:alert][:metricLabel]} #{h[:alert][:metricValue]})
|
58
|
+
else
|
59
|
+
threshold = if h[:alert][:status] == 'critical'
|
60
|
+
h[:alert][:criticalThreshold]
|
61
|
+
else
|
62
|
+
h[:alert][:warningThreshold]
|
63
|
+
end
|
64
|
+
sa << %Q(Metric: #{h[:alert][:metricLabel]} #{h[:alert][:metricValue]} #{h[:alert][:monitorOperator]} #{threshold})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
69
|
+
sections = [{ widgets: widget1 }]
|
70
|
+
|
71
|
+
if h[:imageUrl]
|
72
|
+
widget2 = [{
|
73
|
+
image: {
|
74
|
+
imageUrl: h[:imageUrl],
|
75
|
+
onClick: {
|
76
|
+
openLink: {
|
77
|
+
url: h[:alert][:url]
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}]
|
82
|
+
sections.push({ widgets: widget2 })
|
83
|
+
end
|
84
|
+
|
85
|
+
if h[:memo]
|
86
|
+
widget3 = [{ textParagraph: { text: h[:memo] } }]
|
87
|
+
sections.push({ widgets: widget3 })
|
88
|
+
end
|
89
|
+
|
90
|
+
googlechat_card(header, sections)
|
91
|
+
end
|
92
|
+
|
93
|
+
def alert_group(h)
|
94
|
+
header = { title: %Q([#{h[:orgName]}] #{h[:alertGroup][:status].upcase}: #{h[:alertGroupSetting][:name]}) }
|
95
|
+
start_time = to_date(h[:alertGroup][:createdAt]) # createdAt
|
96
|
+
end_time = h[:alertGroup][:closedAt] ? to_date(h[:alertGroup][:closedAt]) : nil
|
97
|
+
header[:subtitle] = if end_time
|
98
|
+
%Q(from #{start_time} to #{end_time})
|
99
|
+
else
|
100
|
+
%Q(from #{start_time})
|
101
|
+
end
|
102
|
+
|
103
|
+
sa = []
|
104
|
+
sa << %Q(<a href="#{h[:alertGroup][:url]}">View Alert</a>)
|
105
|
+
|
106
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
107
|
+
sections = [{ widgets: widget1 }]
|
108
|
+
|
109
|
+
if h[:alertGroupSetting][:memo]
|
110
|
+
widget2 = [{ textParagraph: { text: h[:alertGroupSetting][:memo] } }]
|
111
|
+
sections.push({ widgets: widget2 })
|
112
|
+
end
|
113
|
+
|
114
|
+
googlechat_card(header, sections)
|
115
|
+
end
|
116
|
+
|
117
|
+
def host_register(h)
|
118
|
+
header = { title: %Q([#{h[:orgName]}] Host #{h[:host][:name]} is registered) }
|
119
|
+
|
120
|
+
sa = []
|
121
|
+
if h[:user]
|
122
|
+
sa << %Q(Registered by: #{h[:user][:screenName]})
|
123
|
+
end
|
124
|
+
|
125
|
+
if h[:host][:roles]
|
126
|
+
sa << %Q(Host: <a href="#{h[:host][:url]}">#{h[:host][:name]}</a>)
|
127
|
+
h[:host][:roles].each do |a|
|
128
|
+
sa << %Q(Role: [<a href="#{a[:serviceUrl]}">#{a[:serviceName]}</a>] <a href="#{a[:roleUrl]}">#{a[:roleName]}</a>)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
133
|
+
sections = [{ widgets: widget1 }]
|
134
|
+
|
135
|
+
googlechat_card(header, sections)
|
136
|
+
end
|
137
|
+
|
138
|
+
def host_status(h)
|
139
|
+
header = { title: %Q([#{h[:orgName]}] Host #{h[:host][:name]} is changed to #{h[:host][:status]}) }
|
140
|
+
|
141
|
+
sa = []
|
142
|
+
if h[:user]
|
143
|
+
sa << %Q(Chagned by: #{h[:user][:screenName]})
|
144
|
+
end
|
145
|
+
|
146
|
+
sa << %Q(Previous: #{h[:fromStatus]})
|
147
|
+
if h[:host][:roles]
|
148
|
+
sa << %Q(Host: <a href="#{h[:host][:url]}">#{h[:host][:name]}</a>)
|
149
|
+
h[:host][:roles].each do |a|
|
150
|
+
sa << %Q(Role: [<a href="#{a[:serviceUrl]}">#{a[:serviceName]}</a>] <a href="#{a[:roleUrl]}">#{a[:roleName]}</a>)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
155
|
+
sections = [{ widgets: widget1 }]
|
156
|
+
|
157
|
+
googlechat_card(header, sections)
|
158
|
+
end
|
159
|
+
|
160
|
+
def host_retire(h)
|
161
|
+
header = { title: %Q([#{h[:orgName]}] Host #{h[:host][:name]} is retired) }
|
162
|
+
|
163
|
+
sa = []
|
164
|
+
if h[:user]
|
165
|
+
sa << %Q(Retired by: #{h[:user][:screenName]})
|
166
|
+
end
|
167
|
+
|
168
|
+
if h[:host][:roles]
|
169
|
+
sa << %Q(Host: <a href="#{h[:host][:url]}">#{h[:host][:name]}</a>)
|
170
|
+
h[:host][:roles].each do |a|
|
171
|
+
sa << %Q(Role: [<a href="#{a[:serviceUrl]}">#{a[:serviceName]}</a>] <a href="#{a[:roleUrl]}">#{a[:roleName]}</a>)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
176
|
+
sections = [{ widgets: widget1 }]
|
177
|
+
|
178
|
+
googlechat_card(header, sections)
|
179
|
+
end
|
180
|
+
|
181
|
+
def monitor_create_common(h, target)
|
182
|
+
header = { title: %Q([#{h[:orgName]}] Monitor #{h[:monitor][:name]} is created) }
|
183
|
+
|
184
|
+
sa = []
|
185
|
+
if h[:user]
|
186
|
+
sa << %Q(Created by: #{h[:user][:screenName]})
|
187
|
+
end
|
188
|
+
|
189
|
+
sa << target
|
190
|
+
|
191
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
192
|
+
sections = [{ widgets: widget1 }]
|
193
|
+
|
194
|
+
if h[:monitor][:memo]
|
195
|
+
widget2 = [{ textParagraph: { text: h[:monitor][:memo] } }]
|
196
|
+
sections.push({ widgets: widget2 })
|
197
|
+
end
|
198
|
+
|
199
|
+
googlechat_card(header, sections)
|
200
|
+
end
|
201
|
+
|
202
|
+
def monitor_create_host(h)
|
203
|
+
monitor_create_common(h, %Q(Target: Host metric (#{h[:monitor][:metric]})))
|
204
|
+
end
|
205
|
+
|
206
|
+
def monitor_create_external(h)
|
207
|
+
monitor_create_common(h, %Q(Target: External (#{h[:monitor][:url]})))
|
208
|
+
end
|
209
|
+
|
210
|
+
def monitor_create_expression(h)
|
211
|
+
monitor_create_common(h, %Q(Target: Expression (#{h[:monitor][:expression]})))
|
212
|
+
end
|
213
|
+
|
214
|
+
def monitor_create_anomaly_detection(h)
|
215
|
+
monitor_create_common(h, %Q(Target: Anormaly detection (#{h[:monitor][:scopes].join(', ')})))
|
216
|
+
end
|
217
|
+
|
218
|
+
def monitor_create_service(h)
|
219
|
+
monitor_create_common(h, %Q(Target: Service metric (#{h[:monitor][:metric]})))
|
220
|
+
end
|
221
|
+
|
222
|
+
def monitor_create_connectivity(h)
|
223
|
+
monitor_create_common(h, %Q(Target: Connectivity (#{h[:monitor][:scopes].join(', ')})))
|
224
|
+
end
|
225
|
+
|
226
|
+
def monitor_update_common(h, target)
|
227
|
+
header = { title: %Q([#{h[:orgName]}] Monitor #{h[:monitor][:name]} is updated) }
|
228
|
+
|
229
|
+
sa = []
|
230
|
+
if h[:user]
|
231
|
+
sa << %Q(Updated by: #{h[:user][:screenName]})
|
232
|
+
end
|
233
|
+
|
234
|
+
sa << target
|
235
|
+
|
236
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
237
|
+
sections = [{ widgets: widget1 }]
|
238
|
+
|
239
|
+
if h[:monitor][:memo]
|
240
|
+
widget2 = [{ textParagraph: { text: h[:monitor][:memo] } }]
|
241
|
+
sections.push({ widgets: widget2 })
|
242
|
+
end
|
243
|
+
|
244
|
+
googlechat_card(header, sections)
|
245
|
+
end
|
246
|
+
|
247
|
+
def monitor_update_host(h)
|
248
|
+
monitor_update_common(h, %Q(Target: Host metric (#{h[:monitor][:metric]})))
|
249
|
+
end
|
250
|
+
|
251
|
+
def monitor_update_external(h)
|
252
|
+
monitor_update_common(h, %Q(Target: External (#{h[:monitor][:url]})))
|
253
|
+
end
|
254
|
+
|
255
|
+
def monitor_update_expression(h)
|
256
|
+
monitor_update_common(h, %Q(Target: Expression (#{h[:monitor][:expression]})))
|
257
|
+
end
|
258
|
+
|
259
|
+
def monitor_update_anomaly_detection(h)
|
260
|
+
monitor_update_common(h, %Q(Target: Anormaly detection (#{h[:monitor][:scopes].join(', ')})))
|
261
|
+
end
|
262
|
+
|
263
|
+
def monitor_update_service(h)
|
264
|
+
monitor_update_common(h, %Q(Target: Service metric (#{h[:monitor][:metric]})))
|
265
|
+
end
|
266
|
+
|
267
|
+
def monitor_update_connectivity(h)
|
268
|
+
monitor_update_common(h, %Q(Target: Connectivity (#{h[:monitor][:scopes].join(', ')})))
|
269
|
+
end
|
270
|
+
|
271
|
+
def monitor_delete_common(h, target)
|
272
|
+
header = { title: %Q([#{h[:orgName]}] Monitor #{h[:monitor][:name]} is deleted) }
|
273
|
+
|
274
|
+
sa = []
|
275
|
+
if h[:user]
|
276
|
+
sa << %Q(Deleted by: #{h[:user][:screenName]})
|
277
|
+
end
|
278
|
+
|
279
|
+
sa << target
|
280
|
+
|
281
|
+
widget1 = [{ textParagraph: { text: sa.join("\n") } }]
|
282
|
+
sections = [{ widgets: widget1 }]
|
283
|
+
|
284
|
+
if h[:monitor][:memo]
|
285
|
+
widget2 = [{ textParagraph: { text: h[:monitor][:memo] } }]
|
286
|
+
sections.push({ widgets: widget2 })
|
287
|
+
end
|
288
|
+
|
289
|
+
googlechat_card(header, sections)
|
290
|
+
end
|
291
|
+
|
292
|
+
def monitor_delete_host(h)
|
293
|
+
monitor_delete_common(h, %Q(Target: Host metric (#{h[:monitor][:metric]})))
|
294
|
+
end
|
295
|
+
|
296
|
+
def monitor_delete_external(h)
|
297
|
+
monitor_delete_common(h, %Q(Target: External (#{h[:monitor][:url]})))
|
298
|
+
end
|
299
|
+
|
300
|
+
def monitor_delete_expression(h)
|
301
|
+
monitor_delete_common(h, %Q(Target: Expression (#{h[:monitor][:expression]})))
|
302
|
+
end
|
303
|
+
|
304
|
+
def monitor_delete_anomaly_detection(h)
|
305
|
+
monitor_delete_common(h, %Q(Target: Anormaly detection (#{h[:monitor][:scopes].join(', ')})))
|
306
|
+
end
|
307
|
+
|
308
|
+
def monitor_delete_service(h)
|
309
|
+
monitor_delete_common(h, %Q(Target: Service metric (#{h[:monitor][:metric]})))
|
310
|
+
end
|
311
|
+
|
312
|
+
def monitor_delete_connectivity(h)
|
313
|
+
monitor_delete_common(h, %Q(Target: Connectivity (#{h[:monitor][:scopes].join(', ')})))
|
314
|
+
end
|
315
|
+
|
316
|
+
def post(json)
|
317
|
+
resp = Faraday.post(ENV['GOOGLECHAT_WEBHOOK']) do |req|
|
318
|
+
req.headers['Content-Type'] = 'application/json'
|
319
|
+
req.body = json
|
320
|
+
end
|
321
|
+
if @debug
|
322
|
+
p("[post]\n#{resp.body}")
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
data/make-lambda-zip.sh
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
bundle config set --local path 'vendor/bundle'
|
3
|
+
rm -rf vendor saba-webhook-gateway-googlechat.zip
|
4
|
+
bundle install --gemfile Gemfile-lambda
|
5
|
+
mv vendor/bundle/ruby/3.1.0 vendor/bundle/ruby/3.2.0
|
6
|
+
bundle config unset --local path
|
7
|
+
zip -r saba-webhook-gateway-googlechat.zip exe/lambda-handler-googlechat.rb customize.rb lib vendor
|