Improve cpu and memory chart in control panel
This commit is contained in:
		
							parent
							
								
									667b18fe24
								
							
						
					
					
						commit
						c2b882a5d7
					
				
					 5 changed files with 26 additions and 18 deletions
				
			
		| 
						 | 
					@ -122,7 +122,7 @@ export default Vue.extend({
 | 
				
			||||||
			this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
 | 
								this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		onStatsLog(statsLog) {
 | 
							onStatsLog(statsLog) {
 | 
				
			||||||
			statsLog.forEach(stats => this.onStats(stats));
 | 
								statsLog.reverse().forEach(stats => this.onStats(stats));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,14 +15,14 @@
 | 
				
			||||||
					:points="cpuPolylinePoints"
 | 
										:points="cpuPolylinePoints"
 | 
				
			||||||
					fill="none"
 | 
										fill="none"
 | 
				
			||||||
					stroke="#fff"
 | 
										stroke="#fff"
 | 
				
			||||||
					stroke-width="0.3"/>
 | 
										stroke-width="1"/>
 | 
				
			||||||
			</mask>
 | 
								</mask>
 | 
				
			||||||
		</defs>
 | 
							</defs>
 | 
				
			||||||
		<rect
 | 
							<rect
 | 
				
			||||||
			x="0" y="0"
 | 
								x="0" y="0"
 | 
				
			||||||
			:width="viewBoxX" :height="viewBoxY"
 | 
								:width="viewBoxX" :height="viewBoxY"
 | 
				
			||||||
			:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
 | 
								:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
 | 
				
			||||||
		<text x="1" y="5">CPU <tspan>{{ cpuP }}%</tspan></text>
 | 
							<text x="1" y="12">CPU <tspan>{{ cpuP }}%</tspan></text>
 | 
				
			||||||
	</svg>
 | 
						</svg>
 | 
				
			||||||
	<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
 | 
						<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
 | 
				
			||||||
		<defs>
 | 
							<defs>
 | 
				
			||||||
| 
						 | 
					@ -39,14 +39,14 @@
 | 
				
			||||||
					:points="memPolylinePoints"
 | 
										:points="memPolylinePoints"
 | 
				
			||||||
					fill="none"
 | 
										fill="none"
 | 
				
			||||||
					stroke="#fff"
 | 
										stroke="#fff"
 | 
				
			||||||
					stroke-width="0.3"/>
 | 
										stroke-width="1"/>
 | 
				
			||||||
			</mask>
 | 
								</mask>
 | 
				
			||||||
		</defs>
 | 
							</defs>
 | 
				
			||||||
		<rect
 | 
							<rect
 | 
				
			||||||
			x="0" y="0"
 | 
								x="0" y="0"
 | 
				
			||||||
			:width="viewBoxX" :height="viewBoxY"
 | 
								:width="viewBoxX" :height="viewBoxY"
 | 
				
			||||||
			:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
 | 
								:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
 | 
				
			||||||
		<text x="1" y="5">MEM <tspan>{{ memP }}%</tspan></text>
 | 
							<text x="1" y="12">MEM <tspan>{{ memP }}%</tspan></text>
 | 
				
			||||||
	</svg>
 | 
						</svg>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -59,8 +59,8 @@ export default Vue.extend({
 | 
				
			||||||
	props: ['connection'],
 | 
						props: ['connection'],
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			viewBoxX: 50,
 | 
								viewBoxX: 200,
 | 
				
			||||||
			viewBoxY: 20,
 | 
								viewBoxY: 70,
 | 
				
			||||||
			stats: [],
 | 
								stats: [],
 | 
				
			||||||
			cpuGradientId: uuid(),
 | 
								cpuGradientId: uuid(),
 | 
				
			||||||
			cpuMaskId: uuid(),
 | 
								cpuMaskId: uuid(),
 | 
				
			||||||
| 
						 | 
					@ -79,7 +79,8 @@ export default Vue.extend({
 | 
				
			||||||
		this.connection.on('statsLog', this.onStatsLog);
 | 
							this.connection.on('statsLog', this.onStatsLog);
 | 
				
			||||||
		this.connection.send({
 | 
							this.connection.send({
 | 
				
			||||||
			type: 'requestLog',
 | 
								type: 'requestLog',
 | 
				
			||||||
			id: Math.random().toString()
 | 
								id: Math.random().toString(),
 | 
				
			||||||
 | 
								length: 200
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	beforeDestroy() {
 | 
						beforeDestroy() {
 | 
				
			||||||
| 
						 | 
					@ -89,7 +90,7 @@ export default Vue.extend({
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		onStats(stats) {
 | 
							onStats(stats) {
 | 
				
			||||||
			this.stats.push(stats);
 | 
								this.stats.push(stats);
 | 
				
			||||||
			if (this.stats.length > 50) this.stats.shift();
 | 
								if (this.stats.length > 200) this.stats.shift();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
 | 
								const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
 | 
				
			||||||
			const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
 | 
								const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
 | 
				
			||||||
| 
						 | 
					@ -103,7 +104,7 @@ export default Vue.extend({
 | 
				
			||||||
			this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
 | 
								this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		onStatsLog(statsLog) {
 | 
							onStatsLog(statsLog) {
 | 
				
			||||||
			statsLog.forEach(stats => this.onStats(stats));
 | 
								statsLog.reverse().forEach(stats => this.onStats(stats));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -111,8 +112,6 @@ export default Vue.extend({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="stylus" scoped>
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
root(isDark)
 | 
					root(isDark)
 | 
				
			||||||
	margin-bottom 16px
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> svg
 | 
						> svg
 | 
				
			||||||
		display block
 | 
							display block
 | 
				
			||||||
		width 50%
 | 
							width 50%
 | 
				
			||||||
| 
						 | 
					@ -125,7 +124,7 @@ root(isDark)
 | 
				
			||||||
			padding-left 5px
 | 
								padding-left 5px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> text
 | 
							> text
 | 
				
			||||||
			font-size 2px
 | 
								font-size 10px
 | 
				
			||||||
			fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
 | 
								fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			> tspan
 | 
								> tspan
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,4 +77,10 @@ export default Vue.extend({
 | 
				
			||||||
			> *:last-child
 | 
								> *:last-child
 | 
				
			||||||
				font-size 70%
 | 
									font-size 70%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .cpu-memory
 | 
				
			||||||
 | 
							margin-bottom 16px
 | 
				
			||||||
 | 
							padding 16px
 | 
				
			||||||
 | 
							border solid 1px #eee
 | 
				
			||||||
 | 
							border-radius: 8px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,8 @@ const interval = 1000;
 | 
				
			||||||
export default function() {
 | 
					export default function() {
 | 
				
			||||||
	const log = new Deque<any>();
 | 
						const log = new Deque<any>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ev.on('requestServerStatsLog', id => {
 | 
						ev.on('requestServerStatsLog', x => {
 | 
				
			||||||
		ev.emit('serverStatsLog:' + id, log.toArray());
 | 
							ev.emit('serverStatsLog:' + x.id, log.toArray().slice(0, x.length || 50));
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	async function tick() {
 | 
						async function tick() {
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,8 @@ export default function() {
 | 
				
			||||||
			process_uptime: process.uptime()
 | 
								process_uptime: process.uptime()
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		ev.emit('serverStats', stats);
 | 
							ev.emit('serverStats', stats);
 | 
				
			||||||
		log.push(stats);
 | 
							log.unshift(stats);
 | 
				
			||||||
		if (log.length > 50) log.shift();
 | 
							if (log.length > 200) log.pop();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tick();
 | 
						tick();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,10 @@ export default function(request: websocket.request, connection: websocket.connec
 | 
				
			||||||
						body: statsLog
 | 
											body: statsLog
 | 
				
			||||||
					}));
 | 
										}));
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
				ev.emit('requestServerStatsLog', msg.id);
 | 
									ev.emit('requestServerStatsLog', {
 | 
				
			||||||
 | 
										id: msg.id,
 | 
				
			||||||
 | 
										length: msg.length
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue