Repository navigation
Expand file tree
/
Copy pathDashboard.js
More file actions
223 lines (187 loc) · 7.91 KB
/
Copy pathDashboard.js
File metadata and controls
223 lines (187 loc) · 7.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/// <reference path="JsChart-vsdoc.js" />
var Charting = MindFusion.Charting;
var Gauges = MindFusion.Gauges;
var Controls = MindFusion.Charting.Controls;
var Components = MindFusion.Charting.Components;
var Collections = MindFusion.Common.Collections;
var Drawing = MindFusion.Drawing;
// create the dashboard JS object
var element = document.getElementById('dashboard');
if (element.offsetParent) {
element.width = element.offsetParent.clientWidth;
element.height = element.offsetParent.clientHeight;
}
var dashboard = new Controls.ChartBase(element);
var builder = new Controls.LayoutBuilder(dashboard);
// Global Theme Settings
dashboard.theme.gridLineColor = new Drawing.Color("#eceff1");
// define and style the title
var titleLabel = new Components.TextComponent();
titleLabel.horizontalAlignment = Components.LayoutAlignment.Center;
titleLabel.text = "GLOBAL AI INFRASTRUCTURE HEALTH";
titleLabel.font = new Drawing.Font("Inter", 18, Drawing.FontStyle.Bold);
titleLabel.textBrush = new Drawing.Brush("#263238");
dashboard.layoutPanel.children.add(titleLabel);
var nameStack = new Components.StackPanel();
nameStack.orientation = Components.Orientation.Horizontal;
nameStack.horizontalAlignment = Components.LayoutAlignment.Center;
nameStack.margin = new Charting.Margins(0, 0, 0, 10);
dashboard.layoutPanel.children.add(nameStack);
addToStack(nameStack, "OPENAI", new Drawing.Brush("#26a69a"));
addToStack(nameStack, " vs ", new Drawing.Brush("#546e7a"));
addToStack(nameStack, "ANTHROPIC", new Drawing.Brush("#3f51b5"));
addToStack(nameStack, " vs ", new Drawing.Brush("#546e7a"));
addToStack(nameStack, "META AI", new Drawing.Brush("#ffa000"));
// define the plot for the line chart
var linePlot = new Charting.Plot2D();
linePlot.gridType = Charting.GridType.Horizontal;
linePlot.gridColor1 = new Drawing.Color("#f5f5f5");
var lineYAxis = new Charting.Axis();
lineYAxis.title = "Tokens (B)";
var lineXAxis = new Charting.Axis();
lineXAxis.title = "";
function generateTokenData(trend) {
var vals = new Collections.List();
var curr = 10;
for (var i = 0; i < 36; i++) {
curr += Math.random() * trend;
vals.add(curr);
}
return vals;
}
var xLine = new Collections.List();
for (var i = 0; i < 36; i++) xLine.add(i);
var l1 = new Charting.Series2D(xLine, generateTokenData(5), null); l1.title = "OpenAI";
var l2 = new Charting.Series2D(xLine, generateTokenData(4), null); l2.title = "Anthropic";
var l3 = new Charting.Series2D(xLine, generateTokenData(6), null); l3.title = "Meta AI";
var lineRenderer = new Charting.LineRenderer(new Collections.ObservableCollection([l1, l2, l3]));
var lineStyle = new Charting.MixedSeriesStyle();
lineStyle.commonFills = lineStyle.commonStrokes = new Collections.List([
new Drawing.Brush("#26a69a"),
new Drawing.Brush("#3f51b5"),
new Drawing.Brush("#ffa000")
]);
lineStyle.uniformStrokeThickness = 3;
lineRenderer.seriesStyle = lineStyle;
linePlot.seriesRenderers.add(lineRenderer);
linePlot.yAxis = lineYAxis;
linePlot.xAxis = lineXAxis;
var linePlotXRenderer = new Charting.XAxisRenderer(lineXAxis);
var linePlotYRenderer = new Charting.YAxisRenderer(lineYAxis);
linePlotXRenderer.labelsSource = linePlot;
linePlotYRenderer.labelsSource = linePlot;
// add the line chart plot to the main panel
var linePanel = builder.createAndAddPlotWithBottomAndLeftAxes(
linePlot,
linePlotXRenderer,
linePlotYRenderer
);
// create the plot for the bar chart
var barPlot = new Charting.Plot2D();
barPlot.gridType = Charting.GridType.Horizontal;
barPlot.gridColor1 = new Drawing.Color("#f5f5f5");
var barYAxis = new Charting.Axis();
barYAxis.title = "Latency (ms)";
barYAxis.minValue = 0;
barYAxis.maxValue = 300;
var barXAxis = new Charting.Axis();
barXAxis.title = "Time of Day";
var labels = new Collections.List();
for (var i = 0; i < 24; i++) labels.add((i % 12 || 12) + (i < 12 ? " AM" : " PM"));
function generateLatencyData(base) {
var vals = new Collections.List();
for (var i = 0; i < 24; i++) vals.add(base + Math.random() * 50);
return vals;
}
var s1 = new Charting.BarSeries(generateLatencyData(120), labels);
s1.title = "OpenAI";
s1.supportedLabels = Charting.LabelKinds.XAxisLabel;
var s2 = new Charting.BarSeries(generateLatencyData(150), null);
s2.title = "Anthropic";
var s3 = new Charting.BarSeries(generateLatencyData(180), null);
s3.title = "Meta AI";
var barRenderer = new Charting.BarRenderer(new Collections.ObservableCollection([s1, s2, s3]));
barRenderer.seriesStyle = new Charting.PerSeriesStyle(
new Collections.List([new Drawing.Brush("#26a69a"), new Drawing.Brush("#3f51b5"), new Drawing.Brush("#ffa000")]),
new Collections.List([new Drawing.Brush("#ffffff"), new Drawing.Brush("#ffffff"), new Drawing.Brush("#ffffff")]),
new Collections.List([1, 1, 1])
);
barPlot.seriesRenderers.add(barRenderer);
barPlot.yAxis = barYAxis;
barPlot.xAxis = barXAxis;
var barPlotXAxisRenderer = new Charting.XAxisRenderer(barXAxis);
var barPlotYAxisRenderer = new Charting.YAxisRenderer(barYAxis);
barPlotXAxisRenderer.labelsSource = barPlot;
barPlotXAxisRenderer.showCoordinates = false;
// setup for the gauge
var ovalGauge = new MindFusion.Charting.Gauges.OvalGaugeRenderer(element);
ovalGauge.background = new Drawing.Brush("#ffffff");
var scale = ovalGauge.gauge.scales[0];
scale.minValue = 0;
scale.maxValue = 100;
scale.startAngle = 135;
scale.endAngle = 405;
var loadPointer = new Gauges.Pointer();
loadPointer.value = 72;
loadPointer.fill = "#F97316";
scale.addPointer(loadPointer);
// bottom grid: bar chart and gauge
var pnlGrid = new Components.GridPanel();
// define 2 columns and 2 rows
pnlGrid.columns.add(new Components.GridColumn());
pnlGrid.columns.add(new Components.GridColumn());
pnlGrid.rows.add(new Components.GridRow());
pnlGrid.rows.add(new Components.GridRow());
pnlGrid.columns.items()[0].lengthType = Components.LengthType.Relative;
pnlGrid.columns.items()[1].lengthType = Components.LengthType.Relative;
var barPlotWithAxes = builder.createPlotWithBottomAndLeftAxes(
barPlot,
barPlotXAxisRenderer,
barPlotYAxisRenderer
);
var barText = new Components.TextComponent();
barText.gridRow = 0;
barText.gridColumn = 0;
barText.text = "Model Latency Breakdown";
barText.horizontalAlignment = Components.LayoutAlignment.Center;
barText.font = new Drawing.Font("Inter", 12, Drawing.FontStyle.Bold);
var gaugeTitle = new Components.TextComponent();
gaugeTitle.gridRow = 0;
gaugeTitle.gridColumn = 1;
gaugeTitle.text = "Cluster Load %";
gaugeTitle.horizontalAlignment = Components.LayoutAlignment.Center;
gaugeTitle.font = new Drawing.Font("Inter", 12, Drawing.FontStyle.Bold);
barPlotWithAxes.gridRow = 1;
barPlotWithAxes.gridColumn = 0;
ovalGauge.gridRow = 1;
ovalGauge.gridColumn = 1;
pnlGrid.children.add(barText);
pnlGrid.children.add(gaugeTitle);
pnlGrid.children.add(barPlotWithAxes);
pnlGrid.children.add(ovalGauge);
// create the legends
var legendLine = new Charting.LegendRenderer();
legendLine.content = new Collections.ObservableCollection([lineRenderer]);
legendLine.background = new Drawing.Brush("#ffffff");
legendLine.borderStroke = new Drawing.Brush("#eeeeee");
legendLine.horizontalAlignment = Components.LayoutAlignment.Far;
var legendBar = new Charting.LegendRenderer();
legendBar.content = new Collections.ObservableCollection([barRenderer]);
legendBar.background = new Drawing.Brush("#ffffff");
legendBar.borderStroke = new Drawing.Brush("#eeeeee");
legendBar.horizontalAlignment = Components.LayoutAlignment.Near;
legendBar.verticalAlignment = Components.LayoutAlignment.Center;
dashboard.rootPanel.children.add(legendLine);
dashboard.rootPanel.children.add(legendBar);
dashboard.layoutPanel.children.add(pnlGrid);
// always call the draw method
dashboard.draw();
// auxiliary method
function addToStack(stack, text, brush) {
var component = new Components.TextComponent();
component.text = text;
if (brush) component.textBrush = brush;
component.font = new Drawing.Font("Inter", 14, Drawing.FontStyle.Bold);
stack.children.add(component);
return component;
}