@jfvilas/plugin-kwirth-metrics 0.13.5 → 0.14.2
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.
- package/dist/components/Chart.esm.js +7 -6
- package/dist/components/Chart.esm.js.map +1 -1
- package/dist/components/ChartType.esm.js +12 -0
- package/dist/components/ChartType.esm.js.map +1 -0
- package/dist/components/EntityKwirthMetricsContent.esm.js +36 -38
- package/dist/components/EntityKwirthMetricsContent.esm.js.map +1 -1
- package/dist/components/MenuChart.esm.js +3 -11
- package/dist/components/MenuChart.esm.js.map +1 -1
- package/dist/components/Options.esm.js +1 -1
- package/dist/components/Options.esm.js.map +1 -1
- package/dist/index.d.ts +16 -5
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/version.esm.js +1 -1
- package/dist/version.esm.js.map +1 -1
- package/package.json +16 -9
|
@@ -3,6 +3,7 @@ import { Alert, Stack, Typography, Card, CardContent, Tooltip as Tooltip$1, Icon
|
|
|
3
3
|
import { ResponsiveContainer, Treemap, Tooltip, PieChart, Legend, Pie, Cell, BarChart, CartesianGrid, XAxis, YAxis, Bar, LabelList, AreaChart, Area, LineChart, Line } from 'recharts';
|
|
4
4
|
import { MenuChart, MenuChartOption } from './MenuChart.esm.js';
|
|
5
5
|
import { MoreVert } from '@material-ui/icons';
|
|
6
|
+
import { ChartType } from './ChartType.esm.js';
|
|
6
7
|
|
|
7
8
|
const METRICSCOLOURS = [
|
|
8
9
|
"#6e5bb8",
|
|
@@ -164,7 +165,7 @@ const Chart = (props) => {
|
|
|
164
165
|
return /* @__PURE__ */ React.createElement("text", { x: data.x + data.width / 3.5, y: data.y - 10 }, total.toPrecision(3).replace(/0+$/, "").replace(/\.+$/, ""));
|
|
165
166
|
};
|
|
166
167
|
switch (chartType) {
|
|
167
|
-
case
|
|
168
|
+
case ChartType.ValueChart:
|
|
168
169
|
result = /* @__PURE__ */ React.createElement("div", { style: { padding: "30px", height: height * 0.8, alignItems: "center", justifyContent: "center", display: "flex" } }, /* @__PURE__ */ React.createElement(Stack, { direction: "row", alignItems: "center", justifyContent: "center", spacing: 2, sx: { flexWrap: "wrap" } }, props.series.map((serie, index) => {
|
|
169
170
|
let value = serie[serie.length - 1].value;
|
|
170
171
|
if (!value) return;
|
|
@@ -178,26 +179,26 @@ const Chart = (props) => {
|
|
|
178
179
|
return /* @__PURE__ */ React.createElement(Stack, { key: index, direction: "column" }, /* @__PURE__ */ React.createElement(Typography, { mt: 2, textAlign: "center", width: "100%", fontSize: Math.min(48, 192 / props.series.length), color: props.series.length === 1 ? props.colour : METRICSCOLOURS[index] }, valueStr), /* @__PURE__ */ React.createElement(Typography, { textAlign: "center", width: "100%", fontSize: 12, color: props.series.length === 1 ? props.colour : METRICSCOLOURS[index] }, props.names[index]));
|
|
179
180
|
})));
|
|
180
181
|
break;
|
|
181
|
-
case
|
|
182
|
+
case ChartType.LineChart:
|
|
182
183
|
result = /* @__PURE__ */ React.createElement(LineChart, { data: mergeSeries(props.names, props.series) }, /* @__PURE__ */ React.createElement(CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ React.createElement(XAxis, { dataKey: "timestamp", fontSize: 8 }), /* @__PURE__ */ React.createElement(YAxis, null), tooltip && /* @__PURE__ */ React.createElement(Tooltip, null), /* @__PURE__ */ React.createElement(Legend, null), props.series.map((_serie, index) => /* @__PURE__ */ React.createElement(Line, { key: index, name: props.names[index], type: "monotone", dataKey: props.names[index], stroke: props.series.length === 1 ? props.colour : METRICSCOLOURS[index], activeDot: { r: 8 } })));
|
|
183
184
|
break;
|
|
184
|
-
case
|
|
185
|
+
case ChartType.AreaChart:
|
|
185
186
|
result = /* @__PURE__ */ React.createElement(AreaChart, { data: mergeSeries(props.names, props.series) }, /* @__PURE__ */ React.createElement("defs", null, props.series.map((_serie, index) => {
|
|
186
187
|
return /* @__PURE__ */ React.createElement("linearGradient", { key: index, id: `color${props.series.length === 1 ? props.colour : METRICSCOLOURS[index]}`, x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React.createElement("stop", { offset: "7%", stopColor: props.series.length === 1 ? props.colour : METRICSCOLOURS[index], stopOpacity: 0.8 }), /* @__PURE__ */ React.createElement("stop", { offset: "93%", stopColor: props.series.length === 1 ? props.colour : METRICSCOLOURS[index], stopOpacity: 0 }));
|
|
187
188
|
})), /* @__PURE__ */ React.createElement(CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ React.createElement(XAxis, { dataKey: "timestamp", fontSize: 8 }), /* @__PURE__ */ React.createElement(YAxis, null), tooltip && /* @__PURE__ */ React.createElement(Tooltip, null), /* @__PURE__ */ React.createElement(Legend, null), props.series.map((_serie, index) => /* @__PURE__ */ React.createElement(Area, { key: index, name: props.names[index], type: "monotone", ...stack ? { stackId: "1" } : {}, dataKey: props.names[index], stroke: props.series.length === 1 ? props.colour : METRICSCOLOURS[index], fill: `url(#color${props.series.length === 1 ? props.colour : METRICSCOLOURS[index]})` })));
|
|
188
189
|
break;
|
|
189
|
-
case
|
|
190
|
+
case ChartType.BarChart:
|
|
190
191
|
result = /* @__PURE__ */ React.createElement(BarChart, { data: mergeSeries(props.names, props.series) }, /* @__PURE__ */ React.createElement(CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ React.createElement(XAxis, { dataKey: "timestamp", fontSize: 8 }), /* @__PURE__ */ React.createElement(YAxis, null), tooltip && /* @__PURE__ */ React.createElement(Tooltip, null), /* @__PURE__ */ React.createElement(Legend, null), props.series.map(
|
|
191
192
|
(_serie, index) => /* @__PURE__ */ React.createElement(Bar, { key: index, name: props.names[index], ...stack ? { stackId: "1" } : {}, dataKey: props.names[index], stroke: props.series.length === 1 ? props.colour : METRICSCOLOURS[index], fill: props.series.length === 1 ? props.colour : METRICSCOLOURS[index] }, index === props.series.length - 1 && props.series.length > 1 && labels ? /* @__PURE__ */ React.createElement(LabelList, { dataKey: props.names[index], position: "insideTop", content: renderLabel }) : null)
|
|
192
193
|
));
|
|
193
194
|
break;
|
|
194
|
-
case
|
|
195
|
+
case ChartType.PieChart:
|
|
195
196
|
dataSummarized = props.names.map((name, index) => {
|
|
196
197
|
return { name, value: props.series[index].reduce((ac, val) => ac + val.value, 0) };
|
|
197
198
|
});
|
|
198
199
|
result = /* @__PURE__ */ React.createElement(PieChart, null, tooltip && /* @__PURE__ */ React.createElement(Tooltip, null), /* @__PURE__ */ React.createElement(Legend, { layout: "vertical", align: "right", verticalAlign: "middle" }), /* @__PURE__ */ React.createElement(Pie, { key: "asd", data: dataSummarized, dataKey: "value", fill: METRICSCOLOURS[0], innerRadius: 0, outerRadius: 90 }, dataSummarized.map((_entry, index) => /* @__PURE__ */ React.createElement(Cell, { key: `cell-${index}`, fill: METRICSCOLOURS[index % METRICSCOLOURS.length] }))));
|
|
199
200
|
break;
|
|
200
|
-
case
|
|
201
|
+
case ChartType.TreemapChart:
|
|
201
202
|
dataSummarized = props.names.map((name, index) => {
|
|
202
203
|
return { name, value: props.series[index].reduce((ac, val) => ac + val.value, 0) };
|
|
203
204
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.esm.js","sources":["../../src/components/Chart.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { Alert, Card, CardContent, Stack, Typography } from '@mui/material'\r\nimport { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, LabelList, Legend, Line, LineChart, Pie, PieChart, ResponsiveContainer, Tooltip, Treemap, XAxis, YAxis } from 'recharts'\r\nimport { Tooltip as MUITooltip, IconButton } from '@mui/material'\r\nimport { MenuChart, MenuChartOption } from './MenuChart'\r\nimport { MoreVert } from '@material-ui/icons'\r\nimport { TreemapNode } from 'recharts/types/util/types'\r\nimport { MetricDefinition } from '@jfvilas/plugin-kwirth-common'\r\n\r\nexport interface IMetricViewConfig {\r\n displayName: string\r\n chartType: ChartType\r\n tooltip: boolean\r\n labels: boolean\r\n stack: boolean\r\n}\r\n\r\nenum ChartType {\r\n LineChart='line',\r\n BarChart='bar',\r\n AreaChart='area',\r\n ValueChart='value',\r\n PieChart='pie',\r\n TreemapChart='treemap',\r\n}\r\n\r\nexport interface ISample {\r\n timestamp:string\r\n value:number\r\n}\r\n\r\nexport const METRICSCOLOURS = [\r\n \"#6e5bb8\", // morado oscuro\r\n \"#4a9076\", // verde oscuro\r\n \"#b56c52\", // naranja oscuro\r\n \"#7f6b97\", // color lavanda oscuro\r\n \"#b0528f\", // rosa oscuro\r\n \"#b0b052\", // amarillo oscuro\r\n \"#b05252\", // rojo oscuro\r\n \"#5285b0\", // azul oscuro\r\n \"#a38ad6\", // morado pastel\r\n \"#89c1a0\", // verde pastel\r\n \"#e4a28a\", // naranja pastel\r\n \"#b09dbd\", // lavanda pastel\r\n \"#e2a4c6\", // rosa pastel\r\n \"#c5c89e\", // amarillo pastel\r\n \"#e2a4a4\", // rojo pastel\r\n \"#90b7e2\", // azul pastel\r\n \"#f8d5e1\", // rosa claro pastel\r\n \"#b2d7f0\", // azul muy claro pastel\r\n \"#f7e1b5\", // amarillo muy claro pastel\r\n \"#d0f0c0\", // verde muy claro pastel\r\n \"#f5b0a1\", // coral pastel\r\n \"#d8a7db\", // lavanda muy claro pastel\r\n \"#f4c2c2\", // rosa suave pastel\r\n \"#e6c7b9\", // marron claro pastel\r\n \"#f0e2b6\", // crema pastel\r\n \"#a7c7e7\", // azul palido pastel\r\n \"#f5e6a5\", // amarillo palido pastel\r\n \"#e3c8f5\", // lilas pastel\r\n \"#d0c4e8\", // lila palido pastel\r\n \"#b8d8b8\", // verde claro pastel\r\n \"#d2ebfa\", // azul muy claro pastel\r\n \"#f1c1d2\" // rosa bebe pastel\r\n]\r\n\r\nexport interface IChartProps {\r\n metricDefinition: MetricDefinition,\r\n names: string[],\r\n series: ISample[][],\r\n colour: string,\r\n chartType: ChartType,\r\n stack: boolean\r\n tooltip: boolean\r\n labels: boolean\r\n numSeries: number\r\n viewConfig : IMetricViewConfig\r\n onSetDefault?: (name:string, mvc: IMetricViewConfig) => void\r\n}\r\n\r\nexport const Chart: React.FC<IChartProps> = (props:IChartProps) => {\r\n const [anchorMenuChart, setAnchorMenuChart] = useState<null | HTMLElement>(null)\r\n const [chartType, setChartType] = useState<ChartType>(props.viewConfig?.chartType? props.viewConfig.chartType : props.chartType)\r\n const [stack, setStack] = useState<boolean>(props.viewConfig?.stack? props.viewConfig.stack : props.stack)\r\n const [tooltip, setTooltip] = useState<boolean>(props.viewConfig?.tooltip? props.viewConfig.tooltip : props.tooltip)\r\n const [labels, setLabels] = useState<boolean>(props.viewConfig?.labels? props.viewConfig.labels : props.labels)\r\n\r\n let result\r\n let height=300\r\n let dataSummarized:any[]\r\n\r\n const mergeSeries = (names:string[], series:ISample[][]) => {\r\n // names is an array of names of series\r\n // series is an array of arrays of samples\r\n // example:\r\n // [default, ingress-nginx]\r\n // [ [ {timestamp:'dad',value:1}, {timestamp:'dad',value:2} ], [ {timestamp:'dad',value:4}, {timestamp:'dad',value:0} ] ]\r\n if (!names || names.length===0) return []\r\n let resultSeries = []\r\n\r\n for (var i=0; i<series[0].length; i++) {\r\n var item: { [key: string]: string|number } = {}\r\n for (var j=0; j<series.length; j++ ) {\r\n if (series[j][i]) {\r\n item['timestamp'] = series[0][i].timestamp\r\n item[names[j]] = series[j][i].value\r\n }\r\n }\r\n resultSeries.push(item)\r\n }\r\n\r\n // result is:\r\n // [ \r\n // {timestamp: '09:16:27', default: 0.21, ingress-nginx: 0.93}\r\n // {timestamp: '09:16:32', default: 0.5, ingress-nginx: 0.04}\r\n // ]\r\n return resultSeries\r\n }\r\n\r\n const CustomizedContent: React.FC<TreemapNode> = (props) => {\r\n const { root, depth, x, y, width, height, index, name } = props\r\n\r\n return (\r\n <g>\r\n <rect x={x} y={y} width={width} height={height}\r\n style={{\r\n fill: depth < 2 ? METRICSCOLOURS[Math.floor((index / root.children.length) * 6)] : '#ffffff00',\r\n stroke: '#fff',\r\n strokeWidth: 2 / (depth + 1e-10),\r\n strokeOpacity: 1 / (depth + 1e-10),\r\n }}\r\n />\r\n {depth === 1 ? (\r\n <text x={x + width / 2} y={y + height / 2 + 7} textAnchor=\"middle\" fill=\"#fff\" fontSize={14} fontFamily='Roboto, Helvetica, Arial, sans-serif'>\r\n {name}\r\n </text>\r\n ) : null}\r\n\r\n </g>\r\n )\r\n }\r\n\r\n const menuChartOptionSelected = (opt:MenuChartOption, data:any) => {\r\n setAnchorMenuChart(null)\r\n switch (opt) {\r\n case MenuChartOption.Stack:\r\n setStack(!stack)\r\n break\r\n case MenuChartOption.Remove:\r\n //+++ pending implementation on parent\r\n break\r\n case MenuChartOption.Export:\r\n if (!props.names?.length || !props.series?.length) return\r\n\r\n const headers = [\"timestamp\", ...props.names]\r\n const timestamps = props.series[0].map(point => point.timestamp)\r\n const rows = timestamps.map((timestamp, idx) => {\r\n const values = props.series.map(serie => serie[idx]?.value ?? \"\")\r\n return [timestamp, ...values];\r\n })\r\n const separator = \",\";\r\n const csvContent = headers.join(separator) + \"\\n\" + rows.map(r => r.join(separator)).join(\"\\n\")\r\n const blob = new Blob([\"\\uFEFF\" + csvContent], { type: \"text/csv;charset=utf-8;\" })\r\n \r\n const link = document.createElement(\"a\")\r\n link.href = URL.createObjectURL(blob)\r\n link.download = `${props.metricDefinition.metric}.csv`\r\n link.click()\r\n break\r\n case MenuChartOption.Tooltip:\r\n setTooltip(!tooltip)\r\n break\r\n case MenuChartOption.Labels:\r\n setLabels(!labels)\r\n break\r\n case MenuChartOption.Default:\r\n if (props.onSetDefault) {\r\n props.onSetDefault(props.metricDefinition.metric, {\r\n displayName: props.metricDefinition.metric,\r\n chartType: chartType,\r\n stack: stack,\r\n tooltip: tooltip,\r\n labels: labels\r\n })\r\n }\r\n break\r\n default:\r\n setChartType(data as ChartType)\r\n break\r\n } \r\n }\r\n\r\n const renderLabel = (data:any) => {\r\n var values:any[] = props.series.map (s => s[data.index])\r\n var total:number = values.reduce((acc,value) => acc+value.value, 0)\r\n return <text x={data.x + data.width/3.5} y={data.y-10}>{total.toPrecision(3).replace(/0+$/, '').replace(/\\.+$/, '')}</text>\r\n }\r\n\r\n switch (chartType) {\r\n case ChartType.ValueChart:\r\n result = (\r\n <div style={{padding:'30px', height:height*0.8, alignItems:'center', justifyContent:'center', display:'flex'}}>\r\n <Stack direction={'row'} alignItems={'center'} justifyContent={'center'} spacing={2} sx={{ flexWrap: 'wrap'}}>\r\n { props.series.map( (serie,index) => {\r\n let value = serie[serie.length-1].value\r\n if (!value) return //+++\r\n let valueStr = value.toString()\r\n if (value) {\r\n valueStr = value.toFixed(3)\r\n if (value>10) valueStr=value.toFixed(2)\r\n if (value>100) valueStr=value.toFixed(1)\r\n if (value>1000) valueStr=value.toFixed(0)\r\n }\r\n return (\r\n <Stack key={index} direction={'column'}>\r\n <Typography mt={2} textAlign={'center'} width={'100%'} fontSize={Math.min(48, 192/props.series.length)} color={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n {valueStr}\r\n </Typography>\r\n <Typography textAlign={'center'} width={'100%'} fontSize={12} color={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n {props.names[index]}\r\n </Typography>\r\n </Stack>\r\n )\r\n })}\r\n </Stack>\r\n </div>\r\n )\r\n break\r\n case ChartType.LineChart:\r\n result = (\r\n <LineChart data={mergeSeries(props.names, props.series)}>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis/>\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) => <Line key={index} name={props.names[index]} type='monotone' dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} activeDot={{ r: 8 }} />) }\r\n </LineChart>\r\n )\r\n break\r\n case ChartType.AreaChart:\r\n result = (\r\n <AreaChart data={mergeSeries(props.names, props.series)}>\r\n <defs>\r\n {\r\n props.series.map( (_serie,index) => {\r\n return (\r\n <linearGradient key={index} id={`color${props.series.length===1?props.colour:METRICSCOLOURS[index]}`} x1='0' y1='0' x2='0' y2='1'>\r\n <stop offset='7%' stopColor={props.series.length===1?props.colour:METRICSCOLOURS[index]} stopOpacity={0.8}/>\r\n <stop offset='93%' stopColor={props.series.length===1?props.colour:METRICSCOLOURS[index]} stopOpacity={0}/>\r\n </linearGradient>\r\n )\r\n })\r\n }\r\n </defs>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis />\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) => \r\n <Area key={index} name={props.names[index]} type='monotone' {...(stack? {stackId:'1'}:{})} dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} fill={`url(#color${props.series.length===1?props.colour:METRICSCOLOURS[index]})`}/> )\r\n }\r\n </AreaChart>\r\n )\r\n break\r\n case ChartType.BarChart:\r\n result = (\r\n <BarChart data={mergeSeries(props.names, props.series)}>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis />\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) =>\r\n <Bar key={index} name={props.names[index]} {...(stack? {stackId:'1'}:{})} dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} fill={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n { index === props.series.length-1 && props.series.length > 1 && labels ? <LabelList dataKey={props.names[index]} position='insideTop' content={renderLabel}/> : null }\r\n </Bar>\r\n )}\r\n </BarChart>\r\n )\r\n break\r\n case ChartType.PieChart:\r\n dataSummarized= props.names.map( (name,index) => {\r\n return { name, value:(props.series[index] as ISample[]).reduce((ac,val) => ac+val.value,0)}\r\n })\r\n result = (\r\n <PieChart>\r\n { tooltip && <Tooltip /> }\r\n <Legend layout='vertical' align='right' verticalAlign='middle'/>\r\n <Pie key={'asd'} data={dataSummarized} dataKey={'value'} fill={METRICSCOLOURS[0]} innerRadius={0} outerRadius={90}>\r\n {dataSummarized.map((_entry, index) => (\r\n <Cell key={`cell-${index}`} fill={METRICSCOLOURS[index % METRICSCOLOURS.length]} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n )\r\n break\r\n case ChartType.TreemapChart:\r\n dataSummarized = props.names.map( (name,index) => {\r\n return { name, value:(props.series[index] as ISample[]).reduce((ac,val) => ac+val.value,0)}\r\n })\r\n result = (\r\n <div style={{paddingLeft:'32px', height:height*0.8, alignItems:'center', justifyContent:'center', display:'flex'}}>\r\n <ResponsiveContainer width='100%'>\r\n <Treemap data={dataSummarized} dataKey='value' nameKey='name' aspectRatio={4 / 3} stroke=\"#ffffff\" fill=\"#6e5bb8\" content={React.createElement(CustomizedContent)}>\r\n { tooltip && <Tooltip /> }\r\n </Treemap>\r\n </ResponsiveContainer>\r\n </div>\r\n )\r\n break\r\n default:\r\n result = <Alert severity='error'>Unsupported chart type '{props.chartType}'</Alert>\r\n break\r\n }\r\n\r\n let title = props.metricDefinition.metric.replaceAll('_',' ')\r\n title = title[0].toLocaleUpperCase()+ title.substring(1)\r\n title = title.replaceAll('cpu', 'CPU')\r\n title = title.replaceAll(' fs ', ' FS ')\r\n title = title.replaceAll(' io ', ' IO ')\r\n title = title.replaceAll('oom', 'OOM')\r\n title = title.replaceAll('nvm', 'NVM')\r\n title = title.replaceAll('rss', 'RSS')\r\n title = title.replaceAll('failcnt', 'fail count')\r\n title = title.replaceAll('mbps', 'Mbps')\r\n\r\n // +++ review\r\n return (\r\n <Card sx={{paddingRight:'32px', width:'100%'}}>\r\n <CardContent>\r\n <Stack direction='column' alignItems='center' width='100%' sx={{mb:'32px'}}>\r\n <Stack direction={'row'} alignItems={'center'}>\r\n <MUITooltip key={'tooltip'+props.metricDefinition.metric+JSON.stringify(props.names)} title={<Typography style={{fontSize:12}}><b>{props.metricDefinition.metric}</b><br/><br/>{props.metricDefinition.help}</Typography>}>\r\n <Typography align='center'>{title}</Typography>\r\n </MUITooltip>\r\n <IconButton onClick={(event) => setAnchorMenuChart(event.currentTarget)}><MoreVert fontSize='small'/></IconButton> \r\n { anchorMenuChart && <MenuChart onClose={() => setAnchorMenuChart(null)} optionSelected={menuChartOptionSelected} anchorMenu={anchorMenuChart} selected={chartType} stacked={stack} tooltip={tooltip} labels={labels} numSeries={props.numSeries} setDefault={false}/>}\r\n </Stack>\r\n <div style={{width:'100%'}}>\r\n <ResponsiveContainer width='100%' height={height} key={props.metricDefinition.metric+JSON.stringify(props.names)}>\r\n {result}\r\n </ResponsiveContainer>\r\n </div>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n )\r\n}\r\n"],"names":["props","height","MUITooltip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chart.esm.js","sources":["../../src/components/Chart.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { Alert, Card, CardContent, Stack, Typography } from '@mui/material'\r\nimport { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, LabelList, Legend, Line, LineChart, Pie, PieChart, ResponsiveContainer, Tooltip, Treemap, XAxis, YAxis } from 'recharts'\r\nimport { Tooltip as MUITooltip, IconButton } from '@mui/material'\r\nimport { MenuChart, MenuChartOption } from './MenuChart'\r\nimport { MoreVert } from '@material-ui/icons'\r\nimport { TreemapNode } from 'recharts/types/util/types'\r\nimport { MetricDefinition } from '@jfvilas/plugin-kwirth-common'\r\nimport { ChartType } from './ChartType'\r\n\r\nexport interface IMetricViewConfig {\r\n displayName: string\r\n chartType: ChartType\r\n tooltip: boolean\r\n labels: boolean\r\n stack: boolean\r\n}\r\n\r\nexport interface ISample {\r\n timestamp:string\r\n value:number\r\n}\r\n\r\nexport const METRICSCOLOURS = [\r\n \"#6e5bb8\", // morado oscuro\r\n \"#4a9076\", // verde oscuro\r\n \"#b56c52\", // naranja oscuro\r\n \"#7f6b97\", // color lavanda oscuro\r\n \"#b0528f\", // rosa oscuro\r\n \"#b0b052\", // amarillo oscuro\r\n \"#b05252\", // rojo oscuro\r\n \"#5285b0\", // azul oscuro\r\n \"#a38ad6\", // morado pastel\r\n \"#89c1a0\", // verde pastel\r\n \"#e4a28a\", // naranja pastel\r\n \"#b09dbd\", // lavanda pastel\r\n \"#e2a4c6\", // rosa pastel\r\n \"#c5c89e\", // amarillo pastel\r\n \"#e2a4a4\", // rojo pastel\r\n \"#90b7e2\", // azul pastel\r\n \"#f8d5e1\", // rosa claro pastel\r\n \"#b2d7f0\", // azul muy claro pastel\r\n \"#f7e1b5\", // amarillo muy claro pastel\r\n \"#d0f0c0\", // verde muy claro pastel\r\n \"#f5b0a1\", // coral pastel\r\n \"#d8a7db\", // lavanda muy claro pastel\r\n \"#f4c2c2\", // rosa suave pastel\r\n \"#e6c7b9\", // marron claro pastel\r\n \"#f0e2b6\", // crema pastel\r\n \"#a7c7e7\", // azul palido pastel\r\n \"#f5e6a5\", // amarillo palido pastel\r\n \"#e3c8f5\", // lilas pastel\r\n \"#d0c4e8\", // lila palido pastel\r\n \"#b8d8b8\", // verde claro pastel\r\n \"#d2ebfa\", // azul muy claro pastel\r\n \"#f1c1d2\" // rosa bebe pastel\r\n]\r\n\r\nexport interface IChartProps {\r\n metricDefinition: MetricDefinition,\r\n names: string[],\r\n series: ISample[][],\r\n colour: string,\r\n chartType: ChartType,\r\n stack: boolean\r\n tooltip: boolean\r\n labels: boolean\r\n numSeries: number\r\n viewConfig : IMetricViewConfig\r\n onSetDefault?: (name:string, mvc: IMetricViewConfig) => void\r\n}\r\n\r\nexport const Chart: React.FC<IChartProps> = (props:IChartProps) => {\r\n const [anchorMenuChart, setAnchorMenuChart] = useState<null | HTMLElement>(null)\r\n const [chartType, setChartType] = useState<ChartType>(props.viewConfig?.chartType? props.viewConfig.chartType : props.chartType)\r\n const [stack, setStack] = useState<boolean>(props.viewConfig?.stack? props.viewConfig.stack : props.stack)\r\n const [tooltip, setTooltip] = useState<boolean>(props.viewConfig?.tooltip? props.viewConfig.tooltip : props.tooltip)\r\n const [labels, setLabels] = useState<boolean>(props.viewConfig?.labels? props.viewConfig.labels : props.labels)\r\n\r\n let result\r\n let height=300\r\n let dataSummarized:any[]\r\n\r\n const mergeSeries = (names:string[], series:ISample[][]) => {\r\n // names is an array of names of series\r\n // series is an array of arrays of samples\r\n // example:\r\n // [default, ingress-nginx]\r\n // [ [ {timestamp:'dad',value:1}, {timestamp:'dad',value:2} ], [ {timestamp:'dad',value:4}, {timestamp:'dad',value:0} ] ]\r\n if (!names || names.length===0) return []\r\n let resultSeries = []\r\n\r\n for (var i=0; i<series[0].length; i++) {\r\n var item: { [key: string]: string|number } = {}\r\n for (var j=0; j<series.length; j++ ) {\r\n if (series[j][i]) {\r\n item['timestamp'] = series[0][i].timestamp\r\n item[names[j]] = series[j][i].value\r\n }\r\n }\r\n resultSeries.push(item)\r\n }\r\n\r\n // result is:\r\n // [ \r\n // {timestamp: '09:16:27', default: 0.21, ingress-nginx: 0.93}\r\n // {timestamp: '09:16:32', default: 0.5, ingress-nginx: 0.04}\r\n // ]\r\n return resultSeries\r\n }\r\n\r\n const CustomizedContent: React.FC<TreemapNode> = (props) => {\r\n const { root, depth, x, y, width, height, index, name } = props\r\n\r\n return (\r\n <g>\r\n <rect x={x} y={y} width={width} height={height}\r\n style={{\r\n fill: depth < 2 ? METRICSCOLOURS[Math.floor((index / root.children.length) * 6)] : '#ffffff00',\r\n stroke: '#fff',\r\n strokeWidth: 2 / (depth + 1e-10),\r\n strokeOpacity: 1 / (depth + 1e-10),\r\n }}\r\n />\r\n {depth === 1 ? (\r\n <text x={x + width / 2} y={y + height / 2 + 7} textAnchor=\"middle\" fill=\"#fff\" fontSize={14} fontFamily='Roboto, Helvetica, Arial, sans-serif'>\r\n {name}\r\n </text>\r\n ) : null}\r\n\r\n </g>\r\n )\r\n }\r\n\r\n const menuChartOptionSelected = (opt:MenuChartOption, data:any) => {\r\n setAnchorMenuChart(null)\r\n switch (opt) {\r\n case MenuChartOption.Stack:\r\n setStack(!stack)\r\n break\r\n case MenuChartOption.Remove:\r\n //+++ pending implementation on parent\r\n break\r\n case MenuChartOption.Export:\r\n if (!props.names?.length || !props.series?.length) return\r\n\r\n const headers = [\"timestamp\", ...props.names]\r\n const timestamps = props.series[0].map(point => point.timestamp)\r\n const rows = timestamps.map((timestamp, idx) => {\r\n const values = props.series.map(serie => serie[idx]?.value ?? \"\")\r\n return [timestamp, ...values];\r\n })\r\n const separator = \",\";\r\n const csvContent = headers.join(separator) + \"\\n\" + rows.map(r => r.join(separator)).join(\"\\n\")\r\n const blob = new Blob([\"\\uFEFF\" + csvContent], { type: \"text/csv;charset=utf-8;\" })\r\n \r\n const link = document.createElement(\"a\")\r\n link.href = URL.createObjectURL(blob)\r\n link.download = `${props.metricDefinition.metric}.csv`\r\n link.click()\r\n break\r\n case MenuChartOption.Tooltip:\r\n setTooltip(!tooltip)\r\n break\r\n case MenuChartOption.Labels:\r\n setLabels(!labels)\r\n break\r\n case MenuChartOption.Default:\r\n if (props.onSetDefault) {\r\n props.onSetDefault(props.metricDefinition.metric, {\r\n displayName: props.metricDefinition.metric,\r\n chartType: chartType,\r\n stack: stack,\r\n tooltip: tooltip,\r\n labels: labels\r\n })\r\n }\r\n break\r\n default:\r\n setChartType(data as ChartType)\r\n break\r\n } \r\n }\r\n\r\n const renderLabel = (data:any) => {\r\n var values:any[] = props.series.map (s => s[data.index])\r\n var total:number = values.reduce((acc,value) => acc+value.value, 0)\r\n return <text x={data.x + data.width/3.5} y={data.y-10}>{total.toPrecision(3).replace(/0+$/, '').replace(/\\.+$/, '')}</text>\r\n }\r\n\r\n switch (chartType) {\r\n case ChartType.ValueChart:\r\n result = (\r\n <div style={{padding:'30px', height:height*0.8, alignItems:'center', justifyContent:'center', display:'flex'}}>\r\n <Stack direction={'row'} alignItems={'center'} justifyContent={'center'} spacing={2} sx={{ flexWrap: 'wrap'}}>\r\n { props.series.map( (serie,index) => {\r\n let value = serie[serie.length-1].value\r\n if (!value) return\r\n let valueStr = value.toString()\r\n if (value) {\r\n valueStr = value.toFixed(3)\r\n if (value>10) valueStr=value.toFixed(2)\r\n if (value>100) valueStr=value.toFixed(1)\r\n if (value>1000) valueStr=value.toFixed(0)\r\n }\r\n return (\r\n <Stack key={index} direction={'column'}>\r\n <Typography mt={2} textAlign={'center'} width={'100%'} fontSize={Math.min(48, 192/props.series.length)} color={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n {valueStr}\r\n </Typography>\r\n <Typography textAlign={'center'} width={'100%'} fontSize={12} color={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n {props.names[index]}\r\n </Typography>\r\n </Stack>\r\n )\r\n })}\r\n </Stack>\r\n </div>\r\n )\r\n break\r\n case ChartType.LineChart:\r\n result = (\r\n <LineChart data={mergeSeries(props.names, props.series)}>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis/>\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) => <Line key={index} name={props.names[index]} type='monotone' dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} activeDot={{ r: 8 }} />) }\r\n </LineChart>\r\n )\r\n break\r\n case ChartType.AreaChart:\r\n result = (\r\n <AreaChart data={mergeSeries(props.names, props.series)}>\r\n <defs>\r\n {\r\n props.series.map( (_serie,index) => {\r\n return (\r\n <linearGradient key={index} id={`color${props.series.length===1?props.colour:METRICSCOLOURS[index]}`} x1='0' y1='0' x2='0' y2='1'>\r\n <stop offset='7%' stopColor={props.series.length===1?props.colour:METRICSCOLOURS[index]} stopOpacity={0.8}/>\r\n <stop offset='93%' stopColor={props.series.length===1?props.colour:METRICSCOLOURS[index]} stopOpacity={0}/>\r\n </linearGradient>\r\n )\r\n })\r\n }\r\n </defs>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis />\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) => \r\n <Area key={index} name={props.names[index]} type='monotone' {...(stack? {stackId:'1'}:{})} dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} fill={`url(#color${props.series.length===1?props.colour:METRICSCOLOURS[index]})`}/> )\r\n }\r\n </AreaChart>\r\n )\r\n break\r\n case ChartType.BarChart:\r\n result = (\r\n <BarChart data={mergeSeries(props.names, props.series)}>\r\n <CartesianGrid strokeDasharray='3 3'/>\r\n <XAxis dataKey='timestamp' fontSize={8}/>\r\n <YAxis />\r\n { tooltip && <Tooltip /> }\r\n <Legend/>\r\n { props.series.map ((_serie,index) =>\r\n <Bar key={index} name={props.names[index]} {...(stack? {stackId:'1'}:{})} dataKey={props.names[index]} stroke={props.series.length===1?props.colour:METRICSCOLOURS[index]} fill={props.series.length===1?props.colour:METRICSCOLOURS[index]}>\r\n { index === props.series.length-1 && props.series.length > 1 && labels ? <LabelList dataKey={props.names[index]} position='insideTop' content={renderLabel}/> : null }\r\n </Bar>\r\n )}\r\n </BarChart>\r\n )\r\n break\r\n case ChartType.PieChart:\r\n dataSummarized= props.names.map( (name,index) => {\r\n return { name, value:(props.series[index] as ISample[]).reduce((ac,val) => ac+val.value,0)}\r\n })\r\n result = (\r\n <PieChart>\r\n { tooltip && <Tooltip /> }\r\n <Legend layout='vertical' align='right' verticalAlign='middle'/>\r\n <Pie key={'asd'} data={dataSummarized} dataKey={'value'} fill={METRICSCOLOURS[0]} innerRadius={0} outerRadius={90}>\r\n {dataSummarized.map((_entry, index) => (\r\n <Cell key={`cell-${index}`} fill={METRICSCOLOURS[index % METRICSCOLOURS.length]} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n )\r\n break\r\n case ChartType.TreemapChart:\r\n dataSummarized = props.names.map( (name,index) => {\r\n return { name, value:(props.series[index] as ISample[]).reduce((ac,val) => ac+val.value,0)}\r\n })\r\n result = (\r\n <div style={{paddingLeft:'32px', height:height*0.8, alignItems:'center', justifyContent:'center', display:'flex'}}>\r\n <ResponsiveContainer width='100%'>\r\n <Treemap data={dataSummarized} dataKey='value' nameKey='name' aspectRatio={4 / 3} stroke=\"#ffffff\" fill=\"#6e5bb8\" content={React.createElement(CustomizedContent)}>\r\n { tooltip && <Tooltip /> }\r\n </Treemap>\r\n </ResponsiveContainer>\r\n </div>\r\n )\r\n break\r\n default:\r\n result = <Alert severity='error'>Unsupported chart type '{props.chartType}'</Alert>\r\n break\r\n }\r\n\r\n let title = props.metricDefinition.metric.replaceAll('_',' ')\r\n title = title[0].toLocaleUpperCase()+ title.substring(1)\r\n title = title.replaceAll('cpu', 'CPU')\r\n title = title.replaceAll(' fs ', ' FS ')\r\n title = title.replaceAll(' io ', ' IO ')\r\n title = title.replaceAll('oom', 'OOM')\r\n title = title.replaceAll('nvm', 'NVM')\r\n title = title.replaceAll('rss', 'RSS')\r\n title = title.replaceAll('failcnt', 'fail count')\r\n title = title.replaceAll('mbps', 'Mbps')\r\n\r\n // +++ review\r\n return (\r\n <Card sx={{paddingRight:'32px', width:'100%'}}>\r\n <CardContent>\r\n <Stack direction='column' alignItems='center' width='100%' sx={{mb:'32px'}}>\r\n <Stack direction={'row'} alignItems={'center'}>\r\n <MUITooltip key={'tooltip'+props.metricDefinition.metric+JSON.stringify(props.names)} title={<Typography style={{fontSize:12}}><b>{props.metricDefinition.metric}</b><br/><br/>{props.metricDefinition.help}</Typography>}>\r\n <Typography align='center'>{title}</Typography>\r\n </MUITooltip>\r\n <IconButton onClick={(event) => setAnchorMenuChart(event.currentTarget)}><MoreVert fontSize='small'/></IconButton> \r\n { anchorMenuChart && <MenuChart onClose={() => setAnchorMenuChart(null)} optionSelected={menuChartOptionSelected} anchorMenu={anchorMenuChart} selected={chartType} stacked={stack} tooltip={tooltip} labels={labels} numSeries={props.numSeries} setDefault={false}/>}\r\n </Stack>\r\n <div style={{width:'100%'}}>\r\n <ResponsiveContainer width='100%' height={height} key={props.metricDefinition.metric+JSON.stringify(props.names)}>\r\n {result}\r\n </ResponsiveContainer>\r\n </div>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n )\r\n}\r\n"],"names":["props","height","MUITooltip"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var ChartType = /* @__PURE__ */ ((ChartType2) => {
|
|
2
|
+
ChartType2["LineChart"] = "line";
|
|
3
|
+
ChartType2["BarChart"] = "bar";
|
|
4
|
+
ChartType2["AreaChart"] = "area";
|
|
5
|
+
ChartType2["ValueChart"] = "value";
|
|
6
|
+
ChartType2["PieChart"] = "pie";
|
|
7
|
+
ChartType2["TreemapChart"] = "treemap";
|
|
8
|
+
return ChartType2;
|
|
9
|
+
})(ChartType || {});
|
|
10
|
+
|
|
11
|
+
export { ChartType };
|
|
12
|
+
//# sourceMappingURL=ChartType.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartType.esm.js","sources":["../../src/components/ChartType.ts"],"sourcesContent":["export enum ChartType {\r\n LineChart='line',\r\n BarChart='bar',\r\n AreaChart='area',\r\n ValueChart='value',\r\n PieChart='pie',\r\n TreemapChart='treemap',\r\n}\r\n"],"names":["ChartType"],"mappings":"AAAO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACH,EAAAA,WAAA,WAAA,CAAA,GAAU,MAAA;AACV,EAAAA,WAAA,UAAA,CAAA,GAAS,KAAA;AACT,EAAAA,WAAA,WAAA,CAAA,GAAU,MAAA;AACV,EAAAA,WAAA,YAAA,CAAA,GAAW,OAAA;AACX,EAAAA,WAAA,UAAA,CAAA,GAAS,KAAA;AACT,EAAAA,WAAA,cAAA,CAAA,GAAa,SAAA;AANL,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;;;;"}
|
|
@@ -5,7 +5,7 @@ import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
|
5
5
|
import { isKwirthAvailable, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, getPodList, getContainerList } from '@jfvilas/plugin-kwirth-common';
|
|
6
6
|
import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
|
|
7
7
|
import { kwirthMetricsApiRef } from '../api/types.esm.js';
|
|
8
|
-
import {
|
|
8
|
+
import { ESignalMessageLevel, InstanceConfigScopeEnum, EInstanceMessageType, EOpsCommand, accessKeySerialize, InstanceMessageChannelEnum, EInstanceMessageFlow, EInstanceMessageAction, MetricsConfigModeEnum, EInstanceConfigView, EInstanceConfigObject } from '@jfvilas/kwirth-common';
|
|
9
9
|
import { ShowError, ComponentNotFound, ErrorType, ClusterList, KwirthNews, ObjectSelector, StatusLog } from '@jfvilas/plugin-kwirth-frontend';
|
|
10
10
|
import { Box, Grid, Card, CardHeader, Typography, FormControl, Select, MenuItem, Checkbox, IconButton } from '@material-ui/core';
|
|
11
11
|
import PlayIcon from '@material-ui/icons/PlayArrow';
|
|
@@ -18,8 +18,8 @@ import RefreshIcon from '@material-ui/icons/Refresh';
|
|
|
18
18
|
import KwirthMetricsLogo from '../assets/kwirthmetrics-logo.svg';
|
|
19
19
|
import { Options } from './Options.esm.js';
|
|
20
20
|
import { Chart, METRICSCOLOURS } from './Chart.esm.js';
|
|
21
|
-
import { ChartType } from './MenuChart.esm.js';
|
|
22
21
|
import { VERSION } from '../version.esm.js';
|
|
22
|
+
import { ChartType } from './ChartType.esm.js';
|
|
23
23
|
|
|
24
24
|
const EntityKwirthMetricsContent = (props) => {
|
|
25
25
|
const kwirthMetricsApi = useApi(kwirthMetricsApiRef);
|
|
@@ -49,7 +49,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
49
49
|
stack: false
|
|
50
50
|
});
|
|
51
51
|
const [showStatusDialog, setShowStatusDialog] = useState(false);
|
|
52
|
-
const [statusLevel, setStatusLevel] = useState(
|
|
52
|
+
const [statusLevel, setStatusLevel] = useState(ESignalMessageLevel.INFO);
|
|
53
53
|
const [backendVersion, setBackendVersion] = useState("");
|
|
54
54
|
const [backendInfo, setBackendInfo] = useState();
|
|
55
55
|
const [_refresh, setRefresh] = useState(0);
|
|
@@ -109,7 +109,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
109
109
|
setSelectedNamespaces(validNamespaces);
|
|
110
110
|
let podList = getPodList(cluster.pods, validNamespaces);
|
|
111
111
|
setSelectedPodNames(podList.map((pod) => pod.name));
|
|
112
|
-
setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map((pod) => pod.name), []));
|
|
112
|
+
setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map((pod) => pod.name), props.excludeContainers || []));
|
|
113
113
|
} else {
|
|
114
114
|
setSelectedNamespaces([]);
|
|
115
115
|
}
|
|
@@ -119,7 +119,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
119
119
|
const processMetricsMessage = (wsEvent) => {
|
|
120
120
|
let instanceMessage = JSON.parse(wsEvent.data);
|
|
121
121
|
switch (instanceMessage.type) {
|
|
122
|
-
case
|
|
122
|
+
case EInstanceMessageType.DATA:
|
|
123
123
|
let metricsMessage = instanceMessage;
|
|
124
124
|
if (metricsMessage.timestamp === 0) {
|
|
125
125
|
metricsMessage.timestamp = Date.now();
|
|
@@ -136,8 +136,8 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
138
|
break;
|
|
139
|
-
case
|
|
140
|
-
if (instanceMessage.flow ===
|
|
139
|
+
case EInstanceMessageType.SIGNAL:
|
|
140
|
+
if (instanceMessage.flow === EInstanceMessageFlow.RESPONSE && instanceMessage.action === EInstanceMessageAction.START) {
|
|
141
141
|
if (instanceMessage.instance !== "")
|
|
142
142
|
setInstance(instanceMessage.instance);
|
|
143
143
|
else {
|
|
@@ -151,13 +151,13 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
151
151
|
if (signalMessage.text) {
|
|
152
152
|
addMessage(signalMessage.level, signalMessage.text);
|
|
153
153
|
switch (signalMessage.level) {
|
|
154
|
-
case
|
|
154
|
+
case ESignalMessageLevel.INFO:
|
|
155
155
|
alertApi.post({ message: signalMessage.text, severity: "info", display: "transient" });
|
|
156
156
|
break;
|
|
157
|
-
case
|
|
157
|
+
case ESignalMessageLevel.WARNING:
|
|
158
158
|
alertApi.post({ message: signalMessage.text, severity: "warning", display: "transient" });
|
|
159
159
|
break;
|
|
160
|
-
case
|
|
160
|
+
case ESignalMessageLevel.ERROR:
|
|
161
161
|
alertApi.post({ message: signalMessage.text, severity: "error", display: "transient" });
|
|
162
162
|
break;
|
|
163
163
|
default:
|
|
@@ -168,7 +168,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
168
168
|
}
|
|
169
169
|
break;
|
|
170
170
|
default:
|
|
171
|
-
addMessage(
|
|
171
|
+
addMessage(ESignalMessageLevel.ERROR, "Invalid message type received: " + instanceMessage.type);
|
|
172
172
|
alertApi.post({ message: "Invalid message type received: " + instanceMessage.type, severity: "error", display: "transient" });
|
|
173
173
|
break;
|
|
174
174
|
}
|
|
@@ -189,9 +189,9 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
189
189
|
case InstanceMessageChannelEnum.OPS:
|
|
190
190
|
let opsMessage = instanceMessage;
|
|
191
191
|
if (opsMessage.data?.data)
|
|
192
|
-
addMessage(
|
|
192
|
+
addMessage(ESignalMessageLevel.WARNING, "Operations message: " + opsMessage.data.data);
|
|
193
193
|
else
|
|
194
|
-
addMessage(
|
|
194
|
+
addMessage(ESignalMessageLevel.WARNING, "Operations message: " + JSON.stringify(opsMessage));
|
|
195
195
|
break;
|
|
196
196
|
default:
|
|
197
197
|
console.log("Invalid channel in message: ", instanceMessage);
|
|
@@ -201,12 +201,12 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
201
201
|
const websocketOnOpen = (ws) => {
|
|
202
202
|
let cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
203
203
|
if (!cluster) {
|
|
204
|
-
addMessage(
|
|
204
|
+
addMessage(ESignalMessageLevel.ERROR, "Cluster not found");
|
|
205
205
|
return;
|
|
206
206
|
}
|
|
207
207
|
let pods = cluster.pods.filter((p2) => selectedNamespaces.includes(p2.namespace));
|
|
208
208
|
if (!pods || pods.length === 0) {
|
|
209
|
-
addMessage(
|
|
209
|
+
addMessage(ESignalMessageLevel.ERROR, "Pod not found");
|
|
210
210
|
return;
|
|
211
211
|
}
|
|
212
212
|
console.log(`WS connected`);
|
|
@@ -222,13 +222,13 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
222
222
|
}
|
|
223
223
|
var iConfig = {
|
|
224
224
|
channel: InstanceMessageChannelEnum.METRICS,
|
|
225
|
-
objects:
|
|
226
|
-
action:
|
|
227
|
-
flow:
|
|
225
|
+
objects: EInstanceConfigObject.PODS,
|
|
226
|
+
action: EInstanceMessageAction.START,
|
|
227
|
+
flow: EInstanceMessageFlow.REQUEST,
|
|
228
228
|
instance: "",
|
|
229
229
|
accessKey: accessKeySerialize(accessKey),
|
|
230
230
|
scope: InstanceConfigScopeEnum.STREAM,
|
|
231
|
-
view: selectedContainerNames.length > 0 ?
|
|
231
|
+
view: selectedContainerNames.length > 0 ? EInstanceConfigView.CONTAINER : EInstanceConfigView.POD,
|
|
232
232
|
namespace: selectedNamespaces.join(","),
|
|
233
233
|
group: "",
|
|
234
234
|
pod: selectedPodNames.join(","),
|
|
@@ -239,18 +239,18 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
239
239
|
metrics: selectedMetrics,
|
|
240
240
|
interval: kwirthMetricsOptionsRef.current.interval
|
|
241
241
|
},
|
|
242
|
-
type:
|
|
242
|
+
type: EInstanceMessageType.SIGNAL
|
|
243
243
|
};
|
|
244
244
|
ws.send(JSON.stringify(iConfig));
|
|
245
245
|
} else {
|
|
246
|
-
addMessage(
|
|
246
|
+
addMessage(ESignalMessageLevel.ERROR, "AccessKey has not been obtained");
|
|
247
247
|
return;
|
|
248
248
|
}
|
|
249
249
|
};
|
|
250
250
|
const startMetricsViewer = () => {
|
|
251
251
|
let cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
252
252
|
if (!cluster) {
|
|
253
|
-
addMessage(
|
|
253
|
+
addMessage(ESignalMessageLevel.ERROR, "Cluster not found");
|
|
254
254
|
return;
|
|
255
255
|
}
|
|
256
256
|
try {
|
|
@@ -260,7 +260,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
260
260
|
ws.onclose = (event) => websocketOnClose(event);
|
|
261
261
|
setWebsocket(ws);
|
|
262
262
|
} catch (err) {
|
|
263
|
-
addMessage(
|
|
263
|
+
addMessage(ESignalMessageLevel.ERROR, "Error starting websocket");
|
|
264
264
|
}
|
|
265
265
|
};
|
|
266
266
|
const websocketOnClose = (_event) => {
|
|
@@ -297,7 +297,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
297
297
|
const prepareText = (txt) => {
|
|
298
298
|
return txt ? txt.length > 25 ? txt.substring(0, 25) + "..." : txt : "N/A";
|
|
299
299
|
};
|
|
300
|
-
return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, prepareText(title))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: "-8px" } }, /* @__PURE__ */ React.createElement(IconButton, { title: "info", disabled: !statusMessages.some((m) => m.type ===
|
|
300
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, prepareText(title))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: "-8px" } }, /* @__PURE__ */ React.createElement(IconButton, { title: "info", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.INFO), onClick: () => show(ESignalMessageLevel.INFO) }, /* @__PURE__ */ React.createElement(InfoIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.INFO) ? "#1D63ED" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "warning", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.WARNING), onClick: () => show(ESignalMessageLevel.WARNING), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(WarningIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.WARNING) ? "gold" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "error", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.ERROR), onClick: () => show(ESignalMessageLevel.ERROR), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(ErrorIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.ERROR) ? "red" : "#BDBDBD" } }))));
|
|
301
301
|
};
|
|
302
302
|
const statusClear = (level) => {
|
|
303
303
|
setStatusMessages(statusMessages.filter((m) => m.level !== level));
|
|
@@ -353,10 +353,8 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
353
353
|
});
|
|
354
354
|
});
|
|
355
355
|
let rows = [];
|
|
356
|
-
console.log("render width", allCharts2.length, options.width);
|
|
357
356
|
for (var resultAsset of allCharts2) {
|
|
358
357
|
for (let i2 = 0; i2 < resultAsset.length; i2 += options.width) {
|
|
359
|
-
console.log("row", i2);
|
|
360
358
|
rows.push(resultAsset.slice(i2, i2 + options.width));
|
|
361
359
|
}
|
|
362
360
|
}
|
|
@@ -372,36 +370,36 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
372
370
|
setStatusMessages((prev) => [...prev, {
|
|
373
371
|
level,
|
|
374
372
|
text,
|
|
375
|
-
type:
|
|
373
|
+
type: EInstanceMessageType.SIGNAL
|
|
376
374
|
}]);
|
|
377
375
|
};
|
|
378
376
|
const onClickRestart = () => {
|
|
379
377
|
let cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
380
378
|
if (!cluster) {
|
|
381
|
-
addMessage(
|
|
379
|
+
addMessage(ESignalMessageLevel.ERROR, "No cluster selected");
|
|
382
380
|
return;
|
|
383
381
|
}
|
|
384
382
|
let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART);
|
|
385
383
|
if (!restartKey) {
|
|
386
|
-
addMessage(
|
|
384
|
+
addMessage(ESignalMessageLevel.ERROR, "No access key present");
|
|
387
385
|
return;
|
|
388
386
|
}
|
|
389
387
|
if (!instance) {
|
|
390
|
-
addMessage(
|
|
388
|
+
addMessage(ESignalMessageLevel.ERROR, "No instance has been established");
|
|
391
389
|
return;
|
|
392
390
|
}
|
|
393
391
|
let pods = cluster.pods.filter((pod) => selectedNamespaces.includes(pod.namespace));
|
|
394
392
|
for (let pod of pods) {
|
|
395
393
|
let om = {
|
|
396
394
|
msgtype: "opsmessage",
|
|
397
|
-
action:
|
|
398
|
-
flow:
|
|
399
|
-
type:
|
|
395
|
+
action: EInstanceMessageAction.COMMAND,
|
|
396
|
+
flow: EInstanceMessageFlow.IMMEDIATE,
|
|
397
|
+
type: EInstanceMessageType.DATA,
|
|
400
398
|
channel: InstanceMessageChannelEnum.OPS,
|
|
401
399
|
instance: "",
|
|
402
400
|
id: "1",
|
|
403
401
|
accessKey: accessKeySerialize(restartKey),
|
|
404
|
-
command:
|
|
402
|
+
command: EOpsCommand.RESTARTPOD,
|
|
405
403
|
namespace: pod.namespace,
|
|
406
404
|
group: "",
|
|
407
405
|
pod: pod.name,
|
|
@@ -411,9 +409,9 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
411
409
|
msgtype: "routemessage",
|
|
412
410
|
accessKey: accessKeySerialize(restartKey),
|
|
413
411
|
destChannel: InstanceMessageChannelEnum.OPS,
|
|
414
|
-
action:
|
|
415
|
-
flow:
|
|
416
|
-
type:
|
|
412
|
+
action: EInstanceMessageAction.ROUTE,
|
|
413
|
+
flow: EInstanceMessageFlow.IMMEDIATE,
|
|
414
|
+
type: EInstanceMessageType.SIGNAL,
|
|
417
415
|
channel: InstanceMessageChannelEnum.METRICS,
|
|
418
416
|
instance,
|
|
419
417
|
data: om
|
|
@@ -421,7 +419,7 @@ const EntityKwirthMetricsContent = (props) => {
|
|
|
421
419
|
websocket?.send(JSON.stringify(rm));
|
|
422
420
|
}
|
|
423
421
|
};
|
|
424
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, showError !== "" && /* @__PURE__ */ React.createElement(ShowError, { message: showError, onClose: () => setShowError("") }), loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/kwirth", annotation: [ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR] }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px", maxWidth: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources: validClusters, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { metricsOptions: kwirthMetricsOptionsRef.current, selectedNamespaces, selectedPodNames, selectedContainerNames, onChange: onChangeOptions, disabled: selectedNamespaces.length === 0 || paused.current }))), !props.hideVersion && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(KwirthNews, { latestVersions: backendInfo, backendVersion, ownVersion: VERSION }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, p: 1, marginLeft: "8px" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthMetricsLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, marginBottom: 8 } }, /* @__PURE__ */ React.createElement(CardHeader, { title: statusButtons(selectedClusterName), style: { marginTop: -4, marginBottom: 4, flexShrink: 0 }, action: actionButtons() }), /* @__PURE__ */ React.createElement(Grid, { container: true, style: { alignItems: "end" } }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "66%" } }, /* @__PURE__ */ React.createElement(Typography, { style: { marginLeft: 14 } }, /* @__PURE__ */ React.createElement(ObjectSelector, { cluster: validClusters.find((cluster) => cluster.name === selectedClusterName), onSelect: onSelectObject, disabled: selectedClusterName === "" || started || paused.current, selectedNamespaces, selectedPodNames, selectedContainerNames, scope: InstanceConfigScopeEnum.STREAM }))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "33%", marginLeft: 0, marginBottom: 6, maxWidth: "33%" } }, /* @__PURE__ */ React.createElement(FormControl, { style: { width: "100%" } }, /* @__PURE__ */ React.createElement(Select, { value: selectedMetrics, MenuProps: { variant: "menu" }, multiple: true, onChange: onMetricsChange, renderValue: (selected) => selected.join(", ").substring(0, 40) + "...", disabled: selectedClusterName === "" || selectedNamespaces.length === 0 || started }, allMetrics.map(
|
|
422
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, showError !== "" && /* @__PURE__ */ React.createElement(ShowError, { message: showError, onClose: () => setShowError("") }), loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/kwirth", annotation: [ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR] }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px", maxWidth: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources: validClusters, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { metricsOptions: kwirthMetricsOptionsRef.current, selectedNamespaces, selectedPodNames, selectedContainerNames, onChange: onChangeOptions, disabled: selectedNamespaces.length === 0 || paused.current }))), !props.hideVersion && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(KwirthNews, { latestVersions: backendInfo, backendVersion, ownVersion: VERSION }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, p: 1, marginLeft: "8px" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthMetricsLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, marginBottom: 8 } }, /* @__PURE__ */ React.createElement(CardHeader, { title: statusButtons(selectedClusterName), style: { marginTop: -4, marginBottom: 4, flexShrink: 0 }, action: actionButtons() }), /* @__PURE__ */ React.createElement(Grid, { container: true, style: { alignItems: "end" } }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "66%" } }, /* @__PURE__ */ React.createElement(Typography, { style: { marginLeft: 14 } }, /* @__PURE__ */ React.createElement(ObjectSelector, { cluster: validClusters.find((cluster) => cluster.name === selectedClusterName), onSelect: onSelectObject, disabled: selectedClusterName === "" || started || paused.current, selectedNamespaces, selectedPodNames, selectedContainerNames, scope: InstanceConfigScopeEnum.STREAM, excludeCotainers: props.excludeContainers }))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "33%", marginLeft: 0, marginBottom: 6, maxWidth: "33%" } }, /* @__PURE__ */ React.createElement(FormControl, { style: { width: "100%" } }, /* @__PURE__ */ React.createElement(Select, { value: selectedMetrics, MenuProps: { variant: "menu" }, multiple: true, onChange: onMetricsChange, renderValue: (selected) => selected.join(", ").substring(0, 40) + "...", disabled: selectedClusterName === "" || selectedNamespaces.length === 0 || started }, allMetrics.map(
|
|
425
423
|
(m) => /* @__PURE__ */ React.createElement(MenuItem, { key: m.metric, value: m.metric, style: { marginTop: "-8px", marginBottom: "-8px" } }, /* @__PURE__ */ React.createElement(Checkbox, { checked: selectedMetrics.includes(m.metric), style: { marginTop: "-8px", marginBottom: "-8px" } }), /* @__PURE__ */ React.createElement(Typography, { style: { marginTop: "-8px", marginBottom: "-8px" } }, m.metric))
|
|
426
424
|
)))))), showMetrics(kwirthMetricsOptionsRef.current)))), showStatusDialog && /* @__PURE__ */ React.createElement(StatusLog, { level: statusLevel, onClose: () => setShowStatusDialog(false), statusMessages, onClear: statusClear }));
|
|
427
425
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityKwirthMetricsContent.esm.js","sources":["../../src/components/EntityKwirthMetricsContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { isKwirthAvailable, ClusterValidPods, PodData, IStatusLine, MetricDefinition, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, IBackendInfo, getPodList, getContainerList } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthMetrics\r\nimport { kwirthMetricsApiRef } from '../api'\r\nimport { accessKeySerialize, MetricsConfigModeEnum, MetricsMessage, InstanceMessageActionEnum, InstanceMessageFlowEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, IInstanceMessage, InstanceMessageTypeEnum, ISignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageChannelEnum, OpsCommandEnum, IOpsMessageResponse, IOpsMessage, IRouteMessage } from '@jfvilas/kwirth-common'\r\nimport { ClusterList, ObjectSelector, ShowError, StatusLog, KwirthNews, ComponentNotFound, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\n\r\n// Material-UI\r\nimport { Box, Checkbox, FormControl, Grid, MenuItem, Select, Card, CardHeader, IconButton, Typography } from '@material-ui/core'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\nimport KwirthMetricsLogo from '../assets/kwirthmetrics-logo.svg'\r\n\r\nimport { IMetricsOptions } from './IOptions'\r\nimport { Options } from './Options'\r\nimport { Chart, IMetricViewConfig, METRICSCOLOURS } from './Chart'\r\nimport { ChartType } from './MenuChart'\r\nimport { VERSION } from '../version'\r\n\r\nexport interface IKwirthMetricsProps {\r\n allMetrics: boolean\r\n enableRestart: boolean\r\n width?: number\r\n depth?: number\r\n interval?: number\r\n chart?: ChartType\r\n defaultMetrics?: string[]\r\n hideVersion?: boolean\r\n}\r\n\r\nexport const EntityKwirthMetricsContent: React.FC<IKwirthMetricsProps> = (props:IKwirthMetricsProps) : JSX.Element => { \r\n const kwirthMetricsApi = useApi(kwirthMetricsApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const { entity } = useEntity()\r\n const [validClusters, setValidClusters] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [selectedMetrics, setSelectedMetrics] = useState<string[]>(props.defaultMetrics? props.defaultMetrics : [])\r\n const [showError, setShowError] = useState('')\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [metricsMessages, setMetricsMessages] = useState<MetricsMessage[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthMetricsOptionsRef = useRef<IMetricsOptions>({\r\n depth: props.depth !==undefined? props.depth : 10,\r\n width: props.width !==undefined? props.width : 3,\r\n interval: props.interval !==undefined? props.interval : 15,\r\n chart: props.chart !==undefined? props.chart : ChartType.AreaChart,\r\n aggregate:false,\r\n merge:false,\r\n stack:false\r\n })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const [backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const [_refresh,setRefresh] = useState(0)\r\n const [allMetrics, setAllMetrics] = useState<MetricDefinition[]>(\r\n [\r\n {metric:'kwirth_container_memory_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_cpu_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_mbps',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_mbps',help:'',eval:'',type:'counter'}\r\n ])\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthMetricsApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthMetricsApi.getInfo())\r\n let reqScopes = [InstanceConfigScopeEnum.STREAM]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data = await kwirthMetricsApi.requestAccess(entity,'metrics', reqScopes)\r\n setValidClusters(data)\r\n })\r\n\r\n const clickStart = () => {\r\n if (!paused.current) {\r\n setMetricsMessages([])\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startMetricsViewer()\r\n }\r\n else {\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const clickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopMetricsViewer()\r\n }\r\n\r\n const onSelectCluster = async (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n let cluster = validClusters.find(cluster => cluster.name === clusterName)\r\n\r\n if (cluster && cluster.pods && cluster.metrics) {\r\n cluster.metrics.sort( (a,_b) => a.metric.startsWith('kwirth')? -1:1)\r\n setAllMetrics(cluster.metrics)\r\n\r\n let validNamespaces = Array.from(new Set(cluster.pods.map(pod => pod.namespace)))\r\n if (validNamespaces.length === 1) {\r\n setSelectedNamespaces(validNamespaces)\r\n let podList = getPodList (cluster.pods, validNamespaces)\r\n setSelectedPodNames(podList.map(pod => pod.name))\r\n setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map(pod => pod.name), []))\r\n }\r\n else {\r\n setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n const processMetricsMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n switch (instanceMessage.type) {\r\n case InstanceMessageTypeEnum.DATA:\r\n let metricsMessage = instanceMessage as MetricsMessage\r\n if (metricsMessage.timestamp===0) { // initial metrics values\r\n metricsMessage.timestamp = Date.now()\r\n setMetricsMessages([metricsMessage])\r\n }\r\n else {\r\n setMetricsMessages((prev) => {\r\n while (prev.length>kwirthMetricsOptionsRef.current.depth) {\r\n prev.splice(0,1)\r\n }\r\n if (paused.current)\r\n return prev\r\n else\r\n return [ ...prev, metricsMessage ]\r\n })\r\n }\r\n break\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case SignalMessageLevelEnum.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n \r\n const websocketOnChunk = (wsEvent:any) => {\r\n let instanceMessage:IInstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.METRICS:\r\n processMetricsMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n console.log('Invalid channel in message: ', instanceMessage)\r\n break\r\n }\r\n\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket) => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods || pods.length===0) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Pod not found')\r\n return\r\n }\r\n\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.STREAM)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n var iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.STREAM,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.join(','),\r\n container: containers.join(','),\r\n data: {\r\n mode: MetricsConfigModeEnum.STREAM,\r\n aggregate: kwirthMetricsOptionsRef.current.aggregate,\r\n metrics: selectedMetrics,\r\n interval: kwirthMetricsOptionsRef.current.interval\r\n },\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'AccessKey has not been obtained')\r\n return\r\n }\r\n }\r\n\r\n const startMetricsViewer = () => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws)\r\n ws.onmessage = (event) => websocketOnChunk(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Error starting websocket')\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected from remote`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopMetricsViewer = () => {\r\n websocket?.close()\r\n }\r\n\r\n const onChangeOptions = (options:IMetricsOptions) => {\r\n console.log('change')\r\n kwirthMetricsOptionsRef.current=options\r\n setRefresh(Math.random())\r\n }\r\n \r\n const actionButtons = () => {\r\n let hasStreamKey = false, hasRestartKey = false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasStreamKey = Boolean(cluster.accessKeys.has(InstanceConfigScopeEnum.STREAM))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton onClick={clickStart} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || selectedMetrics.length==0 || !hasStreamKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={clickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length === 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const onMetricsChange = (event:any) => {\r\n setSelectedMetrics(event.target.value)\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n const prepareText = (txt:string|undefined) => {\r\n return txt? (txt.length>25? txt.substring(0,25)+\"...\":txt) : 'N/A'\r\n }\r\n\r\n return (\r\n <Grid container direction='row'>\r\n <Grid item>\r\n <Typography variant='h5'>{prepareText(title)}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'gold':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n\r\n const showMetrics = (options: IMetricsOptions) => {\r\n if (!metricsMessages || metricsMessages.length === 0) {\r\n if (selectedNamespaces.length === 0) \r\n return <Typography>Select namespace chip on top.</Typography>\r\n else\r\n return <>\r\n {started?<Typography>Waiting for first data, be patient...</Typography>:<Typography>Configure <b>chart options</b>, select some <b>metrics on top</b>, and <b>press PLAY</b> on top-right button to start viewing.</Typography>}\r\n </>\r\n }\r\n\r\n let cluster = validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) return\r\n\r\n let data:Map<string, Map<string, { timestamp:string, value:number}[]>> = new Map()\r\n for (let metricsMessage of metricsMessages) {\r\n let ts = new Date(metricsMessage.timestamp)\r\n let timestamp = `${ts.getHours().toString().padStart(2,'0')}:${ts.getMinutes().toString().padStart(2,'0')}:${ts.getSeconds().toString().padStart(2,'0')}`\r\n for (var i=0;i<metricsMessage.assets.length;i++) {\r\n var assetName=metricsMessage.assets[i].assetName\r\n for (var metrics of metricsMessage.assets[i].values) {\r\n if (!data.has(assetName)) data.set(assetName, new Map())\r\n if (!data.get(assetName)?.has(metrics.metricName)) data.get(assetName)?.set(metrics.metricName,[])\r\n data.get(assetName)?.get(metrics.metricName)?.push({timestamp, value:metrics.metricValue})\r\n }\r\n } \r\n }\r\n\r\n let allCharts:any[] = []\r\n if (options.merge) {\r\n var assetNames=Array.from(data.keys())\r\n var firstAsset=assetNames[0]\r\n var allMetrics:string[] = Array.from(new Set(data.get(firstAsset)!.keys()))\r\n\r\n for (let metric of allMetrics) {\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n let series = assetNames.map(assetName => {\r\n return data.get(assetName)!.get(metric)!\r\n })\r\n allCharts.push(\r\n <Chart key={metricDefinition.metric} metricDefinition={metricDefinition} names={assetNames} series={series} colour={''} chartType={options.chart} stack={options.stack} numSeries={series.length} tooltip={true} labels={true} viewConfig={{} as IMetricViewConfig}/>\r\n )\r\n }\r\n\r\n let rows = []\r\n for (let i = 0; i < allCharts.length; i += options.width) {\r\n rows.push(allCharts.slice(i, i + options.width))\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ width:'100%', display: 'flex', justifyContent: 'space-around', gap:8, marginTop: 12 }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n else {\r\n let allCharts = Array.from(data.keys()!).map( (asset, index) => {\r\n return Array.from(data.get(asset)?.keys()!).map ( metric => {\r\n var series = data.get(asset)?.get(metric)!\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n return <Chart key={metricDefinition.metric} metricDefinition={metricDefinition} names={[asset]} series={[series]} colour={METRICSCOLOURS[index]} chartType={options.chart} stack={options.stack} numSeries={series.length} labels={true} tooltip={true} viewConfig={{} as IMetricViewConfig}/>\r\n })\r\n })\r\n\r\n // convert allResults (a list of charts) into a series of rows of charts\r\n let rows = []\r\n console.log('render width', allCharts.length, options.width)\r\n for (var resultAsset of allCharts) {\r\n for (let i = 0; i < resultAsset.length; i += options.width) {\r\n console.log('row', i, )\r\n rows.push(resultAsset.slice(i, i + options.width))\r\n }\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ width:'100%', display: 'flex', justifyContent: 'space-around', gap:8, marginTop: 12 }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n }\r\n\r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }])\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'metrics' to channel 'ops'\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n\r\n let pods:PodData[] = (cluster.pods as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let om:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: InstanceMessageActionEnum.COMMAND,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: OpsCommandEnum.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let rm: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: InstanceMessageActionEnum.ROUTE,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n instance: instance,\r\n data: om\r\n }\r\n websocket?.send(JSON.stringify(rm))\r\n }\r\n }\r\n\r\n return (<>\r\n { showError!=='' && <ShowError message={showError} onClose={() => setShowError('')}/> }\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/kwirth' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)>0 &&\r\n <Box sx={{ display: 'flex'}}>\r\n <Box sx={{ width: '200px', maxWidth:'200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item>\r\n <Card>\r\n <ClusterList resources={validClusters} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options metricsOptions={kwirthMetricsOptionsRef.current!} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} onChange={onChangeOptions} disabled={selectedNamespaces.length === 0 || paused.current}/>\r\n </Card>\r\n </Grid>\r\n {!props.hideVersion &&\r\n <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\r\n }\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthMetricsLogo} alt=\"No cluster selected\" style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{marginTop:-8, marginBottom:8}}>\r\n <CardHeader title={statusButtons(selectedClusterName)} style={{marginTop:-4, marginBottom:4, flexShrink:0}} action={actionButtons()} />\r\n \r\n <Grid container style={{alignItems:'end'}}>\r\n <Grid item style={{width:'66%'}}>\r\n <Typography style={{marginLeft:14}}>\r\n <ObjectSelector cluster={validClusters.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} scope={InstanceConfigScopeEnum.STREAM}/>\r\n </Typography>\r\n </Grid>\r\n <Grid item style={{width:'33%', marginLeft:0, marginBottom:6, maxWidth:'33%' }}>\r\n <FormControl style={{width:'100%'}}>\r\n <Select value={selectedMetrics} MenuProps={{variant:'menu'}} multiple onChange={onMetricsChange} renderValue={(selected) => (selected as string[]).join(', ').substring(0,40)+'...'} disabled={selectedClusterName === '' || selectedNamespaces.length === 0 || started}>\r\n {\r\n allMetrics.map(m => \r\n <MenuItem key={m.metric} value={m.metric} style={{marginTop:'-8px', marginBottom:'-8px'}}>\r\n <Checkbox checked={selectedMetrics.includes(m.metric)} style={{marginTop:'-8px', marginBottom:'-8px'}}/>\r\n <Typography style={{marginTop:'-8px', marginBottom:'-8px'}}>{m.metric}</Typography>\r\n </MenuItem>\r\n )\r\n }\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n </Card>\r\n { showMetrics(kwirthMetricsOptionsRef.current) }\r\n </>}\r\n\r\n\r\n </Box> \r\n </Box>\r\n }\r\n\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p","allMetrics","assetName","i","allCharts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityKwirthMetricsContent.esm.js","sources":["../../src/components/EntityKwirthMetricsContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { isKwirthAvailable, ClusterValidPods, PodData, IStatusLine, MetricDefinition, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, IBackendInfo, getPodList, getContainerList } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthMetrics\r\nimport { kwirthMetricsApiRef } from '../api'\r\nimport { accessKeySerialize, MetricsConfigModeEnum, MetricsMessage, EInstanceMessageAction, EInstanceMessageFlow, InstanceConfigScopeEnum, EInstanceConfigView, IInstanceMessage, EInstanceMessageType, ISignalMessage, ESignalMessageLevel, EInstanceConfigObject, IInstanceConfig, InstanceMessageChannelEnum, IOpsMessageResponse, IOpsMessage, IRouteMessage, EOpsCommand } from '@jfvilas/kwirth-common'\r\nimport { ClusterList, ObjectSelector, ShowError, StatusLog, KwirthNews, ComponentNotFound, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\n\r\n// Material-UI\r\nimport { Box, Checkbox, FormControl, Grid, MenuItem, Select, Card, CardHeader, IconButton, Typography } from '@material-ui/core'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\nimport KwirthMetricsLogo from '../assets/kwirthmetrics-logo.svg'\r\n\r\nimport { IMetricsOptions } from './IOptions'\r\nimport { Options } from './Options'\r\nimport { Chart, IMetricViewConfig, METRICSCOLOURS } from './Chart'\r\nimport { VERSION } from '../version'\r\nimport { ChartType } from './ChartType'\r\n\r\nexport interface IKwirthMetricsProps {\r\n allMetrics: boolean\r\n enableRestart: boolean\r\n width?: number\r\n depth?: number\r\n interval?: number\r\n chart?: ChartType\r\n hideVersion?: boolean\r\n excludeContainers?: string[]\r\n defaultMetrics?: string[]\r\n}\r\n\r\nexport const EntityKwirthMetricsContent: React.FC<IKwirthMetricsProps> = (props:IKwirthMetricsProps) : JSX.Element => { \r\n const kwirthMetricsApi = useApi(kwirthMetricsApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const { entity } = useEntity()\r\n const [validClusters, setValidClusters] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [selectedMetrics, setSelectedMetrics] = useState<string[]>(props.defaultMetrics? props.defaultMetrics : [])\r\n const [showError, setShowError] = useState('')\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [metricsMessages, setMetricsMessages] = useState<MetricsMessage[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthMetricsOptionsRef = useRef<IMetricsOptions>({\r\n depth: props.depth !==undefined? props.depth : 10,\r\n width: props.width !==undefined? props.width : 3,\r\n interval: props.interval !==undefined? props.interval : 15,\r\n chart: props.chart !==undefined? props.chart : ChartType.AreaChart,\r\n aggregate:false,\r\n merge:false,\r\n stack:false\r\n })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<ESignalMessageLevel>(ESignalMessageLevel.INFO)\r\n const [backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const [_refresh,setRefresh] = useState(0)\r\n const [allMetrics, setAllMetrics] = useState<MetricDefinition[]>(\r\n [\r\n {metric:'kwirth_container_memory_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_cpu_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_mbps',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_mbps',help:'',eval:'',type:'counter'}\r\n ])\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthMetricsApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthMetricsApi.getInfo())\r\n let reqScopes = [InstanceConfigScopeEnum.STREAM]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data = await kwirthMetricsApi.requestAccess(entity,'metrics', reqScopes)\r\n setValidClusters(data)\r\n })\r\n\r\n const clickStart = () => {\r\n if (!paused.current) {\r\n setMetricsMessages([])\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startMetricsViewer()\r\n }\r\n else {\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const clickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopMetricsViewer()\r\n }\r\n\r\n const onSelectCluster = async (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n let cluster = validClusters.find(cluster => cluster.name === clusterName)\r\n\r\n if (cluster && cluster.pods && cluster.metrics) {\r\n cluster.metrics.sort( (a,_b) => a.metric.startsWith('kwirth')? -1:1)\r\n setAllMetrics(cluster.metrics)\r\n\r\n let validNamespaces = Array.from(new Set(cluster.pods.map(pod => pod.namespace)))\r\n if (validNamespaces.length === 1) {\r\n setSelectedNamespaces(validNamespaces)\r\n let podList = getPodList (cluster.pods, validNamespaces)\r\n setSelectedPodNames(podList.map(pod => pod.name))\r\n setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map(pod => pod.name), props.excludeContainers || []))\r\n }\r\n else {\r\n setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n const processMetricsMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n switch (instanceMessage.type) {\r\n case EInstanceMessageType.DATA:\r\n let metricsMessage = instanceMessage as MetricsMessage\r\n if (metricsMessage.timestamp===0) { // initial metrics values\r\n metricsMessage.timestamp = Date.now()\r\n setMetricsMessages([metricsMessage])\r\n }\r\n else {\r\n setMetricsMessages((prev) => {\r\n while (prev.length>kwirthMetricsOptionsRef.current.depth) {\r\n prev.splice(0,1)\r\n }\r\n if (paused.current)\r\n return prev\r\n else\r\n return [ ...prev, metricsMessage ]\r\n })\r\n }\r\n break\r\n case EInstanceMessageType.SIGNAL:\r\n if (instanceMessage.flow === EInstanceMessageFlow.RESPONSE && instanceMessage.action === EInstanceMessageAction.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case ESignalMessageLevel.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case ESignalMessageLevel.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case ESignalMessageLevel.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(ESignalMessageLevel.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n \r\n const websocketOnChunk = (wsEvent:any) => {\r\n let instanceMessage:IInstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.METRICS:\r\n processMetricsMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (ESignalMessageLevel.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (ESignalMessageLevel.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n console.log('Invalid channel in message: ', instanceMessage)\r\n break\r\n }\r\n\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket) => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR, 'Cluster not found')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods || pods.length===0) {\r\n addMessage(ESignalMessageLevel.ERROR, 'Pod not found')\r\n return\r\n }\r\n\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.STREAM)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n var iConfig:IInstanceConfig = {\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n objects: EInstanceConfigObject.PODS,\r\n action: EInstanceMessageAction.START,\r\n flow: EInstanceMessageFlow.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.STREAM,\r\n view: (selectedContainerNames.length > 0 ? EInstanceConfigView.CONTAINER : EInstanceConfigView.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.join(','),\r\n container: containers.join(','),\r\n data: {\r\n mode: MetricsConfigModeEnum.STREAM,\r\n aggregate: kwirthMetricsOptionsRef.current.aggregate,\r\n metrics: selectedMetrics,\r\n interval: kwirthMetricsOptionsRef.current.interval\r\n },\r\n type: EInstanceMessageType.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(ESignalMessageLevel.ERROR, 'AccessKey has not been obtained')\r\n return\r\n }\r\n }\r\n\r\n const startMetricsViewer = () => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR, 'Cluster not found')\r\n return\r\n }\r\n\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws)\r\n ws.onmessage = (event) => websocketOnChunk(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n addMessage(ESignalMessageLevel.ERROR, 'Error starting websocket')\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected from remote`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopMetricsViewer = () => {\r\n websocket?.close()\r\n }\r\n\r\n const onChangeOptions = (options:IMetricsOptions) => {\r\n console.log('change')\r\n kwirthMetricsOptionsRef.current=options\r\n setRefresh(Math.random())\r\n }\r\n \r\n const actionButtons = () => {\r\n let hasStreamKey = false, hasRestartKey = false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasStreamKey = Boolean(cluster.accessKeys.has(InstanceConfigScopeEnum.STREAM))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton onClick={clickStart} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || selectedMetrics.length==0 || !hasStreamKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={clickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length === 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const onMetricsChange = (event:any) => {\r\n setSelectedMetrics(event.target.value)\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:ESignalMessageLevel) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n const prepareText = (txt:string|undefined) => {\r\n return txt? (txt.length>25? txt.substring(0,25)+\"...\":txt) : 'N/A'\r\n }\r\n\r\n return (\r\n <Grid container direction='row'>\r\n <Grid item>\r\n <Typography variant='h5'>{prepareText(title)}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.INFO)} onClick={() => show(ESignalMessageLevel.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.INFO)?'#1D63ED':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.WARNING)} onClick={() => show(ESignalMessageLevel.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.WARNING)?'gold':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.ERROR)} onClick={() => show(ESignalMessageLevel.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type=== EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: ESignalMessageLevel) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n\r\n const showMetrics = (options: IMetricsOptions) => {\r\n if (!metricsMessages || metricsMessages.length === 0) {\r\n if (selectedNamespaces.length === 0) \r\n return <Typography>Select namespace chip on top.</Typography>\r\n else\r\n return <>\r\n {started?<Typography>Waiting for first data, be patient...</Typography>:<Typography>Configure <b>chart options</b>, select some <b>metrics on top</b>, and <b>press PLAY</b> on top-right button to start viewing.</Typography>}\r\n </>\r\n }\r\n\r\n let cluster = validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) return\r\n\r\n let data:Map<string, Map<string, { timestamp:string, value:number}[]>> = new Map()\r\n for (let metricsMessage of metricsMessages) {\r\n let ts = new Date(metricsMessage.timestamp)\r\n let timestamp = `${ts.getHours().toString().padStart(2,'0')}:${ts.getMinutes().toString().padStart(2,'0')}:${ts.getSeconds().toString().padStart(2,'0')}`\r\n for (var i=0;i<metricsMessage.assets.length;i++) {\r\n var assetName=metricsMessage.assets[i].assetName\r\n for (var metrics of metricsMessage.assets[i].values) {\r\n if (!data.has(assetName)) data.set(assetName, new Map())\r\n if (!data.get(assetName)?.has(metrics.metricName)) data.get(assetName)?.set(metrics.metricName,[])\r\n data.get(assetName)?.get(metrics.metricName)?.push({timestamp, value:metrics.metricValue})\r\n }\r\n } \r\n }\r\n\r\n let allCharts:any[] = []\r\n if (options.merge) {\r\n var assetNames=Array.from(data.keys())\r\n var firstAsset=assetNames[0]\r\n var allMetrics:string[] = Array.from(new Set(data.get(firstAsset)!.keys()))\r\n\r\n for (let metric of allMetrics) {\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n let series = assetNames.map(assetName => {\r\n return data.get(assetName)!.get(metric)!\r\n })\r\n allCharts.push(\r\n <Chart key={metricDefinition.metric} metricDefinition={metricDefinition} names={assetNames} series={series} colour={''} chartType={options.chart} stack={options.stack} numSeries={series.length} tooltip={true} labels={true} viewConfig={{} as IMetricViewConfig}/>\r\n )\r\n }\r\n\r\n let rows = []\r\n for (let i = 0; i < allCharts.length; i += options.width) {\r\n rows.push(allCharts.slice(i, i + options.width))\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ width:'100%', display: 'flex', justifyContent: 'space-around', gap:8, marginTop: 12 }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n else {\r\n let allCharts = Array.from(data.keys()!).map( (asset, index) => {\r\n return Array.from(data.get(asset)?.keys()!).map ( metric => {\r\n var series = data.get(asset)?.get(metric)!\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n return <Chart key={metricDefinition.metric} metricDefinition={metricDefinition} names={[asset]} series={[series]} colour={METRICSCOLOURS[index]} chartType={options.chart} stack={options.stack} numSeries={series.length} labels={true} tooltip={true} viewConfig={{} as IMetricViewConfig}/>\r\n })\r\n })\r\n\r\n // convert allResults (a list of charts) into a series of rows of charts\r\n let rows = []\r\n for (var resultAsset of allCharts) {\r\n for (let i = 0; i < resultAsset.length; i += options.width) {\r\n rows.push(resultAsset.slice(i, i + options.width))\r\n }\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ width:'100%', display: 'flex', justifyContent: 'space-around', gap:8, marginTop: 12 }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n }\r\n\r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const addMessage = (level:ESignalMessageLevel, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: EInstanceMessageType.SIGNAL\r\n }])\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'metrics' to channel 'ops'\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(ESignalMessageLevel.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(ESignalMessageLevel.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n\r\n let pods:PodData[] = (cluster.pods as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let om:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: EInstanceMessageAction.COMMAND,\r\n flow: EInstanceMessageFlow.IMMEDIATE,\r\n type: EInstanceMessageType.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: EOpsCommand.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let rm: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: EInstanceMessageAction.ROUTE,\r\n flow: EInstanceMessageFlow.IMMEDIATE,\r\n type: EInstanceMessageType.SIGNAL,\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n instance: instance,\r\n data: om\r\n }\r\n websocket?.send(JSON.stringify(rm))\r\n }\r\n }\r\n\r\n return (<>\r\n { showError!=='' && <ShowError message={showError} onClose={() => setShowError('')}/> }\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/kwirth' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)>0 &&\r\n <Box sx={{ display: 'flex'}}>\r\n <Box sx={{ width: '200px', maxWidth:'200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item>\r\n <Card>\r\n <ClusterList resources={validClusters} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options metricsOptions={kwirthMetricsOptionsRef.current!} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} onChange={onChangeOptions} disabled={selectedNamespaces.length === 0 || paused.current}/>\r\n </Card>\r\n </Grid>\r\n {!props.hideVersion &&\r\n <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\r\n }\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthMetricsLogo} alt=\"No cluster selected\" style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{marginTop:-8, marginBottom:8}}>\r\n <CardHeader title={statusButtons(selectedClusterName)} style={{marginTop:-4, marginBottom:4, flexShrink:0}} action={actionButtons()} />\r\n \r\n <Grid container style={{alignItems:'end'}}>\r\n <Grid item style={{width:'66%'}}>\r\n <Typography style={{marginLeft:14}}>\r\n <ObjectSelector cluster={validClusters.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} scope={InstanceConfigScopeEnum.STREAM} excludeCotainers={props.excludeContainers}/>\r\n </Typography>\r\n </Grid>\r\n <Grid item style={{width:'33%', marginLeft:0, marginBottom:6, maxWidth:'33%' }}>\r\n <FormControl style={{width:'100%'}}>\r\n <Select value={selectedMetrics} MenuProps={{variant:'menu'}} multiple onChange={onMetricsChange} renderValue={(selected) => (selected as string[]).join(', ').substring(0,40)+'...'} disabled={selectedClusterName === '' || selectedNamespaces.length === 0 || started}>\r\n {\r\n allMetrics.map(m => \r\n <MenuItem key={m.metric} value={m.metric} style={{marginTop:'-8px', marginBottom:'-8px'}}>\r\n <Checkbox checked={selectedMetrics.includes(m.metric)} style={{marginTop:'-8px', marginBottom:'-8px'}}/>\r\n <Typography style={{marginTop:'-8px', marginBottom:'-8px'}}>{m.metric}</Typography>\r\n </MenuItem>\r\n )\r\n }\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n </Card>\r\n { showMetrics(kwirthMetricsOptionsRef.current) }\r\n </>}\r\n\r\n\r\n </Box> \r\n </Box>\r\n }\r\n\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p","allMetrics","assetName","i","allCharts"],"mappings":"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"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Menu, MenuList, MenuItem, Divider } from '@mui/material';
|
|
3
3
|
import { ShowChart, Assessment, BarChart, PieChart, ExposurePlus2, ViewQuilt, Timeline, Info, LocalOffer, DoneAll, ImportExport, Delete } from '@material-ui/icons';
|
|
4
|
+
import { ChartType } from './ChartType.esm.js';
|
|
4
5
|
|
|
5
|
-
var ChartType = /* @__PURE__ */ ((ChartType2) => {
|
|
6
|
-
ChartType2["LineChart"] = "line";
|
|
7
|
-
ChartType2["BarChart"] = "bar";
|
|
8
|
-
ChartType2["AreaChart"] = "area";
|
|
9
|
-
ChartType2["ValueChart"] = "value";
|
|
10
|
-
ChartType2["PieChart"] = "pie";
|
|
11
|
-
ChartType2["TreemapChart"] = "treemap";
|
|
12
|
-
return ChartType2;
|
|
13
|
-
})(ChartType || {});
|
|
14
6
|
var MenuChartOption = /* @__PURE__ */ ((MenuChartOption2) => {
|
|
15
7
|
MenuChartOption2["Chart"] = "chart";
|
|
16
8
|
MenuChartOption2["Stack"] = "stack";
|
|
@@ -22,8 +14,8 @@ var MenuChartOption = /* @__PURE__ */ ((MenuChartOption2) => {
|
|
|
22
14
|
return MenuChartOption2;
|
|
23
15
|
})(MenuChartOption || {});
|
|
24
16
|
const MenuChart = (props) => {
|
|
25
|
-
return /* @__PURE__ */ React.createElement(Menu, { id: "menu-logs", anchorEl: props.anchorMenu, open: Boolean(props.anchorMenu), onClose: props.onClose }, /* @__PURE__ */ React.createElement(MenuList, { dense: true, sx: { width: "180px" } }, /* @__PURE__ */ React.createElement(MenuItem, { key: "chartline", onClick: () => props.optionSelected("chart" /* Chart */,
|
|
17
|
+
return /* @__PURE__ */ React.createElement(Menu, { id: "menu-logs", anchorEl: props.anchorMenu, open: Boolean(props.anchorMenu), onClose: props.onClose }, /* @__PURE__ */ React.createElement(MenuList, { dense: true, sx: { width: "180px" } }, /* @__PURE__ */ React.createElement(MenuItem, { key: "chartline", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.LineChart), selected: props.selected === ChartType.LineChart }, /* @__PURE__ */ React.createElement(ShowChart, null), "\xA0Line chart"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartarea", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.AreaChart), selected: props.selected === ChartType.AreaChart }, /* @__PURE__ */ React.createElement(Assessment, null), "\xA0Area chart"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartbar", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.BarChart), selected: props.selected === ChartType.BarChart }, /* @__PURE__ */ React.createElement(BarChart, null), "\xA0Bar chart"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartpie", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.PieChart), selected: props.selected === ChartType.PieChart, disabled: props.numSeries < 2 }, /* @__PURE__ */ React.createElement(PieChart, null), "\xA0Pie chart"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartvalue", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.ValueChart), selected: props.selected === ChartType.ValueChart }, /* @__PURE__ */ React.createElement(ExposurePlus2, null), "\xA0Show value"), /* @__PURE__ */ React.createElement(MenuItem, { key: "charttreemap", onClick: () => props.optionSelected("chart" /* Chart */, ChartType.TreemapChart), selected: props.selected === ChartType.TreemapChart }, /* @__PURE__ */ React.createElement(ViewQuilt, null), "\xA0Tree map"), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartstack", onClick: () => props.optionSelected("stack" /* Stack */), selected: props.stacked, disabled: props.selected !== ChartType.AreaChart && props.selected !== ChartType.BarChart }, /* @__PURE__ */ React.createElement(Timeline, null), "\xA0Stack values"), /* @__PURE__ */ React.createElement(MenuItem, { key: "charttooltip", onClick: () => props.optionSelected("tooltip" /* Tooltip */), selected: props.tooltip }, /* @__PURE__ */ React.createElement(Info, null), "\xA0Show tooltip"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartlabel", onClick: () => props.optionSelected("labels" /* Labels */), selected: props.labels }, /* @__PURE__ */ React.createElement(LocalOffer, null), "\xA0Show labels"), props.setDefault && /* @__PURE__ */ React.createElement(MenuItem, { key: "chartdefault", onClick: () => props.optionSelected("default" /* Default */) }, /* @__PURE__ */ React.createElement(DoneAll, null), "\xA0Set default"), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartexport", onClick: () => props.optionSelected("export" /* Export */) }, /* @__PURE__ */ React.createElement(ImportExport, null), "\xA0Export data"), /* @__PURE__ */ React.createElement(MenuItem, { key: "chartremove", disabled: true }, /* @__PURE__ */ React.createElement(Delete, null), "\xA0Remove chart")));
|
|
26
18
|
};
|
|
27
19
|
|
|
28
|
-
export {
|
|
20
|
+
export { MenuChart, MenuChartOption };
|
|
29
21
|
//# sourceMappingURL=MenuChart.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuChart.esm.js","sources":["../../src/components/MenuChart.tsx"],"sourcesContent":["import React from 'react'\r\nimport { Divider, Menu, MenuItem, MenuList } from '@mui/material'\r\nimport { Timeline, ShowChart, Assessment, ViewQuilt, BarChart, Delete, DoneAll, ImportExport, Info, LocalOffer, PieChart, ExposurePlus2 } from '@material-ui/icons'\r\
|
|
1
|
+
{"version":3,"file":"MenuChart.esm.js","sources":["../../src/components/MenuChart.tsx"],"sourcesContent":["import React from 'react'\r\nimport { Divider, Menu, MenuItem, MenuList } from '@mui/material'\r\nimport { Timeline, ShowChart, Assessment, ViewQuilt, BarChart, Delete, DoneAll, ImportExport, Info, LocalOffer, PieChart, ExposurePlus2 } from '@material-ui/icons'\r\nimport { ChartType } from './ChartType'\r\n\r\nenum MenuChartOption {\r\n Chart='chart',\r\n Stack='stack',\r\n Tooltip='tooltip',\r\n Labels='labels',\r\n Default='default',\r\n Remove='remove',\r\n Export='export'\r\n}\r\n\r\ninterface IProps {\r\n onClose:() => void\r\n optionSelected: (opt:MenuChartOption, data?:string) => void\r\n anchorMenu: Element\r\n selected: ChartType\r\n stacked: boolean\r\n tooltip: boolean\r\n labels: boolean\r\n numSeries: number\r\n setDefault: boolean\r\n}\r\n\r\nconst MenuChart: React.FC<IProps> = (props:IProps) => {\r\n\r\n return <Menu id='menu-logs' anchorEl={props.anchorMenu} open={Boolean(props.anchorMenu)} onClose={props.onClose}>\r\n <MenuList dense sx={{width:'180px'}}>\r\n <MenuItem key='chartline' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.LineChart)} selected={props.selected===ChartType.LineChart}><ShowChart/> Line chart</MenuItem>\r\n <MenuItem key='chartarea' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.AreaChart)} selected={props.selected===ChartType.AreaChart}><Assessment/> Area chart</MenuItem>\r\n <MenuItem key='chartbar' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.BarChart)} selected={props.selected===ChartType.BarChart}><BarChart/> Bar chart</MenuItem>\r\n <MenuItem key='chartpie' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.PieChart)} selected={props.selected===ChartType.PieChart} disabled={props.numSeries<2}><PieChart/> Pie chart</MenuItem>\r\n <MenuItem key='chartvalue' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.ValueChart)} selected={props.selected===ChartType.ValueChart}><ExposurePlus2/> Show value</MenuItem>\r\n <MenuItem key='charttreemap' onClick={() => props.optionSelected(MenuChartOption.Chart, ChartType.TreemapChart)} selected={props.selected===ChartType.TreemapChart}><ViewQuilt/> Tree map</MenuItem>\r\n <Divider/>\r\n <MenuItem key='chartstack' onClick={() => props.optionSelected(MenuChartOption.Stack)} selected={props.stacked} disabled={props.selected!==ChartType.AreaChart && props.selected!==ChartType.BarChart}><Timeline/> Stack values</MenuItem>\r\n <MenuItem key='charttooltip' onClick={() => props.optionSelected(MenuChartOption.Tooltip)} selected={props.tooltip}><Info/> Show tooltip</MenuItem>\r\n <MenuItem key='chartlabel' onClick={() => props.optionSelected(MenuChartOption.Labels)} selected={props.labels}><LocalOffer/> Show labels</MenuItem>\r\n { props.setDefault && <MenuItem key='chartdefault' onClick={() => props.optionSelected(MenuChartOption.Default)}><DoneAll/> Set default</MenuItem>}\r\n <Divider/>\r\n <MenuItem key='chartexport' onClick={() => props.optionSelected(MenuChartOption.Export)} ><ImportExport/> Export data</MenuItem>\r\n <MenuItem key='chartremove' disabled={true}><Delete/> Remove chart</MenuItem>\r\n </MenuList>\r\n </Menu>\r\n}\r\n\r\nexport { MenuChart, MenuChartOption }"],"names":["MenuChartOption"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ const Options = (props) => {
|
|
|
21
21
|
if (props.selectedContainerNames.length > 1) return true;
|
|
22
22
|
return false;
|
|
23
23
|
};
|
|
24
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Options" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: 16 } }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Width\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.width, onChange: (evt) => handleChange({ width: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 1 }, "1"), /* @__PURE__ */ React.createElement(MenuItem, { value: 2 }, "2"), /* @__PURE__ */ React.createElement(MenuItem, { value: 3 }, "3"), /* @__PURE__ */ React.createElement(MenuItem, { value: 4 }, "4"), /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"), /* @__PURE__ */ React.createElement(MenuItem, { value: 6 }, "6")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Interval", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.interval, onChange: (evt) => handleChange({ interval: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"), /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 15 }, "15"), /* @__PURE__ */ React.createElement(MenuItem, { value: 30 }, "30"), /* @__PURE__ */ React.createElement(MenuItem, { value: 60 }, "60"), /* @__PURE__ */ React.createElement(MenuItem, { value: 300 }, "300")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Depth\xA0\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.depth, onChange: (evt) => handleChange({ depth: evt.target.value }), style: { width: 80, marginLeft: 8 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 50 }, "50"), /* @__PURE__ */ React.createElement(MenuItem, { value: 100 }, "100")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Chart", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.chart, onChange: (evt) => handleChange({ chart: evt.target.value }), style: { width: 80, marginLeft: 28 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: "value" }, "Value"), /* @__PURE__ */ React.createElement(MenuItem, { value: "line" }, "Line"), /* @__PURE__ */ React.createElement(MenuItem, { value: "area" }, "Area"), /* @__PURE__ */ React.createElement(MenuItem, { value: "bar" }, "Bar")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.aggregate, onChange: (evt) => handleChange({ aggregate: evt.target.checked }) }), disabled: !multiAssets() || options.merge, label: "Aggregate", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.merge, onChange: (evt) => handleChange({ merge: evt.target.checked }) }), disabled: !multiAssets() || options.aggregate || !"area bar".includes(options.chart), label: "Merge", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.stack, onChange: (evt) => handleChange({ stack: evt.target.checked }) }), disabled: !options.merge || !"area bar".includes(options.chart), label: "Stack", style: { marginLeft: 12, marginBottom: 16 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { style: { fontSize: 9, marginLeft: 22, marginTop: 4, marginBottom: 6 } }, "Powered by ", /* @__PURE__ */ React.createElement("a", { href: "https://jfvilas.github.io/kwirth/", target: "_blank", style: { color: "
|
|
24
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Options" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: 16 } }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Width\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.width, onChange: (evt) => handleChange({ width: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 1 }, "1"), /* @__PURE__ */ React.createElement(MenuItem, { value: 2 }, "2"), /* @__PURE__ */ React.createElement(MenuItem, { value: 3 }, "3"), /* @__PURE__ */ React.createElement(MenuItem, { value: 4 }, "4"), /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"), /* @__PURE__ */ React.createElement(MenuItem, { value: 6 }, "6")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Interval", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.interval, onChange: (evt) => handleChange({ interval: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"), /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 15 }, "15"), /* @__PURE__ */ React.createElement(MenuItem, { value: 30 }, "30"), /* @__PURE__ */ React.createElement(MenuItem, { value: 60 }, "60"), /* @__PURE__ */ React.createElement(MenuItem, { value: 300 }, "300")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Depth\xA0\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.depth, onChange: (evt) => handleChange({ depth: evt.target.value }), style: { width: 80, marginLeft: 8 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 50 }, "50"), /* @__PURE__ */ React.createElement(MenuItem, { value: 100 }, "100")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Chart", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.chart, onChange: (evt) => handleChange({ chart: evt.target.value }), style: { width: 80, marginLeft: 28 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: "value" }, "Value"), /* @__PURE__ */ React.createElement(MenuItem, { value: "line" }, "Line"), /* @__PURE__ */ React.createElement(MenuItem, { value: "area" }, "Area"), /* @__PURE__ */ React.createElement(MenuItem, { value: "bar" }, "Bar")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.aggregate, onChange: (evt) => handleChange({ aggregate: evt.target.checked }) }), disabled: !multiAssets() || options.merge, label: "Aggregate", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.merge, onChange: (evt) => handleChange({ merge: evt.target.checked }) }), disabled: !multiAssets() || options.aggregate || !"area bar".includes(options.chart), label: "Merge", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.stack, onChange: (evt) => handleChange({ stack: evt.target.checked }) }), disabled: !options.merge || !"area bar".includes(options.chart), label: "Stack", style: { marginLeft: 12, marginBottom: 16 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { style: { fontSize: 9, marginLeft: 22, marginTop: 4, marginBottom: 6 } }, "Powered by ", /* @__PURE__ */ React.createElement("a", { href: "https://jfvilas.github.io/kwirth/", target: "_blank", style: { color: "#1D63ED" } }, "Kwirth")))));
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export { Options };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Options.esm.js","sources":["../../src/components/Options.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport Select from '@material-ui/core/Select'\r\nimport { Checkbox, FormControlLabel, Typography } from '@material-ui/core'\r\nimport { IMetricsOptions, IOptions } from './IOptions'\r\n\r\nconst Options = (props: IOptions) => {\r\n const [options, setOptions] = useState<IMetricsOptions>(props.metricsOptions)\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n const multiAssets = () => {\r\n if (!props.selectedNamespaces) return false\r\n if (!props.selectedPodNames) return false\r\n if (!props.selectedContainerNames) return false\r\n\r\n if (props.selectedPodNames.length>1) return true\r\n if (props.selectedContainerNames.length>1) return true\r\n return false\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={1}>\r\n <Grid item style={{marginTop:16}} >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Width \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.width} onChange={(evt) => handleChange({width:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={1}>1</MenuItem>\r\n <MenuItem value={2}>2</MenuItem>\r\n <MenuItem value={3}>3</MenuItem>\r\n <MenuItem value={4}>4</MenuItem>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={6}>6</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label='Interval' labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.interval} onChange={(evt) => handleChange({interval:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={15}>15</MenuItem>\r\n <MenuItem value={30}>30</MenuItem>\r\n <MenuItem value={60}>60</MenuItem>\r\n <MenuItem value={300}>300</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item>\r\n <FormControlLabel style={{marginLeft:24}} label=\"Depth \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.depth} onChange={(evt) => handleChange({depth:evt.target.value})} style={{width:80, marginLeft:8}} disabled={props.disabled}>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={50}>50</MenuItem>\r\n <MenuItem value={100}>100</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Chart\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.chart} onChange={(evt) => handleChange({chart:evt.target.value})} style={{width:80, marginLeft:28}} disabled={props.disabled}>\r\n <MenuItem value={'value'}>Value</MenuItem>\r\n <MenuItem value={'line'}>Line</MenuItem>\r\n <MenuItem value={'area'}>Area</MenuItem>\r\n <MenuItem value={'bar'}>Bar</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.aggregate} onChange={(evt) => handleChange({aggregate:evt.target.checked})}/>} disabled={!multiAssets() || options.merge} label='Aggregate' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.merge} onChange={(evt) => handleChange({merge:evt.target.checked})}/>} disabled={!multiAssets() || options.aggregate || !'area bar'.includes(options.chart)} label='Merge' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.stack} onChange={(evt) => handleChange({stack:evt.target.checked})}/>} disabled={!options.merge || !('area bar'.includes(options.chart))} label='Stack' style={{marginLeft:12, marginBottom:16}}/>\r\n </Grid>\r\n <Grid item>\r\n <Typography style={{fontSize:9, marginLeft:22, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'blue'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport { Options }"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Options.esm.js","sources":["../../src/components/Options.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport Select from '@material-ui/core/Select'\r\nimport { Checkbox, FormControlLabel, Typography } from '@material-ui/core'\r\nimport { IMetricsOptions, IOptions } from './IOptions'\r\n\r\nconst Options = (props: IOptions) => {\r\n const [options, setOptions] = useState<IMetricsOptions>(props.metricsOptions)\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n const multiAssets = () => {\r\n if (!props.selectedNamespaces) return false\r\n if (!props.selectedPodNames) return false\r\n if (!props.selectedContainerNames) return false\r\n\r\n if (props.selectedPodNames.length>1) return true\r\n if (props.selectedContainerNames.length>1) return true\r\n return false\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={1}>\r\n <Grid item style={{marginTop:16}} >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Width \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.width} onChange={(evt) => handleChange({width:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={1}>1</MenuItem>\r\n <MenuItem value={2}>2</MenuItem>\r\n <MenuItem value={3}>3</MenuItem>\r\n <MenuItem value={4}>4</MenuItem>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={6}>6</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label='Interval' labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.interval} onChange={(evt) => handleChange({interval:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={15}>15</MenuItem>\r\n <MenuItem value={30}>30</MenuItem>\r\n <MenuItem value={60}>60</MenuItem>\r\n <MenuItem value={300}>300</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item>\r\n <FormControlLabel style={{marginLeft:24}} label=\"Depth \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.depth} onChange={(evt) => handleChange({depth:evt.target.value})} style={{width:80, marginLeft:8}} disabled={props.disabled}>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={50}>50</MenuItem>\r\n <MenuItem value={100}>100</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Chart\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.chart} onChange={(evt) => handleChange({chart:evt.target.value})} style={{width:80, marginLeft:28}} disabled={props.disabled}>\r\n <MenuItem value={'value'}>Value</MenuItem>\r\n <MenuItem value={'line'}>Line</MenuItem>\r\n <MenuItem value={'area'}>Area</MenuItem>\r\n <MenuItem value={'bar'}>Bar</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.aggregate} onChange={(evt) => handleChange({aggregate:evt.target.checked})}/>} disabled={!multiAssets() || options.merge} label='Aggregate' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.merge} onChange={(evt) => handleChange({merge:evt.target.checked})}/>} disabled={!multiAssets() || options.aggregate || !'area bar'.includes(options.chart)} label='Merge' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.stack} onChange={(evt) => handleChange({stack:evt.target.checked})}/>} disabled={!options.merge || !('area bar'.includes(options.chart))} label='Stack' style={{marginLeft:12, marginBottom:16}}/>\r\n </Grid>\r\n <Grid item>\r\n <Typography style={{fontSize:9, marginLeft:22, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'#1D63ED'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport { Options }"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
2
2
|
import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
3
4
|
import { Entity } from '@backstage/catalog-model';
|
|
4
5
|
import { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common';
|
|
5
6
|
import { ClusterValidPods, IBackendInfo } from '@jfvilas/plugin-kwirth-common';
|
|
6
7
|
|
|
8
|
+
declare enum ChartType {
|
|
9
|
+
LineChart = "line",
|
|
10
|
+
BarChart = "bar",
|
|
11
|
+
AreaChart = "area",
|
|
12
|
+
ValueChart = "value",
|
|
13
|
+
PieChart = "pie",
|
|
14
|
+
TreemapChart = "treemap"
|
|
15
|
+
}
|
|
16
|
+
|
|
7
17
|
interface IKwirthMetricsProps {
|
|
8
18
|
allMetrics: boolean;
|
|
9
19
|
enableRestart: boolean;
|
|
10
20
|
width?: number;
|
|
11
21
|
depth?: number;
|
|
12
22
|
interval?: number;
|
|
13
|
-
chart?:
|
|
23
|
+
chart?: ChartType;
|
|
24
|
+
hideVersion?: boolean;
|
|
25
|
+
excludeContainers?: string[];
|
|
26
|
+
defaultMetrics?: string[];
|
|
14
27
|
}
|
|
15
28
|
|
|
16
29
|
declare const kwirthMetricsPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
@@ -24,7 +37,7 @@ interface KwirthMetricsApi {
|
|
|
24
37
|
getVersion(): Promise<string>;
|
|
25
38
|
getInfo(): Promise<IBackendInfo>;
|
|
26
39
|
}
|
|
27
|
-
declare const kwirthMetricsApiRef:
|
|
40
|
+
declare const kwirthMetricsApiRef: _backstage_frontend_plugin_api.ApiRef<KwirthMetricsApi>;
|
|
28
41
|
|
|
29
42
|
interface KwirthMetricsClientOptions {
|
|
30
43
|
discoveryApi: DiscoveryApi;
|
|
@@ -40,7 +53,5 @@ declare class KwirthMetricsClient implements KwirthMetricsApi {
|
|
|
40
53
|
requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
|
|
41
54
|
}
|
|
42
55
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
export { EntityKwirthMetricsContent, KwirthMetricsClient, VERSION, kwirthMetricsApiRef, kwirthMetricsPlugin };
|
|
56
|
+
export { ChartType, EntityKwirthMetricsContent, KwirthMetricsClient, kwirthMetricsApiRef, kwirthMetricsPlugin };
|
|
46
57
|
export type { KwirthMetricsApi, KwirthMetricsClientOptions };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { EntityKwirthMetricsContent, kwirthMetricsPlugin } from './plugin.esm.js';
|
|
2
2
|
export { KwirthMetricsClient } from './api/KwirthMetricsClient.esm.js';
|
|
3
3
|
export { kwirthMetricsApiRef } from './api/types.esm.js';
|
|
4
|
+
export { ChartType } from './components/ChartType.esm.js';
|
|
4
5
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
package/dist/version.esm.js
CHANGED
package/dist/version.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.
|
|
1
|
+
{"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.14.2\"; \r\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAe;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jfvilas/plugin-kwirth-metrics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.2",
|
|
4
4
|
"description": "Frontend plugin for viewing Kubernetes resource usage (metrics) in Backstage",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Backstage",
|
|
@@ -45,6 +45,13 @@
|
|
|
45
45
|
},
|
|
46
46
|
"main": "./dist/index.esm.js",
|
|
47
47
|
"types": "./dist/index.d.ts",
|
|
48
|
+
"typesVersions": {
|
|
49
|
+
"*": {
|
|
50
|
+
"package.json": [
|
|
51
|
+
"package.json"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
},
|
|
48
55
|
"files": [
|
|
49
56
|
"dist"
|
|
50
57
|
],
|
|
@@ -58,13 +65,13 @@
|
|
|
58
65
|
"test": "backstage-cli package test"
|
|
59
66
|
},
|
|
60
67
|
"dependencies": {
|
|
61
|
-
"@backstage/catalog-model": "^1.
|
|
62
|
-
"@backstage/core-components": "^0.
|
|
63
|
-
"@backstage/core-plugin-api": "^1.
|
|
64
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
65
|
-
"@backstage/integration-react": "^1.
|
|
66
|
-
"@backstage/plugin-auth-react": "^0.1.
|
|
67
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
68
|
+
"@backstage/catalog-model": "^1.7.7",
|
|
69
|
+
"@backstage/core-components": "^0.18.8",
|
|
70
|
+
"@backstage/core-plugin-api": "^1.12.4",
|
|
71
|
+
"@backstage/frontend-plugin-api": "^0.15.1",
|
|
72
|
+
"@backstage/integration-react": "^1.2.16",
|
|
73
|
+
"@backstage/plugin-auth-react": "^0.1.25",
|
|
74
|
+
"@backstage/plugin-catalog-react": "^2.1.0",
|
|
68
75
|
"@material-ui/core": "^4.12.2",
|
|
69
76
|
"@material-ui/icons": "^4.9.1",
|
|
70
77
|
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
@@ -72,7 +79,7 @@
|
|
|
72
79
|
"recharts": "^2.15.1"
|
|
73
80
|
},
|
|
74
81
|
"devDependencies": {
|
|
75
|
-
"@backstage/cli": "^0.
|
|
82
|
+
"@backstage/cli": "^0.36.0",
|
|
76
83
|
"@testing-library/dom": "^10.0.0",
|
|
77
84
|
"@testing-library/jest-dom": "^6.0.0",
|
|
78
85
|
"@testing-library/react": "^15.0.0",
|