@64mb/freelens-power 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +5 -1
  2. package/out/main/common/monitoring-history.js +52 -0
  3. package/out/main/common/monitoring-history.js.map +1 -0
  4. package/out/main/common/store/monitoring-preferences-store.js +25 -2
  5. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  6. package/out/main/dashboard-views.js +132 -28
  7. package/out/main/dashboard-views.js.map +1 -1
  8. package/out/main/index.js +2 -0
  9. package/out/main/index.js.map +1 -1
  10. package/out/main/monitoring-history-database.js +103 -0
  11. package/out/main/monitoring-history-database.js.map +1 -0
  12. package/out/main/monitoring-history-worker.js +61 -0
  13. package/out/main/monitoring-history-worker.js.map +1 -0
  14. package/out/main/monitoring-history.js +100 -0
  15. package/out/main/monitoring-history.js.map +1 -0
  16. package/out/renderer/_virtual/_global-external_mobx.js +2 -1
  17. package/out/renderer/diagnostics.js +647 -0
  18. package/out/renderer/diagnostics.js.map +1 -0
  19. package/out/renderer/index.js +28 -1
  20. package/out/renderer/index.js.map +1 -1
  21. package/out/renderer/monitoring-collector.js +202 -0
  22. package/out/renderer/monitoring-collector.js.map +1 -0
  23. package/out/renderer/monitoring-history-collection.js +184 -0
  24. package/out/renderer/monitoring-history-collection.js.map +1 -0
  25. package/out/renderer/monitoring-history-view.js +150 -0
  26. package/out/renderer/monitoring-history-view.js.map +1 -0
  27. package/out/renderer/monitoring-history.js +19 -0
  28. package/out/renderer/monitoring-history.js.map +1 -0
  29. package/out/renderer/monitoring.js +98 -125
  30. package/out/renderer/monitoring.js.map +1 -1
  31. package/out/renderer/node-monitoring.js +116 -0
  32. package/out/renderer/node-monitoring.js.map +1 -0
  33. package/out/renderer/pod-monitoring.js +39 -8
  34. package/out/renderer/pod-monitoring.js.map +1 -1
  35. package/out/renderer/preferences/monitoring-preferences.js +55 -10
  36. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  37. package/out/renderer/src/common/monitoring-history.js +15 -0
  38. package/out/renderer/src/common/monitoring-history.js.map +1 -0
  39. package/out/renderer/src/common/monitoring-math.js +98 -0
  40. package/out/renderer/src/common/monitoring-math.js.map +1 -0
  41. package/out/renderer/src/common/resource-diagnostics.js +227 -0
  42. package/out/renderer/src/common/resource-diagnostics.js.map +1 -0
  43. package/out/renderer/src/common/store/monitoring-preferences-store.js +25 -2
  44. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  45. package/out/renderer/welcome.js +3 -1
  46. package/out/renderer/welcome.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
2
+ const require_monitoring_history = require("./src/common/monitoring-history.js");
3
+ const require_monitoring_preferences_store = require("./src/common/store/monitoring-preferences-store.js");
4
+ const require_monitoring_math = require("./src/common/monitoring-math.js");
5
+ const require_resource_diagnostics = require("./src/common/resource-diagnostics.js");
6
+ const require_monitoring_collector = require("./monitoring-collector.js");
7
+ const require_monitoring_history$1 = require("./monitoring-history.js");
8
+ //#region src/renderer/monitoring-history-collection.ts
9
+ function isHistoryTracked(identity) {
10
+ return require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().trackedHistory.some((item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid);
11
+ }
12
+ function setHistoryTracked(identity, tracked) {
13
+ if (!require_monitoring_history.validHistoryIdentity(identity)) return;
14
+ const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
15
+ const rest = preferences.trackedHistory.filter((item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid));
16
+ preferences.trackedHistory = tracked ? [...rest, {
17
+ clusterId: identity.clusterId,
18
+ scope: identity.scope,
19
+ uid: identity.uid
20
+ }].slice(-100) : rest;
21
+ }
22
+ function numeric(sample) {
23
+ const values = {
24
+ cpu: sample.cpu,
25
+ memory: sample.memory
26
+ };
27
+ for (const metric of ["cpu", "memory"]) for (const field of [
28
+ "requests",
29
+ "limits",
30
+ "capacity",
31
+ "allocatable"
32
+ ]) {
33
+ const value = sample.resources?.[metric]?.[field];
34
+ if (value !== void 0 && Number.isFinite(value)) values[`${metric}${field[0].toUpperCase()}${field.slice(1)}`] = value;
35
+ }
36
+ return values;
37
+ }
38
+ function historySnapshotSamples(data, tracked) {
39
+ const result = [];
40
+ const add = (scope, uid, sample) => result.push({
41
+ clusterId: data.clusterId,
42
+ scope,
43
+ uid,
44
+ time: sample.time,
45
+ values: numeric(sample)
46
+ });
47
+ if (data.nodeMetrics?.length) try {
48
+ const sample = require_monitoring_math.aggregateMetrics(data.nodeMetrics);
49
+ sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));
50
+ if (data.nodes?.length) try {
51
+ sample.resources = require_monitoring_math.aggregateResources(data.nodes, data.pods);
52
+ } catch {}
53
+ add("cluster", data.clusterId, sample);
54
+ } catch {}
55
+ const nodeMetricsByName = /* @__PURE__ */ new Map();
56
+ for (const metric of data.nodeMetrics ?? []) {
57
+ if (!metric.metadata?.name) continue;
58
+ const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];
59
+ metrics.push(metric);
60
+ nodeMetricsByName.set(metric.metadata.name, metrics);
61
+ }
62
+ const podsByNode = /* @__PURE__ */ new Map();
63
+ for (const pod of data.pods ?? []) {
64
+ const name = pod.spec.nodeName;
65
+ if (!name) continue;
66
+ const pods = podsByNode.get(name) ?? [];
67
+ pods.push(pod);
68
+ podsByNode.set(name, pods);
69
+ }
70
+ for (const node of data.nodes ?? []) {
71
+ if (!node.metadata.uid) continue;
72
+ try {
73
+ const sample = require_monitoring_collector.getNodeSample({
74
+ ...data,
75
+ nodes: [node],
76
+ nodeMetrics: nodeMetricsByName.get(node.metadata.name),
77
+ pods: data.pods ? podsByNode.get(node.metadata.name) ?? [] : void 0
78
+ }, node.metadata.name, node.metadata.uid);
79
+ if (sample) add("node", node.metadata.uid, sample);
80
+ } catch {}
81
+ }
82
+ const usage = require_monitoring_collector.getCollectedPodUsage(data);
83
+ const targets = tracked.filter((item) => item.clusterId === data.clusterId);
84
+ const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));
85
+ const usageByUid = new Map(usage.map((item) => [item.uid, item]));
86
+ const metricsByName = new Map((data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? ""}/${metric.metadata.name}`, metric]));
87
+ const workloadTargets = new Set(targets.filter((item) => item.scope === "workload").map((item) => item.uid));
88
+ for (const target of targets.filter((item) => item.scope === "pod")) {
89
+ const pod = podsByUid.get(target.uid);
90
+ const metric = usageByUid.get(target.uid);
91
+ const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? ""}/${pod.metadata.name}`) : void 0;
92
+ if (!pod || !metric || metric.cpu === void 0 || metric.memory === void 0 || !raw) continue;
93
+ const sample = {
94
+ time: Date.parse(raw.timestamp),
95
+ cpu: metric.cpu,
96
+ memory: metric.memory
97
+ };
98
+ try {
99
+ sample.resources = {
100
+ cpu: {
101
+ requests: require_resource_diagnostics.effectivePodResource(pod, "cpu"),
102
+ limits: require_resource_diagnostics.effectivePodResource(pod, "cpu", "limits")
103
+ },
104
+ memory: {
105
+ requests: require_resource_diagnostics.effectivePodResource(pod, "memory"),
106
+ limits: require_resource_diagnostics.effectivePodResource(pod, "memory", "limits")
107
+ }
108
+ };
109
+ } catch {}
110
+ add("pod", target.uid, sample);
111
+ }
112
+ for (const group of workloadTargets.size ? require_resource_diagnostics.buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {
113
+ if (!group.ownerResolved || !workloadTargets.has(group.identity) || group.cpu.coveredPods !== group.cpu.totalPods || group.memory.coveredPods !== group.memory.totalPods || group.cpu.usage === void 0 || group.memory.usage === void 0) continue;
114
+ const times = group.pods.flatMap((pod) => {
115
+ const metric = metricsByName.get(`${pod.metadata.namespace ?? ""}/${pod.metadata.name}`);
116
+ return metric ? [Date.parse(metric.timestamp)] : [];
117
+ });
118
+ if (!times.length) continue;
119
+ add("workload", group.identity, {
120
+ time: Math.min(...times),
121
+ cpu: group.cpu.usage,
122
+ memory: group.memory.usage,
123
+ resources: {
124
+ cpu: { requests: group.cpu.unknownRequestPods ? void 0 : group.cpu.requests },
125
+ memory: { requests: group.memory.unknownRequestPods ? void 0 : group.memory.requests }
126
+ }
127
+ });
128
+ }
129
+ return result;
130
+ }
131
+ function startMonitoringHistoryCollection() {
132
+ const seen = /* @__PURE__ */ new Map();
133
+ let stopped = false;
134
+ let writing = false;
135
+ let queued;
136
+ const permitted = (data) => {
137
+ const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
138
+ return !stopped && preferences.enabled && preferences.historyEnabled && document.visibilityState !== "hidden" && require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId;
139
+ };
140
+ const flush = async () => {
141
+ if (writing) return;
142
+ writing = true;
143
+ try {
144
+ while (queued && !stopped) {
145
+ const data = queued;
146
+ queued = void 0;
147
+ if (!permitted(data)) continue;
148
+ const samples = historySnapshotSamples(data, require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().trackedHistory).filter((sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time);
149
+ for (let i = 0; i < samples.length; i += 512) {
150
+ if (!permitted(data)) break;
151
+ const batch = samples.slice(i, i + 512);
152
+ try {
153
+ if (!await require_monitoring_history$1.monitoringHistory.append(batch) || stopped) continue;
154
+ for (const sample of batch) {
155
+ const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;
156
+ seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));
157
+ }
158
+ while (seen.size > 1e4) seen.delete(seen.keys().next().value);
159
+ } catch {}
160
+ }
161
+ }
162
+ } finally {
163
+ writing = false;
164
+ }
165
+ };
166
+ const unsubscribe = require_monitoring_collector.onMonitoringSnapshot((data) => {
167
+ if (!permitted(data)) return;
168
+ queued = data;
169
+ flush();
170
+ });
171
+ return () => {
172
+ stopped = true;
173
+ queued = void 0;
174
+ unsubscribe();
175
+ seen.clear();
176
+ };
177
+ }
178
+ //#endregion
179
+ exports.historySnapshotSamples = historySnapshotSamples;
180
+ exports.isHistoryTracked = isHistoryTracked;
181
+ exports.setHistoryTracked = setHistoryTracked;
182
+ exports.startMonitoringHistoryCollection = startMonitoringHistoryCollection;
183
+
184
+ //# sourceMappingURL=monitoring-history-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-history-collection.js","names":[],"sources":["../../src/renderer/monitoring-history-collection.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { type HistoryIdentity, type HistorySample, validHistoryIdentity } from \"../common/monitoring-history\";\nimport { aggregateMetrics, aggregateResources, type MonitoringSample } from \"../common/monitoring-math\";\nimport { buildConsumerGroups, effectivePodResource } from \"../common/resource-diagnostics\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport {\n getCollectedPodUsage,\n getNodeSample,\n type MonitoringSnapshot,\n onMonitoringSnapshot,\n} from \"./monitoring-collector\";\nimport { monitoringHistory } from \"./monitoring-history\";\nexport function isHistoryTracked(identity: HistoryIdentity): boolean {\n return MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>().trackedHistory.some(\n (item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid,\n );\n}\nexport function setHistoryTracked(identity: HistoryIdentity, tracked: boolean): void {\n if (!validHistoryIdentity(identity)) return;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const rest = preferences.trackedHistory.filter(\n (item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid),\n );\n preferences.trackedHistory = tracked\n ? [...rest, { clusterId: identity.clusterId, scope: identity.scope, uid: identity.uid }].slice(-100)\n : rest;\n}\nfunction numeric(sample: MonitoringSample): HistorySample[\"values\"] {\n const values: HistorySample[\"values\"] = { cpu: sample.cpu, memory: sample.memory };\n for (const metric of [\"cpu\", \"memory\"] as const)\n for (const field of [\"requests\", \"limits\", \"capacity\", \"allocatable\"] as const) {\n const value = sample.resources?.[metric]?.[field];\n if (value !== undefined && Number.isFinite(value))\n values[`${metric}${field[0].toUpperCase()}${field.slice(1)}` as keyof typeof values] = value;\n }\n return values;\n}\nexport function historySnapshotSamples(data: MonitoringSnapshot, tracked: HistoryIdentity[]): HistorySample[] {\n const result: HistorySample[] = [];\n const add = (scope: HistoryIdentity[\"scope\"], uid: string, sample: MonitoringSample) =>\n result.push({ clusterId: data.clusterId, scope, uid, time: sample.time, values: numeric(sample) });\n if (data.nodeMetrics?.length) {\n try {\n const sample = aggregateMetrics(data.nodeMetrics);\n sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));\n if (data.nodes?.length) {\n try {\n sample.resources = aggregateResources(data.nodes, data.pods);\n } catch {\n // usage remains valid when capacity or request data is incomplete\n }\n }\n add(\"cluster\", data.clusterId, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const nodeMetricsByName = new Map<string, NonNullable<MonitoringSnapshot[\"nodeMetrics\"]>>();\n for (const metric of data.nodeMetrics ?? []) {\n if (!metric.metadata?.name) continue;\n const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];\n metrics.push(metric);\n nodeMetricsByName.set(metric.metadata.name, metrics);\n }\n const podsByNode = new Map<string, NonNullable<MonitoringSnapshot[\"pods\"]>>();\n for (const pod of data.pods ?? []) {\n const name = pod.spec.nodeName;\n if (!name) continue;\n const pods = podsByNode.get(name) ?? [];\n pods.push(pod);\n podsByNode.set(name, pods);\n }\n for (const node of data.nodes ?? []) {\n if (!node.metadata.uid) continue;\n try {\n const sample = getNodeSample(\n {\n ...data,\n nodes: [node],\n nodeMetrics: nodeMetricsByName.get(node.metadata.name),\n pods: data.pods ? (podsByNode.get(node.metadata.name) ?? []) : undefined,\n },\n node.metadata.name,\n node.metadata.uid,\n );\n if (sample) add(\"node\", node.metadata.uid, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const usage = getCollectedPodUsage(data);\n const targets = tracked.filter((item) => item.clusterId === data.clusterId);\n const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));\n const usageByUid = new Map(usage.map((item) => [item.uid, item]));\n const metricsByName = new Map(\n (data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? \"\"}/${metric.metadata.name}`, metric]),\n );\n const workloadTargets = new Set(targets.filter((item) => item.scope === \"workload\").map((item) => item.uid));\n for (const target of targets.filter((item) => item.scope === \"pod\")) {\n const pod = podsByUid.get(target.uid);\n const metric = usageByUid.get(target.uid);\n const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`) : undefined;\n if (!pod || !metric || metric.cpu === undefined || metric.memory === undefined || !raw) continue;\n const sample: MonitoringSample = { time: Date.parse(raw.timestamp), cpu: metric.cpu, memory: metric.memory };\n try {\n sample.resources = {\n cpu: { requests: effectivePodResource(pod, \"cpu\"), limits: effectivePodResource(pod, \"cpu\", \"limits\") },\n memory: {\n requests: effectivePodResource(pod, \"memory\"),\n limits: effectivePodResource(pod, \"memory\", \"limits\"),\n },\n };\n } catch {\n /* usage remains available without resource totals */\n }\n add(\"pod\", target.uid, sample);\n }\n for (const group of workloadTargets.size ? buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {\n if (\n !group.ownerResolved ||\n !workloadTargets.has(group.identity) ||\n group.cpu.coveredPods !== group.cpu.totalPods ||\n group.memory.coveredPods !== group.memory.totalPods ||\n group.cpu.usage === undefined ||\n group.memory.usage === undefined\n )\n continue;\n const times = group.pods.flatMap((pod) => {\n const metric = metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`);\n return metric ? [Date.parse(metric.timestamp)] : [];\n });\n if (!times.length) continue;\n add(\"workload\", group.identity, {\n time: Math.min(...times),\n cpu: group.cpu.usage,\n memory: group.memory.usage,\n resources: {\n cpu: { requests: group.cpu.unknownRequestPods ? undefined : group.cpu.requests },\n memory: { requests: group.memory.unknownRequestPods ? undefined : group.memory.requests },\n },\n });\n }\n return result;\n}\nexport function startMonitoringHistoryCollection(): () => void {\n const seen = new Map<string, number>();\n let stopped = false;\n let writing = false;\n let queued: MonitoringSnapshot | undefined;\n const permitted = (data: MonitoringSnapshot) => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n return (\n !stopped &&\n preferences.enabled &&\n preferences.historyEnabled &&\n document.visibilityState !== \"hidden\" &&\n Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId\n );\n };\n const flush = async () => {\n if (writing) return;\n writing = true;\n try {\n while (queued && !stopped) {\n const data = queued;\n queued = undefined;\n if (!permitted(data)) continue;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const samples = historySnapshotSamples(data, preferences.trackedHistory).filter(\n (sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time,\n );\n for (let i = 0; i < samples.length; i += 512) {\n if (!permitted(data)) break;\n const batch = samples.slice(i, i + 512);\n try {\n if (!(await monitoringHistory.append(batch)) || stopped) continue;\n for (const sample of batch) {\n const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;\n seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));\n }\n while (seen.size > 10_000) seen.delete(seen.keys().next().value!);\n } catch {\n // failed batches remain eligible for the next snapshot\n }\n }\n }\n } finally {\n writing = false;\n }\n };\n const unsubscribe = onMonitoringSnapshot((data) => {\n if (!permitted(data)) return;\n // retain only the newest pending snapshot while writes are in flight\n queued = data;\n void flush();\n });\n return () => {\n stopped = true;\n queued = undefined;\n unsubscribe();\n seen.clear();\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
2
+ const require__global_external_mobx = require("./_virtual/_global-external_mobx.js");
3
+ const require_monitoring_preferences_store = require("./src/common/store/monitoring-preferences-store.js");
4
+ const require__global_external_react = require("./_virtual/_global-external_react.js");
5
+ const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
6
+ const require_monitoring_history = require("./monitoring-history.js");
7
+ //#region src/renderer/monitoring-history-view.tsx
8
+ var HISTORY_RANGES = {
9
+ "30m": 18e5,
10
+ "2h": 72e5,
11
+ "24h": 864e5,
12
+ "7d": 6048e5
13
+ };
14
+ function mergeHistorySamples(points, live, from) {
15
+ const buckets = /* @__PURE__ */ new Map();
16
+ for (const point of points) {
17
+ if (point.time < from) continue;
18
+ const sample = buckets.get(point.time) ?? {
19
+ time: point.time,
20
+ cpu: NaN,
21
+ memory: NaN
22
+ };
23
+ if (point.metric === "cpu" || point.metric === "memory") {
24
+ sample[point.metric] = point.avg;
25
+ sample.historical ??= {};
26
+ sample.historical[point.metric] = {
27
+ min: point.min,
28
+ max: point.max,
29
+ count: point.count,
30
+ resolution: point.resolution,
31
+ gap: point.gap
32
+ };
33
+ if (point.gap) sample.breakBefore = true;
34
+ } else if (point.metric !== "restarts") {
35
+ const match = /^(cpu|memory)(Requests|Limits|Capacity|Allocatable)$/.exec(point.metric);
36
+ if (match) {
37
+ sample.resources ??= {
38
+ cpu: {},
39
+ memory: {}
40
+ };
41
+ sample.resources[match[1]][match[2].toLowerCase()] = point.avg;
42
+ }
43
+ }
44
+ if (point.gap) sample.resourceStatus = "Partial historical bucket; missing samples are gaps";
45
+ buckets.set(point.time, sample);
46
+ }
47
+ for (const sample of live) if (sample.time >= from) {
48
+ for (const point of points) if (sample.time >= point.time && sample.time < point.time + point.resolution) buckets.delete(point.time);
49
+ buckets.set(sample.time, sample);
50
+ }
51
+ const samples = [...buckets.values()].filter((sample) => Number.isFinite(sample.cpu) && Number.isFinite(sample.memory)).sort((a, b) => a.time - b.time);
52
+ const resolution = (sample) => Math.max(sample.historical?.cpu?.resolution ?? 3e4, sample.historical?.memory?.resolution ?? 3e4);
53
+ return samples.map((sample, index) => index > 0 && sample.time - samples[index - 1].time > 1.8 * Math.max(resolution(sample), resolution(samples[index - 1])) ? {
54
+ ...sample,
55
+ breakBefore: true
56
+ } : sample);
57
+ }
58
+ function useMonitoringHistory(identity, liveSamples) {
59
+ const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
60
+ const [enabled, setEnabled] = require__global_external_react.useState(preferences.historyEnabled === true);
61
+ require__global_external_react.useEffect(() => require__global_external_mobx.reaction(() => preferences.historyEnabled === true, setEnabled, { fireImmediately: true }), [preferences]);
62
+ const [range, setRange] = require__global_external_react.useState("30m");
63
+ const [points, setPoints] = require__global_external_react.useState([]);
64
+ const [status, setStatus] = require__global_external_react.useState("");
65
+ require__global_external_react.useEffect(() => {
66
+ let current = true;
67
+ setPoints([]);
68
+ setStatus("");
69
+ if (!identity || !enabled) return;
70
+ const query = () => {
71
+ const to = Date.now();
72
+ Promise.resolve().then(() => require_monitoring_history.monitoringHistory.query({
73
+ ...identity,
74
+ from: to - HISTORY_RANGES[range] + 1e3,
75
+ to
76
+ })).then((value) => {
77
+ if (current) {
78
+ setPoints(value);
79
+ setStatus(value.length ? "Historical averages; min/max available in stored buckets" : "No local history for this range. Collection starts when enabled.");
80
+ }
81
+ }).catch(() => {
82
+ if (current) setStatus("Local history unavailable. Live samples remain visible.");
83
+ });
84
+ };
85
+ query();
86
+ const timer = window.setInterval(query, 3e4);
87
+ return () => {
88
+ current = false;
89
+ window.clearInterval(timer);
90
+ };
91
+ }, [
92
+ identity ? `${identity.clusterId}/${identity.scope}/${identity.uid}` : "",
93
+ range,
94
+ enabled
95
+ ]);
96
+ return {
97
+ range,
98
+ setRange,
99
+ samples: mergeHistorySamples(points, liveSamples, Date.now() - HISTORY_RANGES[range]),
100
+ points,
101
+ status
102
+ };
103
+ }
104
+ function MonitoringHistoryRange({ range, onChange, native = false }) {
105
+ return /* @__PURE__ */ require_jsx_runtime.jsxs("label", {
106
+ style: {
107
+ display: "inline-flex",
108
+ alignItems: "center",
109
+ gap: 8
110
+ },
111
+ children: ["History range", /* @__PURE__ */ require_jsx_runtime.jsx("span", {
112
+ style: { width: 120 },
113
+ children: native ? /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Select, {
114
+ "aria-label": "History range",
115
+ value: range,
116
+ options: Object.keys(HISTORY_RANGES).map((value) => ({
117
+ value,
118
+ label: value
119
+ })),
120
+ onChange: (option) => {
121
+ if (option) onChange(option.value);
122
+ },
123
+ isClearable: false
124
+ }) : /* @__PURE__ */ require_jsx_runtime.jsx("select", {
125
+ "aria-label": "History range",
126
+ value: range,
127
+ onChange: (event) => onChange(event.target.value),
128
+ style: {
129
+ width: "100%",
130
+ padding: "6px 8px",
131
+ color: "var(--textColorPrimary)",
132
+ background: "var(--contentColor)",
133
+ border: "1px solid var(--borderColor)",
134
+ borderRadius: 4
135
+ },
136
+ children: Object.keys(HISTORY_RANGES).map((value) => /* @__PURE__ */ require_jsx_runtime.jsx("option", {
137
+ value,
138
+ children: value
139
+ }, value))
140
+ })
141
+ })]
142
+ });
143
+ }
144
+ //#endregion
145
+ exports.HISTORY_RANGES = HISTORY_RANGES;
146
+ exports.MonitoringHistoryRange = MonitoringHistoryRange;
147
+ exports.mergeHistorySamples = mergeHistorySamples;
148
+ exports.useMonitoringHistory = useMonitoringHistory;
149
+
150
+ //# sourceMappingURL=monitoring-history-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-history-view.js","names":[],"sources":["../../src/renderer/monitoring-history-view.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { useEffect, useState } from \"react\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"./monitoring-history\";\n\nimport type { HistoryIdentity, HistoryPoint } from \"../common/monitoring-history\";\nimport type { MonitoringSample } from \"../common/monitoring-math\";\nexport const HISTORY_RANGES = { \"30m\": 1_800_000, \"2h\": 7_200_000, \"24h\": 86_400_000, \"7d\": 604_800_000 } as const;\nexport type HistoryRange = keyof typeof HISTORY_RANGES;\nexport function mergeHistorySamples(\n points: HistoryPoint[],\n live: MonitoringSample[],\n from: number,\n): MonitoringSample[] {\n const buckets = new Map<number, MonitoringSample>();\n for (const point of points) {\n if (point.time < from) continue;\n const sample = buckets.get(point.time) ?? { time: point.time, cpu: NaN, memory: NaN };\n if (point.metric === \"cpu\" || point.metric === \"memory\") {\n sample[point.metric] = point.avg;\n sample.historical ??= {};\n sample.historical[point.metric] = {\n min: point.min,\n max: point.max,\n count: point.count,\n resolution: point.resolution,\n gap: point.gap,\n };\n if (point.gap) sample.breakBefore = true;\n } else if (point.metric !== \"restarts\") {\n const match = /^(cpu|memory)(Requests|Limits|Capacity|Allocatable)$/.exec(point.metric);\n if (match) {\n sample.resources ??= { cpu: {}, memory: {} };\n sample.resources[match[1] as \"cpu\" | \"memory\"][\n match[2].toLowerCase() as \"requests\" | \"limits\" | \"capacity\" | \"allocatable\"\n ] = point.avg;\n }\n }\n if (point.gap) sample.resourceStatus = \"Partial historical bucket; missing samples are gaps\";\n buckets.set(point.time, sample);\n }\n for (const sample of live)\n if (sample.time >= from) {\n for (const point of points)\n if (sample.time >= point.time && sample.time < point.time + point.resolution) buckets.delete(point.time);\n buckets.set(sample.time, sample);\n }\n const samples = [...buckets.values()]\n .filter((sample) => Number.isFinite(sample.cpu) && Number.isFinite(sample.memory))\n .sort((a, b) => a.time - b.time);\n const resolution = (sample: MonitoringSample) =>\n Math.max(sample.historical?.cpu?.resolution ?? 30_000, sample.historical?.memory?.resolution ?? 30_000);\n return samples.map((sample, index) =>\n index > 0 &&\n sample.time - samples[index - 1].time > 1.8 * Math.max(resolution(sample), resolution(samples[index - 1]))\n ? { ...sample, breakBefore: true }\n : sample,\n );\n}\nexport function useMonitoringHistory(identity: HistoryIdentity | undefined, liveSamples: MonitoringSample[]) {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [enabled, setEnabled] = useState(preferences.historyEnabled === true);\n useEffect(\n () => reaction(() => preferences.historyEnabled === true, setEnabled, { fireImmediately: true }),\n [preferences],\n );\n const [range, setRange] = useState<HistoryRange>(\"30m\");\n const [points, setPoints] = useState<HistoryPoint[]>([]);\n const [status, setStatus] = useState(\"\");\n const key = identity ? `${identity.clusterId}/${identity.scope}/${identity.uid}` : \"\";\n useEffect(() => {\n let current = true;\n setPoints([]);\n setStatus(\"\");\n if (!identity || !enabled) return;\n const query = () => {\n const to = Date.now();\n void Promise.resolve()\n .then(() => monitoringHistory.query({ ...identity, from: to - HISTORY_RANGES[range] + 1000, to }))\n .then((value) => {\n if (current) {\n setPoints(value);\n setStatus(\n value.length\n ? \"Historical averages; min/max available in stored buckets\"\n : \"No local history for this range. Collection starts when enabled.\",\n );\n }\n })\n .catch(() => {\n if (current) setStatus(\"Local history unavailable. Live samples remain visible.\");\n });\n };\n query();\n const timer = window.setInterval(query, 30_000);\n return () => {\n current = false;\n window.clearInterval(timer);\n };\n }, [key, range, enabled]);\n return {\n range,\n setRange,\n samples: mergeHistorySamples(points, liveSamples, Date.now() - HISTORY_RANGES[range]),\n points,\n status,\n };\n}\nexport function MonitoringHistoryRange({\n range,\n onChange,\n native = false,\n}: {\n range: HistoryRange;\n onChange: (value: HistoryRange) => void;\n // host [Select] requires injected context unavailable in detached chart roots\n native?: boolean;\n}) {\n return (\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\n History range\n <span style={{ width: 120 }}>\n {native ? (\n <Renderer.Component.Select\n aria-label=\"History range\"\n value={range}\n options={Object.keys(HISTORY_RANGES).map((value) => ({ value: value as HistoryRange, label: value }))}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n isClearable={false}\n />\n ) : (\n <select\n aria-label=\"History range\"\n value={range}\n onChange={(event) => onChange(event.target.value as HistoryRange)}\n style={{\n width: \"100%\",\n padding: \"6px 8px\",\n color: \"var(--textColorPrimary)\",\n background: \"var(--contentColor)\",\n border: \"1px solid var(--borderColor)\",\n borderRadius: 4,\n }}\n >\n {Object.keys(HISTORY_RANGES).map((value) => (\n <option key={value} value={value}>\n {value}\n </option>\n ))}\n </select>\n )}\n </span>\n </label>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const require_monitoring_history = require("./src/common/monitoring-history.js");
2
+ let electron = require("electron");
3
+ //#region src/renderer/monitoring-history.ts
4
+ var monitoringHistory = {
5
+ append: (samples) => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, {
6
+ operation: "append",
7
+ samples
8
+ }),
9
+ query: (query) => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, {
10
+ operation: "query",
11
+ query
12
+ }),
13
+ status: () => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, { operation: "status" }),
14
+ clear: () => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, { operation: "clear" })
15
+ };
16
+ //#endregion
17
+ exports.monitoringHistory = monitoringHistory;
18
+
19
+ //# sourceMappingURL=monitoring-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-history.js","names":[],"sources":["../../src/renderer/monitoring-history.ts"],"sourcesContent":["import { ipcRenderer } from \"electron\";\nimport {\n type HistoryPoint,\n type HistoryQuery,\n type HistorySample,\n type HistoryStatus,\n MONITORING_HISTORY_CHANNEL,\n} from \"../common/monitoring-history\";\nexport const monitoringHistory = {\n append: (samples: HistorySample[]): Promise<boolean> =>\n ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"append\", samples }),\n query: (query: HistoryQuery): Promise<HistoryPoint[]> =>\n ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"query\", query }),\n status: (): Promise<HistoryStatus> => ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"status\" }),\n clear: (): Promise<boolean> => ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"clear\" }),\n};\n"],"mappings":";;;AAQA,IAAa,oBAAoB;CAC/B,SAAS,YACP,SAAA,YAAY,OAAO,2BAAA,4BAA4B;EAAE,WAAW;EAAU;CAAQ,CAAC;CACjF,QAAQ,UACN,SAAA,YAAY,OAAO,2BAAA,4BAA4B;EAAE,WAAW;EAAS;CAAM,CAAC;CAC9E,cAAsC,SAAA,YAAY,OAAO,2BAAA,4BAA4B,EAAE,WAAW,SAAS,CAAC;CAC5G,aAA+B,SAAA,YAAY,OAAO,2BAAA,4BAA4B,EAAE,WAAW,QAAQ,CAAC;AACtG"}