mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-10-31 07:55:06 +01:00 
			
		
		
		
	Merge branch 'dev' into add_detailed_nodelist
This commit is contained in:
		| @@ -15,8 +15,8 @@ | ||||
|  | ||||
| <script> | ||||
|   import uPlot from "uplot"; | ||||
|   import { formatNumber } from "../units.js"; | ||||
|   import { onMount, onDestroy } from "svelte"; | ||||
|   import { formatNumber } from "../units.js"; | ||||
|   import { Card } from "@sveltestrap/sveltestrap"; | ||||
|  | ||||
|   export let data; | ||||
| @@ -26,16 +26,31 @@ | ||||
|   export let title = ""; | ||||
|   export let xlabel = ""; | ||||
|   export let xunit = ""; | ||||
|   export let xtime = false; | ||||
|   export let ylabel = ""; | ||||
|   export let yunit = ""; | ||||
|  | ||||
|   const { bars } = uPlot.paths; | ||||
|  | ||||
|   const drawStyles = { | ||||
|     bars: 1, | ||||
|     points: 2, | ||||
|   }; | ||||
|  | ||||
|   function formatTime(t) { | ||||
|     if (t !== null) { | ||||
|       if (isNaN(t)) { | ||||
|         return t; | ||||
|       } else { | ||||
|         const tAbs = Math.abs(t); | ||||
|         const h = Math.floor(tAbs / 3600); | ||||
|         const m = Math.floor((tAbs % 3600) / 60); | ||||
|         if (h == 0) return `${m}m`; | ||||
|         else if (m == 0) return `${h}h`; | ||||
|         else return `${h}:${m}h`; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   function paths(u, seriesIdx, idx0, idx1, extendGap, buildClip) { | ||||
|     let s = u.series[seriesIdx]; | ||||
|     let style = s.drawStyle; | ||||
| @@ -139,7 +154,7 @@ | ||||
|           label: xlabel, | ||||
|           labelGap: 10, | ||||
|           size: 25, | ||||
|           incrs: [1, 2, 5, 6, 10, 12, 50, 100, 500, 1000, 5000, 10000], | ||||
|           incrs: xtime ? [60, 120, 300, 600, 1800, 3600, 7200, 14400, 18000, 21600, 43200, 86400] : [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000], | ||||
|           border: { | ||||
|             show: true, | ||||
|             stroke: "#000000", | ||||
| @@ -149,7 +164,13 @@ | ||||
|             size: 5 / devicePixelRatio, | ||||
|             stroke: "#000000", | ||||
|           }, | ||||
|           values: (_, t) => t.map((v) => formatNumber(v)), | ||||
|           values: (_, t) => t.map((v) => { | ||||
|             if (xtime) { | ||||
|               return formatTime(v); | ||||
|             } else { | ||||
|               return formatNumber(v) | ||||
|             } | ||||
|           }), | ||||
|         }, | ||||
|         { | ||||
|           stroke: "#000000", | ||||
| @@ -166,17 +187,25 @@ | ||||
|             size: 5 / devicePixelRatio, | ||||
|             stroke: "#000000", | ||||
|           }, | ||||
|           values: (_, t) => t.map((v) => formatNumber(v)), | ||||
|           values: (_, t) => t.map((v) => { | ||||
|             return formatNumber(v) | ||||
|           }), | ||||
|         }, | ||||
|       ], | ||||
|       series: [ | ||||
|         { | ||||
|           label: xunit !== "" ? xunit : null, | ||||
|           value: (u, ts, sidx, didx) => { | ||||
|             if (usesBins) { | ||||
|             if (usesBins && xtime) { | ||||
|               const min = u.data[sidx][didx - 1] ? formatTime(u.data[sidx][didx - 1]) : 0; | ||||
|               const max = formatTime(u.data[sidx][didx]); | ||||
|               ts = min + " - " + max; // narrow spaces | ||||
|             } else if (usesBins) { | ||||
|               const min = u.data[sidx][didx - 1] ? u.data[sidx][didx - 1] : 0; | ||||
|               const max = u.data[sidx][didx]; | ||||
|               ts = min + " - " + max; // narrow spaces | ||||
|             } else if (xtime) { | ||||
|               ts = formatTime(ts); | ||||
|             } | ||||
|             return ts; | ||||
|           }, | ||||
| @@ -191,6 +220,7 @@ | ||||
|           }, | ||||
|           { | ||||
|             drawStyle: drawStyles.bars, | ||||
|             width: 1, // 1 / lastBinCount, | ||||
|             lineInterpolation: null, | ||||
|             stroke: "#85abce", | ||||
|             fill: "#85abce", //  + "1A", // Transparent Fill | ||||
|   | ||||
| @@ -152,10 +152,12 @@ | ||||
|   const lineWidth = | ||||
|     clusterCockpitConfig.plot_general_lineWidth / window.devicePixelRatio; | ||||
|   const lineColors = clusterCockpitConfig.plot_general_colorscheme; | ||||
|   const cbmode = clusterCockpitConfig?.plot_general_colorblindMode || false; | ||||
|  | ||||
|   const backgroundColors = { | ||||
|     normal: "rgba(255, 255, 255, 1.0)", | ||||
|     caution: "rgba(255, 128, 0, 0.3)", | ||||
|     alert: "rgba(255, 0, 0, 0.3)", | ||||
|     caution: cbmode ? "rgba(239, 230, 69, 0.3)" : "rgba(255, 128, 0, 0.3)", | ||||
|     alert: cbmode ? "rgba(225, 86, 44, 0.3)" : "rgba(255, 0, 0, 0.3)", | ||||
|   }; | ||||
|   const thresholds = findJobAggregationThresholds( | ||||
|     subClusterTopology, | ||||
| @@ -348,13 +350,13 @@ | ||||
|       label: "min", | ||||
|       scale: "y", | ||||
|       width: lineWidth, | ||||
|       stroke: "red", | ||||
|       stroke: cbmode ? "rgb(0,255,0)" : "red", | ||||
|     }); | ||||
|     plotSeries.push({ | ||||
|       label: "max", | ||||
|       scale: "y", | ||||
|       width: lineWidth, | ||||
|       stroke: "green", | ||||
|       stroke: cbmode ? "rgb(0,0,255)" : "green", | ||||
|     }); | ||||
|     plotSeries.push({ | ||||
|       label: usesMeanStatsSeries ? "mean" : "median", | ||||
| @@ -364,8 +366,8 @@ | ||||
|     }); | ||||
|  | ||||
|     plotBands = [ | ||||
|       { series: [2, 3], fill: "rgba(0,255,0,0.1)" }, | ||||
|       { series: [3, 1], fill: "rgba(255,0,0,0.1)" }, | ||||
|       { series: [2, 3], fill: cbmode ? "rgba(0,0,255,0.1)" : "rgba(0,255,0,0.1)" }, | ||||
|       { series: [3, 1], fill: cbmode ? "rgba(0,255,0,0.1)" : "rgba(255,0,0,0.1)" }, | ||||
|     ]; | ||||
|   } else { | ||||
|     for (let i = 0; i < series.length; i++) { | ||||
|   | ||||
| @@ -40,6 +40,7 @@ | ||||
|   let timeoutId = null; | ||||
|  | ||||
|   const lineWidth = clusterCockpitConfig.plot_general_lineWidth; | ||||
|   const cbmode = clusterCockpitConfig?.plot_general_colorblindMode || false; | ||||
|  | ||||
|   // Helpers | ||||
|   function getGradientR(x) { | ||||
| @@ -61,7 +62,7 @@ | ||||
|     return Math.floor(x * 255.0); | ||||
|   } | ||||
|   function getRGB(c) { | ||||
|     return `rgb(${getGradientR(c)}, ${getGradientG(c)}, ${getGradientB(c)})`; | ||||
|     return `rgb(${cbmode ? '0' : getGradientR(c)}, ${getGradientG(c)}, ${getGradientB(c)})`; | ||||
|   } | ||||
|   function nearestThousand(num) { | ||||
|     return Math.ceil(num / 1000) * 1000; | ||||
|   | ||||
| @@ -449,7 +449,7 @@ function getMetricConfigDeep(metric, cluster, subCluster) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| export function convert2uplot(canvasData) { | ||||
| export function convert2uplot(canvasData, secondsToMinutes = false, secondsToHours = false) { | ||||
|     // Prep: Uplot Data Structure | ||||
|     let uplotData = [[],[]] // [X, Y1, Y2, ...] | ||||
|     // Iterate if exists | ||||
| @@ -457,11 +457,21 @@ export function convert2uplot(canvasData) { | ||||
|         canvasData.forEach( cd => { | ||||
|             if (Object.keys(cd).length == 4) { // MetricHisto Datafromat | ||||
|                 uplotData[0].push(cd?.max ? cd.max : 0) | ||||
|                 uplotData[1].push(cd?.count ? cd.count : 0) | ||||
|             } else { // Default -> Fill Histodata with zero values on unused value placing -> maybe allows zoom trigger as known | ||||
|                 if (secondsToHours) { | ||||
|                     let hours = cd.value / 3600 | ||||
|                     console.log("x seconds to y hours", cd.value, hours) | ||||
|                     uplotData[0].push(hours) | ||||
|                 } else if (secondsToMinutes) { | ||||
|                     let minutes = cd.value / 60 | ||||
|                     console.log("x seconds to y minutes", cd.value, minutes) | ||||
|                     uplotData[0].push(minutes) | ||||
|                 } else { | ||||
|                     uplotData[0].push(cd.value) | ||||
|                 } | ||||
|                 uplotData[1].push(cd.count) | ||||
|             } else { // Default | ||||
|                 uplotData[0].push(cd.value) | ||||
|                 uplotData[1].push(cd.count) | ||||
|             } | ||||
|              } | ||||
|         }) | ||||
|     } | ||||
|     return uplotData | ||||
|   | ||||
		Reference in New Issue
	
	Block a user