✨ 添加新特性。 add turbine 、 sba customer ui

This commit is contained in:
冷冷 committed 2018-11-16 14:01:39 +08:00
1 parent d3b61f0aab
commit 955fd80929
45 files changed
+2743 -77

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);
+10 -5
View File
@@ -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);
Binary file not shown.

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 */
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

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
&nbsp;&nbsp;&nbsp;&nbsp;
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}
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

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,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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>