status実装
とりあえずCPU使用率だけ
This commit is contained in:
		
							parent
							
								
									598d6f7593
								
							
						
					
					
						commit
						5d9b5820af
					
				
					 10 changed files with 188 additions and 6 deletions
				
			
		|  | @ -25,6 +25,7 @@ Note that Misskey uses following subdomains: | ||||||
| * **api**.*{primary domain}* | * **api**.*{primary domain}* | ||||||
| * **auth**.*{primary domain}* | * **auth**.*{primary domain}* | ||||||
| * **about**.*{primary domain}* | * **about**.*{primary domain}* | ||||||
|  | * **status**.*{primary domain}* | ||||||
| * **dev**.*{primary domain}* | * **dev**.*{primary domain}* | ||||||
| * **file**.*{secondary domain}* | * **file**.*{secondary domain}* | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ Misskeyは以下のサブドメインを使います: | ||||||
| * **api**.*{primary domain}* | * **api**.*{primary domain}* | ||||||
| * **auth**.*{primary domain}* | * **auth**.*{primary domain}* | ||||||
| * **about**.*{primary domain}* | * **about**.*{primary domain}* | ||||||
|  | * **status**.*{primary domain}* | ||||||
| * **dev**.*{primary domain}* | * **dev**.*{primary domain}* | ||||||
| * **file**.*{secondary domain}* | * **file**.*{secondary domain}* | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -81,6 +81,7 @@ type Mixin = { | ||||||
| 	api_url: string; | 	api_url: string; | ||||||
| 	auth_url: string; | 	auth_url: string; | ||||||
| 	about_url: string; | 	about_url: string; | ||||||
|  | 	status_url: string; | ||||||
| 	dev_url: string; | 	dev_url: string; | ||||||
| 	drive_url: string; | 	drive_url: string; | ||||||
| }; | }; | ||||||
|  | @ -115,6 +116,7 @@ export default function load() { | ||||||
| 	mixin.auth_url = `${mixin.scheme}://auth.${mixin.host}`; | 	mixin.auth_url = `${mixin.scheme}://auth.${mixin.host}`; | ||||||
| 	mixin.dev_url = `${mixin.scheme}://dev.${mixin.host}`; | 	mixin.dev_url = `${mixin.scheme}://dev.${mixin.host}`; | ||||||
| 	mixin.about_url = `${mixin.scheme}://about.${mixin.host}`; | 	mixin.about_url = `${mixin.scheme}://about.${mixin.host}`; | ||||||
|  | 	mixin.status_url = `${mixin.scheme}://status.${mixin.host}`; | ||||||
| 	mixin.drive_url = `${mixin.secondary_scheme}://file.${mixin.secondary_host}`; | 	mixin.drive_url = `${mixin.secondary_scheme}://file.${mixin.secondary_host}`; | ||||||
| 
 | 
 | ||||||
| 	return Object.assign(config, mixin); | 	return Object.assign(config, mixin); | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ const url = `${scheme}//${host}`; | ||||||
| const apiUrl = `${scheme}//api.${host}`; | const apiUrl = `${scheme}//api.${host}`; | ||||||
| const devUrl = `${scheme}//dev.${host}`; | const devUrl = `${scheme}//dev.${host}`; | ||||||
| const aboutUrl = `${scheme}//about.${host}`; | const aboutUrl = `${scheme}//about.${host}`; | ||||||
|  | const statusUrl = `${scheme}//status.${host}`; | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
| 	host, | 	host, | ||||||
|  | @ -15,5 +16,6 @@ export default { | ||||||
| 	url, | 	url, | ||||||
| 	apiUrl, | 	apiUrl, | ||||||
| 	devUrl, | 	devUrl, | ||||||
| 	aboutUrl | 	aboutUrl, | ||||||
|  | 	statusUrl | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| <mk-nav-home-widget><a href={ CONFIG.aboutUrl }>Misskeyについて</a><i>・</i><a href={ CONFIG.aboutUrl + '/status' }>ステータス</a><i>・</i><a href="http://zawazawa.jp/misskey/">Wiki</a><i>・</i><a href="https://github.com/syuilo/misskey">リポジトリ</a><i>・</i><a href={ CONFIG.devUrl }>開発者</a><i>・</i><a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on <i class="fa fa-twitter"></i></a> | <mk-nav-home-widget><a href={ CONFIG.aboutUrl }>Misskeyについて</a><i>・</i><a href={ CONFIG.statusUrl }>ステータス</a><i>・</i><a href="http://zawazawa.jp/misskey/">Wiki</a><i>・</i><a href="https://github.com/syuilo/misskey">リポジトリ</a><i>・</i><a href={ CONFIG.devUrl }>開発者</a><i>・</i><a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on <i class="fa fa-twitter"></i></a> | ||||||
| 	<style> | 	<style> | ||||||
| 		:scope | 		:scope | ||||||
| 			display block | 			display block | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								src/web/app/status/script.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/web/app/status/script.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | /** | ||||||
|  |  * Status | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // Style
 | ||||||
|  | import './style.styl'; | ||||||
|  | 
 | ||||||
|  | import * as riot from 'riot'; | ||||||
|  | require('./tags'); | ||||||
|  | import init from '../init'; | ||||||
|  | 
 | ||||||
|  | document.title = 'Misskey System Status'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * init | ||||||
|  |  */ | ||||||
|  | init(me => { | ||||||
|  | 	mount(document.createElement('mk-index')); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | function mount(content) { | ||||||
|  | 	riot.mount(document.getElementById('app').appendChild(content)); | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								src/web/app/status/style.styl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/web/app/status/style.styl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | @import "../base" | ||||||
|  | 
 | ||||||
|  | html | ||||||
|  | 	color #456267 | ||||||
|  | 	background #fff | ||||||
|  | 
 | ||||||
|  | body | ||||||
|  | 	margin 0 | ||||||
|  | 	padding 32px 0 | ||||||
|  | 
 | ||||||
|  | 	@media (max-width 600px) | ||||||
|  | 		padding 0 | ||||||
							
								
								
									
										1
									
								
								src/web/app/status/tags/index.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/web/app/status/tags/index.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | require('./index.tag'); | ||||||
							
								
								
									
										139
									
								
								src/web/app/status/tags/index.tag
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/web/app/status/tags/index.tag
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,139 @@ | ||||||
|  | <mk-index> | ||||||
|  | 	<h1>Misskey Status</h1> | ||||||
|  | 	<main> | ||||||
|  | 		<mk-cpu-usage connection={ connection }/> | ||||||
|  | 	</main> | ||||||
|  | 	<style> | ||||||
|  | 		:scope | ||||||
|  | 			display block | ||||||
|  | 
 | ||||||
|  | 			> h1 | ||||||
|  | 				padding 16px | ||||||
|  | 
 | ||||||
|  | 			> * | ||||||
|  | 				margin 0 auto | ||||||
|  | 				max-width 700px | ||||||
|  | 
 | ||||||
|  | 			> main | ||||||
|  | 				> * | ||||||
|  | 					padding 16px | ||||||
|  | 					border-top solid 2px #456267 | ||||||
|  | 
 | ||||||
|  | 					> h2 | ||||||
|  | 						margin 0 | ||||||
|  | 	</style> | ||||||
|  | 	<script> | ||||||
|  | 		import Connection from '../../common/scripts/server-stream'; | ||||||
|  | 
 | ||||||
|  | 		this.mixin('api'); | ||||||
|  | 
 | ||||||
|  | 		this.initializing = true; | ||||||
|  | 		this.view = 0; | ||||||
|  | 		this.connection = new Connection(); | ||||||
|  | 
 | ||||||
|  | 		this.on('mount', () => { | ||||||
|  | 			this.api('meta').then(meta => { | ||||||
|  | 				this.update({ | ||||||
|  | 					initializing: false, | ||||||
|  | 					meta | ||||||
|  | 				}); | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.on('unmount', () => { | ||||||
|  | 			this.connection.close(); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 	</script> | ||||||
|  | </mk-index> | ||||||
|  | 
 | ||||||
|  | <mk-cpu-usage> | ||||||
|  | 	<h2>CPU <b>{ percentage }%</b></h2> | ||||||
|  | 	<mk-line-chart ref="chart"/> | ||||||
|  | 	<style> | ||||||
|  | 		:scope | ||||||
|  | 			display block | ||||||
|  | 	</style> | ||||||
|  | 	<script> | ||||||
|  | 		this.connection = this.opts.connection; | ||||||
|  | 
 | ||||||
|  | 		this.on('mount', () => { | ||||||
|  | 			this.connection.on('stats', this.onStats); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.on('unmount', () => { | ||||||
|  | 			this.connection.off('stats', this.onStats); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.onStats = stats => { | ||||||
|  | 			this.refs.chart.addData(1 - stats.cpu_usage); | ||||||
|  | 
 | ||||||
|  | 			const percentage = (stats.cpu_usage * 100).toFixed(0); | ||||||
|  | 
 | ||||||
|  | 			this.update({ | ||||||
|  | 				percentage | ||||||
|  | 			}); | ||||||
|  | 		}; | ||||||
|  | 	</script> | ||||||
|  | </mk-cpu-usage> | ||||||
|  | 
 | ||||||
|  | <mk-line-chart> | ||||||
|  | 	<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none"> | ||||||
|  | 		<defs> | ||||||
|  | 			<linearGradient id={ gradientId } x1="0" x2="0" y1="1" y2="0"> | ||||||
|  | 				<stop offset="0%" stop-color="transparent"></stop> | ||||||
|  | 				<stop offset="100%" stop-color="#456267"></stop> | ||||||
|  | 			</linearGradient> | ||||||
|  | 			<mask id={ maskId } x="0" y="0" riot-width={ viewBoxX } riot-height={ viewBoxY }> | ||||||
|  | 				<polygon | ||||||
|  | 					riot-points={ polygonPoints } | ||||||
|  | 					fill="#fff" | ||||||
|  | 					fill-opacity="0.5"/> | ||||||
|  | 			</mask> | ||||||
|  | 		</defs> | ||||||
|  | 		<line x1="0" y1="0" riot-x2={ viewBoxX } y2="0" stroke="#eee" stroke-width="0.5"/> | ||||||
|  | 		<line x1="0" y1="25%" riot-x2={ viewBoxX } y2="25%" stroke="#eee" stroke-width="0.25"/> | ||||||
|  | 		<line x1="0" y1="50%" riot-x2={ viewBoxX } y2="50%" stroke="#eee" stroke-width="0.25"/> | ||||||
|  | 		<line x1="0" y1="75%" riot-x2={ viewBoxX } y2="75%" stroke="#eee" stroke-width="0.25"/> | ||||||
|  | 		<line x1="0" y1="100%" riot-x2={ viewBoxX } y2="100%" stroke="#eee" stroke-width="0.5"/> | ||||||
|  | 		<rect | ||||||
|  | 			x="-1" y="-1" | ||||||
|  | 			riot-width={ viewBoxX + 2 } riot-height={ viewBoxY + 2 } | ||||||
|  | 			style="stroke: none; fill: url(#{ gradientId }); mask: url(#{ maskId })"/> | ||||||
|  | 		<polyline | ||||||
|  | 			riot-points={ polylinePoints } | ||||||
|  | 			fill="none" | ||||||
|  | 			stroke="#456267" | ||||||
|  | 			stroke-width="0.5"/> | ||||||
|  | 	</svg> | ||||||
|  | 	<style> | ||||||
|  | 		:scope | ||||||
|  | 			display block | ||||||
|  | 
 | ||||||
|  | 			> svg | ||||||
|  | 				display block | ||||||
|  | 				width 100% | ||||||
|  | 	</style> | ||||||
|  | 	<script> | ||||||
|  | 		import uuid from '../../common/scripts/uuid'; | ||||||
|  | 
 | ||||||
|  | 		this.viewBoxX = 100; | ||||||
|  | 		this.viewBoxY = 30; | ||||||
|  | 		this.data = []; | ||||||
|  | 		this.gradientId = uuid(); | ||||||
|  | 		this.maskId = uuid(); | ||||||
|  | 
 | ||||||
|  | 		this.addData = data => { | ||||||
|  | 			this.data.push(data); | ||||||
|  | 			if (this.data.length > 100) this.data.shift(); | ||||||
|  | 
 | ||||||
|  | 			const polylinePoints = this.data.map((d, i) => `${this.viewBoxX - ((this.data.length - 1) - i)},${d * this.viewBoxY}`).join(' '); | ||||||
|  | 			const polygonPoints = `${this.viewBoxX - (this.data.length - 1)},${ this.viewBoxY } ${ polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; | ||||||
|  | 
 | ||||||
|  | 			this.update({ | ||||||
|  | 				polylinePoints, | ||||||
|  | 				polygonPoints | ||||||
|  | 			}); | ||||||
|  | 		}; | ||||||
|  | 	</script> | ||||||
|  | </mk-line-chart> | ||||||
|  | @ -14,10 +14,11 @@ module.exports = langs.map(([lang, locale]) => { | ||||||
| 
 | 
 | ||||||
| 	// Entries
 | 	// Entries
 | ||||||
| 	const entry = { | 	const entry = { | ||||||
| 		'desktop': './src/web/app/desktop/script.js', | 		desktop: './src/web/app/desktop/script.js', | ||||||
| 		'mobile': './src/web/app/mobile/script.js', | 		mobile: './src/web/app/mobile/script.js', | ||||||
| 		'dev': './src/web/app/dev/script.js', | 		status: './src/web/app/status/script.js', | ||||||
| 		'auth': './src/web/app/auth/script.js' | 		dev: './src/web/app/dev/script.js', | ||||||
|  | 		auth: './src/web/app/auth/script.js' | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	const output = { | 	const output = { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue