Просмотр исходного кода

Merge branch 'hotfix/gcm-env-quotes' of hostbbq/hostbbq-monitoring into master

tunefish 2 лет назад
Родитель
Сommit
706bf2026b

+ 2 - 2
server.docker-compose.yml

@@ -8,8 +8,8 @@ services:
     env_file:
       - .env
     environment:
-      - GOOGLE_APPLICATION_CREDENTIALS="google-cloud/firebase-adminsdk.json"
-      - NOTIFICATION_ICON_URL="https://fcm.hostbbq.net/logo.png"
+      - GOOGLE_APPLICATION_CREDENTIALS=google-cloud/firebase-adminsdk.json
+      - NOTIFICATION_ICON_URL=https://fcm.hostbbq.net/logo.png
     ports:
       - $HOST_PORT:$WEB_PORT
     links:

+ 0 - 5
server/install/install.sh

@@ -51,11 +51,6 @@ else
   export $(cat "$TMPFOLDER/server/.env.default" | xargs)
 fi
 
-echo "Checking data volume directory $INSTALL_DIR/$DATA_DIR"
-if [[ ! -d "$INSTALL_DIR/$DATA_DIR" ]]; then
-  mkdir "$INSTALL_DIR/$DATA_DIR"
-fi
-
 echo "Checking data volume directory $INSTALL_DIR/$DB_DIR"
 if [[ ! -d "$INSTALL_DIR/$DB_DIR" ]]; then
   mkdir "$INSTALL_DIR/$DB_DIR"

+ 9 - 0
server/src/ctrl/health-check-data-provider.interface.ts

@@ -0,0 +1,9 @@
+import { HttpCheckData, HttpCheckStatus, ServiceCheckData } from '../../../common/lib/http-check-data.module';
+
+export interface HealthCheckDataProvider {
+  getHttpCheckConfigByID: (serverID: number, configID: number) => Promise<HttpCheckConfig | null>;
+  insertHealthCheckData: (confID: number, time: Date, status: HttpCheckStatus, message: string) => Promise<HttpCheckData>;
+  getLastErrors: (confID: number, threshold: number) => Promise<ServiceCheckData[]>;
+  open: () => Promise<void>;
+  close: () => Promise<void>;
+}

+ 5 - 2
server/src/ctrl/http-check-controller.class.ts

@@ -9,6 +9,7 @@ import { Logger } from '../../../common/util/logger.class';
 import { ServiceChangedStatus } from '../lib/service-changed-status.enum';
 import { Timer } from '../timer.class';
 import { FCMController } from './fcm-controller.class';
+import { HealthCheckDataProvider } from './health-check-data-provider.interface';
 import { MariaDBDatabase } from './mariadb-database.class';
 
 type Subscriber = { id: number; interval: number; conf: HttpCheckConfig };
@@ -89,7 +90,7 @@ export class HttpCheckController {
     this.subscriptions = this.subscriptions.filter(s => s.id !== sub.id);
   }
 
-  public async runCheck(conf: HttpCheckConfig) {
+  public async runCheck(conf: HttpCheckConfig, db?: HealthCheckDataProvider) {
     Logger.debug('[DEBUG] TICK', new Date(), JSON.stringify(conf));
 
     const now = new Date();
@@ -99,7 +100,9 @@ export class HttpCheckController {
     };
     let success = true;
 
-    const db = new MariaDBDatabase(this.pool);
+    if (!db) {
+      db = new MariaDBDatabase(this.pool);
+    }
     try {
       await db.open();
 

+ 2 - 1
server/src/ctrl/mariadb-database.class.ts

@@ -10,10 +10,11 @@ import { DatabaseException } from '../lib/database.exception';
 import { ServiceChangedStatus } from '../lib/service-changed-status.enum';
 import { ValidationException } from '../lib/validation-exception.class';
 import { DataProvider } from './data-provider.interface';
+import { HealthCheckDataProvider } from './health-check-data-provider.interface';
 // TODO: import { DBMigration } from './db-migration.class';
 import { MariaDBConnector } from './mariadb-connector.class';
 
-export class MariaDBDatabase implements DataProvider {
+export class MariaDBDatabase implements DataProvider, HealthCheckDataProvider {
   private db: MariaDBConnector;
 
   constructor(pool: Pool) {

+ 56 - 1
server/src/webhdl/services-api-handler.class.ts

@@ -1,9 +1,10 @@
 import { RouterOptions, json } from 'express';
 
-import { ServiceCheckData } from '../../../common/lib/http-check-data.module';
+import { HttpCheckData, HttpCheckStatus, ServiceCheckData, ServiceCheckDataEntry } from '../../../common/lib/http-check-data.module';
 import { HttpStatusException } from '../../../common/lib/http-status.exception';
 
 import { ControllerPool } from '../ctrl/controller-pool.interface';
+import { HealthCheckDataProvider } from '../ctrl/health-check-data-provider.interface';
 import { ServiceChangedStatus } from '../lib/service-changed-status.enum';
 import { WebHandler } from './web-handler.base';
 
@@ -124,6 +125,19 @@ export class ServicesAPIHandler extends WebHandler {
         next(err);
       }
     });
+
+    this.router.post('/test', async (req, res, next) => {
+      try {
+        const config = req.body as HttpCheckConfig;
+        const mockDB = new HealthCheckDatabaseMock(config);
+
+        await this.ctrlPool.httpChecks.runCheck(config, mockDB);
+
+        res.send(mockDB.log);
+      } catch (err) {
+        next(err);
+      }
+    });
   }
 
   private validateNumber(id: string, field: string) {
@@ -136,3 +150,44 @@ export class ServicesAPIHandler extends WebHandler {
     return num;
   }
 }
+
+class HealthCheckDatabaseMock implements HealthCheckDataProvider {
+  public log: HttpCheckData[] = [];
+
+  constructor(private config: HttpCheckConfig) {}
+
+  async open() {}
+
+  async getHttpCheckConfigByID(serverID: number, configID: number) {
+    return this.config;
+  }
+  async insertHealthCheckData(confID: number, time: Date, status: HttpCheckStatus, message: string) {
+    const logEntry = { configId: confID, id: new Date().getTime(), time, status, message };
+    this.log.push(logEntry);
+    return logEntry;
+  }
+  async getLastErrors(confID: number, threshold: number) {
+    if (this.log.length === 0) return [];
+
+    const mapByTimestamp = new Map<number, ServiceCheckDataEntry[]>();
+    mapByTimestamp.set(this.log[0].time.getTime(), this.log);
+
+    const errors: ServiceCheckData[] = [];
+    for (const entry of mapByTimestamp.entries()) {
+      const time = entry[0];
+      const data = entry[1];
+
+      const errorData = data.filter(d => d.status !== HttpCheckStatus.OK);
+      if (!errorData.length) break;
+
+      errors.push({
+        time: new Date(time),
+        data: errorData
+      });
+    }
+
+    return errors;
+  }
+
+  async close() {}
+}