mirror of
https://gitee.com/nutz/nutzboot.git
synced 2024-11-30 02:38:28 +08:00
add: eureka-ui 添加 startup 相关信息
This commit is contained in:
parent
77a4e9f98d
commit
f43038d754
@ -34,6 +34,7 @@ import com.netflix.eureka.EurekaServerContext;
|
||||
import com.netflix.eureka.EurekaServerContextHolder;
|
||||
import com.netflix.eureka.cluster.PeerEurekaNode;
|
||||
import com.netflix.eureka.registry.PeerAwareInstanceRegistry;
|
||||
import com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl;
|
||||
import com.netflix.eureka.resources.StatusResource;
|
||||
import com.netflix.eureka.util.StatusInfo;
|
||||
|
||||
@ -76,6 +77,19 @@ public class EurekaServletStarter extends HttpServlet implements WebServletFace
|
||||
+ "/");
|
||||
|
||||
populateBase(result);
|
||||
|
||||
if (pathInfo.endsWith("/status.json")) {
|
||||
status(result);
|
||||
lastn(result);
|
||||
response.setContentType("application/json");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.getWriter().println(Json.toJson(result, JsonFormat.tidy()));
|
||||
} else {
|
||||
response.setStatus(404);
|
||||
}
|
||||
}
|
||||
|
||||
private void status(NutMap result) {
|
||||
populateApps(result);
|
||||
|
||||
StatusInfo statusInfo;
|
||||
@ -89,14 +103,27 @@ public class EurekaServletStarter extends HttpServlet implements WebServletFace
|
||||
result.put("statusInfo", statusInfo);
|
||||
populateInstanceInfo(result, statusInfo);
|
||||
filterReplicas(result, statusInfo);
|
||||
}
|
||||
|
||||
if (pathInfo.endsWith("/status.json")) {
|
||||
response.setContentType("application/json");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.getWriter().println(Json.toJson(result, JsonFormat.tidy()));
|
||||
} else {
|
||||
response.setStatus(404);
|
||||
}
|
||||
private void lastn(NutMap result) {
|
||||
PeerAwareInstanceRegistryImpl registry = (PeerAwareInstanceRegistryImpl) getRegistry();
|
||||
List<NutMap> lastNCanceled = registry.getLastNCanceledInstances()
|
||||
.stream()
|
||||
.map(entry -> NutMap.NEW()
|
||||
.setv("id", entry.second())
|
||||
.setv("date",
|
||||
new Date(entry.first())))
|
||||
.collect(Collectors.toList());
|
||||
result.put("lastNCanceled", lastNCanceled);
|
||||
|
||||
List<NutMap> lastNRegistered = registry.getLastNRegisteredInstances()
|
||||
.stream()
|
||||
.map(entry -> NutMap.NEW()
|
||||
.setv("id", entry.second())
|
||||
.setv("date",
|
||||
new Date(entry.first())))
|
||||
.collect(Collectors.toList());
|
||||
result.put("lastNRegistered", lastNRegistered);
|
||||
}
|
||||
|
||||
private PeerAwareInstanceRegistry getRegistry() {
|
||||
@ -109,7 +136,6 @@ public class EurekaServletStarter extends HttpServlet implements WebServletFace
|
||||
|
||||
private void populateBase(NutMap result) {
|
||||
result.put("time", new Date());
|
||||
result.put("basePath", "/eureka");
|
||||
populateHeader(result);
|
||||
populateNavbar(result);
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@ -11,6 +11,21 @@
|
||||
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<script>
|
||||
function activeStatus() {
|
||||
$('li.status').addClass("active");
|
||||
$('li.lastn').removeClass("active");
|
||||
$('#status').show();
|
||||
$('#lastn').hide();
|
||||
}
|
||||
|
||||
function activeLastn() {
|
||||
$('li.status').removeClass("active");
|
||||
$('li.lastn').addClass("active");
|
||||
$('#status').hide();
|
||||
$('#lastn').show();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-inverse navbar-fixed-top">
|
||||
@ -27,7 +42,12 @@
|
||||
</div>
|
||||
<div id="navbar" class="collapse navbar-collapse">
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="active"><a :href="home">Home</a></li>
|
||||
<li class="active status">
|
||||
<a href="javascript:void(0);" onclick="activeStatus()">Home</a>
|
||||
</li>
|
||||
<li class="lastn">
|
||||
<a href="javascript:void(0);" onclick="activeLastn()">Last 1000 since startup</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -113,91 +133,153 @@
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h1>Instances currently registered with Eureka</h1>
|
||||
<table id='instances' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Application</th>
|
||||
<th>AMIs</th>
|
||||
<th>Availability Zones</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="instances-tbody">
|
||||
<tr v-for="app in apps">
|
||||
<td><strong>{{ app.name }}</strong></td>
|
||||
<td>
|
||||
<template v-for="(item, index) in app.amiCounts">
|
||||
<strong>{{ item.key }}</strong> {{ item.value }}
|
||||
<template v-if="index < app.amiCounts.length - 1">, </template>
|
||||
</template>
|
||||
</td>
|
||||
<td>
|
||||
<template v-for="(item, index) in app.zoneCounts">
|
||||
<strong>{{ item.key }}</strong> {{ item.value }}
|
||||
<template v-if="index < app.zoneCounts.length - 1">, </template>
|
||||
</template>
|
||||
</td>
|
||||
<td>
|
||||
<template v-for="instanceInfo in app.instanceInfos">
|
||||
<strong v-if="instanceInfo.isNotUp">
|
||||
<strong>{{ instanceInfo.status }}</strong> {{ instanceInfo.instances.length }} -
|
||||
</strong>
|
||||
<template v-for="(instance, index) in instanceInfo.instances">
|
||||
<a :href="instance.url" target="_blank" v-if="instance.isHref">{{ instance.id }}</a>
|
||||
<template v-else>{{ instance.id }}</template>
|
||||
<template v-if="index < instanceInfo.instances.length - 1">, </template>
|
||||
<div id="status">
|
||||
<h1>Instances currently registered with Eureka</h1>
|
||||
<table id='instances' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Application</th>
|
||||
<th>AMIs</th>
|
||||
<th>Availability Zones</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="instances-tbody">
|
||||
<tr v-for="app in apps">
|
||||
<td><strong>{{ app.name }}</strong></td>
|
||||
<td>
|
||||
<template v-for="(item, index) in app.amiCounts">
|
||||
<strong>{{ item.key }}</strong> {{ item.value }}
|
||||
<template v-if="index < app.amiCounts.length - 1">, </template>
|
||||
</template>
|
||||
</template>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<template v-for="(item, index) in app.zoneCounts">
|
||||
<strong>{{ item.key }}</strong> {{ item.value }}
|
||||
<template v-if="index < app.zoneCounts.length - 1">, </template>
|
||||
</template>
|
||||
</td>
|
||||
<td>
|
||||
<template v-for="instanceInfo in app.instanceInfos">
|
||||
<strong v-if="instanceInfo.isNotUp">
|
||||
<strong>{{ instanceInfo.status }}</strong> {{ instanceInfo.instances.length }} -
|
||||
</strong>
|
||||
<template v-for="(instance, index) in instanceInfo.instances">
|
||||
<a :href="instance.url" target="_blank" v-if="instance.isHref">{{ instance.id }}</a>
|
||||
<template v-else>{{ instance.id }}</template>
|
||||
<template v-if="index < instanceInfo.instances.length - 1">, </template>
|
||||
</template>
|
||||
</template>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h1>General Info</h1>
|
||||
<table id='generalInfo' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(value, key) in statusInfo.generalStats">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
<tr v-for="(value, key) in statusInfo.applicationStats">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h1>General Info</h1>
|
||||
<table id='generalInfo' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(value, key) in statusInfo.generalStats">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
<tr v-for="(value, key) in statusInfo.applicationStats">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h1>Instance Info</h1>
|
||||
<table id='instanceInfo' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(value, key) in instanceInfo">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h1>Instance Info</h1>
|
||||
<table id='instanceInfo' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(value, key) in instanceInfo">
|
||||
<td>{{ key }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div id="lastn" style="display: none">
|
||||
<hr>
|
||||
<div id="xd-jobs" class="tab-pane active col-md-12">
|
||||
<ul class="nav nav-tabs" role="tablist" id="myTab">
|
||||
<li class="active"><a data-toggle="tab" href="#cancelled">Last 1000 cancelled leases</a>
|
||||
</li>
|
||||
<li><a data-toggle="tab" href="#registered">Last 1000 newly registered leases</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane" id="cancelled">
|
||||
<table id='lastNCanceled' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Timestamp</th>
|
||||
<th>Lease</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<template v-for="entry in lastNCanceled">
|
||||
<tr>
|
||||
<td>{{ entry.date }}</td>
|
||||
<td>{{ entry.id }}</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template v-if="lastNCanceled.length == 0">
|
||||
<tr>
|
||||
<td colspan="2">No results available</td>
|
||||
</tr>
|
||||
</template>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-pane" id="registered">
|
||||
<table id='lastNRegistered' class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Timestamp</th>
|
||||
<th>Lease</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<template v-for="entry in lastNRegistered">
|
||||
<tr>
|
||||
<td>{{ entry.date }}</td>
|
||||
<td>{{ entry.id }}</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template v-if="lastNRegistered.length == 0">
|
||||
<tr>
|
||||
<td colspan="2">No results available</td>
|
||||
</tr>
|
||||
</template>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="js/jquery.min.js"></script>
|
||||
<script src="js/vue.min.js"></script>
|
||||
<script src="js/bootstrap.min.js"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
$.getJSON('./js/status.json', function (data) {
|
||||
new Vue({
|
||||
el: 'nav',
|
||||
data: {home: data.basePath + '/status'}
|
||||
data: {home: data.basePath + 'status.html'}
|
||||
});
|
||||
new Vue({
|
||||
el: '#content',
|
||||
|
Loading…
Reference in New Issue
Block a user