Pārlūkot izejas kodu

Server + FCM: Notify when server data request to server daemon fails

Christian Kahlau 3 gadi atpakaļ
vecāks
revīzija
3d8ae45e42

+ 6 - 0
common/defaults.module.ts

@@ -1,3 +1,8 @@
+export const fcmTopics = {
+  serverData: 'monitoring-serverdata',
+  services: 'monitoring-services'
+};
+
 export const serverSync = {
   interval: 300
 };
@@ -11,6 +16,7 @@ export const serviceChecks = {
 };
 
 export default {
+  fcmTopics,
   serverSync,
   serviceChecks
 };

+ 4 - 1
fcm/ng/src/app/services/firebase.service.ts

@@ -4,6 +4,9 @@ import { Analytics, getAnalytics } from 'firebase/analytics';
 import { FirebaseApp, initializeApp } from 'firebase/app';
 import { getMessaging, getToken, Messaging } from 'firebase/messaging';
 import { firstValueFrom, tap } from 'rxjs';
+
+import { fcmTopics } from '../../../../../common/defaults.module';
+
 import { environment } from 'src/environments/environment';
 
 type FirebaseInstanceInformation = {
@@ -62,7 +65,7 @@ export class FirebaseService {
   }
 
   public get topics() {
-    return ['monitoring-services'];
+    return Object.values(fcmTopics);
   }
 
   public async getInstanceInfo(): Promise<FirebaseInstanceInformation> {

+ 1 - 1
server/src/ctrl/db-migration.class.ts

@@ -23,7 +23,7 @@ export class DBMigration extends SQLiteController {
       await this.createMigrationsTable();
       const lastID = await this.getLastID();
 
-      console.log('[DEBUG] lastid', lastID);
+      Logger.debug('[DEBUG] lastid', lastID);
 
       for (const file of files) {
         const m = /^(\d{12})_(.*)\.sql$/.exec(file);

+ 1 - 3
server/src/ctrl/http-check-controller.class.ts

@@ -9,8 +9,6 @@ import { Timer } from '../timer.class';
 import { Database, ServiceChangedStatus } from './database.class';
 import { FCMController } from './fcm-controller.class';
 
-const FCM_TOPIC_SERVICES = 'monitoring-services';
-
 type Subscriber = { id: number; interval: number; conf: HttpCheckConfig };
 
 export class HttpCheckController {
@@ -154,7 +152,7 @@ export class HttpCheckController {
           Logger.debug(`[DEBUG] Sending FCM Notification for`, conf.title);
           const lastCheck = lastErrors[0];
           const lastError = lastCheck.data[0];
-          await FCMController.instance.sendNotificationToTopic(FCM_TOPIC_SERVICES, {
+          await FCMController.instance.sendNotificationToTopic(defaults.fcmTopics.services, {
             title: `[CRIT] ${conf.title} since ${moment(lastCheck.time).format('HH:mm')}`,
             body:
               `HTTP Check '${conf.title}' has failed over ${conf.notifyThreshold} times in a row\n` +

+ 15 - 1
server/src/ctrl/server-connector.class.ts

@@ -1,9 +1,10 @@
-import axios from 'axios';
+import axios, { AxiosError } from 'axios';
 
 import defaults from '../../../common/defaults.module';
 import { Logger } from '../../../common/util/logger.class';
 
 import { Database } from './database.class';
+import { FCMController } from './fcm-controller.class';
 import { Timer } from '../timer.class';
 
 export class ServerConnector {
@@ -58,6 +59,19 @@ export class ServerConnector {
     } catch (err) {
       Logger.error('[ERROR] Server data sync failed:', err);
 
+      if (err instanceof AxiosError) {
+        if (['ECONNREFUSED', 'ECONNABORTED'].includes(err.code ?? '')) {
+          try {
+            await FCMController.instance.sendNotificationToTopic(defaults.fcmTopics.serverData, {
+              title: `[WARN] Server '${server.title}': daemon unreachable (${err.code})`,
+              body: new String(err).toString()
+            });
+          } catch (err) {
+            Logger.error('[ERROR] Notification failure:', err);
+          }
+        }
+      }
+
       if (!!trxHdl) {
         Logger.error(`[WARN] Rolling back transaction #${trxHdl} ... `);
         const response = await axios.delete(`http://${server.fqdn}:8890/${trxHdl}`, { responseType: 'json' });