Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/288 interpolation #291

Merged
merged 2 commits into from
Feb 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kener",
"version": "3.1.4",
"version": "3.1.5",
"private": false,
"license": "MIT",
"description": "Kener: An open-source Node.js status page application for real-time service monitoring, incident management, and customizable reporting. Simplify service outage tracking, enhance incident communication, and ensure a seamless user experience.",
Expand Down
8 changes: 4 additions & 4 deletions src/lib/server/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ const SITE = "./config/site.yaml";
const UP = "UP";
const DOWN = "DOWN";
const DEGRADED = "DEGRADED";
const NO_DATA = "NO_DATA";
const API_TIMEOUT = 10 * 1000; // 10 seconds
const AnalyticsProviders = {
GA: "https://unpkg.com/@analytics/[email protected]/dist/@analytics/google-analytics.min.js",
AMPLITUDE:
"https://unpkg.com/@analytics/[email protected]/dist/@analytics/amplitude.min.js",
MIXPANEL:
"https://unpkg.com/@analytics/[email protected]/dist/@analytics/mixpanel.min.js",
AMPLITUDE: "https://unpkg.com/@analytics/[email protected]/dist/@analytics/amplitude.min.js",
MIXPANEL: "https://unpkg.com/@analytics/[email protected]/dist/@analytics/mixpanel.min.js",
};
const AllRecordTypes = {
A: 1,
Expand Down Expand Up @@ -117,4 +116,5 @@ export {
TIMEOUT,
ERROR,
MANUAL,
NO_DATA,
};
78 changes: 43 additions & 35 deletions src/lib/server/controllers/controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import crypto from "crypto";
import { format, subMonths, addMonths, startOfMonth } from "date-fns";
import { UP, DOWN, DEGRADED, NO_DATA } from "../constants.js";

const saltRounds = 10;
const DUMMY_SECRET = "DUMMY_SECRET";
Expand Down Expand Up @@ -199,17 +200,28 @@ export const CreateUpdateMonitor = async (monitor) => {
export const GetMonitors = async (data) => {
return await db.getMonitors(data);
};
export const GetMonitorsParsed = async (data) => {
let monitors = await db.getMonitors(data);
let parsedMonitors = monitors.map((m) => {
let parsedMonitor = { ...m };
if (!!parsedMonitor.type_data) {
parsedMonitor.type_data = JSON.parse(parsedMonitor.type_data);
export const GetMonitorsParsed = async (query) => {
// Retrieve monitors from the database based on the provided query
const rawMonitors = await db.getMonitors(query);

// Parse type_data if available for each monitor
const parsedMonitors = rawMonitors.map((monitor) => {
const monitorData = { ...monitor };

if (monitorData.type_data) {
try {
monitorData.type_data = JSON.parse(monitorData.type_data);
} catch (error) {
// Fallback to an empty object if JSON parsing fails
monitorData.type_data = {};
}
} else {
parsedMonitor.type_data = {};
monitorData.type_data = {};
}
return parsedMonitor;

return monitorData;
});

return parsedMonitors;
};

Expand Down Expand Up @@ -386,39 +398,40 @@ export const HashString = (str) => {
return hash.digest("hex");
};

export const InterpolateData = (data, start, anchorStatus, e) => {
let finalData = [];
let status = anchorStatus || "UP";
let end = start;
if (!!data && data.length > 0) {
end = data[data.length - 1].timestamp;
}
export const InterpolateData = (rawData, startTimestamp, initialStatus, overrideEndTimestamp) => {
const interpolatedData = [];
let currentStatus = initialStatus || "UP";
let endTimestamp = startTimestamp;

if (e) {
end = e;
if (rawData && rawData.length > 0) {
endTimestamp = rawData[rawData.length - 1].timestamp;
}
let dataMap = data.reduce((acc, d) => {
acc[d.timestamp] = d;
return acc;
if (overrideEndTimestamp) {
endTimestamp = overrideEndTimestamp;
}

const dataByTimestamp = rawData.reduce((accumulator, entry) => {
accumulator[entry.timestamp] = entry;
return accumulator;
}, {});

for (let i = start; i <= end; i += 60) {
let nowData = dataMap[i];
if (!!nowData) {
status = nowData.status;
for (let timestamp = startTimestamp; timestamp <= endTimestamp; timestamp += 60) {
const currentEntry = dataByTimestamp[timestamp];
if (currentEntry) {
currentStatus = currentEntry.status;
}

finalData.push({ timestamp: i, status: status });
interpolatedData.push({ timestamp, status: currentStatus });
}
return finalData;

return interpolatedData;
};

export const GetLastStatusBefore = async (monitor_tag, timestamp) => {
let data = await db.getLastStatusBefore(monitor_tag, timestamp);
if (data) {
return data.status;
}
return "UP";
return NO_DATA;
};

export const GetDataGroupByDayAlternative = async (monitor_tag, start, end, timezoneOffsetMinutes = 0) => {
Expand All @@ -443,16 +456,13 @@ export const GetDataGroupByDayAlternative = async (monitor_tag, start, end, time
UP: 0,
DOWN: 0,
DEGRADED: 0,
latencySum: 0,
latencies: [],
NO_DATA: 0,
};
}

const group = acc[dayGroup];
group.total++;
group[row.status]++;
group.latencySum += row.latency;
group.latencies.push(row.latency);

return acc;
}, {});
Expand All @@ -464,9 +474,7 @@ export const GetDataGroupByDayAlternative = async (monitor_tag, start, end, time
UP: group.UP,
DOWN: group.DOWN,
DEGRADED: group.DEGRADED,
avgLatency: group.total > 0 ? Number((group.latencySum / group.total).toFixed(3)) : null,
maxLatency: group.latencies.length > 0 ? Number(Math.max(...group.latencies).toFixed(3)) : null,
minLatency: group.latencies.length > 0 ? Number(Math.min(...group.latencies).toFixed(3)) : null,
NO_DATA: group.NO_DATA,
}));
};

Expand Down
Loading