This is an automated email from the ASF dual-hosted git repository.
wilfreds pushed a commit to branch branch-1.4
in repository https://gitbox.apache.org/repos/asf/yunikorn-web.git
The following commit(s) were added to refs/heads/branch-1.4 by this push:
new 781370e [YUNIKORN-2150] Use dominant resource utilization in UI (#147)
781370e is described below
commit 781370e047edf91d412d50e1b8caa8af7481dc5b
Author: Yu-Lin Chen <[email protected]>
AuthorDate: Wed Nov 15 13:38:59 2023 +1100
[YUNIKORN-2150] Use dominant resource utilization in UI (#147)
Node resource utilization chart does not render properly as it expects
multiple resources types. Node utilisation REST was changed to dominant
resource only.i
Multiple resource types in the REST response could lead to showing the
incorrect usage (non dominant one) or for different types after a
reload. The REST content shows types in a random way.
Closes: #147
Signed-off-by: Wilfred Spiegelenburg <[email protected]>
---
json-db.json | 473 +++------------------
json-routes.json | 2 +-
.../components/dashboard/dashboard.component.ts | 16 +-
src/app/services/scheduler/scheduler.service.ts | 4 +-
4 files changed, 67 insertions(+), 428 deletions(-)
diff --git a/json-db.json b/json-db.json
index 9ba1666..09ffc7c 100644
--- a/json-db.json
+++ b/json-db.json
@@ -751,422 +751,63 @@
"reservations": []
}
],
- "utilization": [
- {
- "type": "ephemeral-storage",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- }
- ]
- },
- {
- "type": "hugepages-1Gi",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- }
- ]
- },
- {
- "type": "hugepages-2Mi",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- }
- ]
- },
- {
- "type": "memory",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": 1,
- "nodeNames": [
- "aethergpu"
- ]
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": 0,
- "nodeNames": null
- }
- ]
- },
- {
- "type": "pods",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": -1,
- "nodeNames": [
- "N/A"
- ]
- }
- ]
- },
- {
- "type": "vcore",
- "utilization": [
- {
- "bucketName": "0-10%",
- "numOfNodes": 1,
- "nodeNames": [
- "aethergpu"
- ]
- },
- {
- "bucketName": "10-20%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "20-30%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "30-40%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "40-50%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "50-60%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "60-70%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "70-80%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "80-90%",
- "numOfNodes": 0,
- "nodeNames": null
- },
- {
- "bucketName": "90-100%",
- "numOfNodes": 0,
- "nodeNames": null
- }
- ]
- }
- ],
+ "node-utilization": {
+ "type": "vcore",
+ "utilization": [
+ {
+ "bucketName": "0-10%",
+ "numOfNodes": 1,
+ "nodeNames": [
+ "aethergpu"
+ ]
+ },
+ {
+ "bucketName": "10-20%",
+ "numOfNodes": 3,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "20-30%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "30-40%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "40-50%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "50-60%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "60-70%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "70-80%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "80-90%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ },
+ {
+ "bucketName": "90-100%",
+ "numOfNodes": 0,
+ "nodeNames": null
+ }
+ ]
+ },
"partitions": [
{
"clusterId": "mycluster",
diff --git a/json-routes.json b/json-routes.json
index 797c575..7b2086a 100644
--- a/json-routes.json
+++ b/json-routes.json
@@ -1,5 +1,5 @@
{
- "/ws/v1/scheduler/node-utilization": "/utilization",
+ "/ws/v1/scheduler/node-utilization": "/node-utilization",
"/ws/v1/*": "/$1",
"/history/apps": "/appHistory",
"/history/containers": "/containerHistory",
diff --git a/src/app/components/dashboard/dashboard.component.ts
b/src/app/components/dashboard/dashboard.component.ts
index 233eab0..f38ab9b 100644
--- a/src/app/components/dashboard/dashboard.component.ts
+++ b/src/app/components/dashboard/dashboard.component.ts
@@ -112,15 +112,13 @@ export class DashboardComponent implements OnInit {
this.scheduler.fetchNodeUtilization().subscribe((data) => {
const utilizationData: Record<string, number> = {};
- data.forEach((utilizationInfo) => {
- utilizationInfo.utilization.forEach(({ bucketName, numOfNodes }) => {
- const numOfNodesValue = numOfNodes === -1 ? 0 : numOfNodes;
- if (utilizationData[bucketName]) {
- utilizationData[bucketName] += numOfNodesValue;
- } else {
- utilizationData[bucketName] = numOfNodesValue;
- }
- });
+ data.utilization.forEach(({ bucketName, numOfNodes }) => {
+ const numOfNodesValue = numOfNodes === -1 ? 0 : numOfNodes;
+ if (utilizationData[bucketName]) {
+ utilizationData[bucketName] += numOfNodesValue;
+ } else {
+ utilizationData[bucketName] = numOfNodesValue;
+ }
});
this.nodeUtilizationData = [];
diff --git a/src/app/services/scheduler/scheduler.service.ts
b/src/app/services/scheduler/scheduler.service.ts
index 25f0d05..c5b2801 100644
--- a/src/app/services/scheduler/scheduler.service.ts
+++ b/src/app/services/scheduler/scheduler.service.ts
@@ -254,9 +254,9 @@ export class SchedulerService {
);
}
- fetchNodeUtilization(): Observable<NodeUtilization[]>{
+ fetchNodeUtilization(): Observable<NodeUtilization>{
const nodeUtilizationUrl =
`${this.envConfig.getSchedulerWebAddress()}/ws/v1/scheduler/node-utilization`;
- return this.httpClient.get(nodeUtilizationUrl).pipe(map((data: any) =>
data as NodeUtilization[]));
+ return this.httpClient.get(nodeUtilizationUrl).pipe(map((data: any) =>
data as NodeUtilization));
}
fecthHealthchecks(): Observable<SchedulerHealthInfo> {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]