|
@@ -6,7 +6,7 @@ import { Database as SQLiteDB, OPEN_CREATE, OPEN_READWRITE } from 'sqlite3';
|
|
|
|
|
|
|
|
import defaults from '../../../common/defaults.module';
|
|
import defaults from '../../../common/defaults.module';
|
|
|
import { ServiceConfig, validateParamType } from '../../../common/interfaces/service-config.interface';
|
|
import { ServiceConfig, validateParamType } from '../../../common/interfaces/service-config.interface';
|
|
|
-import { HttpCheckData, HttpCheckStatus } from '../../../common/lib/http-check-data.module';
|
|
|
|
|
|
|
+import { HttpCheckData, HttpCheckStatus, ServiceCheckData, ServiceCheckDataEntry } from '../../../common/lib/http-check-data.module';
|
|
|
import { Logger } from '../../../common/util/logger.class';
|
|
import { Logger } from '../../../common/util/logger.class';
|
|
|
|
|
|
|
|
import { ValidationException } from '../lib/validation-exception.class';
|
|
import { ValidationException } from '../lib/validation-exception.class';
|
|
@@ -415,6 +415,41 @@ export class Database extends SQLiteController {
|
|
|
} as HttpCheckData;
|
|
} as HttpCheckData;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ async queryServiceCheckData(serverID: number, confID: number, from: Date, to: Date) {
|
|
|
|
|
+ const result = await this.stmt(
|
|
|
|
|
+ `
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ HealthCheckDataEntry.*
|
|
|
|
|
+ FROM HealthCheckDataEntry
|
|
|
|
|
+ JOIN HealthCheckConfig ON HealthCheckConfig.ID = HealthCheckDataEntry.ConfigID
|
|
|
|
|
+ WHERE HealthCheckConfig.ServerID = ?
|
|
|
|
|
+ AND HealthCheckDataEntry.ConfigID = ?
|
|
|
|
|
+ AND HealthCheckDataEntry.Timestamp BETWEEN ? AND ?
|
|
|
|
|
+ ORDER BY Timestamp, ID;
|
|
|
|
|
+ `,
|
|
|
|
|
+ [serverID, confID, from.getTime(), to.getTime()]
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ const mapByTimestamp = result.rows.reduce((res: Map<number, ServiceCheckDataEntry[]>, row) => {
|
|
|
|
|
+ const time: number = row['Timestamp'];
|
|
|
|
|
+ if (!res.has(time)) res.set(time, []);
|
|
|
|
|
+ res.get(time)?.push({
|
|
|
|
|
+ status: row['Status'] as number,
|
|
|
|
|
+ message: row['Message']
|
|
|
|
|
+ });
|
|
|
|
|
+ return res;
|
|
|
|
|
+ }, new Map()) as Map<number, ServiceCheckDataEntry[]>;
|
|
|
|
|
+
|
|
|
|
|
+ const arr: ServiceCheckData[] = [];
|
|
|
|
|
+ for (const entry of mapByTimestamp.entries()) {
|
|
|
|
|
+ arr.push({
|
|
|
|
|
+ time: new Date(entry[0]),
|
|
|
|
|
+ data: entry[1]
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ return arr;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private configFromResultRows(rows: any[]) {
|
|
private configFromResultRows(rows: any[]) {
|
|
|
return rows.reduce((res: ServiceConfig[], line, i) => {
|
|
return rows.reduce((res: ServiceConfig[], line, i) => {
|
|
|
const configID = line['ID'];
|
|
const configID = line['ID'];
|