@@ -178,42 +178,37 @@ func (client *Client) fetchAcknowledgementComment(host, service string, ackTime
178
178
// If a filterExpr is given (non-empty string), it will be used for the query. Otherwise, all objects will be requested.
179
179
//
180
180
// The callback function will be called f.e. object of the objType (i.e. "host" or "service") being retrieved from the
181
- // Icinga 2 Objects API. The callback function or a later caller must decide if this object should be replayed.
182
- func (client * Client ) checkMissedChanges (objType , filterExpr string , attrsCallbackFn func (attrs HostServiceRuntimeAttributes , host , service string )) {
183
- var (
184
- logger = client .Logger .With (zap .String ("object type" , objType ))
185
-
186
- jsonRaw io.ReadCloser
187
- err error
188
- )
181
+ // Icinga 2 Objects API sequentially. The callback function or a later caller decides if this object should be replayed.
182
+ func (client * Client ) checkMissedChanges (
183
+ objType , filterExpr string ,
184
+ attrsCallbackFn func (attrs HostServiceRuntimeAttributes , host , service string ) error ,
185
+ ) (err error ) {
186
+ logger := client .Logger .With (zap .String ("object type" , objType ), zap .String ("filter expr" , filterExpr ))
187
+
188
+ defer func () {
189
+ if err != nil {
190
+ logger .Errorw ("Querying API for replay failed" , zap .Error (err ))
191
+ }
192
+ }()
193
+
194
+ var jsonRaw io.ReadCloser
189
195
if filterExpr == "" {
190
196
jsonRaw , err = client .queryObjectsApiDirect (objType , "" )
191
197
} else {
192
198
jsonRaw , err = client .queryObjectsApiQuery (objType , map [string ]any {"filter" : filterExpr })
193
199
}
194
200
if err != nil {
195
- logger .Errorw ("Querying API failed" , zap .Error (err ))
196
201
return
197
202
}
198
203
199
204
objQueriesResults , err := extractObjectQueriesResult [HostServiceRuntimeAttributes ](jsonRaw )
200
205
if err != nil {
201
- logger .Errorw ("Parsing API response failed" , zap .Error (err ))
202
- return
203
- }
204
-
205
- if len (objQueriesResults ) == 0 {
206
206
return
207
207
}
208
208
209
209
logger .Debugw ("Querying API resulted in state changes" , zap .Int ("changes" , len (objQueriesResults )))
210
210
211
211
for _ , objQueriesResult := range objQueriesResults {
212
- if client .Ctx .Err () != nil {
213
- logger .Warnw ("Stopping API response processing as context is finished" , zap .Error (client .Ctx .Err ()))
214
- return
215
- }
216
-
217
212
var hostName , serviceName string
218
213
switch objQueriesResult .Type {
219
214
case "Host" :
@@ -224,57 +219,56 @@ func (client *Client) checkMissedChanges(objType, filterExpr string, attrsCallba
224
219
serviceName = objQueriesResult .Attrs .Name
225
220
226
221
default :
227
- logger . Errorw ( "Querying API delivered a wrong object type" , zap . String ( "result type" , objQueriesResult .Type ) )
228
- continue
222
+ err = fmt . Errorf ( "querying API delivered a wrong object type %q" , objQueriesResult .Type )
223
+ return
229
224
}
230
225
231
- attrsCallbackFn (objQueriesResult .Attrs , hostName , serviceName )
226
+ err = attrsCallbackFn (objQueriesResult .Attrs , hostName , serviceName )
227
+ if err != nil {
228
+ return
229
+ }
232
230
}
231
+ return
233
232
}
234
233
235
234
// checkMissedStateChanges fetches all objects of the requested type and feeds them into the handler.
236
- func (client * Client ) checkMissedStateChanges (objType string ) {
237
- client .checkMissedChanges (objType , "" , func (attrs HostServiceRuntimeAttributes , host , service string ) {
238
- logger := client .Logger .With (zap .String ("object type" , objType ))
239
-
235
+ func (client * Client ) checkMissedStateChanges (objType string , ctx context.Context ) error {
236
+ return client .checkMissedChanges (objType , "" , func (attrs HostServiceRuntimeAttributes , host , service string ) error {
240
237
ev , err := client .buildHostServiceEvent (attrs .LastCheckResult , attrs .State , host , service )
241
238
if err != nil {
242
- logger .Errorw ("Failed to construct Event from API" , zap .Error (err ))
243
- return
239
+ return fmt .Errorf ("failed to construct Event from API, %w" , err )
244
240
}
245
241
246
242
select {
247
- case <- client . Ctx .Done ():
248
- logger . Warnw ( "Cannot dispatch replayed event as context is finished" , zap . Error ( client . Ctx . Err ()) )
243
+ case <- ctx .Done ():
244
+ return ctx . Err ()
249
245
case client .eventDispatcherReplay <- & eventMsg {ev , attrs .LastStateChange .Time }:
246
+ return nil
250
247
}
251
248
})
252
249
}
253
250
254
251
// checkMissedAcknowledgements fetches all Host or Service Acknowledgements and feeds them into the handler.
255
252
//
256
253
// Currently only active acknowledgements are being processed.
257
- func (client * Client ) checkMissedAcknowledgements (objType string ) {
254
+ func (client * Client ) checkMissedAcknowledgements (objType string , ctx context. Context ) error {
258
255
filterExpr := fmt .Sprintf ("%s.acknowledgement" , objType )
259
- client .checkMissedChanges (objType , filterExpr , func (attrs HostServiceRuntimeAttributes , host , service string ) {
260
- logger := client .Logger .With (zap .String ("object type" , objType ))
261
-
256
+ return client .checkMissedChanges (objType , filterExpr , func (attrs HostServiceRuntimeAttributes , host , service string ) error {
262
257
ackComment , err := client .fetchAcknowledgementComment (host , service , attrs .AcknowledgementLastChange .Time )
263
258
if err != nil {
264
- logger .Errorw ("Cannot fetch ACK Comment for Acknowledgement" , zap .Error (err ))
265
- return
259
+ return fmt .Errorf ("cannot fetch ACK Comment for Acknowledgement, %w" , err )
266
260
}
267
261
268
262
ev , err := client .buildAcknowledgementEvent (host , service , ackComment .Author , ackComment .Text )
269
263
if err != nil {
270
- logger .Errorw ("Failed to construct Event from Acknowledgement API" , zap .Error (err ))
271
- return
264
+ return fmt .Errorf ("failed to construct Event from Acknowledgement API, %w" , err )
272
265
}
273
266
274
267
select {
275
- case <- client . Ctx .Done ():
276
- logger . Warnw ( "Cannot dispatch replayed event as context is finished" , zap . Error ( client . Ctx . Err ()) )
268
+ case <- ctx .Done ():
269
+ return ctx . Err ()
277
270
case client .eventDispatcherReplay <- & eventMsg {ev , attrs .AcknowledgementLastChange .Time }:
271
+ return nil
278
272
}
279
273
})
280
274
}
0 commit comments