This is an automated email from the ASF dual-hosted git repository.
wilfreds pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-web.git
The following commit(s) were added to refs/heads/master by this push:
new d1a26e7 [YUNIKORN-2150] Use dominant resource utilization in UI (#147)
d1a26e7 is described below
commit d1a26e7f05d7008435f973974e7601b47b8a89a6
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]