✨ 添加新特性。 add turbine 、 sba customer ui
No files matched your search
@@ -76,7 +76,7 @@ public class PigxTokenEndpoint {
|
||||
*
|
||||
* @param authHeader Authorization
|
||||
*/
|
||||
@DeleteMapping("/token")
|
||||
@DeleteMapping("/logout")
|
||||
public R<Boolean> logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) {
|
||||
if (StringUtils.hasText(authHeader)) {
|
||||
String tokenValue = authHeader.replace("Bearer", "").trim();
|
||||
|
||||
@@ -31,7 +31,7 @@ public interface SecurityConstants {
|
||||
/**
|
||||
* 验证码长度
|
||||
*/
|
||||
int CODE_SIZE = 4;
|
||||
String CODE_SIZE = "4";
|
||||
/**
|
||||
* 角色前缀
|
||||
*/
|
||||
|
||||
@@ -73,7 +73,7 @@ public class MobileServiceImpl implements MobileService {
|
||||
return new R<>(Boolean.FALSE, "手机号未注册");
|
||||
}
|
||||
|
||||
String code = RandomUtil.randomNumbers(4);
|
||||
String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE));
|
||||
log.debug("手机号生成验证码成功:{},{}", mobile, code);
|
||||
redisTemplate.opsForValue().set(CommonConstant.DEFAULT_CODE_KEY + mobile, code
|
||||
, SecurityConstants.CODE_TIME, TimeUnit.SECONDS);
|
||||
|
||||
@@ -49,6 +49,16 @@
|
||||
<artifactId>spring-boot-admin-starter-server</artifactId>
|
||||
<version>${monitor.version}</version>
|
||||
</dependency>
|
||||
<!--hystrix-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
|
||||
</dependency>
|
||||
<!--turbine-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
|
||||
</dependency>
|
||||
<!--Redis-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
@@ -76,11 +86,6 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||
</dependency>
|
||||
<!--security-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -22,15 +22,19 @@ package com.pig4cloud.pigx.monitor;
|
||||
|
||||
import de.codecentric.boot.admin.server.config.EnableAdminServer;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.SpringCloudApplication;
|
||||
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
|
||||
import org.springframework.cloud.netflix.turbine.EnableTurbine;
|
||||
|
||||
/**
|
||||
* @author lengleng
|
||||
* @date 2018年06月21日
|
||||
* 监控中心
|
||||
*/
|
||||
@EnableTurbine
|
||||
@EnableAdminServer
|
||||
@SpringBootApplication
|
||||
@EnableHystrixDashboard
|
||||
@SpringCloudApplication
|
||||
public class PigxMonitorApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2018-2025, lengleng All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the pig4cloud.com developer nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
* Author: lengleng (wangiegie@gmail.com)
|
||||
*
|
||||
*/
|
||||
|
||||
package com.pig4cloud.pigx.monitor.config;
|
||||
|
||||
import de.codecentric.boot.admin.server.config.AdminServerProperties;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
|
||||
|
||||
/**
|
||||
* WebSecurityConfigurer
|
||||
*
|
||||
* @author lishangbu
|
||||
* @date 2018/10/8
|
||||
*/
|
||||
@Configuration
|
||||
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
|
||||
private final String adminContextPath;
|
||||
|
||||
public WebSecurityConfigurer(AdminServerProperties adminServerProperties) {
|
||||
this.adminContextPath = adminServerProperties.getContextPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
// @formatter:off
|
||||
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
|
||||
successHandler.setTargetUrlParameter("redirectTo");
|
||||
successHandler.setDefaultTargetUrl(adminContextPath + "/");
|
||||
|
||||
http
|
||||
.headers().frameOptions().disable()
|
||||
.and().authorizeRequests()
|
||||
.antMatchers(adminContextPath + "/assets/**"
|
||||
, adminContextPath + "/login"
|
||||
, adminContextPath + "/actuator/**"
|
||||
).permitAll()
|
||||
.anyRequest().authenticated()
|
||||
.and()
|
||||
.formLogin().loginPage(adminContextPath + "/login")
|
||||
.successHandler(successHandler).and()
|
||||
.logout().logoutUrl(adminContextPath + "/logout")
|
||||
.and()
|
||||
.httpBasic().and()
|
||||
.csrf()
|
||||
.disable();
|
||||
// @formatter:on
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,10 @@ spring:
|
||||
discovery:
|
||||
enabled: true
|
||||
service-id: pigx-config
|
||||
boot:
|
||||
admin:
|
||||
ui:
|
||||
resource-locations: 'classpath:/ui/,classpath:/static/'
|
||||
|
||||
# 注册中心配置
|
||||
eureka:
|
||||
@@ -21,3 +25,7 @@ eureka:
|
||||
client:
|
||||
service-url:
|
||||
defaultZone: http://pig:pig@pigx-eureka:1025/eureka/
|
||||
turbine:
|
||||
app-config: pigx-upms,pigx-auth
|
||||
cluster-name-expression: new String("default")
|
||||
combine-host-port: true
|
||||
@@ -0,0 +1,200 @@
|
||||
.dependencies .spacer {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
padding-top:4px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
|
||||
.dependencies .last {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.dependencies span.loading {
|
||||
display: block;
|
||||
padding-top: 6%;
|
||||
padding-bottom: 6%;
|
||||
color: gray;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dependencies span.loading.failed {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
.dependencies div.monitor {
|
||||
float: left;
|
||||
margin-right:5px;
|
||||
margin-top:5px;
|
||||
}
|
||||
|
||||
.dependencies div.monitor p.name {
|
||||
font-weight:bold;
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.dependencies div.monitor_data {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* override the HREF when we have specified it as a tooltip to not act like a link */
|
||||
.dependencies div.monitor_data a.tooltip {
|
||||
text-decoration: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.dependencies div.monitor_data div.counters {
|
||||
text-align: right;
|
||||
padding-bottom: 10px;
|
||||
font-size: 10pt;
|
||||
clear: both;
|
||||
|
||||
}
|
||||
|
||||
.dependencies div.monitor_data div.counters div.cell {
|
||||
display: inline;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.dependencies .borderRight {
|
||||
border-right: 1px solid grey;
|
||||
padding-right: 6px;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.dependencies div.cell .line {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dependencies div.monitor_data a,
|
||||
.dependencies span.rate_value {
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
|
||||
.dependencies span.smaller {
|
||||
font-size: 8pt;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.dependencies div.tableRow {
|
||||
width:100%;
|
||||
white-space: nowrap;
|
||||
font-size: 8pt;
|
||||
margin: 0 auto;
|
||||
clear:both;
|
||||
padding-left:26%;
|
||||
}
|
||||
|
||||
.dependencies div.tableRow .cell {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.dependencies div.tableRow .header {
|
||||
width:18%;
|
||||
text-align:right;
|
||||
padding-right:2%;
|
||||
}
|
||||
|
||||
.dependencies div.tableRow .data {
|
||||
width:17%;
|
||||
font-weight: bold;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
|
||||
.dependencies div.monitor {
|
||||
width: 245px; /* we want a fixed width instead of percentage as I want the boxes to be a set size and then fill in as many as can fit in each row ... this allows 3 columns on an iPad */
|
||||
height: 155px;
|
||||
}
|
||||
|
||||
.dependencies .success {
|
||||
color: green;
|
||||
}
|
||||
.dependencies .shortCircuited {
|
||||
color: blue;
|
||||
}
|
||||
.dependencies .timeout {
|
||||
color: #FF9900; /* shade of orange */
|
||||
}
|
||||
.dependencies .failure {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.badRequest {
|
||||
color: #00CC99;
|
||||
}
|
||||
|
||||
.dependencies .rejected {
|
||||
color: purple;
|
||||
}
|
||||
|
||||
.dependencies .exceptionsThrown {
|
||||
color: brown;
|
||||
}
|
||||
|
||||
.dependencies div.monitor_data a.rate {
|
||||
color: black;
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
.dependencies div.rate {
|
||||
padding-top: 1px;
|
||||
clear:both;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
.dependencies .errorPercentage {
|
||||
color: grey;
|
||||
}
|
||||
|
||||
.dependencies div.cell .errorPercentage {
|
||||
padding-left:5px;
|
||||
font-size: 12pt !important;
|
||||
}
|
||||
|
||||
|
||||
.dependencies div.monitor div.chart {
|
||||
}
|
||||
|
||||
.dependencies div.monitor div.chart svg {
|
||||
}
|
||||
|
||||
.dependencies div.monitor div.chart svg text {
|
||||
fill: white;
|
||||
}
|
||||
|
||||
|
||||
.dependencies div.circuitStatus {
|
||||
width:100%;
|
||||
white-space: nowrap;
|
||||
font-size: 9pt;
|
||||
margin: 0 auto;
|
||||
clear:both;
|
||||
text-align:right;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
.dependencies #hidden {
|
||||
width:1px;
|
||||
height:1px;
|
||||
background: lightgrey;
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sparkline */
|
||||
.dependencies path {
|
||||
stroke: steelblue;
|
||||
stroke-width: 1;
|
||||
fill: none;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,542 @@
|
||||
|
||||
(function(window) {
|
||||
|
||||
// cache the templates we use on this page as global variables (asynchronously)
|
||||
jQuery.get(getRelativePath("components/hystrixCommand/templates/hystrixCircuit.html"), function(data) {
|
||||
hystrixTemplateCircuit = data;
|
||||
});
|
||||
jQuery.get(getRelativePath("components/hystrixCommand/templates/hystrixCircuitContainer.html"), function(data) {
|
||||
hystrixTemplateCircuitContainer = data;
|
||||
});
|
||||
|
||||
function getRelativePath(path) {
|
||||
var p = location.pathname.slice(0, location.pathname.lastIndexOf("/")+1);
|
||||
return p + path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Object containing functions for displaying and updating the UI with streaming data.
|
||||
*
|
||||
* Publish this externally as "HystrixCommandMonitor"
|
||||
*/
|
||||
window.HystrixCommandMonitor = function(containerId, args) {
|
||||
|
||||
var self = this; // keep scope under control
|
||||
self.args = args;
|
||||
if(self.args == undefined) {
|
||||
self.args = {};
|
||||
}
|
||||
|
||||
this.containerId = containerId;
|
||||
|
||||
/**
|
||||
* Initialization on construction
|
||||
*/
|
||||
// intialize various variables we use for visualization
|
||||
var maxXaxisForCircle="40%";
|
||||
var maxYaxisForCircle="40%";
|
||||
var maxRadiusForCircle="125";
|
||||
|
||||
// CIRCUIT_BREAKER circle visualization settings
|
||||
self.circuitCircleRadius = d3.scale.pow().exponent(0.5).domain([0, 400]).range(["5", maxRadiusForCircle]); // requests per second per host
|
||||
self.circuitCircleYaxis = d3.scale.linear().domain([0, 400]).range(["30%", maxXaxisForCircle]);
|
||||
self.circuitCircleXaxis = d3.scale.linear().domain([0, 400]).range(["30%", maxYaxisForCircle]);
|
||||
self.circuitColorRange = d3.scale.linear().domain([10, 25, 40, 50]).range(["green", "#FFCC00", "#FF9900", "red"]);
|
||||
self.circuitErrorPercentageColorRange = d3.scale.linear().domain([0, 10, 35, 50]).range(["grey", "black", "#FF9900", "red"]);
|
||||
|
||||
/**
|
||||
* We want to keep sorting in the background since data values are always changing, so this will re-sort every X milliseconds
|
||||
* to maintain whatever sort the user (or default) has chosen.
|
||||
*
|
||||
* In other words, sorting only for adds/deletes is not sufficient as all but alphabetical sort are dynamically changing.
|
||||
*/
|
||||
setInterval(function() {
|
||||
// sort since we have added a new one
|
||||
self.sortSameAsLast();
|
||||
}, 10000);
|
||||
|
||||
|
||||
/**
|
||||
* END of Initialization on construction
|
||||
*/
|
||||
|
||||
/**
|
||||
* Event listener to handle new messages from EventSource as streamed from the server.
|
||||
*/
|
||||
/* public */ self.eventSourceMessageListener = function(e) {
|
||||
var data = JSON.parse(e.data);
|
||||
if(data) {
|
||||
// check for reportingHosts (if not there, set it to 1 for singleHost vs cluster)
|
||||
if(!data.reportingHosts) {
|
||||
data.reportingHosts = 1;
|
||||
}
|
||||
|
||||
if(data && data.type == 'HystrixCommand') {
|
||||
if (data.deleteData == 'true') {
|
||||
deleteCircuit(data.escapedName);
|
||||
} else {
|
||||
displayCircuit(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Pre process the data before displying in the UI.
|
||||
* e.g Get Averages from sums, do rate calculation etc.
|
||||
*/
|
||||
function preProcessData(data) {
|
||||
// set defaults for values that may be missing from older streams
|
||||
setIfMissing(data, "rollingCountBadRequests", 0);
|
||||
// assert all the values we need
|
||||
validateData(data);
|
||||
// escape string used in jQuery & d3 selectors
|
||||
data.escapedName = data.name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\$1');
|
||||
// do math
|
||||
convertAllAvg(data);
|
||||
calcRatePerSecond(data);
|
||||
}
|
||||
|
||||
function setIfMissing(data, key, defaultValue) {
|
||||
if(data[key] == undefined) {
|
||||
data[key] = defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Since the stream of data can be aggregated from multiple hosts in a tiered manner
|
||||
* the aggregation just sums everything together and provides us the denominator (reportingHosts)
|
||||
* so we must divide by it to get an average per instance value.
|
||||
*
|
||||
* We want to do this on any numerical values where we want per instance rather than cluster-wide sum.
|
||||
*/
|
||||
function convertAllAvg(data) {
|
||||
convertAvg(data, "errorPercentage", true);
|
||||
convertAvg(data, "latencyExecute_mean", false);
|
||||
convertAvg(data, "latencyTotal_mean", false);
|
||||
}
|
||||
|
||||
function convertAvg(data, key, decimal) {
|
||||
if (decimal) {
|
||||
data[key] = getInstanceAverage(data[key], data["reportingHosts"], decimal);
|
||||
} else {
|
||||
data[key] = getInstanceAverage(data[key], data["reportingHosts"], decimal);
|
||||
}
|
||||
}
|
||||
|
||||
function getInstanceAverage(value, reportingHosts, decimal) {
|
||||
if (decimal) {
|
||||
return roundNumber(value/reportingHosts);
|
||||
} else {
|
||||
return Math.floor(value/reportingHosts);
|
||||
}
|
||||
}
|
||||
|
||||
function calcRatePerSecond(data) {
|
||||
var numberSeconds = data["propertyValue_metricsRollingStatisticalWindowInMilliseconds"] / 1000;
|
||||
|
||||
var totalRequests = data["requestCount"];
|
||||
if (totalRequests < 0) {
|
||||
totalRequests = 0;
|
||||
}
|
||||
data["ratePerSecond"] = roundNumber(totalRequests / numberSeconds);
|
||||
data["ratePerSecondPerHost"] = roundNumber(totalRequests / numberSeconds / data["reportingHosts"]) ;
|
||||
}
|
||||
|
||||
function validateData(data) {
|
||||
assertNotNull(data,"reportingHosts");
|
||||
assertNotNull(data,"type");
|
||||
assertNotNull(data,"name");
|
||||
assertNotNull(data,"group");
|
||||
// assertNotNull(data,"currentTime");
|
||||
assertNotNull(data,"isCircuitBreakerOpen");
|
||||
assertNotNull(data,"errorPercentage");
|
||||
assertNotNull(data,"errorCount");
|
||||
assertNotNull(data,"requestCount");
|
||||
assertNotNull(data,"rollingCountCollapsedRequests");
|
||||
assertNotNull(data,"rollingCountExceptionsThrown");
|
||||
assertNotNull(data,"rollingCountFailure");
|
||||
assertNotNull(data,"rollingCountFallbackFailure");
|
||||
assertNotNull(data,"rollingCountFallbackRejection");
|
||||
assertNotNull(data,"rollingCountFallbackSuccess");
|
||||
assertNotNull(data,"rollingCountResponsesFromCache");
|
||||
assertNotNull(data,"rollingCountSemaphoreRejected");
|
||||
assertNotNull(data,"rollingCountShortCircuited");
|
||||
assertNotNull(data,"rollingCountSuccess");
|
||||
assertNotNull(data,"rollingCountThreadPoolRejected");
|
||||
assertNotNull(data,"rollingCountTimeout");
|
||||
assertNotNull(data,"rollingCountBadRequests");
|
||||
assertNotNull(data,"currentConcurrentExecutionCount");
|
||||
assertNotNull(data,"latencyExecute_mean");
|
||||
assertNotNull(data,"latencyExecute");
|
||||
assertNotNull(data,"latencyTotal_mean");
|
||||
assertNotNull(data,"latencyTotal");
|
||||
assertNotNull(data,"propertyValue_circuitBreakerRequestVolumeThreshold");
|
||||
assertNotNull(data,"propertyValue_circuitBreakerSleepWindowInMilliseconds");
|
||||
assertNotNull(data,"propertyValue_circuitBreakerErrorThresholdPercentage");
|
||||
assertNotNull(data,"propertyValue_circuitBreakerForceOpen");
|
||||
assertNotNull(data,"propertyValue_circuitBreakerForceClosed");
|
||||
assertNotNull(data,"propertyValue_executionIsolationStrategy");
|
||||
assertNotNull(data,"propertyValue_executionIsolationThreadTimeoutInMilliseconds");
|
||||
assertNotNull(data,"propertyValue_executionIsolationThreadInterruptOnTimeout");
|
||||
// assertNotNull(data,"propertyValue_executionIsolationThreadPoolKeyOverride");
|
||||
assertNotNull(data,"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests");
|
||||
assertNotNull(data,"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests");
|
||||
assertNotNull(data,"propertyValue_requestCacheEnabled");
|
||||
assertNotNull(data,"propertyValue_requestLogEnabled");
|
||||
assertNotNull(data,"propertyValue_metricsRollingStatisticalWindowInMilliseconds");
|
||||
}
|
||||
|
||||
function assertNotNull(data, key) {
|
||||
if(data[key] == undefined) {
|
||||
throw new Error("Key Missing: " + key + " for " + data.name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to display the CIRCUIT data
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
/* private */ function displayCircuit(data) {
|
||||
|
||||
try {
|
||||
preProcessData(data);
|
||||
} catch (err) {
|
||||
log("Failed preProcessData: " + err.message);
|
||||
return;
|
||||
}
|
||||
|
||||
// add the 'addCommas' function to the 'data' object so the HTML templates can use it
|
||||
data.addCommas = addCommas;
|
||||
// add the 'roundNumber' function to the 'data' object so the HTML templates can use it
|
||||
data.roundNumber = roundNumber;
|
||||
// add the 'getInstanceAverage' function to the 'data' object so the HTML templates can use it
|
||||
data.getInstanceAverage = getInstanceAverage;
|
||||
|
||||
var addNew = false;
|
||||
// check if we need to create the container
|
||||
if(!$('#CIRCUIT_' + data.escapedName).length) {
|
||||
// args for display
|
||||
if(self.args.includeDetailIcon != undefined && self.args.includeDetailIcon) {
|
||||
data.includeDetailIcon = true;
|
||||
}else {
|
||||
data.includeDetailIcon = false;
|
||||
}
|
||||
|
||||
// it doesn't exist so add it
|
||||
var html = tmpl(hystrixTemplateCircuitContainer, data);
|
||||
// remove the loading thing first
|
||||
$('#' + containerId + ' span.loading').remove();
|
||||
// now create the new data and add it
|
||||
$('#' + containerId + '').append(html);
|
||||
|
||||
// add the default sparkline graph
|
||||
d3.selectAll('#graph_CIRCUIT_' + data.escapedName + ' svg').append("svg:path");
|
||||
|
||||
// remember this is new so we can trigger a sort after setting data
|
||||
addNew = true;
|
||||
}
|
||||
|
||||
|
||||
// now update/insert the data
|
||||
$('#CIRCUIT_' + data.escapedName + ' div.monitor_data').html(tmpl(hystrixTemplateCircuit, data));
|
||||
|
||||
var ratePerSecond = data.ratePerSecond;
|
||||
var ratePerSecondPerHost = data.ratePerSecondPerHost;
|
||||
var ratePerSecondPerHostDisplay = ratePerSecondPerHost;
|
||||
var errorThenVolume = (data.errorPercentage * 100000000) + ratePerSecond;
|
||||
|
||||
// set the rates on the div element so it's available for sorting
|
||||
$('#CIRCUIT_' + data.escapedName).attr('rate_value', ratePerSecond);
|
||||
$('#CIRCUIT_' + data.escapedName).attr('error_then_volume', errorThenVolume);
|
||||
|
||||
// update errorPercentage color on page
|
||||
$('#CIRCUIT_' + data.escapedName + ' a.errorPercentage').css('color', self.circuitErrorPercentageColorRange(data.errorPercentage));
|
||||
|
||||
updateCircle('circuit', '#CIRCUIT_' + data.escapedName + ' circle', ratePerSecondPerHostDisplay, data.errorPercentage);
|
||||
|
||||
if(data.graphValues) {
|
||||
// we have a set of values to initialize with
|
||||
updateSparkline('circuit', '#CIRCUIT_' + data.escapedName + ' path', data.graphValues);
|
||||
} else {
|
||||
updateSparkline('circuit', '#CIRCUIT_' + data.escapedName + ' path', ratePerSecond);
|
||||
}
|
||||
|
||||
if(addNew) {
|
||||
// sort since we added a new circuit
|
||||
self.sortSameAsLast();
|
||||
}
|
||||
}
|
||||
|
||||
/* round a number to X digits: num => the number to round, dec => the number of decimals */
|
||||
/* private */ function roundNumber(num) {
|
||||
var dec=1;
|
||||
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
||||
var resultAsString = result.toString();
|
||||
if(resultAsString.indexOf('.') == -1) {
|
||||
resultAsString = resultAsString + '.0';
|
||||
}
|
||||
return resultAsString;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/* private */ function updateCircle(variablePrefix, cssTarget, rate, errorPercentage) {
|
||||
var newXaxisForCircle = self[variablePrefix + 'CircleXaxis'](rate);
|
||||
if(parseInt(newXaxisForCircle) > parseInt(maxXaxisForCircle)) {
|
||||
newXaxisForCircle = maxXaxisForCircle;
|
||||
}
|
||||
var newYaxisForCircle = self[variablePrefix + 'CircleYaxis'](rate);
|
||||
if(parseInt(newYaxisForCircle) > parseInt(maxYaxisForCircle)) {
|
||||
newYaxisForCircle = maxYaxisForCircle;
|
||||
}
|
||||
var newRadiusForCircle = self[variablePrefix + 'CircleRadius'](rate);
|
||||
if(parseInt(newRadiusForCircle) > parseInt(maxRadiusForCircle)) {
|
||||
newRadiusForCircle = maxRadiusForCircle;
|
||||
}
|
||||
|
||||
d3.selectAll(cssTarget)
|
||||
.transition()
|
||||
.duration(400)
|
||||
.attr("cy", newYaxisForCircle)
|
||||
.attr("cx", newXaxisForCircle)
|
||||
.attr("r", newRadiusForCircle)
|
||||
.style("fill", self[variablePrefix + 'ColorRange'](errorPercentage));
|
||||
}
|
||||
|
||||
/* private */ function updateSparkline(variablePrefix, cssTarget, newDataPoint) {
|
||||
var currentTimeMilliseconds = new Date().getTime();
|
||||
var data = self[variablePrefix + cssTarget + '_data'];
|
||||
if(typeof data == 'undefined') {
|
||||
// else it's new
|
||||
if(typeof newDataPoint == 'object') {
|
||||
// we received an array of values, so initialize with it
|
||||
data = newDataPoint;
|
||||
} else {
|
||||
// v: VALUE, t: TIME_IN_MILLISECONDS
|
||||
data = [{"v":parseFloat(newDataPoint),"t":currentTimeMilliseconds}];
|
||||
}
|
||||
self[variablePrefix + cssTarget + '_data'] = data;
|
||||
} else {
|
||||
if(typeof newDataPoint == 'object') {
|
||||
/* if an array is passed in we'll replace the cached one */
|
||||
data = newDataPoint;
|
||||
} else {
|
||||
// else we just add to the existing one
|
||||
data.push({"v":parseFloat(newDataPoint),"t":currentTimeMilliseconds});
|
||||
}
|
||||
}
|
||||
|
||||
while(data.length > 200) { // 400 should be plenty for the 2 minutes we have the scale set to below even with a very low update latency
|
||||
// remove data so we don't keep increasing forever
|
||||
data.shift();
|
||||
}
|
||||
|
||||
if(data.length == 1 && data[0].v == 0) {
|
||||
//console.log("we have a single 0 so skipping");
|
||||
// don't show if we have a single 0
|
||||
return;
|
||||
}
|
||||
|
||||
if(data.length > 1 && data[0].v == 0 && data[1].v != 0) {
|
||||
//console.log("we have a leading 0 so removing it");
|
||||
// get rid of a leading 0 if the following number is not a 0
|
||||
data.shift();
|
||||
}
|
||||
|
||||
var xScale = d3.time.scale().domain([new Date(currentTimeMilliseconds-(60*1000*2)), new Date(currentTimeMilliseconds)]).range([0, 140]);
|
||||
|
||||
var yMin = d3.min(data, function(d) { return d.v; });
|
||||
var yMax = d3.max(data, function(d) { return d.v; });
|
||||
var yScale = d3.scale.linear().domain([yMin, yMax]).nice().range([60, 0]); // y goes DOWN, so 60 is the "lowest"
|
||||
|
||||
sparkline = d3.svg.line()
|
||||
// assign the X function to plot our line as we wish
|
||||
.x(function(d,i) {
|
||||
// return the X coordinate where we want to plot this datapoint based on the time
|
||||
return xScale(new Date(d.t));
|
||||
})
|
||||
.y(function(d) {
|
||||
return yScale(d.v);
|
||||
})
|
||||
.interpolate("basis");
|
||||
|
||||
d3.selectAll(cssTarget).attr("d", sparkline(data));
|
||||
}
|
||||
|
||||
/* private */ function deleteCircuit(circuitName) {
|
||||
$('#CIRCUIT_' + circuitName).remove();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// public methods for sorting
|
||||
HystrixCommandMonitor.prototype.sortByVolume = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'rate_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortByVolumeInDirection(direction);
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByVolumeInDirection = function(direction) {
|
||||
this.sortedBy = 'rate_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort({order: direction, attr: 'rate_value'});
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortAlphabetically = function() {
|
||||
var direction = "asc";
|
||||
if(this.sortedBy == 'alph_asc') {
|
||||
direction = 'desc';
|
||||
}
|
||||
this.sortAlphabeticalInDirection(direction);
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortAlphabeticalInDirection = function(direction) {
|
||||
this.sortedBy = 'alph_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort("p.name", {order: direction});
|
||||
};
|
||||
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByError = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'error_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortByErrorInDirection(direction);
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByErrorInDirection = function(direction) {
|
||||
this.sortedBy = 'error_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort(".errorPercentage .value", {order: direction});
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByErrorThenVolume = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'error_then_volume_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortByErrorThenVolumeInDirection(direction);
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByErrorThenVolumeInDirection = function(direction) {
|
||||
this.sortedBy = 'error_then_volume_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort({order: direction, attr: 'error_then_volume'});
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByLatency90 = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'lat90_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortedBy = 'lat90_' + direction;
|
||||
this.sortByMetricInDirection(direction, ".latency90 .value");
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByLatency99 = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'lat99_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortedBy = 'lat99_' + direction;
|
||||
this.sortByMetricInDirection(direction, ".latency99 .value");
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByLatency995 = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'lat995_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortedBy = 'lat995_' + direction;
|
||||
this.sortByMetricInDirection(direction, ".latency995 .value");
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByLatencyMean = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'latMean_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortedBy = 'latMean_' + direction;
|
||||
this.sortByMetricInDirection(direction, ".latencyMean .value");
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByLatencyMedian = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'latMedian_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortedBy = 'latMedian_' + direction;
|
||||
this.sortByMetricInDirection(direction, ".latencyMedian .value");
|
||||
};
|
||||
|
||||
HystrixCommandMonitor.prototype.sortByMetricInDirection = function(direction, metric) {
|
||||
$('#' + this.containerId + ' div.monitor').tsort(metric, {order: direction});
|
||||
};
|
||||
|
||||
// this method is for when new divs are added to cause the elements to be sorted to whatever the user last chose
|
||||
HystrixCommandMonitor.prototype.sortSameAsLast = function() {
|
||||
if(this.sortedBy == 'alph_asc') {
|
||||
this.sortAlphabeticalInDirection('asc');
|
||||
} else if(this.sortedBy == 'alph_desc') {
|
||||
this.sortAlphabeticalInDirection('desc');
|
||||
} else if(this.sortedBy == 'rate_asc') {
|
||||
this.sortByVolumeInDirection('asc');
|
||||
} else if(this.sortedBy == 'rate_desc') {
|
||||
this.sortByVolumeInDirection('desc');
|
||||
} else if(this.sortedBy == 'error_asc') {
|
||||
this.sortByErrorInDirection('asc');
|
||||
} else if(this.sortedBy == 'error_desc') {
|
||||
this.sortByErrorInDirection('desc');
|
||||
} else if(this.sortedBy == 'error_then_volume_asc') {
|
||||
this.sortByErrorThenVolumeInDirection('asc');
|
||||
} else if(this.sortedBy == 'error_then_volume_desc') {
|
||||
this.sortByErrorThenVolumeInDirection('desc');
|
||||
} else if(this.sortedBy == 'lat90_asc') {
|
||||
this.sortByMetricInDirection('asc', '.latency90 .value');
|
||||
} else if(this.sortedBy == 'lat90_desc') {
|
||||
this.sortByMetricInDirection('desc', '.latency90 .value');
|
||||
} else if(this.sortedBy == 'lat99_asc') {
|
||||
this.sortByMetricInDirection('asc', '.latency99 .value');
|
||||
} else if(this.sortedBy == 'lat99_desc') {
|
||||
this.sortByMetricInDirection('desc', '.latency99 .value');
|
||||
} else if(this.sortedBy == 'lat995_asc') {
|
||||
this.sortByMetricInDirection('asc', '.latency995 .value');
|
||||
} else if(this.sortedBy == 'lat995_desc') {
|
||||
this.sortByMetricInDirection('desc', '.latency995 .value');
|
||||
} else if(this.sortedBy == 'latMean_asc') {
|
||||
this.sortByMetricInDirection('asc', '.latencyMean .value');
|
||||
} else if(this.sortedBy == 'latMean_desc') {
|
||||
this.sortByMetricInDirection('desc', '.latencyMean .value');
|
||||
} else if(this.sortedBy == 'latMedian_asc') {
|
||||
this.sortByMetricInDirection('asc', '.latencyMedian .value');
|
||||
} else if(this.sortedBy == 'latMedian_desc') {
|
||||
this.sortByMetricInDirection('desc', '.latencyMedian .value');
|
||||
}
|
||||
};
|
||||
|
||||
// default sort type and direction
|
||||
this.sortedBy = 'alph_asc';
|
||||
|
||||
|
||||
// a temporary home for the logger until we become more sophisticated
|
||||
function log(message) {
|
||||
console.log(message);
|
||||
};
|
||||
|
||||
function addCommas(nStr){
|
||||
nStr += '';
|
||||
if(nStr.length <=3) {
|
||||
return nStr; //shortcut if we don't need commas
|
||||
}
|
||||
x = nStr.split('.');
|
||||
x1 = x[0];
|
||||
x2 = x.length > 1 ? '.' + x[1] : '';
|
||||
var rgx = /(\d+)(\d{3})/;
|
||||
while (rgx.test(x1)) {
|
||||
x1 = x1.replace(rgx, '$1' + ',' + '$2');
|
||||
}
|
||||
return x1 + x2;
|
||||
}
|
||||
})(window);
|
||||
|
After Width: | Height: | Size: 863 B |
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,77 @@
|
||||
<div class="counters">
|
||||
|
||||
<div class="cell line">
|
||||
<a href="javascript://" title="Error Percentage [Timed-out + Threadpool Rejected + Failure / Total]" class="tooltip errorPercentage"><span class="value"><%= errorPercentage %></span> %</a>
|
||||
</div>
|
||||
|
||||
<div class="cell borderRight">
|
||||
<% if(propertyValue_executionIsolationStrategy == 'THREAD') { %>
|
||||
<a href="javascript://" title="Timed-out Request Count" class="line tooltip timeout"><%= addCommas(rollingCountTimeout) %></a>
|
||||
<a href="javascript://" title="Threadpool Rejected Request Count" class="line tooltip rejected"><%= addCommas(rollingCountThreadPoolRejected) %></a>
|
||||
<% } %>
|
||||
<% if(propertyValue_executionIsolationStrategy == 'SEMAPHORE') { %>
|
||||
<a href="javascript://" title="Semaphore Rejected Request Count" class="line tooltip rejected"><%= addCommas(rollingCountSemaphoreRejected) %></a>
|
||||
<% } %>
|
||||
<a href="javascript://" title="Failure Request Count" class="line tooltip failure"><%= addCommas(rollingCountFailure) %></a>
|
||||
</div>
|
||||
<div class="cell borderRight">
|
||||
<a href="javascript://" title="Successful Request Count" class="line tooltip success"><%= addCommas(rollingCountSuccess) %></a>
|
||||
<a href="javascript://" title="Short-circuited Request Count" class="line tooltip shortCircuited"><%= addCommas(rollingCountShortCircuited) %></a>
|
||||
<a href="javascript://" title="Bad Request Count" class="line tooltip badRequest"><%= addCommas(rollingCountBadRequests) %></a>
|
||||
<br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rate">
|
||||
<a href="javascript://" title="Total Request Rate per Second per Reporting Host" class="tooltip rate"><span class="smaller">Host: </span><span class="ratePerSecondPerHost"><%= addCommas(roundNumber(ratePerSecondPerHost)) %></span>/s</a>
|
||||
</div>
|
||||
<div class="rate">
|
||||
<a href="javascript://" title="Total Request Rate per Second for Cluster" class="tooltip rate"><span class="smaller">Cluster: </span><span class="ratePerSecond"><%= addCommas(roundNumber(ratePerSecond)) %></span>/s</a>
|
||||
</div>
|
||||
|
||||
<div class="circuitStatus">
|
||||
<% if(propertyValue_circuitBreakerForceClosed) { %>
|
||||
<span class="smaller">[ <font color="orange">Forced Closed</font> ]</span>
|
||||
<% } %>
|
||||
<% if(propertyValue_circuitBreakerForceOpen) { %>
|
||||
Circuit <font color="red">Forced Open</font>
|
||||
<% } else { %>
|
||||
<% if(isCircuitBreakerOpen == reportingHosts) { %>
|
||||
Circuit <font color="red">Open</font>
|
||||
<% } else if(isCircuitBreakerOpen == 0) { %>
|
||||
Circuit <font color="green">Closed</font>
|
||||
<% } else {
|
||||
/* We have some circuits that are open */
|
||||
%>
|
||||
Circuit <font color="orange"><%= isCircuitBreakerOpen.toString().replace("true", "Open").replace("false", "Closed") %>)</font>
|
||||
<% } %>
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
<div class="tableRow">
|
||||
<% if(typeof reportingHosts != 'undefined') { %>
|
||||
<div class="cell header">Hosts</div>
|
||||
<div class="cell data"><%= reportingHosts %></div>
|
||||
<% } else { %>
|
||||
<div class="cell header">Host</div>
|
||||
<div class="cell data">Single</div>
|
||||
<% } %>
|
||||
<div class="cell header">90th</div>
|
||||
<div class="cell data latency90"><span class="value"><%= getInstanceAverage(latencyExecute['90'], reportingHosts, false) %></span>ms</div>
|
||||
</div>
|
||||
<div class="tableRow">
|
||||
<div class="cell header">Median</div>
|
||||
<div class="cell data latencyMedian"><span class="value"><%= getInstanceAverage(latencyExecute['50'], reportingHosts, false) %></span>ms</div>
|
||||
<div class="cell header">99th</div>
|
||||
<div class="cell data latency99"><span class="value"><%= getInstanceAverage(latencyExecute['99'], reportingHosts, false) %></span>ms</div>
|
||||
</div>
|
||||
<div class="tableRow">
|
||||
<div class="cell header">Mean</div>
|
||||
<div class="cell data latencyMean"><span class="value"><%= latencyExecute_mean %></span>ms</div>
|
||||
<div class="cell header">99.5th</div>
|
||||
<div class="cell data latency995"><span class="value"><%= getInstanceAverage(latencyExecute['99.5'], reportingHosts, false) %></span>ms</div>
|
||||
</div>
|
||||
|
||||
<!-- <a href="">History</a> <a href="">EPIC</a> <a href="">Actions</a> -->
|
||||
@@ -0,0 +1,40 @@
|
||||
<div class="monitor" id="CIRCUIT_<%= name %>" style="position:relative;">
|
||||
<%
|
||||
var displayName = name;
|
||||
var toolTip = "";
|
||||
if(displayName.length > 32) {
|
||||
displayName = displayName.substring(0,4) + "..." + displayName.substring(displayName.length-20, displayName.length);
|
||||
toolTip = "title=\"" + name + "\"";
|
||||
}
|
||||
%>
|
||||
|
||||
<div id="chart_CIRCUIT_<%= name %>" class="chart" style="position:absolute;top:0px;left:0; float:left; width:100%; height:100%;"></div>
|
||||
<div style="position:absolute;top:0;width:100%;height:15px;opacity:0.8; background:white;">
|
||||
<% if(includeDetailIcon) { %>
|
||||
<p class="name" <%= toolTip %> style="padding-right:16px">
|
||||
<%= displayName %>
|
||||
<a href="../dependencies/command.jsp?name=<%= name %>"><img src="components/hystrixCommand/magnifying-glass-icon-20.png" height="14px" width="14px" border="0" style="position: absolute; right:0px;"></a>
|
||||
</p>
|
||||
<% } else { %>
|
||||
<p class="name" <%= toolTip %>><%= displayName %></p>
|
||||
<% } %>
|
||||
</div>
|
||||
<div style="position:absolute;top:15px;; opacity:0.8; background:white; width:100%; height:95%;">
|
||||
<div class="monitor_data"></div>
|
||||
</div>
|
||||
<div id="graph_CIRCUIT_<%= name %>" class="graph" style="position:absolute;top:25px;left:0; float:left; width:140px; height:62px;"></div>
|
||||
|
||||
<script>
|
||||
var y = 200;
|
||||
/* escape with two backslashes */
|
||||
var vis = d3.select("#chart_CIRCUIT_<%= name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\\\$1') %>").append("svg:svg").attr("width", "100%").attr("height", "100%");
|
||||
/* add a circle -- we don't use the data point, we set it manually, so just passing in [1] */
|
||||
var circle = vis.selectAll("circle").data([1]).enter().append("svg:circle");
|
||||
/* setup the initial styling and sizing of the circle */
|
||||
circle.style("fill", "green").attr("cx", "30%").attr("cy", "30%").attr("r", 5);
|
||||
|
||||
/* add the line graph - it will be populated by javascript, no default to show here */
|
||||
/* escape with two backslashes */
|
||||
var graph = d3.select("#graph_CIRCUIT_<%= name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\\\$1') %>").append("svg:svg").attr("width", "100%").attr("height", "100%");
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div class="tableRow">
|
||||
<div class="cell header">Median</div>
|
||||
<div class="cell data"><span class="value"><%= sla_medianLastMinute %></span>ms</div>
|
||||
<div class="cell header">99th</div>
|
||||
<div class="cell data"><span class="value"><%= sla_percentile99LastMinute %></span>ms</div>
|
||||
</div>
|
||||
@@ -0,0 +1,141 @@
|
||||
.dependencyThreadPools .spacer {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
padding-top:4px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
|
||||
.dependencyThreadPools .last {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools span.loading {
|
||||
display: block;
|
||||
padding-top: 6%;
|
||||
padding-bottom: 6%;
|
||||
color: gray;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dependencyThreadPools span.loading.failed {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
.dependencyThreadPools div.monitor {
|
||||
float: left;
|
||||
margin-right:5px; /* these are tweaked to look good on desktop and iPad portrait, and fit things densely */
|
||||
margin-top:5px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor p.name {
|
||||
font-weight:bold;
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor_data {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.dependencyThreadPools span.smaller {
|
||||
font-size: 8pt;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
|
||||
.dependencyThreadPools div.tableRow {
|
||||
width:100%;
|
||||
white-space: nowrap;
|
||||
font-size: 8pt;
|
||||
margin: 0 auto;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .cell {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .header {
|
||||
text-align:right;
|
||||
padding-right:5px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .header.left {
|
||||
width:85px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .header.right {
|
||||
width:75px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .data {
|
||||
font-weight: bold;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .data.left {
|
||||
width:30px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.tableRow .data.right {
|
||||
width:45px;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor {
|
||||
width: 245px; /* we want a fixed width instead of percentage as I want the boxes to be a set size and then fill in as many as can fit in each row ... this allows 3 columns on an iPad */
|
||||
height: 110px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* override the HREF when we have specified it as a tooltip to not act like a link */
|
||||
.dependencyThreadPools div.monitor_data a.tooltip {
|
||||
text-decoration: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor_data a.rate {
|
||||
font-weight:bold;
|
||||
color: black;
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.rate {
|
||||
padding-top: 1px;
|
||||
clear:both;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
.dependencyThreadPools span.rate_value {
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.dependencyThreadPools div.monitor div.chart {
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor div.chart svg {
|
||||
}
|
||||
|
||||
.dependencyThreadPools div.monitor div.chart svg text {
|
||||
fill: white;
|
||||
}
|
||||
|
||||
.dependencyThreadPools #hidden {
|
||||
width:1px;
|
||||
height:1px;
|
||||
background: lightgrey;
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
|
||||
(function(window) {
|
||||
|
||||
// cache the templates we use on this page as global variables (asynchronously)
|
||||
jQuery.get(getRelativePath("components/hystrixThreadPool/templates/hystrixThreadPool.html"), function(data) {
|
||||
htmlTemplate = data;
|
||||
});
|
||||
jQuery.get(getRelativePath("components/hystrixThreadPool/templates/hystrixThreadPoolContainer.html"), function(data) {
|
||||
htmlTemplateContainer = data;
|
||||
});
|
||||
|
||||
function getRelativePath(path) {
|
||||
var p = location.pathname.slice(0, location.pathname.lastIndexOf("/")+1);
|
||||
return p + path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Object containing functions for displaying and updating the UI with streaming data.
|
||||
*
|
||||
* Publish this externally as "HystrixThreadPoolMonitor"
|
||||
*/
|
||||
window.HystrixThreadPoolMonitor = function(containerId) {
|
||||
|
||||
var self = this; // keep scope under control
|
||||
|
||||
this.containerId = containerId;
|
||||
|
||||
/**
|
||||
* Initialization on construction
|
||||
*/
|
||||
// intialize various variables we use for visualization
|
||||
var maxXaxisForCircle="40%";
|
||||
var maxYaxisForCircle="40%";
|
||||
var maxRadiusForCircle="125";
|
||||
var maxDomain = 2000;
|
||||
|
||||
self.circleRadius = d3.scale.pow().exponent(0.5).domain([0, maxDomain]).range(["5", maxRadiusForCircle]); // requests per second per host
|
||||
self.circleYaxis = d3.scale.linear().domain([0, maxDomain]).range(["30%", maxXaxisForCircle]);
|
||||
self.circleXaxis = d3.scale.linear().domain([0, maxDomain]).range(["30%", maxYaxisForCircle]);
|
||||
self.colorRange = d3.scale.linear().domain([10, 25, 40, 50]).range(["green", "#FFCC00", "#FF9900", "red"]);
|
||||
self.errorPercentageColorRange = d3.scale.linear().domain([0, 10, 35, 50]).range(["grey", "black", "#FF9900", "red"]);
|
||||
|
||||
/**
|
||||
* We want to keep sorting in the background since data values are always changing, so this will re-sort every X milliseconds
|
||||
* to maintain whatever sort the user (or default) has chosen.
|
||||
*
|
||||
* In other words, sorting only for adds/deletes is not sufficient as all but alphabetical sort are dynamically changing.
|
||||
*/
|
||||
setInterval(function() {
|
||||
// sort since we have added a new one
|
||||
self.sortSameAsLast();
|
||||
}, 1000)
|
||||
|
||||
/**
|
||||
* END of Initialization on construction
|
||||
*/
|
||||
|
||||
/**
|
||||
* Event listener to handle new messages from EventSource as streamed from the server.
|
||||
*/
|
||||
/* public */ self.eventSourceMessageListener = function(e) {
|
||||
var data = JSON.parse(e.data);
|
||||
if(data) {
|
||||
// check for reportingHosts (if not there, set it to 1 for singleHost vs cluster)
|
||||
if(!data.reportingHosts) {
|
||||
data.reportingHosts = 1;
|
||||
}
|
||||
|
||||
if(data && data.type == 'HystrixThreadPool') {
|
||||
if (data.deleteData == 'true') {
|
||||
deleteThreadPool(data.escapedName);
|
||||
} else {
|
||||
displayThreadPool(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pre process the data before displying in the UI.
|
||||
* e.g Get Averages from sums, do rate calculation etc.
|
||||
*/
|
||||
function preProcessData(data) {
|
||||
validateData(data);
|
||||
// escape string used in jQuery & d3 selectors
|
||||
data.escapedName = data.name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\$1');
|
||||
// do math
|
||||
converAllAvg(data);
|
||||
calcRatePerSecond(data);
|
||||
}
|
||||
|
||||
function converAllAvg(data) {
|
||||
convertAvg(data, "propertyValue_queueSizeRejectionThreshold", false);
|
||||
}
|
||||
|
||||
function convertAvg(data, key, decimal) {
|
||||
if (decimal) {
|
||||
data[key] = roundNumber(data[key]/data["reportingHosts"]);
|
||||
} else {
|
||||
data[key] = Math.floor(data[key]/data["reportingHosts"]);
|
||||
}
|
||||
}
|
||||
|
||||
function calcRatePerSecond(data) {
|
||||
var numberSeconds = data["propertyValue_metricsRollingStatisticalWindowInMilliseconds"] / 1000;
|
||||
|
||||
var totalThreadsExecuted = data["rollingCountThreadsExecuted"];
|
||||
if (totalThreadsExecuted < 0) {
|
||||
totalThreadsExecuted = 0;
|
||||
}
|
||||
data["ratePerSecond"] = roundNumber(totalThreadsExecuted / numberSeconds);
|
||||
data["ratePerSecondPerHost"] = roundNumber(totalThreadsExecuted / numberSeconds / data["reportingHosts"]);
|
||||
}
|
||||
|
||||
function validateData(data) {
|
||||
|
||||
assertNotNull(data,"type");
|
||||
assertNotNull(data,"name");
|
||||
// assertNotNull(data,"currentTime");
|
||||
assertNotNull(data,"currentActiveCount");
|
||||
assertNotNull(data,"currentCompletedTaskCount");
|
||||
assertNotNull(data,"currentCorePoolSize");
|
||||
assertNotNull(data,"currentLargestPoolSize");
|
||||
assertNotNull(data,"currentMaximumPoolSize");
|
||||
assertNotNull(data,"currentPoolSize");
|
||||
assertNotNull(data,"currentQueueSize");
|
||||
assertNotNull(data,"currentTaskCount");
|
||||
assertNotNull(data,"rollingCountThreadsExecuted");
|
||||
assertNotNull(data,"rollingMaxActiveThreads");
|
||||
assertNotNull(data,"reportingHosts");
|
||||
|
||||
assertNotNull(data,"propertyValue_queueSizeRejectionThreshold");
|
||||
assertNotNull(data,"propertyValue_metricsRollingStatisticalWindowInMilliseconds");
|
||||
}
|
||||
|
||||
function assertNotNull(data, key) {
|
||||
if(data[key] == undefined) {
|
||||
if (key == "dependencyOwner") {
|
||||
data["dependencyOwner"] = data.name;
|
||||
} else {
|
||||
throw new Error("Key Missing: " + key + " for " + data.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to display the THREAD_POOL data
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
/* private */ function displayThreadPool(data) {
|
||||
|
||||
try {
|
||||
preProcessData(data);
|
||||
} catch (err) {
|
||||
log("Failed preProcessData: " + err.message);
|
||||
return;
|
||||
}
|
||||
|
||||
// add the 'addCommas' function to the 'data' object so the HTML templates can use it
|
||||
data.addCommas = addCommas;
|
||||
// add the 'roundNumber' function to the 'data' object so the HTML templates can use it
|
||||
data.roundNumber = roundNumber;
|
||||
|
||||
var addNew = false;
|
||||
// check if we need to create the container
|
||||
if(!$('#THREAD_POOL_' + data.escapedName).length) {
|
||||
// it doesn't exist so add it
|
||||
var html = tmpl(htmlTemplateContainer, data);
|
||||
// remove the loading thing first
|
||||
$('#' + containerId + ' span.loading').remove();
|
||||
// get the current last column and remove the 'last' class from it
|
||||
$('#' + containerId + ' div.last').removeClass('last');
|
||||
// now create the new data and add it
|
||||
$('#' + containerId + '').append(html);
|
||||
// add the 'last' class to the column we just added
|
||||
$('#' + containerId + ' div.monitor').last().addClass('last');
|
||||
|
||||
// add the default sparkline graph
|
||||
d3.selectAll('#graph_THREAD_POOL_' + data.escapedName + ' svg').append("svg:path");
|
||||
|
||||
// remember this is new so we can trigger a sort after setting data
|
||||
addNew = true;
|
||||
}
|
||||
|
||||
// set the rate on the div element so it's available for sorting
|
||||
$('#THREAD_POOL_' + data.escapedName).attr('rate_value', data.ratePerSecondPerHost);
|
||||
|
||||
// now update/insert the data
|
||||
$('#THREAD_POOL_' + data.escapedName + ' div.monitor_data').html(tmpl(htmlTemplate, data));
|
||||
|
||||
// set variables for circle visualization
|
||||
var rate = data.ratePerSecondPerHost;
|
||||
// we will treat each item in queue as 1% of an error visualization
|
||||
// ie. 5 threads in queue per instance == 5% error percentage
|
||||
var errorPercentage = data.currentQueueSize / data.reportingHosts;
|
||||
|
||||
updateCircle('#THREAD_POOL_' + data.escapedName + ' circle', rate, errorPercentage);
|
||||
|
||||
if(addNew) {
|
||||
// sort since we added a new circuit
|
||||
self.sortSameAsLast();
|
||||
}
|
||||
}
|
||||
|
||||
/* round a number to X digits: num => the number to round, dec => the number of decimals */
|
||||
/* private */ function roundNumber(num) {
|
||||
var dec=1; // we are hardcoding to support only 1 decimal so that our padding logic at the end is simple
|
||||
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
||||
var resultAsString = result.toString();
|
||||
if(resultAsString.indexOf('.') == -1) {
|
||||
resultAsString = resultAsString + '.';
|
||||
for(var i=0; i<dec; i++) {
|
||||
resultAsString = resultAsString + '0';
|
||||
}
|
||||
}
|
||||
return resultAsString;
|
||||
};
|
||||
|
||||
|
||||
/* private */ function updateCircle(cssTarget, rate, errorPercentage) {
|
||||
var newXaxisForCircle = self.circleXaxis(rate);
|
||||
if(parseInt(newXaxisForCircle) > parseInt(maxXaxisForCircle)) {
|
||||
newXaxisForCircle = maxXaxisForCircle;
|
||||
}
|
||||
var newYaxisForCircle = self.circleYaxis(rate);
|
||||
if(parseInt(newYaxisForCircle) > parseInt(maxYaxisForCircle)) {
|
||||
newYaxisForCircle = maxYaxisForCircle;
|
||||
}
|
||||
var newRadiusForCircle = self.circleRadius(rate);
|
||||
if(parseInt(newRadiusForCircle) > parseInt(maxRadiusForCircle)) {
|
||||
newRadiusForCircle = maxRadiusForCircle;
|
||||
}
|
||||
|
||||
d3.selectAll(cssTarget)
|
||||
.transition()
|
||||
.duration(400)
|
||||
.attr("cy", newYaxisForCircle)
|
||||
.attr("cx", newXaxisForCircle)
|
||||
.attr("r", newRadiusForCircle)
|
||||
.style("fill", self.colorRange(errorPercentage));
|
||||
}
|
||||
|
||||
/* private */ function deleteThreadPool(poolName) {
|
||||
$('#THREAD_POOL_' + poolName).remove();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// public methods for sorting
|
||||
HystrixThreadPoolMonitor.prototype.sortByVolume = function() {
|
||||
var direction = "desc";
|
||||
if(this.sortedBy == 'rate_desc') {
|
||||
direction = 'asc';
|
||||
}
|
||||
this.sortByVolumeInDirection(direction);
|
||||
}
|
||||
|
||||
HystrixThreadPoolMonitor.prototype.sortByVolumeInDirection = function(direction) {
|
||||
this.sortedBy = 'rate_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort({order: direction, attr: 'rate_value'});
|
||||
}
|
||||
|
||||
HystrixThreadPoolMonitor.prototype.sortAlphabetically = function() {
|
||||
var direction = "asc";
|
||||
if(this.sortedBy == 'alph_asc') {
|
||||
direction = 'desc';
|
||||
}
|
||||
this.sortAlphabeticalInDirection(direction);
|
||||
}
|
||||
|
||||
HystrixThreadPoolMonitor.prototype.sortAlphabeticalInDirection = function(direction) {
|
||||
this.sortedBy = 'alph_' + direction;
|
||||
$('#' + this.containerId + ' div.monitor').tsort("p.name", {order: direction});
|
||||
}
|
||||
|
||||
HystrixThreadPoolMonitor.prototype.sortByMetricInDirection = function(direction, metric) {
|
||||
$('#' + this.containerId + ' div.monitor').tsort(metric, {order: direction});
|
||||
}
|
||||
|
||||
// this method is for when new divs are added to cause the elements to be sorted to whatever the user last chose
|
||||
HystrixThreadPoolMonitor.prototype.sortSameAsLast = function() {
|
||||
if(this.sortedBy == 'alph_asc') {
|
||||
this.sortAlphabeticalInDirection('asc');
|
||||
} else if(this.sortedBy == 'alph_desc') {
|
||||
this.sortAlphabeticalInDirection('desc');
|
||||
} else if(this.sortedBy == 'rate_asc') {
|
||||
this.sortByVolumeInDirection('asc');
|
||||
} else if(this.sortedBy == 'rate_desc') {
|
||||
this.sortByVolumeInDirection('desc');
|
||||
} else if(this.sortedBy == 'error_asc') {
|
||||
this.sortByErrorInDirection('asc');
|
||||
} else if(this.sortedBy == 'error_desc') {
|
||||
this.sortByErrorInDirection('desc');
|
||||
} else if(this.sortedBy == 'lat90_asc') {
|
||||
this.sortByMetricInDirection('asc', 'p90');
|
||||
} else if(this.sortedBy == 'lat90_desc') {
|
||||
this.sortByMetricInDirection('desc', 'p90');
|
||||
} else if(this.sortedBy == 'lat99_asc') {
|
||||
this.sortByMetricInDirection('asc', 'p99');
|
||||
} else if(this.sortedBy == 'lat99_desc') {
|
||||
this.sortByMetricInDirection('desc', 'p99');
|
||||
} else if(this.sortedBy == 'lat995_asc') {
|
||||
this.sortByMetricInDirection('asc', 'p995');
|
||||
} else if(this.sortedBy == 'lat995_desc') {
|
||||
this.sortByMetricInDirection('desc', 'p995');
|
||||
} else if(this.sortedBy == 'latMean_asc') {
|
||||
this.sortByMetricInDirection('asc', 'pMean');
|
||||
} else if(this.sortedBy == 'latMean_desc') {
|
||||
this.sortByMetricInDirection('desc', 'pMean');
|
||||
} else if(this.sortedBy == 'latMedian_asc') {
|
||||
this.sortByMetricInDirection('asc', 'pMedian');
|
||||
} else if(this.sortedBy == 'latMedian_desc') {
|
||||
this.sortByMetricInDirection('desc', 'pMedian');
|
||||
}
|
||||
}
|
||||
|
||||
// default sort type and direction
|
||||
this.sortedBy = 'alph_asc';
|
||||
|
||||
|
||||
// a temporary home for the logger until we become more sophisticated
|
||||
function log(message) {
|
||||
console.log(message);
|
||||
};
|
||||
|
||||
function addCommas(nStr){
|
||||
nStr += '';
|
||||
if(nStr.length <=3) {
|
||||
return nStr; //shortcut if we don't need commas
|
||||
}
|
||||
x = nStr.split('.');
|
||||
x1 = x[0];
|
||||
x2 = x.length > 1 ? '.' + x[1] : '';
|
||||
var rgx = /(\d+)(\d{3})/;
|
||||
while (rgx.test(x1)) {
|
||||
x1 = x1.replace(rgx, '$1' + ',' + '$2');
|
||||
}
|
||||
return x1 + x2;
|
||||
}
|
||||
})(window)
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
<div class="rate">
|
||||
<a href="javascript://" title="Total Execution Rate per Second per Reporting Host" class="tooltip rate"><span class="smaller">Host: </span><span class="ratePerSecondPerHost"><%= addCommas(ratePerSecondPerHost) %></span>/s</a>
|
||||
</div>
|
||||
<div class="rate">
|
||||
<a href="javascript://" title="Total Execution Rate per Second for Cluster" class="tooltip rate"><span class="smaller">Cluster: </span><span class="ratePerSecond"><%= addCommas(ratePerSecond) %></span>/s</a>
|
||||
</div>
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
<div class="tableRow">
|
||||
<div class="cell header left">Active</div>
|
||||
<div class="cell data left"><%= currentActiveCount%></div>
|
||||
|
||||
<div class="cell header right">Max Active</div>
|
||||
<div class="cell data right"><%= addCommas(rollingMaxActiveThreads)%></div>
|
||||
</div>
|
||||
|
||||
<div class="tableRow">
|
||||
<div class="cell header left">Queued</div>
|
||||
<div class="cell data left"><%= currentQueueSize %></div>
|
||||
<div class="cell header right">Executions</div>
|
||||
<div class="cell data right"><%= addCommas(rollingCountThreadsExecuted)%></div>
|
||||
</div>
|
||||
<div class="tableRow">
|
||||
<div class="cell header left">Pool Size</div>
|
||||
<div class="cell data left"><%= currentPoolSize %></div>
|
||||
<div class="cell header right">Queue Size</div>
|
||||
<div class="cell data right"><%= propertyValue_queueSizeRejectionThreshold %></div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<div class="monitor" id="THREAD_POOL_<%= name %>" style="position:relative;">
|
||||
|
||||
<%
|
||||
var displayName = name;
|
||||
var toolTip = "";
|
||||
if(displayName.length > 32) {
|
||||
displayName = displayName.substring(0,4) + "..." + displayName.substring(displayName.length-20, displayName.length);
|
||||
toolTip = "title=\"" + name + "\"";
|
||||
}
|
||||
%>
|
||||
|
||||
<div id="chart_THREAD_POOL_<%= name %>" class="chart" style="position:absolute;top:0px;left:0; float:left; width:100%; height:100%;"></div>
|
||||
<div style="position:absolute;top:0;width:100%;height:15px;opacity:0.8; background:white;"><p class="name" <%= toolTip %>><%= displayName %></p></div>
|
||||
<div style="position:absolute;top:15px;; opacity:0.8; background:white; width:100%; height:95%;">
|
||||
<div class="monitor_data"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
<% if(typeof errorPercentage != 'undefined') { %>
|
||||
var errorPercentageData = [<%= errorPercentage %>];
|
||||
<% } else { %>
|
||||
var errorPercentageData = [99];
|
||||
<% } %>
|
||||
var y = 200;
|
||||
/* escape with two backslashes */
|
||||
var vis = d3.select("#chart_THREAD_POOL_<%= name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\\\$1') %>").append("svg:svg").attr("width", "100%").attr("height", "100%");
|
||||
/* add a circle -- we don't use the data point, we set it manually, so just passing in [1] */
|
||||
var circle = vis.selectAll("circle").data([1]).enter().append("svg:circle");
|
||||
/* setup the initial styling and sizing of the circle */
|
||||
circle.style("fill", "green").attr("cx", "30%").attr("cy", "20%").attr("r", 5);
|
||||
</script>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,71 @@
|
||||
@IMPORT url("resets.css");
|
||||
|
||||
body {
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
}
|
||||
|
||||
img, object, embed {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
img {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
background: #FFFFFF url(../images/hystrix-logo-tagline-tiny.png) no-repeat scroll 99% 0%;
|
||||
height: 65px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#header h2 {
|
||||
float:left;
|
||||
color: black;
|
||||
position:relative;
|
||||
padding-left: 20px;
|
||||
top: 26px;
|
||||
font-size: 20px;
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
}
|
||||
|
||||
#header .header_nav {
|
||||
position:absolute;
|
||||
top:48px;
|
||||
right:15px;
|
||||
}
|
||||
|
||||
#header .header_links {
|
||||
float:left;
|
||||
color: lightgray;
|
||||
font-size: 18px;
|
||||
top: 3px;
|
||||
padding-left: 10px;
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
}
|
||||
|
||||
#header .header_links a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
#header .header_clusters {
|
||||
float:left;
|
||||
position:relative;
|
||||
padding-left: 10px;
|
||||
top: -1px;
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (min-width: 1500px) {
|
||||
|
||||
#header .header_nav {
|
||||
top:13px;
|
||||
right:130px;
|
||||
}
|
||||
|
||||
#header {
|
||||
background: #FFFFFF url(../images/hystrix-logo-tagline-tiny.png) no-repeat scroll 99% 50%;
|
||||
height: 65px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
.container {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.row {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
padding-top:4px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
|
||||
.last {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.menubar {
|
||||
overflow: hidden;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
.menubar div {
|
||||
padding-bottom:5px;
|
||||
|
||||
margin: 0 auto;
|
||||
overflow: hidden;
|
||||
|
||||
font-size: 80%;
|
||||
font-family:'Bookman Old Style',Bookman,'URW Bookman L','Palatino Linotype',serif;
|
||||
|
||||
float:left;
|
||||
}
|
||||
|
||||
.menubar .title {
|
||||
float: left;
|
||||
padding-right: 20px;
|
||||
|
||||
font-size: 110%;
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
font-weight: bold;
|
||||
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.menubar .menu_actions {
|
||||
float: left;
|
||||
position:relative;
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
.menubar .menu_legend {
|
||||
float: right;
|
||||
position:relative;
|
||||
top: 4px;
|
||||
|
||||
}
|
||||
|
||||
h3.sectionHeader {
|
||||
color: black;
|
||||
font-size: 110%;
|
||||
padding-top: 4px;
|
||||
padding-bottom: 4px;
|
||||
padding-left: 8px;
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
||||
background: lightgrey;
|
||||
}
|
||||
|
||||
.success {
|
||||
color: green;
|
||||
}
|
||||
.shortCircuited {
|
||||
color: blue;
|
||||
}
|
||||
.timeout {
|
||||
color: #FF9900; /* shade of orange */
|
||||
}
|
||||
.failure {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.rejected {
|
||||
color: purple;
|
||||
}
|
||||
|
||||
.exceptionsThrown {
|
||||
color: brown;
|
||||
}
|
||||
|
||||
.badRequest {
|
||||
color: #00CC99;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1100px) {
|
||||
.container {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
html5doctor.com Reset Stylesheet
|
||||
v1.6.1
|
||||
Last Updated: 2010-09-17
|
||||
Author: Richard Clark - http://richclarkdesign.com
|
||||
Twitter: @rich_clark
|
||||
*/
|
||||
|
||||
html, body, div, span, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
abbr, address, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, samp,
|
||||
small, strong, sub, sup, var,
|
||||
b, i,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin:0;
|
||||
padding:0;
|
||||
border:0;
|
||||
outline:0;
|
||||
font-size:100%;
|
||||
vertical-align:baseline;
|
||||
background:transparent;
|
||||
}
|
||||
|
||||
body {
|
||||
line-height:1;
|
||||
}
|
||||
|
||||
article,aside,details,figcaption,figure,
|
||||
footer,header,hgroup,menu,nav,section {
|
||||
display:block;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
list-style:none;
|
||||
}
|
||||
|
||||
blockquote, q {
|
||||
quotes:none;
|
||||
}
|
||||
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content:'';
|
||||
content:none;
|
||||
}
|
||||
|
||||
a {
|
||||
margin:0;
|
||||
padding:0;
|
||||
font-size:100%;
|
||||
vertical-align:baseline;
|
||||
background:transparent;
|
||||
}
|
||||
|
||||
/* change colours to suit your needs */
|
||||
ins {
|
||||
background-color:#ff9;
|
||||
color:#000;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
/* change colours to suit your needs */
|
||||
mark {
|
||||
background-color:#ff9;
|
||||
color:#000;
|
||||
font-style:italic;
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
abbr[title], dfn[title] {
|
||||
border-bottom:1px dotted;
|
||||
cursor:help;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse:collapse;
|
||||
border-spacing:0;
|
||||
}
|
||||
|
||||
/* change border colour to suit your needs */
|
||||
hr {
|
||||
display:block;
|
||||
height:1px;
|
||||
border:0;
|
||||
border-top:1px solid #cccccc;
|
||||
margin:1em 0;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
input, select {
|
||||
vertical-align:middle;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||
* http://simplegrid.info
|
||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
||||
* License: http://creativecommons.org/licenses/MIT/ */
|
||||
|
||||
/* Containers */
|
||||
body { font-size: 1.125em; }
|
||||
.grid{ width:1206px; }
|
||||
|
||||
/* 6-Col Grid Sizes */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5{ width:176px; } /* Sixths */
|
||||
.slot-0-1,.slot-1-2,.slot-2-3,.slot-3-4,.slot-4-5{ width:382px; } /* Thirds */
|
||||
.slot-0-1-2-3,.slot-1-2-3-4,.slot-2-3-4-5{ width:794px; } /* Two-Thirds */
|
||||
.slot-0-1-2-3-4,.slot-1-2-3-4-5{ width:1000px; } /* Five-Sixths */
|
||||
|
||||
/* 4-Col Grid Sizes */
|
||||
.slot-6,.slot-7,.slot-8,.slot-9{ width:279px; } /* Quarters */
|
||||
.slot-6-7-8,.slot-7-8-9{ width:897px; } /* Three-Quarters */
|
||||
|
||||
/* 6-Col/4-Col Shared Grid Sizes */
|
||||
.slot-0-1-2,.slot-1-2-3,.slot-2-3-4,.slot-3-4-5, .slot-6-7,.slot-7-8,.slot-8-9{ width:588px; } /* Halves */
|
||||
@@ -0,0 +1,33 @@
|
||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||
* http://simplegrid.info
|
||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
||||
* License: http://creativecommons.org/licenses/MIT/ */
|
||||
|
||||
/* Containers */
|
||||
body { font-size: 0.875em; padding: 0; }
|
||||
.grid{ margin:0 auto; padding: 0 10px; width:700px; }
|
||||
.row{ clear:left; }
|
||||
|
||||
/* Slots Setup */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5,.slot-0-1,.slot-0-1-2,.slot-0-1-2-3,.slot-0-1-2-3-4,.slot-0-1-2-3-4-5,.slot-1-2,.slot-1-2-3,.slot-1-2-3-4,.slot-1-2-3-4-5,.slot-2-3,.slot-2-3-4,.slot-2-3-4-5,.slot-3-4,.slot-3-4-5,.slot-4-5,.slot-6,.slot-7,.slot-8,.slot-9,.slot-6-7,.slot-6-7-8,.slot-6-7-8-9,.slot-7-8,.slot-7-8-9,.slot-8-9{ display:inline; float:left; margin-left:20px; }
|
||||
|
||||
/* 6-Col Grid Sizes */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5{ width:100px; } /* Sixths */
|
||||
.slot-0-1,.slot-1-2,.slot-2-3,.slot-3-4,.slot-4-5{ width:220px; } /* Thirds */
|
||||
.slot-0-1-2-3,.slot-1-2-3-4,.slot-2-3-4-5{ width:460px; } /* Two-Thirds */
|
||||
.slot-0-1-2-3-4,.slot-1-2-3-4-5{ width:580px; } /* Five-Sixths */
|
||||
|
||||
/* 4-Col Grid Sizes */
|
||||
.slot-6,.slot-7,.slot-8,.slot-9{ width:160px; } /* Quarters */
|
||||
.slot-6-7-8,.slot-7-8-9{ width:520px; } /* Three-Quarters */
|
||||
|
||||
/* 6-Col/4-Col Shared Grid Sizes */
|
||||
.slot-0-1-2,.slot-1-2-3,.slot-2-3-4,.slot-3-4-5, .slot-6-7,.slot-7-8,.slot-8-9{ width:340px; } /* Halves */
|
||||
.slot-0-1-2-3-4-5, .slot-6-7-8-9{ width: 100%; } /* Full-Width */
|
||||
|
||||
/* Zeroing Out Leftmost Slot Margins */
|
||||
.slot-0,.slot-0-1,.slot-0-1-2,.slot-0-1-2-3,.slot-0-1-2-3-4,.slot-0-1-2-3-4-5,.slot-6,.slot-6-7,.slot-6-7-8,.slot-6-7-8-9,.slot-1 .slot-1,.slot-1-2 .slot-1,.slot-1-2 .slot-1-2,.slot-1-2-3 .slot-1,.slot-1-2-3 .slot-1-2,.slot-1-2-3 .slot-1-2-3,.slot-1-2-3-4 .slot-1,.slot-1-2-3-4 .slot-1-2,.slot-1-2-3-4 .slot-1-2-3,.slot-1-2-3-4 .slot-1-2-3-4,.slot-1-2-3-4-5 .slot-1,.slot-1-2-3-4-5 .slot-1-2,.slot-1-2-3-4-5 .slot-1-2-3,.slot-1-2-3-4-5 .slot-1-2-3-4,.slot-1-2-3-4-5 .slot-1-2-3-4-5,.slot-2 .slot-2,.slot-2-3 .slot-2,.slot-2-3 .slot-2-3,.slot-2-3-4 .slot-2,.slot-2-3-4 .slot-2-3,.slot-2-3-4 .slot-2-3-4,.slot-2-3-4-5 .slot-2,.slot-2-3-4-5 .slot-2-3,.slot-2-3-4-5 .slot-2-3-4,.slot-2-3-4-5 .slot-2-3-4-5,.slot-3 .slot-3,.slot-3-4 .slot-3,.slot-3-4 .slot-3-4,.slot-3-4-5 .slot-3,.slot-3-4-5 .slot-3-4,.slot-3-4-5 .slot-3-4-5,.slot-4 .slot-4,.slot-4-5 .slot-4,.slot-4-5 .slot-4-5,.slot-5 .slot-5,.slot-7 .slot-7,.slot-7-8 .slot-7,.slot-7-8 .slot-7-8,.slot-7-8-9 .slot-7,.slot-7-8-9 .slot-7-8,.slot-7-8-9 .slot-7-8-9,.slot-8 .slot-8,.slot-8-9 .slot-8,.slot-8-9 .slot-8-9{ margin-left:0 !important; } /* Important is to avoid repeating this in larger screen css files */
|
||||
|
||||
/* Row Clearfix */
|
||||
.row:after{ visibility:hidden; display:block; font-size:0; content:" "; clear:both; height:0; }
|
||||
.row{ zoom:1; }
|
||||
@@ -0,0 +1,24 @@
|
||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||
* http://simplegrid.info
|
||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
||||
* License: http://creativecommons.org/licenses/MIT/ */
|
||||
|
||||
/* Containers */
|
||||
body { font-size: 100%; }
|
||||
.grid{ width:966px; }
|
||||
|
||||
/* Slots Setup */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5,.slot-0-1,.slot-0-1-2,.slot-0-1-2-3,.slot-0-1-2-3-4,.slot-0-1-2-3-4-5,.slot-1-2,.slot-1-2-3,.slot-1-2-3-4,.slot-1-2-3-4-5,.slot-2-3,.slot-2-3-4,.slot-2-3-4-5,.slot-3-4,.slot-3-4-5,.slot-4-5,.slot-6,.slot-7,.slot-8,.slot-9,.slot-6-7,.slot-6-7-8,.slot-6-7-8-9,.slot-7-8,.slot-7-8-9,.slot-8-9{ display:inline; float:left; margin-left:30px; }
|
||||
|
||||
/* 6-Col Grid Sizes */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5{ width:136px; } /* Sixths */
|
||||
.slot-0-1,.slot-1-2,.slot-2-3,.slot-3-4,.slot-4-5{ width:302px; } /* Thirds */
|
||||
.slot-0-1-2-3,.slot-1-2-3-4,.slot-2-3-4-5{ width:634px; } /* Two-Thirds */
|
||||
.slot-0-1-2-3-4,.slot-1-2-3-4-5{ width:800px; } /* Five-Sixths */
|
||||
|
||||
/* 4-Col Grid Sizes */
|
||||
.slot-6,.slot-7,.slot-8,.slot-9{ width:219px; } /* Quarters */
|
||||
.slot-6-7-8,.slot-7-8-9{ width:717px; } /* Three-Quarters */
|
||||
|
||||
/* 6-Col/4-Col Shared Grid Sizes */
|
||||
.slot-0-1-2,.slot-1-2-3,.slot-2-3-4,.slot-3-4-5, .slot-6-7,.slot-7-8,.slot-8-9{ width:468px; } /* Halves */
|
||||
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2011 Crowd Favorite, Ltd.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -0,0 +1 @@
|
||||
http://simplegrid.info/
|
||||
@@ -0,0 +1,27 @@
|
||||
/* Extension of SimpleGrid by benjchristensen to allow percentage based sizing on very large displays
|
||||
*
|
||||
* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||
* http://simplegrid.info
|
||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
||||
* License: http://creativecommons.org/licenses/MIT/ */
|
||||
|
||||
/* Containers */
|
||||
body { font-size: 1.125em; }
|
||||
.grid{ width:100%; }
|
||||
|
||||
/* Slots Setup */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5,.slot-0-1,.slot-0-1-2,.slot-0-1-2-3,.slot-0-1-2-3-4,.slot-0-1-2-3-4-5,.slot-1-2,.slot-1-2-3,.slot-1-2-3-4,.slot-1-2-3-4-5,.slot-2-3,.slot-2-3-4,.slot-2-3-4-5,.slot-3-4,.slot-3-4-5,.slot-4-5,.slot-6,.slot-7,.slot-8,.slot-9,.slot-6-7,.slot-6-7-8,.slot-6-7-8-9,.slot-7-8,.slot-7-8-9,.slot-8-9{ display:inline; float:left; margin-left:0px; }
|
||||
|
||||
|
||||
/* 6-Col Grid Sizes */
|
||||
.slot-0,.slot-1,.slot-2,.slot-3,.slot-4,.slot-5{ width:16.6%; } /* Sixths */
|
||||
.slot-0-1,.slot-1-2,.slot-2-3,.slot-3-4,.slot-4-5{ width:33.3%; } /* Thirds */
|
||||
.slot-0-1-2-3,.slot-1-2-3-4,.slot-2-3-4-5{ width:66.6%; } /* Two-Thirds */
|
||||
.slot-0-1-2-3-4,.slot-1-2-3-4-5{ width:83.3%; } /* Five-Sixths */
|
||||
|
||||
/* 4-Col Grid Sizes */
|
||||
.slot-6,.slot-7,.slot-8,.slot-9{ width:25%; } /* Quarters */
|
||||
.slot-6-7-8,.slot-7-8-9{ width:75%; } /* Three-Quarters */
|
||||
|
||||
/* 6-Col/4-Col Shared Grid Sizes */
|
||||
.slot-0-1-2,.slot-1-2-3,.slot-2-3-4,.slot-3-4-5, .slot-6-7,.slot-7-8,.slot-8-9{ width:50%; } /* Halves */
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 55 KiB |
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* jQuery TinySort - A plugin to sort child nodes by (sub) contents or attributes.
|
||||
*
|
||||
* Version: 1.0.5
|
||||
*
|
||||
* Copyright (c) 2008-2011 Ron Valstar http://www.sjeiti.com/
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
(function(b){b.tinysort={id:"TinySort",version:"1.0.5",copyright:"Copyright (c) 2008-2011 Ron Valstar",uri:"http://tinysort.sjeiti.com/",defaults:{order:"asc",attr:"",place:"start",returns:false,useVal:false}};b.fn.extend({tinysort:function(h,j){if(h&&typeof(h)!="string"){j=h;h=null}var e=b.extend({},b.tinysort.defaults,j);var p={};this.each(function(t){var v=(!h||h=="")?b(this):b(this).find(h);var u=e.order=="rand"?""+Math.random():(e.attr==""?(e.useVal?v.val():v.text()):v.attr(e.attr));var s=b(this).parent();if(!p[s]){p[s]={s:[],n:[]}}if(v.length>0){p[s].s.push({s:u,e:b(this),n:t})}else{p[s].n.push({e:b(this),n:t})}});for(var g in p){var d=p[g];d.s.sort(function k(t,s){var i=t.s.toLowerCase?t.s.toLowerCase():t.s;var u=s.s.toLowerCase?s.s.toLowerCase():s.s;if(c(t.s)&&c(s.s)){i=parseFloat(t.s);u=parseFloat(s.s)}return(e.order=="asc"?1:-1)*(i<u?-1:(i>u?1:0))})}var m=[];for(var g in p){var d=p[g];var n=[];var f=b(this).length;switch(e.place){case"first":b.each(d.s,function(s,t){f=Math.min(f,t.n)});break;case"org":b.each(d.s,function(s,t){n.push(t.n)});break;case"end":f=d.n.length;break;default:f=0}var q=[0,0];for(var l=0;l<b(this).length;l++){var o=l>=f&&l<f+d.s.length;if(a(n,l)){o=true}var r=(o?d.s:d.n)[q[o?0:1]].e;r.parent().append(r);if(o||!e.returns){m.push(r.get(0))}q[o?0:1]++}}return this.pushStack(m)}});function c(e){var d=/^\s*?[\+-]?(\d*\.?\d*?)\s*?$/.exec(e);return d&&d.length>0?d[1]:false}function a(e,f){var d=false;b.each(e,function(h,g){if(!d){d=g==f}});return d}b.fn.TinySort=b.fn.Tinysort=b.fn.tsort=b.fn.tinysort})(jQuery);
|
||||
@@ -0,0 +1,43 @@
|
||||
|
||||
//Simple JavaScript Templating
|
||||
//John Resig - http://ejohn.org/ - MIT Licensed
|
||||
// http://ejohn.org/blog/javascript-micro-templating/
|
||||
(function(window, undefined) {
|
||||
var cache = {};
|
||||
|
||||
window.tmpl = function tmpl(str, data) {
|
||||
try {
|
||||
// Figure out if we're getting a template, or if we need to
|
||||
// load the template - and be sure to cache the result.
|
||||
var fn = !/\W/.test(str) ?
|
||||
cache[str] = cache[str] ||
|
||||
tmpl(document.getElementById(str).innerHTML) :
|
||||
|
||||
// Generate a reusable function that will serve as a template
|
||||
// generator (and which will be cached).
|
||||
new Function("obj",
|
||||
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
||||
|
||||
// Introduce the data as local variables using with(){}
|
||||
"with(obj){p.push('" +
|
||||
|
||||
// Convert the template into pure JavaScript
|
||||
str
|
||||
.replace(/[\r\t\n]/g, " ")
|
||||
.split("<%").join("\t")
|
||||
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
||||
.replace(/\t=(.*?)%>/g, "',$1,'")
|
||||
.split("\t").join("');")
|
||||
.split("%>").join("p.push('")
|
||||
.split("\r").join("\\'")
|
||||
+ "');}return p.join('');");
|
||||
|
||||
//console.log(fn);
|
||||
|
||||
// Provide some basic currying to the user
|
||||
return data ? fn(data) : fn;
|
||||
}catch(e) {
|
||||
console.log(e);
|
||||
}
|
||||
};
|
||||
})(window);
|
||||
@@ -0,0 +1,58 @@
|
||||
<#import "/spring.ftl" as spring />
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<base href="${basePath}">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Hystrix Dashboard</title>
|
||||
|
||||
<!-- Javascript to monitor and display -->
|
||||
<script src="<@spring.url '/webjars/jquery/2.1.1/jquery.min.js'/>" type="text/javascript"></script>
|
||||
|
||||
<script>
|
||||
function sendToMonitor() {
|
||||
|
||||
if($('#stream').val().length > 0) {
|
||||
var url = "<@spring.url '/hystrix'/>/monitor?stream=" + encodeURIComponent($('#stream').val()) + "";
|
||||
if($('#delay').val().length > 0) {
|
||||
url += "&delay=" + $('#delay').val();
|
||||
}
|
||||
if($('#title').val().length > 0) {
|
||||
url += "&title=" + encodeURIComponent($('#title').val());
|
||||
}
|
||||
location.href= url;
|
||||
} else {
|
||||
$('#message').html("The 'stream' value is required.");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div style="width:800px;margin:0 auto;">
|
||||
|
||||
<center>
|
||||
<img width="264" height="233" src="<@spring.url '/hystrix'/>/images/hystrix-logo.png">
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<h2>Hystrix Dashboard</h2>
|
||||
<input id="stream" type="textfield" size="120" placeholder="http://hostname:port/turbine/turbine.stream"></input>
|
||||
<br><br>
|
||||
<i>Cluster via Turbine (default cluster):</i> http://turbine-hostname:port/turbine.stream
|
||||
<br>
|
||||
<i>Cluster via Turbine (custom cluster):</i> http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
|
||||
<br>
|
||||
<i>Single Hystrix App:</i> http://hystrix-app:port/actuator/hystrix.stream
|
||||
<br><br>
|
||||
Delay: <input id="delay" type="textfield" size="10" placeholder="2000"></input>ms
|
||||
|
||||
Title: <input id="title" type="textfield" size="60" placeholder="Example Hystrix App"></input><br>
|
||||
<br>
|
||||
<button onclick="sendToMonitor()">Monitor Stream</button>
|
||||
<br><br>
|
||||
<div id="message" style="color:red"></div>
|
||||
|
||||
</center>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,202 @@
|
||||
<#import "/spring.ftl" as spring />
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<base href="${basePath}">
|
||||
<meta charset="utf-8" />
|
||||
<title>Hystrix Monitor</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<!-- Setup base for everything -->
|
||||
<link rel="stylesheet" type="text/css" href="css/global.css" />
|
||||
|
||||
<!-- Our custom CSS -->
|
||||
<link rel="stylesheet" type="text/css" href="css/monitor.css" />
|
||||
|
||||
<!-- d3 -->
|
||||
<script type="text/javascript" src="<@spring.url '/webjars/d3js/3.4.11/d3.min.js'/>" ></script>
|
||||
|
||||
<!-- Javascript to monitor and display -->
|
||||
<script type="text/javascript" src="<@spring.url '/webjars/jquery/2.1.1/jquery.min.js'/>" ></script>
|
||||
<script type="text/javascript" src="js/jquery.tinysort.min.js"></script>
|
||||
<script type="text/javascript" src="js/tmpl.js"></script>
|
||||
|
||||
<!-- HystrixCommand -->
|
||||
<script type="text/javascript" src="components/hystrixCommand/hystrixCommand.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="components/hystrixCommand/hystrixCommand.css" />
|
||||
|
||||
<!-- HystrixThreadPool -->
|
||||
<script type="text/javascript" src="components/hystrixThreadPool/hystrixThreadPool.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="components/hystrixThreadPool/hystrixThreadPool.css" />
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<h2><span id="title_name"></span></h2>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="menubar">
|
||||
<div class="title">
|
||||
Circuit
|
||||
</div>
|
||||
<div class="menu_actions">
|
||||
Sort:
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByErrorThenVolume();">Error then Volume</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortAlphabetically();">Alphabetical</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByVolume();">Volume</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByError();">Error</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByLatencyMean();">Mean</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByLatencyMedian();">Median</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByLatency90();">90</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByLatency99();">99</a> |
|
||||
<a href="javascript://" onclick="hystrixMonitor.sortByLatency995();">99.5</a>
|
||||
</div>
|
||||
<div class="menu_legend">
|
||||
<span class="success">Success</span> | <span class="shortCircuited">Short-Circuited</span> | <span class="badRequest"> Bad Request</span> | <span class="timeout">Timeout</span> | <span class="rejected">Rejected</span> | <span class="failure">Failure</span> | <span class="errorPercentage">Error %</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dependencies" class="row dependencies"><span class="loading">Loading ...</span></div>
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="menubar">
|
||||
<div class="title">
|
||||
Thread Pools
|
||||
</div>
|
||||
<div class="menu_actions">
|
||||
Sort: <a href="javascript://" onclick="dependencyThreadPoolMonitor.sortAlphabetically();">Alphabetical</a> |
|
||||
<a href="javascript://" onclick="dependencyThreadPoolMonitor.sortByVolume();">Volume</a> |
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dependencyThreadPools" class="row dependencyThreadPools"><span class="loading">Loading ...</span></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/**
|
||||
* Queue up the monitor to start once the page has finished loading.
|
||||
*
|
||||
* This is an inline script and expects to execute once on page load.
|
||||
*/
|
||||
|
||||
// commands
|
||||
var hystrixMonitor = new HystrixCommandMonitor('dependencies', {includeDetailIcon:false});
|
||||
|
||||
var stream = getUrlVars()["stream"];
|
||||
|
||||
console.log("Stream: " + stream)
|
||||
|
||||
if(stream != undefined) {
|
||||
if(getUrlVars()["delay"] != undefined) {
|
||||
stream = stream + "&delay=" + getUrlVars()["delay"];
|
||||
}
|
||||
|
||||
var commandStream = "${contextPath}/proxy.stream?origin=" + stream;
|
||||
var poolStream = "${contextPath}/proxy.stream?origin=" + stream;
|
||||
|
||||
if(getUrlVars()["title"] != undefined) {
|
||||
$('#title_name').text("Hystrix Stream: " + decodeURIComponent(getUrlVars()["title"]))
|
||||
} else {
|
||||
$('#title_name').text("Hystrix Stream: " + decodeURIComponent(stream))
|
||||
}
|
||||
}
|
||||
console.log("Command Stream: " + commandStream)
|
||||
|
||||
$(window).load(function() { // within load with a setTimeout to prevent the infinite spinner
|
||||
setTimeout(function() {
|
||||
if(commandStream == undefined) {
|
||||
console.log("commandStream is undefined")
|
||||
$("#dependencies .loading").html("The 'stream' argument was not provided.");
|
||||
$("#dependencies .loading").addClass("failed");
|
||||
} else {
|
||||
// sort by error+volume by default
|
||||
hystrixMonitor.sortByErrorThenVolume();
|
||||
|
||||
// start the EventSource which will open a streaming connection to the server
|
||||
var source = new EventSource(commandStream);
|
||||
|
||||
// add the listener that will process incoming events
|
||||
source.addEventListener('message', hystrixMonitor.eventSourceMessageListener, false);
|
||||
|
||||
// source.addEventListener('open', function(e) {
|
||||
// console.console.log(">>> opened connection, phase: " + e.eventPhase);
|
||||
// // Connection was opened.
|
||||
// }, false);
|
||||
|
||||
source.addEventListener('error', function(e) {
|
||||
$("#dependencies .loading").html("Unable to connect to Command Metric Stream.");
|
||||
$("#dependencies .loading").addClass("failed");
|
||||
if (e.eventPhase == EventSource.CLOSED) {
|
||||
// Connection was closed.
|
||||
console.log("Connection was closed on error: " + JSON.stringify(e));
|
||||
} else {
|
||||
console.log("Error occurred while streaming: " + JSON.stringify(e));
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
},0);
|
||||
});
|
||||
|
||||
// thread pool
|
||||
var dependencyThreadPoolMonitor = new HystrixThreadPoolMonitor('dependencyThreadPools');
|
||||
|
||||
$(window).load(function() { // within load with a setTimeout to prevent the infinite spinner
|
||||
setTimeout(function() {
|
||||
if(poolStream == undefined) {
|
||||
console.log("poolStream is undefined")
|
||||
$("#dependencyThreadPools .loading").html("The 'stream' argument was not provided.");
|
||||
$("#dependencyThreadPools .loading").addClass("failed");
|
||||
} else {
|
||||
dependencyThreadPoolMonitor.sortByVolume();
|
||||
|
||||
// start the EventSource which will open a streaming connection to the server
|
||||
var source = new EventSource(poolStream);
|
||||
|
||||
// add the listener that will process incoming events
|
||||
source.addEventListener('message', dependencyThreadPoolMonitor.eventSourceMessageListener, false);
|
||||
|
||||
// source.addEventListener('open', function(e) {
|
||||
// console.console.log(">>> opened connection, phase: " + e.eventPhase);
|
||||
// // Connection was opened.
|
||||
// }, false);
|
||||
|
||||
source.addEventListener('error', function(e) {
|
||||
$("#dependencies .loading").html("Unable to connect to Command Metric Stream.");
|
||||
$("#dependencies .loading").addClass("failed");
|
||||
if (e.eventPhase == EventSource.CLOSED) {
|
||||
// Connection was closed.
|
||||
console.log("Connection was closed on error: " + e);
|
||||
} else {
|
||||
console.log("Error occurred while streaming: " + e);
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
},0);
|
||||
});
|
||||
|
||||
//Read a page's GET URL variables and return them as an associative array.
|
||||
// from: http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
|
||||
function getUrlVars()
|
||||
{
|
||||
var vars = [], hash;
|
||||
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
|
||||
for(var i = 0; i < hashes.length; i++)
|
||||
{
|
||||
hash = hashes[i].split('=');
|
||||
vars.push(hash[0]);
|
||||
vars[hash[0]] = hash[1];
|
||||
}
|
||||
return vars;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,394 @@
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*! bulma.io v0.7.1 | MIT License | github.com/jgthms/bulma */@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.breadcrumb,.button,.delete,.file,.is-unselectable,.modal-close,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:after,.select:not(.is-multiple):not(.is-loading):after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.highlight:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-moz-appearance:none;-webkit-appearance:none;background-color:hsla(0,0%,4%,.2);border:none;border-radius:290486px;cursor:pointer;display:inline-block;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.delete:after,.delete:before,.modal-close:after,.modal-close:before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete:before,.modal-close:before{height:2px;width:50%}.delete:after,.modal-close:after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:hsla(0,0%,4%,.3)}.delete:active,.modal-close:active{background-color:hsla(0,0%,4%,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading:after,.content.is-loading:after,.control.is-loading:after,.loader,.section.is-loading:after,.select.is-loading:after,p.is-loading:before{animation:a .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-1by1 img,.image.is-1by2 img,.image.is-1by3 img,.image.is-2by1 img,.image.is-2by3 img,.image.is-3by1 img,.image.is-3by2 img,.image.is-3by4 img,.image.is-3by5 img,.image.is-4by3 img,.image.is-4by5 img,.image.is-5by3 img,.image.is-5by4 img,.image.is-9by16 img,.image.is-16by9 img,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding:calc(.375em - 1px) calc(.625em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:none}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select select[disabled],.textarea[disabled]{cursor:not-allowed}
|
||||
|
||||
/*! minireset.css v0.0.3 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}audio,img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0;text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1rem;font-weight:400;line-height:1.5}a{color:#42d3a5;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{color:#ff3860;font-size:.875em;font-weight:400;padding:.25em .5em}code,hr{background-color:#f5f5f5}hr{border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{text-align:left;vertical-align:top}table th{color:#363636}.is-clearfix:after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-clipped{overflow:hidden!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media print,screen and (min-width:769px){.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1087px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1088px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1280px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1472px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media print,screen and (min-width:769px){.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-centered-tablet-only{text-align:center!importanLine truncated
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.confirm-button{transition:all .15s ease-out}.formatted{white-space:pre}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.icon-button{background:none;border:none;padding:0;font-size:1em;color:inherit}.icon-button:not([disabled]){cursor:pointer}.icon-button:not([disabled]):hover{color:#0a0a0a}.icon-button:not([disabled]) svg{fill:currentcolor}.icon-button:disabled{opacity:.5;pointer-events:none}.icon-button:active{outline:none}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.panel{margin-bottom:1.5rem}.panel__close{margin-right:.75em;color:#b5b5b5;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;justify-self:flex-end}.panel__header--sticky{position:-webkit-sticky;position:sticky;background-color:#fff}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.application-status{text-align:center;line-height:1rem;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column}.application-status__icon{color:gray;margin:0 auto}.application-status__icon--UP{color:#23d160}.application-status__icon--RESTRICTED{color:#ffdd57}.application-status__icon--DOWN,.application-status__icon--OUT_OF_SERVICE{color:#ff3860}.application-status__icon--OFFLINE,.application-status__icon--UNKNOWN{color:#7a7a7a}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.logo{-ms-flex-item-align:center;align-self:center;-ms-flex-preferred-size:12em;flex-basis:12em;-ms-flex-preferred-size:content;flex-basis:content;max-height:2.25em;padding:.5em 1em .5em .5em;font-size:1.5em;font-weight:600;white-space:nowrap}.logo img{margin-right:.5em}.about-links{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.about-links>*{margin-right:.5rem}.button.is-stackoverflow.is-outlined{background-color:transparent;border-color:#f48024;color:#f48024}.button.is-stackoverflow.is-outlined:focus,.button.is-stackoverflow.is-outlined:hover{background-color:#f48024;border-color:#f48024;color:#fff}.button.is-gitter.is-outlined{background-color:transparent;border-color:#ed1965;color:#ed1965}.button.is-gitter.is-outlined:focus,.button.is-gitter.is-outlined:hover{background-color:#ed1965;border-color:#ed1965;color:#fff}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.application-group{margin:64px 0}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.application-list__item{transition:all 86ms ease-out}.application-list__item.is-active{margin:.75rem -.75rem;max-width:unset}.application-list__item__header{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:center;align-items:center}:not(.is-active)>.application-list__item__header:hover{background-color:#fafafa}.application-list__item__header>:not(:first-child){margin-left:12px}.application-list__item__header__status{width:64px}.application-list__item__header__name,.application-list__item__header__version{-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:50%;flex-basis:50%}.application-list__item__header__name.title{margin:.75rem 0}.application-list__item__header__actions{justify-self:end;opacity:0;transition:all 86ms ease-out;will-change:opacity;margin-right:32px;display:-ms-flexbox;display:flex}.is-active .application-list__item__header__actions,:hover>.application-list__item__header__actions{opacity:1}.application-list__item__header__actions>*{width:32px;height:32px}.application__instances td{vertical-align:middle}.instance__status{width:64px}.instance__actions{text-align:right;opacity:0;transition:all 86ms ease-out;will-change:opacity;margin-right:64px}:hover>.instance__actions{opacity:1}.instance__actions>*{width:32px;height:32px}.control.has-inline-text{line-height:2.25em}.auditevents{table-layout:fixed}.auditevents td{vertical-align:middle}.auditevents__event--is-detailed td{border:none!important}.auditevents__event-detail{overflow:auto}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.details-header{margin-bottom:1.5rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.details-header__urls{width:100%;text-align:center}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.cache-chart__svg{height:159px;width:100%}.cache-chart__area--miss{fill:#ffdd57;opacity:.8}.cache-chart__area--hit{fill:#209cee;opacity:.8}.datasource-current{margin-bottom:0!important}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.datasource-chart__svg{height:159px;width:100%}.datasource-chart__area--active{fill:#209cee;opacity:.8}.datasource-chart__line--max{stroke:#7a7a7a}table .metrics__label{width:300px;white-space:pre-wrap}table .metrics__actions{width:1px;vertical-align:middle}table .metrics__statistic-name *{vertical-align:middle}table .metrics__statistic-value{text-align:right;vertical-align:middle}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/td.health-details__nested{padding:0 0 0 .75em;border-bottom:0}.health-details__nested .table{margin-bottom:.5em}.health-details__status{float:right}.health-details__status--UP{color:#23d160}.health-details__status--RESTRICTED{color:#ffdd57}.health-details__status--DOWN,.health-details__status--OUT_OF_SERVICE{color:#ff3860}.health-details__status--OFFLINE,.health-details__status--UNKNOWN{color:#7a7a7a}.info{overflow:auto}.info__key{vertical-align:top}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.memory-current{margin-bottom:0!important}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.mem-chart__svg{height:159px;width:100%}.mem-chart__area--committed{fill:#ffdd57;opacity:.8}.mem-chart__area--used{fill:#209cee;opacity:.8}.mem-chart__area--metaspace{fill:#42d3a5;opacity:.8}.mem-chart__line--max{stroke:#7a7a7a}.metadata{overflow:auto}.metadata__key{vertical-align:top}.threads-current{margin-bottom:0!important}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.threads-chart__svg{height:159px;width:100%}.threads-chart__area--live{fill:#ffdd57;opacity:.8}.threads-chart__area--daemon{fill:#209cee;opacity:.8}.heapdump{-ms-flex-pack:distribute;justify-content:space-around}.heapdump,.heapdump>div{display:-ms-flexbox;display:flex}.heapdump>div{-ms-flex-direction:column;flex-direction:column}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.trace-chart__svg{height:200px;width:100%}.trace-chart__hover{stroke:#b5b5b5;stroke-width:1px}.trace-chart__tooltip{position:absolute;background:#0a0a0a;opacity:.8;pointer-events:none;border-radius:6px;padding:.825em;width:200px}.trace-chart__tooltip table td,.trace-chart__tooltip table th{border:none;color:#b5b5b5;padding:.25em .75em}.trace-chart__tooltip table td{text-align:right}.trace-chart__tooltip--left{left:5px}.trace-chart__tooltip--right{right:5px}.trace-chart .selection{stroke:none;fill:rgba(0,0,0,.2);fill-opacity:1}.trace-chart__axis-y .domain{stroke:none}.trace-chart__axis-y .tick:not(:first-of-type) line{stroke-dasharray:2,2;stroke:#b5b5b5}.trace-chart__area--totalSuccess{fill:#23d160;opacity:.8}.trace-chart__area--totalClientErrors{fill:#ffdd57;opacity:.8}.trace-chart__area--totalServerErrors{fill:#ff3860;opacity:.8}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.httptraces{table-layout:fixed}.httptraces td{vertical-align:middle;overflow:hidden;word-wrap:break-word}.httptraces__trace--is-detailed td{border:none!important}.httptraces__trace-timestamp{width:130px}.httptraces__trace-method{width:100px}.httptraces__trace-uri{width:auto}.httptraces__trace-status{width:80px}.httptraces__trace-contentType{width:200px}.httptraces__trace-contentLength{width:100px}.httptraces__trace-timeTaken{width:120px}.httptraces__trace-detail{overflow:auto}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.m-bean{transition:all 86ms ease-out}.m-bean.is-active{margin:.75rem -.75rem;max-width:unset}.m-bean.is-active .m-bean--header{padding-bottom:0}.m-bean:not(.is-active) .m-bean--header:hover{background-color:#fafafa}.m-bean--header .level .level-left{width:100%}.m-bean--header .level .level-left .level-item{min-width:0;-ms-flex-negative:1;flex-shrink:1}.m-bean--header .level .level-left .level-item p{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.m-bean--header--close{position:absolute;right:.75rem;top:.75rem}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.m-bean-attribute--text{resize:vertical;min-height:120px}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.logfile-view{padding:1.5em}.logfile-view pre{word-break:break-all;padding:0;white-space:pre-wrap;width:100%}.logfile-view pre:hover{background:#dbdbdb}.logfile-view-actions{top:84px;right:32px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:-webkit-sticky;position:sticky;float:right}.logfile-view-actions__navigation{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between;margin-right:.5rem}.rotated{transform:rotate(90deg)}.logger-control__level--inherited{opacity:.5}.logger-control__level--inherited:hover{opacity:1}.sessions td{vertical-align:middle}.instances{-ms-flex-direction:column;flex-direction:column}.instances,.instances__body{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1}.instances__sidebar,.instances__view{position:relative}.instances__sidebar{z-index:6}.instances__view{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;z-index:5}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.sidebar{height:100%;width:175px;background-color:#fafafa;border-right:1px solid #dbdbdb}.sidebar .instance-summary{padding:1rem .5rem;color:#4a4a4a;background-color:#7a7a7a;text-align:center}.sidebar .instance-summary:hover{background-color:hsla(0,0%,48%,.9)}.sidebar .instance-summary__name{font-weight:600;font-size:1.25rem}.sidebar .instance-summary__id{font-size:1rem}.sidebar .instance-summary--UP{color:#fff;background-color:#42d3a5}.sidebar .instance-summary--UP:hover{background-color:rgba(66,211,165,.9)}.sidebar .instance-summary--RESTRICTED{color:rgba(0,0,0,.7);background-color:#ffdd57}.sidebar .instance-summary--RESTRICTED:hover{background-color:rgba(255,221,87,.9)}.sidebar .instance-summary--DOWN,.sidebar .instance-summary--OUT_OF_SERVICE{color:#fff;background-color:#ff3860}.sidebar .instance-summary--DOWN:hover,.sidebar .instance-summary--OUT_OF_SERVICE:hover{background-color:rgba(255,56,96,.9)}.sidebar a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.sidebar a:hover{background-color:rgba(0,0,0,.04)}.sidebar .sidebar-group .sidebar-group-items{display:none}.sidebar .sidebar-group.is-active{box-shadow:inset 4px 0 0 #42d3a5;background-color:rgba(0,0,0,.04)}.sidebar .sidebar-group.is-active>a{color:#4a4a4a;font-weight:600}.sidebar .sidebar-group.is-active .sidebar-group-items{display:block;padding-bottom:.25em}.sidebar .sidebar-group.is-active .sidebar-group-items a{padding-left:2em}.sidebar .sidebar-group.is-active .sidebar-group-items a.is-active{background-color:#42d3a5;color:#fff}.sidebar .sidebar-group.is-showing-flyout .sidebar-group-items{position:fixed;display:block;z-index:9;background-color:#fff;min-width:150px;box-shadow:0 2px 3px hsla(0,0%,4%,.1),0 0 0 1px hsla(0,0%,4%,.1)}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.threads{table-layout:fixed}.threads__thread-name{width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.threads__thread-details{table-layout:fixed}.threads__thread-details td:first-child:not(.threads__thread-stacktrace){width:20%}.threads__thread-stacktrace{overflow:auto;max-height:300px}.threads__timeline{width:auto;overflow:hidden;text-overflow:ellipsis;padding-left:0!important;padding-right:0!important}.threads__timeline svg{display:block}.threads__scale .domain{display:none}.thread--runnable{fill:#23d160}.thread--timed_waiting,.thread--waiting{fill:#ffdd57}.thread--blocked{fill:#ff3860}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.thread-tag{width:2em}.thread-tag--runnable{color:#fff!important;background-color:#23d160!important}.thread-tag--runnable:before{content:"R"}.thread-tag--timed_waiting,.thread-tag--waiting{color:rgba(0,0,0,.7)!important;background-color:#ffdd57!important}.thread-tag--timed_waiting:before,.thread-tag--waiting:before{content:"W"}.thread-tag--blocked{color:#fff!important;background-color:#ff3860!important}.thread-tag--blocked:before{content:"B"}.thread-tag--terminated{color:#363636!important;background-color:#f5f5f5!important}.thread-tag--terminated:before{content:"T"}.thread-tag--new{color:#363636!important;background-color:#f5f5f5!important}.thread-tag--new:before{content:"N"}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.wallboard{background-color:#4a4a4a;height:calc(100vh - 52px);width:100%}.wallboard .application{color:#f5f5f5;font-size:1em;font-weight:400;line-height:1;text-align:center;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.wallboard .application__name{width:100%;padding:2.5%;color:#fff;font-size:2em;font-weight:600;line-height:1.125}.wallboard .application__version{color:#f5f5f5;font-size:1.25em;line-height:1.25}.wallboard .application__header{width:90%;margin-bottom:.5em}.wallboard .application__footer{width:90%;margin-top:.5em}
|
||||
/*!
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/.hex-mesh{background-color:#4a4a4a;width:100%;height:100%;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-align:center;align-items:center}.hex{fill-opacity:.05;stroke-width:.5;stroke-opacity:.8}.hex polygon{fill:none;stroke:#7a7a7a;transition:all .25s ease-out}.hex.is-white polygon{fill:#fff;fill-opacity:.3;stroke:#fff;stroke-opacity:.95;stroke-width:1.5}.hex.is-black polygon{fill:#0a0a0a;fill-opacity:.3;stroke:#0a0a0a;stroke-opacity:.95;stroke-width:1.5}.hex.is-light polygon{fill:#f5f5f5;fill-opacity:.3;stroke:#f5f5f5;stroke-opacity:.95;stroke-width:1.5}.hex.is-dark polygon{fill:#363636;fill-opacity:.3;stroke:#363636;stroke-opacity:.95;stroke-width:1.5}.hex.is-primary polygon{fill:#42d3a5;fill-opacity:.3;stroke:#42d3a5;stroke-opacity:.95;stroke-width:1.5}.hex.is-link polygon{fill:#3273dc;fill-opacity:.3;stroke:#3273dc;stroke-opacity:.95;stroke-width:1.5}.hex.is-info polygon{fill:#209cee;fill-opacity:.3;stroke:#209cee;stroke-opacity:.95;stroke-width:1.5}.hex.is-success polygon{fill:#23d160;fill-opacity:.3;stroke:#23d160;stroke-opacity:.95;stroke-width:1.5}.hex.is-warning polygon{fill:#ffdd57;fill-opacity:.3;stroke:#ffdd57;stroke-opacity:.95;stroke-width:1.5}.hex.is-danger polygon{fill:#ff3860;fill-opacity:.3;stroke:#ff3860;stroke-opacity:.95;stroke-width:1.5}.hex.is-selectable:hover{cursor:pointer}.hex.is-selectable:hover polygon{fill-opacity:.85;stroke-opacity:1}.hex__body{width:100%;height:100%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}
|
||||
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1,9 @@
|
||||
<svg viewBox="0 0 135.297 120.36666" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<style>.hex{fill:#42d3a5;} .line{fill:#fff;}</style>
|
||||
</defs>
|
||||
<path d="M133.605291 66.312792l-27.6913077 47.9628009c-2.1826121 3.7799055-6.2171779 6.1091806-10.5824021 6.1091806H39.9489658c-4.3652242 0-8.3984567-2.3292751-10.5824021-6.1091806L1.6765893 66.312792c-2.1826121-3.7799055-2.1826121-8.4384557 0-12.2196945L29.3665637 6.1316299C31.5505091 2.3503911 35.5837416.021116 39.9489658.021116h55.3826154c4.3652242 0 8.39979 2.3292751 10.5824021 6.1105139l27.6913077 47.9614676c2.1826121 3.7812388 2.1826121 8.439789 0 12.2196945"
|
||||
class="hex"/>
|
||||
<path d="M61.53275952 19.96761733c-1.41466463.03066923-2.66193345.92969675-3.14052148 2.26164345l-17.8355541 49.69575758-5.85535361-9.759556c-.6159846-1.02927427-1.72965676-1.6601585-2.92962676-1.6601585H.05149659c.04970976 2.00834979.5878153 4.00699982 1.62695933 5.80645483l.59373516 1.02727432h27.56531085l8.57008574 14.28264293c.62131447 1.0359741 1.73705657 1.66015849 2.9276268 1.66015849.1119972 0 .22197446-.00559986.33397166-.01757956 1.31466713-.1279968 2.43673908-1.00337492 2.88472788-2.24604385l17.25756855-48.0947976 18.95252617 46.4108397c.48531787 1.18667033 1.5956601 2.00194995 2.87292818 2.11124722 1.26926826.11332717 2.5074373-.50440739 3.1874203-1.59376016l15.14962126-24.28039297 8.8435789 11.5637109c.6479838.84530887 1.65345867 1.34176645 2.71473213 1.34176645h18.8235294l1.24996875-2.16594585c.84245894-1.45896352 1.35666609-3.0480238 1.54876128-4.6678833h-19.93350165l-10.8157296-14.14464637c-.68131296-.88930777-1.7675558-1.39116522-2.87692807-1.33786655-1.119972.05332866-2.14294643.6515037-2.7362316 1.60345991L84.56351375 70.56637232 64.76700867 22.0885843c-.5359866-1.3079673-1.82695433-2.15894603-3.2362191-2.12294693z"
|
||||
class="line"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,7 @@
|
||||
webpackJsonp([0],{"./node_modules/event-source-polyfill/src/eventsource.js":function(t,e){/** @license
|
||||
* eventsource.js
|
||||
* Available under MIT License (MIT)
|
||||
* https://github.com/Yaffle/EventSource/
|
||||
*/
|
||||
!function(t){"use strict";function e(){this.bitsNeeded=0,this.codePoint=0}function n(t){this.withCredentials=!1,this.responseType="",this.readyState=0,this.status=0,this.statusText="",this.responseText="",this.onprogress=A,this.onreadystatechange=A,this._contentType="",this._xhr=t,this._sendTimeout=0,this._abort=A}function o(t){return t.replace(/[A-Z]/g,function(t){return String.fromCharCode(t.charCodeAt(0)+32)})}function r(t){for(var e=Object.create(null),n=t.split("\r\n"),r=0;r<n.length;r+=1){var i=n[r],s=i.split(": "),a=s.shift(),c=s.join(": ");e[o(a)]=c}this._map=e}function i(){}function s(t){this._headers=t}function a(){}function c(){this._listeners=Object.create(null)}function d(t){y(function(){throw t},0)}function h(t){this.type=t,this.target=void 0}function u(t,e){h.call(this,t),this.data=e.data,this.lastEventId=e.lastEventId}function p(t,e){h.call(this,t),this.status=e.status,this.statusText=e.statusText,this.headers=e.headers}function f(t,e){c.call(this),this.onopen=void 0,this.onmessage=void 0,this.onerror=void 0,this.url=void 0,this.readyState=void 0,this.withCredentials=void 0,this._close=void 0,l(this,t,e)}function v(){return T&&"withCredentials"in T.prototype?T:w}function l(t,e,o){e=String(e);var r=void 0!=o&&Boolean(o.withCredentials),s=G(1e3),c=void 0!=o&&void 0!=o.heartbeatTimeout?M(o.heartbeatTimeout,45e3):G(45e3),f="",l=s,T=!1,w=void 0!=o&&void 0!=o.headers?JSON.parse(JSON.stringify(o.headers)):void 0,C=void 0!=o&&void 0!=o.Transport?o.Transport:v(),m=B?void 0:new n(new C),S=B?new a:new i,b=void 0,E=0,_=O,x="",A="",X="",k="",z=P,K=0,U=0,Z=function(e,n,o,r,i){if(_===R)if(b=i,200===e&&void 0!=o&&D.test(o)){_=N,T=!0,l=s,t.readyState=N;var a=new p("open",{status:e,statusText:n,headers:r});t.dispatchEvent(a),J(t,t.onopen,a)}else{var c="";200!==e?(n&&(n=n.replace(/\s+/g," ")),c="EventSource's response has a status "+e+" "+n+" that is not 200. Aborting the connection."):c="EventSource's response has a Content-Type specifying an unsupported type: "+(void 0==o?"-":o.replace(/\s+/g," "))+". Aborting the connection.",d(new Error(c)),Q();var a=new p("error",{status:e,statusText:n,headers:r});t.dispatchEvent(a),J(t,t.onerror,a)}},$=function(e){if(_===N){for(var n=-1,o=0;o<e.length;o+=1){var r=e.charCodeAt(o);r!=="\n".charCodeAt(0)&&r!=="\r".charCodeAt(0)||(n=o)}var i=(-1!==n?k:"")+e.slice(0,n+1);k=(-1===n?k:"")+e.slice(n+1),""!==i&&(T=!0);for(var a=0;a<i.length;a+=1){var r=i.charCodeAt(a);if(z===j&&r==="\n".charCodeAt(0))z=P;else if(z===j&&(z=P),r==="\r".charCodeAt(0)||r==="\n".charCodeAt(0)){if(z!==P){z===I&&(U=a+1);var d=i.slice(K,U-1),h=i.slice(U+(U<a&&i.charCodeAt(U)===" ".charCodeAt(0)?1:0),a);"data"===d?(x+="\n",x+=h):"id"===d?A=h:"event"===d?X=h:"retry"===d?(s=M(h,s),l=s):"heartbeatTimeout"===d&&(c=M(h,c),0!==E&&(g(E),E=y(function(){V()},c)))}if(z===P){if(""!==x){f=A,""===X&&(X="message");var p=new u(X,{data:x.slice(1),lastEventId:A});if(t.dispatchEvent(p),"message"===X&&J(t,t.onmessage,p),_===H)return}x="",X=""}z=r==="\r".charCodeAt(0)?j:P}else z===P&&(K=a,z=I),z===I?r===":".charCodeAt(0)&&(U=a+1,z=q):z===q&&(z=L)}}},F=function(){if(_===N||_===R){_=O,0!==E&&(g(E),E=0),E=y(function(){V()},l),l=G(Math.min(16*s,2*l)),t.readyState=R;var e=new h("error");t.dispatchEvent(e),J(t,t.onerror,e)}},Q=function(){_=H,void 0!=b&&(b(),b=void 0),0!==E&&(g(E),E=0),t.readyState=H},V=function(){if(E=0,_!==O)return void(T||void 0==b?(T=!1,E=y(function(){V()},c)):(d(new Error("No activity within "+c+" milliseconds. Reconnecting.")),b(),b=void 0));T=!1,E=y(function(){V()},c),_=R,x="",X="",A=f,k="",K=0,U=0,z=P;var t=e;"data:"!==e.slice(0,5)&&"blob:"!==e.slice(0,5)&&""!==f&&(t+=(-1===e.indexOf("?")?"?":"&")+"lastEventId="+encodeURIComponent(f));var n={};if(n.Accept="text/event-stream",void 0!=w)for(var o in w)Object.prototype.hasOwnProperty.call(w,o)&&(n[o]=w[o]);try{S.open(m,Z,$,F,t,r,n)}catch(t){throw Q(),t}};t.url=e,t.readyState=R,t.withCredentials=r,t._close=Q,V()}var y=t.setTimeout,g=t.clearTimeout,T=t.XMLHttpRequest,w=t.XDomainRequest,C=t.EventSource,m=t.document,S=t.Promise,b=t.fetch,E=t.Response,_=t.TextDecoder,x=t.TextEncoder;null==Object.create&&(Object.create=function(t){function e(){}return e.prototype=t,new e}),void 0!=S&&void 0==S.prototype.finally&&(S.prototype.finally=function(t){return this.then(function(e){return S.resolve(t()).then(function(){return e})},function(e){return S.resolve(t()).then(function(){throw e})})}),e.prototype.decode=function(t){function e(t,e,n){if(1===n)return t>=128>>e&&t<<e<=2047;if(2===n)return t>=2048>>e&&t<<e<=55295||t>=57344>>e&&t<<e<=65535;if(3===n)return t>=65536>>e&&t<<e<=1114111;throw new Error}function n(t,e){if(6===t)return e>>6>15?3:e>31?2:1;if(12===t)return e>15?3:2;if(18===t)return 3;throw new Error}for(var o="",r=this.bitsNeeded,i=this.codePoint,s=0;s<t.length;s+=1){var a=t[s];0!==r&&(a<128||a>191||!e(i<<6|63&a,r-6,n(r,i)))&&(r=0,i=65533,o+=String.fromCharCode(i)),0===r?(a>=0&&a<=127?(r=0,i=a):a>=192&&a<=223?(r=6,i=31&a):a>=224&&a<=239?(r=12,i=15&a):a>=240&&a<=Line truncated
|
||||
//# sourceMappingURL=event-source-polyfill.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["webpack:///assets/js/event-source-polyfill.js","webpack:///./node_modules/event-source-polyfill/src/eventsource.js"],"names":["webpackJsonp","./node_modules/event-source-polyfill/src/eventsource.js","module","exports","global","TextDecoderPolyfill","this","bitsNeeded","codePoint","XHRWrapper","xhr","withCredentials","responseType","readyState","status","statusText","responseText","onprogress","k","onreadystatechange","_contentType","_xhr","_sendTimeout","_abort","toLowerCase","name","replace","c","String","fromCharCode","charCodeAt","HeadersPolyfill","all","map","Object","create","array","split","i","length","line","parts","shift","value","join","_map","XHRTransport","HeadersWrapper","headers","_headers","FetchTransport","EventTarget","_listeners","throwError","e","setTimeout","Event","type","target","undefined","MessageEvent","options","call","data","lastEventId","ConnectionEvent","EventSourcePolyfill","url","onopen","onmessage","onerror","_close","start","getBestTransport","XMLHttpRequest","prototype","XDomainRequest","es","Boolean","initialRetry","clampDuration","heartbeatTimeout","parseDuration","retry","wasActivity","JSON","parse","stringify","CurrentTransport","Transport","isFetchSupported","transport","cancelFunction","timeout","currentState","WAITING","dataBuffer","lastEventIdBuffer","eventTypeBuffer","textBuffer","state","FIELD_START","fieldStart","valueStart","onStart","contentType","cancel","CONNECTING","contentTypeRegExp","test","OPEN","event","dispatchEvent","fire","message","Error","close","onProgress","textChunk","n","chunk","slice","position","AFTER_CR","FIELD","field","clearTimeout","onTimeout","CLOSED","VALUE_START","VALUE","onFinish","Math","min","requestURL","indexOf","encodeURIComponent","requestHeaders","hasOwnProperty","open","error","NativeEventSource","EventSource","document","Promise","fetch","Response","TextDecoder","TextEncoder","C","F","callback","then","result","resolve","decode","octets","valid","octetsCount","string","octet","encode","stream","console","log","method","that","silent","onload","onabort","abort","getResponseHeader","onReadyStateChange","setRequestHeader","getAllResponseHeaders","send","error1","get","onStartCallback","onProgressCallback","onFinishCallback","offset","textDecoder","credentials","response","reader","body","getReader","reject","readNextChunk","read","done","typeListeners","listener","handleEvent","addEventListener","listeners","found","push","removeEventListener","filtered","def","parseInt","max","f","window"],"mappings":"AAAAA,cAAc,IAERC,0DACA,SAAUC,EAAQC;;;;;CCMxB,SAAAC,GACA,YAqCA,SAAAC,KACAC,KAAAC,WAAA,EACAD,KAAAE,UAAA,EAkGA,QAAAC,GAAAC,GACAJ,KAAAK,iBAAA,EACAL,KAAAM,aAAA,GACAN,KAAAO,WAAA,EACAP,KAAAQ,OAAA,EACAR,KAAAS,WAAA,GACAT,KAAAU,aAAA,GACAV,KAAAW,WAAAC,EACAZ,KAAAa,mBAAAD,EACAZ,KAAAc,aAAA,GACAd,KAAAe,KAAAX,EACAJ,KAAAgB,aAAA,EACAhB,KAAAiB,OAAAL,EA0MA,QAAAM,GAAAC,GACA,MAAAA,GAAAC,QAAA,kBAAAC,GACA,MAAAC,QAAAC,aAAAF,EAAAG,WAAA,SAIA,QAAAC,GAAAC,GAIA,OAFAC,GAAAC,OAAAC,OAAA,MACAC,EAAAJ,EAAAK,MAAA,QACAC,EAAA,EAAmBA,EAAAF,EAAAG,OAAkBD,GAAA,GACrC,GAAAE,GAAAJ,EAAAE,GACAG,EAAAD,EAAAH,MAAA,MACAZ,EAAAgB,EAAAC,QACAC,EAAAF,EAAAG,KAAA,KACAX,GAAAT,EAAAC,IAAAkB,EAEArC,KAAAuC,KAAAZ,EAMA,QAAAa,MAmCA,QAAAC,GAAAC,GACA1C,KAAA2C,SAAAD,EAMA,QAAAE,MAqCA,QAAAC,KACA7C,KAAA8C,WAAAlB,OAAAC,OAAA,MAGA,QAAAkB,GAAAC,GACAC,EAAA,WACA,KAAAD,IACK,GA2DL,QAAAE,GAAAC,GACAnD,KAAAmD,OACAnD,KAAAoD,WAAAC,GAGA,QAAAC,GAAAH,EAAAI,GACAL,EAAAM,KAAAxD,KAAAmD,GACAnD,KAAAyD,KAAAF,EAAAE,KACAzD,KAAA0D,YAAAH,EAAAG,YAKA,QAAAC,GAAAR,EAAAI,GACAL,EAAAM,KAAAxD,KAAAmD,GACAnD,KAAAQ,OAAA+C,EAAA/C,OACAR,KAAAS,WAAA8C,EAAA9C,WACAT,KAAA0C,QAAAa,EAAAb,QA0CA,QAAAkB,GAAAC,EAAAN,GACAV,EAAAW,KAAAxD,MAEAA,KAAA8D,WAAAT,GACArD,KAAA+D,cAAAV,GACArD,KAAAgE,YAAAX,GAEArD,KAAA6D,QAAAR,GACArD,KAAAO,eAAA8C,GACArD,KAAAK,oBAAAgD,GAEArD,KAAAiE,WAAAZ,GAEAa,EAAAlE,KAAA6D,EAAAN,GAGA,QAAAY,KACA,MAAAC,IAAA,mBAAAA,GAAAC,UACAD,EACAE,EAKA,QAAAJ,GAAAK,EAAAV,EAAAN,GACAM,EAAAvC,OAAAuC,EACA,IAAAxD,OAAAgD,IAAAE,GAAAiB,QAAAjB,EAAAlD,iBAEAoE,EAAAC,EAAA,KACAC,MAAAtB,IAAAE,OAAAF,IAAAE,EAAAoB,iBAAAC,EAAArB,EAAAoB,iBAAA,MAAAD,EAAA,MAEAhB,EAAA,GACAmB,EAAAJ,EACAK,GAAA,EACApC,MAAAW,IAAAE,OAAAF,IAAAE,EAAAb,QAAAqC,KAAAC,MAAAD,KAAAE,UAAA1B,EAAAb,cAAAW,GACA6B,MAAA7B,IAAAE,OAAAF,IAAAE,EAAA4B,UAAA5B,EAAA4B,UAAAhB,IACA/D,EAAAgF,MAAA/B,GAAA,GAAAlD,GAAA,GAAA+E,IACAG,EAAAD,EAAA,GAAAxC,GAAA,GAAAJ,GACA8C,MAAAjC,GACAkC,EAAA,EACAC,EAAAC,EACAC,EAAA,GACAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAAC,EACAC,EAAA,EACAC,EAAA,EAEAC,EAAA,SAAA1F,EAAAC,EAAA0F,EAAAzD,EAAA0D,GACA,GAAAZ,IAAAa,EAEA,GADAf,EAAAc,EACA,MAAA5F,OAAA6C,IAAA8C,GAAAG,EAAAC,KAAAJ,GAAA,CACAX,EAAAgB,EACA1B,GAAA,EACAD,EAAAJ,EACAF,EAAAhE,WAAAiG,CACA,IAAAC,GAAA,GAAA9C,GAAA,QACAnD,SACAC,aACAiC,WAEA6B,GAAAmC,cAAAD,GACAE,EAAApC,IAAAT,OAAA2C,OACS,CACT,GAAAG,GAAA,EACA,OAAApG,GACAC,IACAA,IAAAW,QAAA,aAEAwF,EAAA,uCAAApG,EAAA,IAAAC,EAAA,8CAEAmG,EAAA,kFAAAvD,IAAA8C,EAAA,IAAAA,EAAA/E,QAAA,0CAEA2B,EAAA,GAAA8D,OAAAD,IACAE,GACA,IAAAL,GAAA,GAAA9C,GAAA,SACAnD,SACAC,aACAiC,WAEA6B,GAAAmC,cAAAD,GACAE,EAAApC,IALine truncated
|
||||
@@ -0,0 +1,2 @@
|
||||
webpackJsonp([1],{'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/components/sba-confirm-button.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/components/sba-formatted-obj.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/components/sba-icon-button.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/components/sba-panel.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/components/sba-status.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/shell/navbar.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/main/frontend/views/about/index.vue':function(e,t,n){},'./node_modules/css-hot-loader/index.js!./node_modules/extract-text-webpack-plugin/dist/loader.js?{"omit":1,"remove":true}!./node_modules/style-loader/index.js!./node_modules/css-loader/index.js!./node_modules/vue-loader/lib/style-compiler/index.js?{"optionsId":"0","vue":true,"scoped":false,"sourceMap":false}!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?{"includePaths":["/home/travis/build/codecentric/spring-boot-admin/spring-boot-admin-server-ui/node_modules"]}!./node_modules/vue-loader/lib/selectorLine truncated
|
||||
//# sourceMappingURL=sba-core.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["webpack:///assets/js/sba-core.js","webpack:///./node_modules/moment/locale ^\\.\\/.*$","webpack:///./src/main/frontend/assets/img/favicon-danger.png","webpack:///./src/main/frontend/assets/img/favicon.png","webpack:///./src/main/frontend/assets/img/icon-spring-boot-admin.svg","webpack:///.*\\.spec\\.(js|vue)$).)*\\.(js|vue)$","webpack:///./src/main/frontend/components/font-awesome-icon.js","webpack:///./src/main/frontend/components/index.js","webpack:///./src/main/frontend/components/sba-confirm-button.vue","webpack:///src/main/frontend/components/sba-confirm-button.vue","webpack:///./src/main/frontend/components/sba-confirm-button.vue?41f0","webpack:///./src/main/frontend/components/sba-formatted-obj.vue","webpack:///./src/main/frontend/utils/objToString.js","webpack:///src/main/frontend/components/sba-formatted-obj.vue","webpack:///./src/main/frontend/components/sba-formatted-obj.vue?ecbd","webpack:///./src/main/frontend/components/sba-icon-button.vue","webpack:///src/main/frontend/components/sba-icon-button.vue","webpack:///./src/main/frontend/components/sba-icon-button.vue?93c1","webpack:///./src/main/frontend/components/sba-panel.vue","webpack:///src/main/frontend/components/sba-panel.vue","webpack:///./src/main/frontend/components/sba-panel.vue?99f0","webpack:///./src/main/frontend/components/sba-status.vue","webpack:///src/main/frontend/components/sba-status.vue","webpack:///./src/main/frontend/components/sba-status.vue?0488","webpack:///src/main/frontend/components/sba-tags.vue","webpack:///./src/main/frontend/components/sba-tags.vue?4aa8","webpack:///./src/main/frontend/components/sba-tags.vue","webpack:///./src/main/frontend/components/sba-time-ago.js","webpack:///./src/main/frontend/directives/sticks-below.js","webpack:///./src/main/frontend/shell/navbar.vue","webpack:///./src/main/frontend/notifications.js","webpack:///src/main/frontend/shell/navbar.vue","webpack:///./src/main/frontend/shell/navbar.vue?edb2","webpack:///src/main/frontend/shell/index.vue","webpack:///./src/main/frontend/shell/index.vue?0daf","webpack:///./src/main/frontend/shell/index.vue","webpack:///./src/main/frontend/store.js","webpack:///./src/main/frontend/viewRegistry.js","webpack:///./src/main/frontend/views/index.js","webpack:///./src/main/frontend/index.js","webpack:///./src/main/frontend/mixins/subscribing.js","webpack:///./src/main/frontend/services/application.js","webpack:///./src/main/frontend/utils/logtail.js","webpack:///./src/main/frontend/services/instance.js","webpack:///./src/main/frontend/utils/autolink.js","webpack:///./src/main/frontend/utils/axios.js","webpack:///./src/main/frontend/utils/collections.js","webpack:///./src/main/frontend/utils/d3.js","webpack:///./src/main/frontend/utils/eventsource-polyfill.js","webpack:///./src/main/frontend/utils/rxjs.js","webpack:///./src/main/frontend/utils/uri.js","webpack:///./src/main/frontend/views ^\\.\\/.+\\/index\\.(js|vue)$","webpack:///./src/main/frontend/views/about/index.vue","webpack:///src/main/frontend/views/about/index.vue","webpack:///./src/main/frontend/views/about/index.vue?7f04","webpack:///./src/main/frontend/views/applications/notification-filter-settings.vue","webpack:///./src/main/frontend/views/applications/applications-list.vue","webpack:///./src/main/frontend/views/applications/index.vue","webpack:///./src/main/frontend/directives/popper.js","webpack:///./src/main/frontend/services/notification-filter.js","webpack:///src/main/frontend/views/applications/notification-filter-settings.vue","webpack:///./src/main/frontend/views/applications/notification-filter-settings.vue?27ad","webpack:///src/main/frontend/views/applications/applications-list.vue","webpack:///./src/main/frontend/views/applications/applications-list.vue?79be","webpack:///src/main/frontend/views/applications/handle.vue","webpack:///./src/main/frontend/views/applications/handle.vue?488c","webpack:///./src/main/frontend/views/applications/handle.vue","webpack:///src/main/frontend/views/applications/index.vue","webpack:///./src/main/frontend/views/applications/index.vue?872e","webpack:///./src/main/frontend/views/instances/auditevents/auditevents-list.vue","webpack:///src/main/frontend/views/instances/auditevents/auditevents-list.vue","webpack:///./src/main/frontend/views/instances/auditevents/auditevents-list.vue?7c97","webpack:///src/main/frontend/views/instances/auditevents/index.vue","webpack:///./src/main/frontend/views/instances/auditevents/index.vue?0178","webpack:///./src/main/frontend/views/instances/auditevents/index.vue","webpack:///src/main/frontend/views/instances/configprops/index.vue","webpack:///./src/main/frontend/views/instances/configprops/index.vue?70a5","webpack:///./src/main/frontend/views/instances/configprops/index.vue","webpack:///./src/main/frontend/views/instances/details/cache-chart.vue","webpack:///./src/main/frontend/views/instances/details/details-cache.vue","webpack:///./src/main/frontend/views/instances/details/datasource-chaLine truncated
|
||||
@@ -0,0 +1,17 @@
|
||||
!function(e){function t(n){if(o[n])return o[n].exports;var r=o[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n=window.webpackJsonp;window.webpackJsonp=function(o,s,i){for(var l,a,u,d=0,c=[];d<o.length;d++)a=o[d],r[a]&&c.push(r[a][0]),r[a]=0;for(l in s)Object.prototype.hasOwnProperty.call(s,l)&&(e[l]=s[l]);for(n&&n(o,s,i);c.length;)c.shift()();if(i)for(d=0;d<i.length;d++)u=t(t.s=i[d]);return u};var o={},r={2:0};t.e=function(e){function n(){l.onerror=l.onload=null,clearTimeout(a);var t=r[e];0!==t&&(t&&t[1](new Error("Loading chunk "+e+" failed.")),r[e]=void 0)}var o=r[e];if(0===o)return new Promise(function(e){e()});if(o)return o[2];var s=new Promise(function(t,n){o=r[e]=[t,n]});o[2]=s;var i=document.getElementsByTagName("head")[0],l=document.createElement("script");l.type="text/javascript",l.charset="utf-8",l.async=!0,l.timeout=12e4,t.nc&&l.setAttribute("nonce",t.nc),l.src=t.p+"assets/js/"+({0:"event-source-polyfill"}[e]||e)+".js";var a=setTimeout(n,12e4);return l.onerror=l.onload=n,i.appendChild(l),s},t.m=e,t.c=o,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t.oe=function(e){throw console.error(e),e}}({"./node_modules/@fortawesome/fontawesome-svg-core/index.es.js":function(e,t,n){"use strict";function o(e){var t=ne.querySelector("script["+e+"]");if(t)return t.getAttribute(e)}function r(e){return""===e||"false"!==e&&("true"===e||e)}function s(e){return~be.indexOf(e)}function i(e){if(e&&se){var t=ne.createElement("style");t.setAttribute("type","text/css"),t.innerHTML=e;for(var n=ne.head.childNodes,o=null,r=n.length-1;r>-1;r--){var s=n[r];["STYLE","LINK"].indexOf((s.tagName||"").toUpperCase())>-1&&(o=s)}return ne.head.insertBefore(t,o),e}}function l(){return++He}function a(e){for(var t=[],n=(e||[]).length>>>0;n--;)t[n]=e[n];return t}function u(e){return e.classList?a(e.classList):(e.getAttribute("class")||"").split(" ").filter(function(e){return e})}function d(e,t){var n=t.split("-"),o=n[0],r=n.slice(1).join("-");return o!==e||""===r||s(r)?null:r}function c(e){return(""+e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function m(e){return Object.keys(e||{}).reduce(function(t,n){return t+(n+'="')+c(e[n])+'" '},"").trim()}function f(e){return Object.keys(e||{}).reduce(function(t,n){return t+(n+": ")+e[n]+";"},"")}function _(e){return e.size!==Pe.size||e.x!==Pe.x||e.y!==Pe.y||e.rotate!==Pe.rotate||e.flipX||e.flipY}function h(e){var t=e.transform,n=e.containerWidth,o=e.iconWidth;return{outer:{transform:"translate("+n/2+" 256)"},inner:{transform:"translate("+32*t.x+", "+32*t.y+") scale("+t.size/16*(t.flipX?-1:1)+", "+t.size/16*(t.flipY?-1:1)+") rotate("+t.rotate+" 0 0)"},path:{transform:"translate("+o/2*-1+" -256)"}}}function p(e){var t=e.transform,n=e.width,o=void 0===n?le:n,r=e.height,s=void 0===r?le:r,i=e.startCentered,l=void 0!==i&&i,a="";return a+=l&&ie?"translate("+(t.x/Ee-o/2)+"em, "+(t.y/Ee-s/2)+"em) ":l?"translate(calc(-50% + "+t.x/Ee+"em), calc(-50% + "+t.y/Ee+"em)) ":"translate("+t.x/Ee+"em, "+t.y/Ee+"em) ",a+="scale("+t.size/Ee*(t.flipX?-1:1)+", "+t.size/Ee*(t.flipY?-1:1)+") ",a+="rotate("+t.rotate+"deg) "}function y(e){var t=e.icons,n=t.main,o=t.mask,r=e.prefix,s=e.iconName,i=e.transform,a=e.symbol,u=e.title,d=e.extra,c=e.watchable,m=void 0!==c&&c,f=o.found?o:n,_=f.width,h=f.height,p="fa-w-"+Math.ceil(_/h*16),y=[ke.replacementClass,s?ke.familyPrefix+"-"+s:"",p].filter(function(e){return-1===d.classes.indexOf(e)}).concat(d.classes).join(" "),b={children:[],attributes:ge({},d.attributes,{"data-prefix":r,"data-icon":s,class:y,role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 "+_+" "+h})};m&&(b.attributes[ae]=""),u&&b.children.push({tag:"title",attributes:{id:b.attributes["aria-labelledby"]||"title-"+l()},children:[u]});var j=ge({},b,{prefix:r,iconName:s,main:n,mask:o,transform:i,symbol:a,styles:d.styles}),v=o.found&&n.found?Ne(j):Fe(j),g=v.children,M=v.attributes;return j.children=g,j.attributes=M,a?We(j):ze(j)}function b(e){var t=e.content,n=e.width,o=e.height,r=e.transform,s=e.title,i=e.extra,l=e.watchable,a=void 0!==l&&l,u=ge({},i.attributes,s?{title:s}:{},{class:i.classes.join(" ")});a&&(u[ae]="");var d=ge({},i.styles);_(r)&&(d.transform=p({transform:r,startCentered:!0,width:n,height:o}),d["-webkit-transform"]=d.transform);var c=f(d);c.length>0&&(u.style=c);var m=[];return m.push({tag:"span",attributes:u,children:[t]}),s&&m.push({tag:"span",attributes:{class:"sr-only"},children:[s]}),m}function j(e){var t=e.content,n=e.title,o=e.extra,r=ge({},o.attributes,n?{title:n}:{},{class:o.classes.join(" ")}),s=f(o.styles);s.length>0&&(r.style=s);var i=[];return i.push({tag:"span",attributes:r,children:[t]}),n&&i.push({tag:"span",attributes:{class:"sr-only"},childreLine truncated
|
||||
* Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
var V=function(){},J={},G={},K=null,Z={mark:V,measure:V};try{"undefined"!=typeof window&&(J=window),"undefined"!=typeof document&&(G=document),"undefined"!=typeof MutationObserver&&(K=MutationObserver),"undefined"!=typeof performance&&(Z=performance)}catch(e){}var X=J.navigator||{},Q=X.userAgent,ee=void 0===Q?"":Q,te=J,ne=G,oe=K,re=Z,se=!!ne.documentElement&&!!ne.head&&"function"==typeof ne.addEventListener&&"function"==typeof ne.createElement,ie=~ee.indexOf("MSIE")||~ee.indexOf("Trident/"),le=16,ae="data-fa-i2svg",ue="data-fa-pseudo-element",de="data-prefix",ce="data-icon",me="fontawesome-i2svg",fe=["HTML","HEAD","STYLE","SCRIPT"],_e=function(){try{return!0}catch(e){return!1}}(),he=[1,2,3,4,5,6,7,8,9,10],pe=he.concat([11,12,13,14,15,16,17,18,19,20]),ye=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],be=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(he.map(function(e){return e+"x"})).concat(pe.map(function(e){return"w-"+e})),je=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},ve=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),ge=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Me=function(){function e(e,t){var n=[],o=!0,r=!1,s=void 0;try{for(var i,l=e[Symbol.iterator]();!(o=(i=l.next()).done)&&(n.push(i.value),!t||n.length!==t);o=!0);}catch(e){r=!0,s=e}finally{try{!o&&l.return&&l.return()}finally{if(r)throw s}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),we=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)},xe=te.FontAwesomeConfig||{};if(ne&&"function"==typeof ne.querySelector){[["data-family-prefix","familyPrefix"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach(function(e){var t=Me(e,2),n=t[0],s=t[1],i=r(o(n));void 0!==i&&null!==i&&(xe[s]=i)})}var Le=ge({familyPrefix:"fa",replacementClass:"svg-inline--fa",autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0},xe);Le.autoReplaceSvg||(Le.observeMutations=!1);var ke=ge({},Le);te.FontAwesomeConfig=ke;var Ye=te||{};Ye.___FONT_AWESOME___||(Ye.___FONT_AWESOME___={}),Ye.___FONT_AWESOME___.styles||(Ye.___FONT_AWESOME___.styles={}),Ye.___FONT_AWESOME___.hooks||(Ye.___FONT_AWESOME___.hooks={}),Ye.___FONT_AWESOME___.shims||(Ye.___FONT_AWESOME___.shims=[]);var Te=Ye.___FONT_AWESOME___,De=[],Se=function e(){ne.removeEventListener("DOMContentLoaded",e),Oe=1,De.map(function(e){return e()})},Oe=!1;se&&((Oe=(ne.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(ne.readyState))||ne.addEventListener("DOMContentLoaded",Se));var Ae=function(e){se&&(Oe?setTimeout(e,0):De.push(e))},Ee=le,Pe={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1},He=0,Ce={x:0,y:0,width:"100%",height:"100%"},Ne=function(e){var t=e.children,n=e.attributes,o=e.main,r=e.mask,s=e.transform,i=o.width,a=o.icon,u=r.width,d=r.icon,c=h({transform:s,containerWidth:u,iconWidth:i}),m={tag:"rect",attributes:ge({},Ce,{fill:"white"})},f={tag:"g",attributes:ge({},c.inner),children:[{tag:"path",attributes:ge({},a.attributes,c.path,{fill:"black"})}]},_={tag:"g",attributes:ge({},c.outer),children:[f]},p="mask-"+l(),y="clip-"+l(),b={tag:"mask",attributes:ge({},Ce,{id:p,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[m,_]},j={tag:"defs",children:[{tag:"clipPath",attributes:{id:y},children:[d]},b]};return t.push(j,{tag:"rect",attributes:ge({fill:"currentColor","clip-path":"url(#"+y+")",mask:"url(#"+p+")"},Ce)}),{children:t,attributes:n}},Fe=function(e){var t=e.children,n=e.attributes,o=e.main,r=e.transform,s=e.styles,i=f(s);if(i.length>0&&(n.style=i),_(r)){var l=h({transform:r,containerWidth:o.width,iconWidth:o.width});t.push({tag:"g",attributes:ge({},l.outer),children:[{tag:"g",attributes:ge({},l.inner),children:[{tag:o.icon.tag,children:o.icon.children,attributes:ge({},o.icon.attributes,l.path)}]}]})}else t.push(o.icon);return{children:t,attributes:n}},ze=function(e){var t=e.chilLine truncated
|
||||
* Determine if an object is a Buffer
|
||||
*
|
||||
* @author Feross Aboukhadijeh <https://feross.org>
|
||||
* @license MIT
|
||||
*/
|
||||
e.exports=function(e){return null!=e&&(n(e)||o(e)||!!e._isBuffer)}},"./node_modules/lodash/_SetCache.js":function(e,t,n){function o(){if(!arguments.length)return[];var e=arguments[0];return r(e)?e:[e]}var r=n("./node_modules/lodash/isArray.js");e.exports=o},"./node_modules/lodash/_Stack.js":function(e,t,n){function o(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var o=e[t];this.set(o[0],o[1])}}var r=n("./node_modules/lodash/_listCacheClear.js"),s=n("./node_modules/lodash/_listCacheDelete.js"),i=n("./node_modules/lodash/_listCacheGet.js"),l=n("./node_modules/lodash/_listCacheHas.js"),a=n("./node_modules/lodash/_listCacheSet.js");o.prototype.clear=r,o.prototype.delete=s,o.prototype.get=i,o.prototype.has=l,o.prototype.set=a,e.exports=o},"./node_modules/lodash/_apply.js":function(e,t){function n(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}e.exports=n},"./node_modules/lodash/_arrayAggregator.js":function(e,t){function n(e,t,n,o){for(var r=-1,s=null==e?0:e.length;++r<s;){var i=e[r];t(o,i,n(i),e)}return o}e.exports=n},"./node_modules/lodash/_arrayEach.js":function(e,t){function n(e,t){for(var n=-1,o=null==e?0:e.length;++n<o&&!1!==t(e[n],n,e););return e}e.exports=n},"./node_modules/lodash/_arrayIncludes.js":function(e,t,n){function o(e,t){return!!(null==e?0:e.length)&&r(e,t,0)>-1}var r=n("./node_modules/lodash/_baseIndexOf.js");e.exports=o},"./node_modules/lodash/_arrayIncludesWith.js":function(e,t){function n(e,t,n){for(var o=-1,r=null==e?0:e.length;++o<r;)if(n(t,e[o]))return!0;return!1}e.exports=n},"./node_modules/lodash/_arrayMap.js":function(e,t){function n(e,t){for(var n=-1,o=null==e?0:e.length,r=Array(o);++n<o;)r[n]=t(e[n],n,e);return r}e.exports=n},"./node_modules/lodash/_arraySome.js":function(e,t){function n(e,t){for(var n=-1,o=null==e?0:e.length;++n<o;)if(t(e[n],n,e))return!0;return!1}e.exports=n},"./node_modules/lodash/_assignValue.js":function(e,t,n){function o(e,t,n){var o=e[t];l.call(e,t)&&s(o,n)&&(void 0!==n||t in e)||r(e,t,n)}var r=n("./node_modules/lodash/_baseAssignValue.js"),s=n("./node_modules/lodash/eq.js"),i=Object.prototype,l=i.hasOwnProperty;e.exports=o},"./node_modules/lodash/_assocIndexOf.js":function(e,t,n){function o(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}var r=n("./node_modules/lodash/eq.js");e.exports=o},"./node_modules/lodash/_baseAggregator.js":function(e,t){function n(e,t,n,o){for(var r=-1,s=null==e?0:e.length;++r<s;){var i=e[r];t(o,i,n(i),e)}return o}e.exports=n},"./node_modules/lodash/_baseAssignValue.js":function(e,t,n){function o(e,t,n){"__proto__"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var r=n("./node_modules/lodash/_defineProperty.js");e.exports=o},"./node_modules/lodash/_baseClone.js":function(e,t){function n(e){return e}e.exports=n},"./node_modules/lodash/_baseCreate.js":function(e,t,n){var o=n("./node_modules/lodash/isObject.js"),r=Object.create,s=function(){function e(){}return function(t){if(!o(t))return{};if(r)return r(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=s},"./node_modules/lodash/_baseFlatten.js":function(e,t){function n(e){return e&&e.length?e[0]:void 0}e.exports=n},"./node_modules/lodash/_baseFor.js":function(e,t,n){var o=n("./node_modules/lodash/_createBaseFor.js"),r=o();e.exports=r},"./node_modules/lodash/_baseForOwn.js":function(e,t,n){function o(e,t){return e&&r(e,t,s)}var r=n("./node_modules/lodash/_baseFor.js"),s=n("./node_modules/lodash/keys.js");e.exports=o},"./node_modules/lodash/_baseGet.js":function(e,t){function n(e,t){return null==e?void 0:e[t]}e.exports=n},"./node_modules/lodash/_baseGetTag.js":function(e,t){function n(e){return r.call(e)}var o=Object.prototype,r=o.toString;e.exports=n},"./node_modules/lodash/_baseIndexOf.js":function(e,t){function n(e,t,n){for(var o=n-1,r=e.length;++o<r;)if(e[o]===t)return o;return-1}e.exports=n},"./node_modules/lodash/_baseIsEqual.js":function(e,t,n){function o(e,t,n,i,l){return e===t||(null==e||null==t||!s(e)&&!s(t)?e!==e&&t!==t:r(e,t,n,i,o,l))}var r=n("./node_modules/lodash/_baseIsEqualDeep.js"),s=n("./node_modules/lodash/isObjectLike.js");e.exports=o},"./node_modules/lodash/_baseIsEqualDeep.js":function(e,t,n){function o(e,t,n,o,p,b){var j=u(e),v=u(t),g=j?_:a(e),M=v?_:a(t);g=g==f?h:g,M=M==f?h:M;var w=g==h,x=M==h,L=g==M;if(L&&d(e)){if(!d(t))return!1;j=!0,w=!1}if(L&&!w)return b||(b=new r),j||c(e)?s(e,t,n,o,p,b):i(e,t,g,n,o,p,b);if(!(n&m)){var k=w&&y.call(e,"__wrapped__"),Y=x&&y.call(t,"__wrapped__");if(k||Y){var T=k?e.value():e,D=Y?t.value():t;return b||(b=new r),p(T,D,n,o,b)}}return!!L&&(b||(b=new r),l(e,t,n,o,p,b))}var r=n("./node_modules/lodash/_Stack.js"),s=n("./node_modules/lodash/_equalArrays.js"),i=n("./node_modules/lodash/_equalByTag.js"),l=n("./node_modules/lodash/_equalObjects.js"),a=n("./node_modules/lodash/_getTag.js"),u=n("./node_modules/lodash/isArray.js"),d=n("./node_modules/loLine truncated
|
||||
* Vue.js v2.5.17
|
||||
* (c) 2014-2018 Evan You
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
var bo=Object.freeze({}),jo=Object.prototype.toString,vo=(_("slot,component",!0),_("key,ref,slot,slot-scope,is")),go=Object.prototype.hasOwnProperty,Mo=/-(\w)/g,wo=y(function(e){return e.replace(Mo,function(e,t){return t?t.toUpperCase():""})}),xo=y(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),Lo=/\B([A-Z])/g,ko=y(function(e){return e.replace(Lo,"-$1").toLowerCase()}),Yo=Function.prototype.bind?j:b,To=function(e,t,n){return!1},Do=function(e){return e},So="data-server-rendered",Oo=["component","directive","filter"],Ao=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],Eo={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:To,isReservedAttr:To,isUnknownElement:To,getTagNamespace:w,parsePlatformTagName:Do,mustUseProp:To,_lifecycleHooks:Ao},Po=/[^\w.$]/,Ho="__proto__"in{},Co="undefined"!=typeof window,No="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Fo=No&&WXEnvironment.platform.toLowerCase(),zo=Co&&window.navigator.userAgent.toLowerCase(),Wo=zo&&/msie|trident/.test(zo),Io=zo&&zo.indexOf("msie 9.0")>0,Ro=zo&&zo.indexOf("edge/")>0,Uo=(zo&&zo.indexOf("android"),zo&&/iphone|ipad|ipod|ios/.test(zo)||"ios"===Fo),$o=(zo&&/chrome\/\d+/.test(zo),{}.watch),qo=!1;if(Co)try{var Bo={};Object.defineProperty(Bo,"passive",{get:function(){qo=!0}}),window.addEventListener("test-passive",null,Bo)}catch(e){}var Vo,Jo,Go=function(){return void 0===Vo&&(Vo=!Co&&!No&&void 0!==e&&"server"===e.process.env.VUE_ENV),Vo},Ko=Co&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Zo="undefined"!=typeof Symbol&&S(Symbol)&&"undefined"!=typeof Reflect&&S(Reflect.ownKeys);Jo="undefined"!=typeof Set&&S(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var Xo=w,Qo=0,er=function(){this.id=Qo++,this.subs=[]};er.prototype.addSub=function(e){this.subs.push(e)},er.prototype.removeSub=function(e){h(this.subs,e)},er.prototype.depend=function(){er.target&&er.target.addDep(this)},er.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},er.target=null;var tr=[],nr=function(e,t,n,o,r,s,i,l){this.tag=e,this.data=t,this.children=n,this.text=o,this.elm=r,this.ns=void 0,this.context=s,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=i,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=l,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},or={child:{configurable:!0}};or.child.get=function(){return this.componentInstance},Object.defineProperties(nr.prototype,or);var rr=function(e){void 0===e&&(e="");var t=new nr;return t.text=e,t.isComment=!0,t},sr=Array.prototype,ir=Object.create(sr);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=sr[e];T(ir,e,function(){for(var n=[],o=arguments.length;o--;)n[o]=arguments[o];var r,s=t.apply(this,n),i=this.__ob__;switch(e){case"push":case"unshift":r=n;break;case"splice":r=n.slice(2)}return r&&i.observeArray(r),i.dep.notify(),s})});var lr=Object.getOwnPropertyNames(ir),ar=!0,ur=function(e){if(this.value=e,this.dep=new er,this.vmCount=0,T(e,"__ob__",this),Array.isArray(e)){(Ho?C:N)(e,ir,lr),this.observeArray(e)}else this.walk(e)};ur.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)z(e,t[n])},ur.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)F(e[t])};var dr=Eo.optionMergeStrategies;dr.data=function(e,t,n){return n?$(e,t,n):t&&"function"!=typeof t?e:$(e,t)},Ao.forEach(function(e){dr[e]=q}),Oo.forEach(function(e){dr[e+"s"]=B}),dr.watch=function(e,t,n,o){if(e===$o&&(e=void 0),t===$o&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var r={};g(r,e);for(var s in t){var i=r[s],l=t[s];i&&!Array.isArray(i)&&(i=[i]),r[s]=i?i.concat(l):Array.isArray(l)?l:[l]}return r},dr.props=dr.methods=dr.inject=dr.computed=function(e,t,n,o){if(!e)return t;var r=Object.create(null);return g(r,e),t&&g(r,t),r},dr.provide=$;var cr,mr,fr=function(e,t){return void 0===t?e:t},_r=[],hr=!1,pr=!1;if(void 0!==n&&S(n))mr=function(){n(ie)};else if("undefined"==typeof MessageChannel||!S(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())mr=function(){setTimeout(ie,0)};else{var yr=new MessageChannel,br=yr.port2;yr.port1.onmessage=ie,mr=function(){br.postMessage(1)}}if("undefined"!=typeof Promise&&S(Promise)){var jr=Promise.resolve();cr=function(){jr.then(ie),Uo&&setTimeout(w)}}else cr=mr;var vr,gr=new Jo,Mr=y(function(e){var t="&"===e.charAt(0);e=t?e.slice(1):e;var n="~"===e.charAt(0);e=n?e.slice(1):e;var o="!"===e.charAt(0);rLine truncated
|
||||
//# sourceMappingURL=vendors.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["webpack:///assets/js/vendors.js","webpack:///webpack/bootstrap b2583a747ab41e0de112","webpack:///./node_modules/@fortawesome/fontawesome-svg-core/index.es.js","webpack:///./node_modules/@fortawesome/free-brands-svg-icons/faGithub.js","webpack:///./node_modules/@fortawesome/free-brands-svg-icons/faGitter.js","webpack:///./node_modules/@fortawesome/free-brands-svg-icons/faStackOverflow.js","webpack:///./node_modules/@fortawesome/free-regular-svg-icons/faTimesCircle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faBan.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faBell.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faBellSlash.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faBook.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faCheck.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faDownload.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faExclamation.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faExclamationTriangle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faHeartbeat.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faHome.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faMinusCircle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faPencilAlt.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faQuestionCircle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faSignOutAlt.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faStepBackward.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faStepForward.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faTimesCircle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faTrash.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faUserCircle.js","webpack:///./node_modules/@fortawesome/free-solid-svg-icons/faWrench.js","webpack:///./node_modules/@fortawesome/vue-fontawesome/index.js","webpack:///./node_modules/ansi_up/ansi_up.js","webpack:///./node_modules/autolinker/dist/Autolinker.js","webpack:///./node_modules/axios/index.js","webpack:///./node_modules/axios/lib/adapters/xhr.js","webpack:///./node_modules/axios/lib/axios.js","webpack:///./node_modules/axios/lib/cancel/Cancel.js","webpack:///./node_modules/axios/lib/cancel/CancelToken.js","webpack:///./node_modules/axios/lib/cancel/isCancel.js","webpack:///./node_modules/axios/lib/core/Axios.js","webpack:///./node_modules/axios/lib/core/InterceptorManager.js","webpack:///./node_modules/axios/lib/core/createError.js","webpack:///./node_modules/axios/lib/core/dispatchRequest.js","webpack:///./node_modules/axios/lib/core/enhanceError.js","webpack:///./node_modules/axios/lib/core/settle.js","webpack:///./node_modules/axios/lib/core/transformData.js","webpack:///./node_modules/axios/lib/defaults.js","webpack:///./node_modules/axios/lib/helpers/bind.js","webpack:///./node_modules/axios/lib/helpers/btoa.js","webpack:///./node_modules/axios/lib/helpers/buildURL.js","webpack:///./node_modules/axios/lib/helpers/combineURLs.js","webpack:///./node_modules/axios/lib/helpers/cookies.js","webpack:///./node_modules/axios/lib/helpers/isAbsoluteURL.js","webpack:///./node_modules/axios/lib/helpers/isURLSameOrigin.js","webpack:///./node_modules/axios/lib/helpers/normalizeHeaderName.js","webpack:///./node_modules/axios/lib/helpers/parseHeaders.js","webpack:///./node_modules/axios/lib/helpers/spread.js","webpack:///./node_modules/axios/lib/utils.js","webpack:///./node_modules/babel-polyfill/lib/index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/babel-polyfill/Line truncated
|
||||
@@ -0,0 +1,70 @@
|
||||
<!--
|
||||
~ Copyright 2014-2018 the original author or authors.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<base th:href="@{${adminContextPath} + '/'}" href="/">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="format-detection" content="telephone=no,email=no">
|
||||
<meta name="theme-color" content="#42d3a5">
|
||||
|
||||
<link rel="preload" href="assets/css/sba-core.css" as="style">
|
||||
<th:block th:each="cssFile : ${cssExtensions}">
|
||||
<link rel="preload" th:href="${cssFile.resourcePath}" as="style">
|
||||
</th:block>
|
||||
<link rel="preload" href="assets/js/vendors.js" as="script">
|
||||
<th:block th:each="jsFile : ${jsExtensions}">
|
||||
<link rel="preload" th:href="${jsFile.resourcePath}" as="script">
|
||||
</th:block>
|
||||
<link rel="preload" href="assets/js/sba-core.js" as="script">
|
||||
|
||||
<link href="assets/css/sba-core.css" rel="stylesheet">
|
||||
<th:block th:each="cssFile : ${cssExtensions}">
|
||||
<link th:href="${cssFile.resourcePath}" rel="stylesheet">
|
||||
</th:block>
|
||||
<link rel="shortcut icon" href="assets/img/favicon.png" type="image/png">
|
||||
<title th:text="${uiSettings.title}">Spring Boot Admin</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="app"></div>
|
||||
|
||||
<script th:inline="javascript">
|
||||
var SBA = {
|
||||
uiSettings: /*[[${uiSettings}]]*/ {},
|
||||
user: /*[[${user}]]*/ null,
|
||||
extensions: [],
|
||||
/*[#th:block th:if="${_csrf}"]*/
|
||||
csrf: {
|
||||
parameterName: /*[[${_csrf.parameterName}]]*/ null,
|
||||
headerName: /*[[${_csrf.headerName}]]*/ null
|
||||
},
|
||||
/*[/th:block]*/
|
||||
use: function (ext) {
|
||||
this.extensions.push(ext);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script lang="javascript" src="assets/js/vendors.js" defer></script>
|
||||
<th:block th:each="jsFile : ${jsExtensions}">
|
||||
<script lang="javascript" th:src="${jsFile.resourcePath}" defer></script>
|
||||
</th:block>
|
||||
<script lang="javascript" src="assets/js/sba-core.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,80 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
~ Copyright 2014-2018 the original author or authors.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<base th:href="@{${adminContextPath} + '/'}" href="/">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="format-detection" content="telephone=no,email=no">
|
||||
<meta name="theme-color" content="#42d3a5">
|
||||
<link rel="shortcut icon" href="assets/img/favicon.png" type="image/png">
|
||||
<link rel="preload" href="assets/css/sba-core.css" as="style">
|
||||
<link href="assets/css/sba-core.css" rel="stylesheet">
|
||||
<title>Spring Boot Admin - Login</title>
|
||||
</head>
|
||||
<body class="login">
|
||||
|
||||
<section class="hero is-fullheight">
|
||||
<div class="hero-body">
|
||||
<div class="container has-text-centered">
|
||||
<div class="column is-4 is-offset-4">
|
||||
<div class="box">
|
||||
<figure class="image is-128x128 login--logo">
|
||||
<img src="assets/img/icon-spring-boot-admin.svg">
|
||||
</figure>
|
||||
<h1 class="title has-text-primary">Spring Boot Admin</h1>
|
||||
<form method="post">
|
||||
<input type="hidden"
|
||||
th:if="${_csrf}"
|
||||
th:name="${_csrf.parameterName}"
|
||||
th:value="${_csrf.token}"/>
|
||||
<div class="field">
|
||||
<p class="is-medium has-text-danger" th:unless="${param.error == null}">
|
||||
Invalid username or password
|
||||
</p>
|
||||
<p class="is-medium" th:unless="${param.logout == null}">
|
||||
Logout successful
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input is-medium" type="input" name="username" placeholder="Username"
|
||||
autofocus th:classappend="${param.error != null} ? is-danger">
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input is-medium" type="password" name="password"
|
||||
placeholder="Password" th:classappend="${param.error != null} ? is-danger">
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input type="submit" class="button is-block is-primary is-medium is-fullwidth"
|
||||
value="Login">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</body>
|
||||
</html>
|
||||