Skip to content

Commit

Permalink
feat: Add node age and version to nodes table
Browse files Browse the repository at this point in the history
  • Loading branch information
tiithansen committed Dec 2, 2024
1 parent 1954d58 commit fe1d51a
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 5 deletions.
11 changes: 11 additions & 0 deletions src/metrics/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,17 @@ export const Metrics = {
labels:{
node: 'node',
internalIP: 'internal_ip',
kernelVersion: 'kernel_version',
osImage: 'os_image',
containerRuntimeVersion: 'container_runtime_version',
kubeletVersion: 'kubelet_version',
kubeproxyVersion: 'kubeproxy_version',
}
},
kubeNodeCreated: {
name: 'kube_node_created',
labels:{
node: 'node',
}
},
machineCpuCores: {
Expand Down
25 changes: 25 additions & 0 deletions src/pages/Clusters/tabs/Nodes/Nodes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,30 @@ const columns: Array<Column<TableRow>> = [
local: true
}
},
{
id: 'version',
header: 'VERSION',
accessor: (row: TableRow) => row.kubelet_version,
sortingConfig: {
enabled: true,
type: 'label',
local: true
}
},
{
id: 'age',
header: 'AGE',
sortingConfig: {
enabled: true,
local: false,
type: 'value'
},
cellType: 'formatted',
cellProps: {
format: 'dtdurations',
},
accessor: (row: TableRow) => row.age > 0 ? (Date.now() / 1000) - row.age : 0
},
{
id: 'cluster',
header: 'CLUSTER',
Expand Down Expand Up @@ -224,6 +248,7 @@ function asyncDataRowMapper(row: TableRow, asyncRowData: Record<string, number[]
}

row.pod_count = getSeriesValue(asyncRowData, 'pod_count', serieMatcherByNodeNamePredicate(row))
row.age = getSeriesValue(asyncRowData, 'age', serieMatcherByNodeNamePredicate(row))
}

export const getNodesScene = () => {
Expand Down
58 changes: 53 additions & 5 deletions src/pages/Clusters/tabs/Nodes/Queries.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {

rootQueryBuilder(variables: SceneVariableSet | SceneVariables, sorting: SortingState, sortingConfig?: ColumnSortingConfig<TableRow> | undefined) {

const commonCarryOverLabels = [
Metrics.kubeNodeInfo.labels.kubeproxyVersion,
Metrics.kubeNodeInfo.labels.kernelVersion,
Metrics.kubeNodeInfo.labels.osImage,
Metrics.kubeNodeInfo.labels.kubeletVersion
]

const baseQuery = PromQL.group(
PromQL.metric(
Metrics.kubeNodeInfo.name,
Expand All @@ -19,6 +26,7 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
).by([
Metrics.kubeNodeInfo.labels.internalIP,
Metrics.kubeNodeInfo.labels.node,
...commonCarryOverLabels,
'cluster'
]);

Expand All @@ -36,7 +44,8 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
.on(['node'])
.groupRight(
[
'internal_ip'
'internal_ip',
...commonCarryOverLabels,
],
this.createMemoryRequestsQuery('$cluster', {
'node': {
Expand All @@ -57,7 +66,8 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
.on(['node'])
.groupRight(
[
'internal_ip'
'internal_ip',
...commonCarryOverLabels,
],
this.createCpuRequestsQuery('$cluster', {})
).or(
Expand All @@ -73,7 +83,8 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
.on(['node'])
.groupRight(
[
'internal_ip'
'internal_ip',
...commonCarryOverLabels,
],
this.createCoresQuery('$cluster', {})
).or(
Expand All @@ -89,14 +100,32 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
.on(['node'])
.groupRight(
[
'internal_ip'
'internal_ip',
...commonCarryOverLabels,
],
this.createPodCountQuery('$cluster', {})
).or(
baseQuery.multiply().withScalar(0)
)
)
break;
case 'age':
finalQuery = PromQL.sort(
sorting.direction,
baseQuery
.multiply()
.on(['node'])
.groupRight(
[
'internal_ip',
...commonCarryOverLabels,
],
this.createNodeAgeQuery('$cluster', {})
).or(
baseQuery.multiply().withScalar(0)
)
)
break;
// Node IP based queries
// TODO figure out how join using internal_ip
}
Expand Down Expand Up @@ -225,6 +254,19 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
]);
}

createNodeAgeQuery(cluster: string, additionalLabels: Labels) {
return PromQL.max(
PromQL.metric(
Metrics.kubeNodeCreated.name,
)
.withLabels(additionalLabels)
.withLabelEquals('cluster', cluster)
).by([
Metrics.kubeNodeInfo.labels.node,
'cluster'
]);
}

rowQueryBuilder(rows: TableRow[], variables: SceneVariableSet | SceneVariables) {
const internalIPs = rows.map(row => row.internal_ip + ":.*").join('|');
const nodeNames = rows.map(row => row.node).join('|');
Expand Down Expand Up @@ -281,7 +323,13 @@ export class NodesQueryBuilder implements QueryBuilder<TableRow> {
expr: this.createPodCountQuery(clusterValue, nodeNamesLabels).stringify(),
instant: true,
format: 'table'
}
},
{
refId: 'age',
expr: this.createNodeAgeQuery(clusterValue, nodeNamesLabels).stringify(),
instant: true,
format: 'table',
},
];
}
}
2 changes: 2 additions & 0 deletions src/pages/Clusters/tabs/Nodes/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export interface TableRow extends RowBase{
cluster: string;
node: string;
internal_ip: string;
kubelet_version: string;
memory: {
free: number;
total: number;
Expand All @@ -16,4 +17,5 @@ export interface TableRow extends RowBase{
cores: number;
},
pod_count: number;
age: number;
}

0 comments on commit fe1d51a

Please sign in to comment.