Skip to content

Commit

Permalink
Merge pull request #35 from tiithansen/show-node-name-instead-of-ip
Browse files Browse the repository at this point in the history
fix: Display node name instead of IP
  • Loading branch information
tiithansen committed Jul 14, 2024
2 parents 62e5a98 + 5f15a69 commit 9a2d7b4
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 51 deletions.
100 changes: 62 additions & 38 deletions src/pages/Clusters/pages/Node/Node.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
import { EmbeddedScene, PanelBuilders, SceneAppPage, SceneAppPageLike, SceneControlsSpacer, SceneFlexItem, SceneFlexLayout, SceneQueryRunner, SceneRefreshPicker, SceneRouteMatch, SceneTimePicker, VariableValueSelectors } from "@grafana/scenes";
import {
EmbeddedScene,
PanelBuilders,
SceneAppPage,
SceneAppPageLike,
SceneControlsSpacer,
SceneFlexItem,
SceneFlexLayout,
SceneQueryRunner,
SceneRefreshPicker,
SceneRouteMatch,
SceneTimePicker,
VariableValueSelectors
} from "@grafana/scenes";
import { ROUTES } from "../../../../constants";
import { prefixRoute } from "utils/utils.routing";
import { usePluginProps } from "utils/utils.plugin";
Expand Down Expand Up @@ -59,56 +72,62 @@ function getCPUPanel(node: string) {
{
refId: 'cpu_total',
expr: `
sum(
${Metrics.machineCpuCores.name}{cluster=~"$cluster",instance=~"${node}.*"}
max(
kube_node_status_capacity{
resource="cpu",
cluster=~"$cluster",
node="${node}"
}
) by (cluster)`,
legendFormat: 'Total'
},
{
refId: 'cpu_usage',
// Calculate CPU usage in cores per node and sum it up to get the total usage across all nodes
expr: `
node_uname_info{
cluster=~"$cluster",
nodename="${node}"
} * on (cluster, instance)
(
sum (
rate(
${Metrics.nodeCpuSecondsTotal.name}{
${Metrics.nodeCpuSecondsTotal.labels.mode}!="idle",
instance=~"${node}.*",
cluster="$cluster"
}[$__rate_interval]
)
) by(${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster)
/
on (${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster) group_left sum (
(
(
sum (
rate(
${Metrics.nodeCpuSecondsTotal.name}{
cluster="$cluster",
instance=~"${node}.*",
${Metrics.nodeCpuSecondsTotal.labels.mode}!="idle",
cluster="$cluster"
}[$__rate_interval]
)
)
) by (${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster)
) by(${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster)
/
on (${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster) group_left sum (
(
rate(
${Metrics.nodeCpuSecondsTotal.name}{
cluster="$cluster",
}[$__rate_interval]
)
)
) by (${Metrics.nodeCpuSecondsTotal.labels.instance}, cluster)
)
* count(
count(
node_cpu_seconds_total{
cluster="$cluster",
}
) by (cpu, cluster, instance)
) by (cluster, instance)
)
* count(
count(
node_cpu_seconds_total{
cluster="$cluster",
instance=~"${node}.*",
}
) by (cpu, cluster, instance)
) by (cluster, instance)
`,
legendFormat: 'Usage'
},
{
refId: 'cpu_requested',
expr: `
sum(
kube_node_info{cluster=~"$cluster",internal_ip=~"${node}.*"} * on(node) group_right()
${Metrics.kubePodContainerResourceRequests.name}{
resource="cpu",
cluster=~"$cluster",
node="${node}"
}
) by (cluster)`,
legendFormat: 'Requested'
Expand Down Expand Up @@ -140,29 +159,34 @@ function getMemoryPanel(node: string) {
{
refId: 'memory_total',
expr: `
sum(
${Metrics.nodeMemoryMemTotalBytes.name}{cluster=~"$cluster", instance=~"${node}.*"}
max(
kube_node_status_capacity{
resource="memory",
cluster=~"$cluster",
node="${node}"
}
) by (cluster)`,
legendFormat: 'Total [{{cluster}}]'
},
{
refId: 'memory_usage',
expr: `
node_uname_info{cluster=~"$cluster", nodename="${node}"} * on (cluster, instance)
sum(
${Metrics.nodeMemoryMemTotalBytes.name}{cluster=~"$cluster", instance=~"${node}.*"}
${Metrics.nodeMemoryMemTotalBytes.name}{cluster=~"$cluster"}
-
${Metrics.nodeMemoryMemAvailableBytes.name}{cluster=~"$cluster", instance=~"${node}.*"}
) by (cluster)`,
${Metrics.nodeMemoryMemAvailableBytes.name}{cluster=~"$cluster"}
) by (cluster, instance)`,
legendFormat: 'Used [{{cluster}}]'
},
{
refId: 'memory_requested',
expr: `
sum(
kube_node_info{cluster=~"$cluster",internal_ip=~"${node}.*"} * on(node) group_right()
${Metrics.kubePodContainerResourceRequests.name}{
resource="memory",
cluster=~"$cluster",
node="${node}"
}
) by (cluster)`,
legendFormat: 'Requested [{{cluster}}]'
Expand All @@ -185,9 +209,9 @@ function getMemoryPanel(node: string) {
function getPods(node: string) {
const staticLabelFilters: LabelFilters = [
{
label: 'host_ip',
op: '=~',
value: `${node}.*`
label: 'node',
op: '=',
value: `${node}`
},
]

Expand Down
2 changes: 1 addition & 1 deletion src/pages/Clusters/tabs/Nodes/NodeExpandedRowScene.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export function buildExpandedRowScene(row: TableRow) {
]

return new SceneFlexLayout({
key: row.internal_ip,
key: row.node,
width: '100%',
children: [
getPodsScene(staticLabelFilters, false, false)
Expand Down
25 changes: 17 additions & 8 deletions src/pages/Clusters/tabs/Nodes/Nodes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,27 @@ function determineMemoryUsageColor(row: TableRow) {

const columns: Array<Column<TableRow>> = [
{
id: 'internal_ip',
id: 'node',
header: 'NODE',
cellType: 'link',
cellProps: {
urlBuilder: (row: TableRow) => prefixRoute(`${ROUTES.Clusters}/nodes/${row.cluster}/${row.internal_ip}`)
urlBuilder: (row: TableRow) => prefixRoute(`${ROUTES.Clusters}/nodes/${row.cluster}/${row.node}`)
},
sortingConfig: {
enabled: true,
type: 'label',
local: true
}
},
{
id: 'internal_ip',
header: 'IP',
sortingConfig: {
enabled: true,
type: 'label',
local: true
}
},
{
id: 'cluster',
header: 'CLUSTER',
Expand Down Expand Up @@ -198,7 +207,7 @@ const columns: Array<Column<TableRow>> = [
},
]

const serieMatcherPredicate = (row: TableRow) => (value: any) => {
const serieMatcherByIPPredicate = (row: TableRow) => (value: any) => {
return value.instance.startsWith(row.internal_ip);
}

Expand All @@ -208,8 +217,8 @@ const serieMatcherByNodeNamePredicate = (row: TableRow) => (value: any) => {

function asyncDataRowMapper(row: TableRow, asyncRowData: Record<string, number[]>) {

const free = getSeriesValue(asyncRowData, 'memory_free', serieMatcherPredicate(row))
const total = getSeriesValue(asyncRowData, 'memory_total', serieMatcherPredicate(row))
const free = getSeriesValue(asyncRowData, 'memory_free', serieMatcherByIPPredicate(row))
const total = getSeriesValue(asyncRowData, 'memory_total', serieMatcherByIPPredicate(row))
const requests = getSeriesValue(asyncRowData, 'memory_requests', serieMatcherByNodeNamePredicate(row))

row.memory = {
Expand All @@ -220,7 +229,7 @@ function asyncDataRowMapper(row: TableRow, asyncRowData: Record<string, number[]
}

row.cpu = {
usage: getSeriesValue(asyncRowData, 'cpu_usage', serieMatcherPredicate(row)),
usage: getSeriesValue(asyncRowData, 'cpu_usage', serieMatcherByIPPredicate(row)),
requests: getSeriesValue(asyncRowData, 'cpu_requests', serieMatcherByNodeNamePredicate(row)),
cores: getSeriesValue(asyncRowData, 'cores', serieMatcherByNodeNamePredicate(row))
}
Expand Down Expand Up @@ -272,7 +281,7 @@ export const getNodesScene = () => {
const queryBuilder = new NodesQueryBuilder()

const defaultSorting: SortingState = {
columnId: 'internal_ip',
columnId: 'node',
direction: 'asc'
}

Expand All @@ -291,7 +300,7 @@ export const getNodesScene = () => {
$data: queryBuilder.rootQueryBuilder(variables, defaultSorting),
asyncDataRowMapper,
queryBuilder,
createRowId: (row) => row.internal_ip,
createRowId: (row) => row.node,
expandedRowBuilder: buildExpandedRowScene,
sorting: defaultSorting,
}),
Expand Down
8 changes: 4 additions & 4 deletions src/pages/Workloads/tabs/Pods/Pods.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 9a2d7b4

Please sign in to comment.