├── .gitattributes ├── src └── main │ ├── resources │ └── META-INF │ │ ├── spring.factories │ │ └── resources │ │ └── monitor │ │ ├── assets │ │ ├── img │ │ │ ├── favicon.png │ │ │ ├── favicon-danger.png │ │ │ └── icon-spring-boot-admin.svg │ │ ├── js │ │ │ ├── login.4fc89eff.js │ │ │ ├── login.4fc89eff.js.map │ │ │ ├── event-source-polyfill.9676e331.js │ │ │ ├── chunk-common.9cc280b0.js.map │ │ │ └── event-source-polyfill.9676e331.js.map │ │ └── css │ │ │ └── sba-core.0293d669.css │ │ ├── sba-settings.js │ │ ├── index.html │ │ └── login.html │ └── java │ └── cn │ └── pomit │ └── boot │ └── monitor │ ├── event │ ├── InstanceEventLog.java │ ├── InstanceEndpointsDetectedEvent.java │ ├── InstanceStatusChangedEvent.java │ ├── InstanceEvent.java │ └── InstanceRegisteredEvent.java │ ├── model │ ├── Application.java │ ├── UserInfo.java │ ├── Endpoint.java │ ├── Info.java │ ├── Registration.java │ ├── Tags.java │ ├── Endpoints.java │ ├── StatusInfo.java │ └── Instance.java │ ├── ui │ ├── UiController.java │ └── ApplicationController.java │ └── configuration │ └── MonitorUiAutoConfiguration.java ├── .gitignore ├── README.md ├── pom.xml └── LICENSE /.gitattributes: -------------------------------------------------------------------------------- 1 | *.css linguist-language=java -------------------------------------------------------------------------------- /src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | cn.pomit.boot.monitor.configuration.MonitorUiAutoConfiguration -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffch/spring-boot-monitor/HEAD/src/main/resources/META-INF/resources/monitor/assets/img/favicon.png -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/img/favicon-danger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffch/spring-boot-monitor/HEAD/src/main/resources/META-INF/resources/monitor/assets/img/favicon-danger.png -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/event/InstanceEventLog.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.event; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | @lombok.Data 7 | public class InstanceEventLog { 8 | private List eventList = new ArrayList<>(); 9 | private boolean hasInit = false; 10 | 11 | public void add(InstanceEvent instanceEvent) { 12 | eventList.add(instanceEvent); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Application.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import java.time.Instant; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | @lombok.Data 8 | public class Application { 9 | private String name; 10 | private String buildVersion; 11 | private String status = StatusInfo.STATUS_UP; 12 | private Instant statusTimestamp = Instant.now(); 13 | private List instances = new ArrayList<>(); 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | /.settings/ 25 | /.mvn/ 26 | /mvnw 27 | /mvnw.cmd 28 | /target/ 29 | 30 | # Maven # 31 | target/ 32 | 33 | # IDEA # 34 | .idea/ 35 | *.iml 36 | 37 | # Eclipse # 38 | .settings/ 39 | .metadata/ 40 | .classpath 41 | .project 42 | Servers/ 43 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/UserInfo.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 用户信息 7 | * 8 | * @author 陈付菲 9 | */ 10 | @lombok.Data 11 | public class UserInfo implements Serializable { 12 | /** 13 | * 14 | */ 15 | private static final long serialVersionUID = 5729690130594095773L; 16 | private String salt; 17 | private String userName; 18 | private String password; 19 | private String userNameToken; 20 | 21 | public UserInfo() { 22 | 23 | } 24 | 25 | public UserInfo(String salt, String userName, String password) { 26 | this.salt = salt; 27 | this.userName = userName; 28 | this.password = password; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/event/InstanceEndpointsDetectedEvent.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.event; 2 | 3 | import java.time.Instant; 4 | 5 | import cn.pomit.boot.monitor.model.Endpoints; 6 | 7 | /** 8 | * This event gets emitted when all instance's endpoints are discovered. 9 | * 10 | * @author Johannes Edmeier 11 | */ 12 | @lombok.Data 13 | @lombok.EqualsAndHashCode(callSuper = true) 14 | @lombok.ToString(callSuper = true) 15 | public class InstanceEndpointsDetectedEvent extends InstanceEvent { 16 | private static final long serialVersionUID = 1L; 17 | private final Endpoints endpoints; 18 | 19 | public InstanceEndpointsDetectedEvent(String instance, long version, Endpoints endpoints) { 20 | this(instance, version, Instant.now(), endpoints); 21 | } 22 | 23 | public InstanceEndpointsDetectedEvent(String instance, long version, Instant timestamp, Endpoints endpoints) { 24 | super(instance, version, "ENDPOINTS_DETECTED", timestamp); 25 | this.endpoints = endpoints; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/event/InstanceStatusChangedEvent.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.event; 2 | 3 | import java.time.Instant; 4 | 5 | import cn.pomit.boot.monitor.model.StatusInfo; 6 | 7 | /** 8 | * This event gets emitted when an instance changes its status. 9 | * 10 | * @author Johannes Edmeier 11 | */ 12 | @lombok.Data 13 | @lombok.EqualsAndHashCode(callSuper = true) 14 | @lombok.ToString(callSuper = true) 15 | public class InstanceStatusChangedEvent extends InstanceEvent { 16 | private static final long serialVersionUID = 1L; 17 | private final StatusInfo statusInfo; 18 | 19 | public InstanceStatusChangedEvent(String instance, long version, StatusInfo statusInfo) { 20 | this(instance, version, Instant.now(), statusInfo); 21 | } 22 | 23 | public InstanceStatusChangedEvent(String instance, long version, Instant timestamp, StatusInfo statusInfo) { 24 | super(instance, version, "STATUS_CHANGED", timestamp); 25 | this.statusInfo = statusInfo; 26 | } 27 | 28 | public StatusInfo getStatusInfo() { 29 | return statusInfo; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/sba-settings.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2014-2019 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | //This is a Thymleaf template whill will be rendered by the backend 18 | // eslint-disable-next-line no-unused-vars 19 | var SBA = { 20 | uiSettings: /*[[${uiSettings}]]*/ {}, 21 | user: /*[[${user}]]*/ null, 22 | extensions: [], 23 | csrf: { 24 | parameterName: /*[[${_csrf} ? ${_csrf.parameterName} : 'null']]*/ null, 25 | headerName: /*[[${_csrf} ? ${_csrf.headerName} : 'null']]*/ null 26 | }, 27 | use: function (ext) { 28 | this.extensions.push(ext); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/index.html: -------------------------------------------------------------------------------- 1 | Spring Boot Monitor
-------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Endpoint.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import java.io.Serializable; 4 | import org.springframework.util.Assert; 5 | 6 | @lombok.Data 7 | public class Endpoint implements Serializable { 8 | /** 9 | * 10 | */ 11 | private static final long serialVersionUID = -8656237790482826441L; 12 | public static final String INFO = "info"; 13 | public static final String HEALTH = "health"; 14 | public static final String LOGFILE = "logfile"; 15 | public static final String ENV = "env"; 16 | public static final String HTTPTRACE = "httptrace"; 17 | public static final String THREADDUMP = "threaddump"; 18 | public static final String LIQUIBASE = "liquibase"; 19 | public static final String FLYWAY = "flyway"; 20 | public static final String ACTUATOR_INDEX = "actuator-index"; 21 | private final String id; 22 | private final String url; 23 | 24 | Endpoint(String id, String url) { 25 | Assert.hasText(id, "'id' must not be empty."); 26 | Assert.hasText(url, "'url' must not be empty."); 27 | this.id = id; 28 | this.url = url; 29 | } 30 | 31 | public static Endpoint of(String id, String url) { 32 | return new Endpoint(id, url); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/event/InstanceEvent.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.event; 2 | /* 3 | * Copyright 2014-2018 the original author or authors. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | import java.io.Serializable; 19 | import java.time.Instant; 20 | 21 | /** 22 | * Abstract Event regarding registered instances 23 | * 24 | * @author Johannes Edmeier 25 | */ 26 | @lombok.Data 27 | public abstract class InstanceEvent implements Serializable { 28 | private static final long serialVersionUID = 1L; 29 | private final String instance; 30 | private final long version; 31 | private final Instant timestamp; 32 | private final String type; 33 | 34 | protected InstanceEvent(String instance, long version, String type, Instant timestamp) { 35 | this.instance = instance; 36 | this.version = version; 37 | this.timestamp = timestamp; 38 | this.type = type; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Info.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import java.io.Serializable; 4 | import java.util.Collections; 5 | import java.util.LinkedHashMap; 6 | import java.util.Map; 7 | 8 | import org.springframework.lang.Nullable; 9 | 10 | import com.fasterxml.jackson.annotation.JsonAnyGetter; 11 | 12 | /** 13 | * Represents the info fetched from the info actuator endpoint 14 | * 15 | * @author Johannes Edmeier 16 | */ 17 | @lombok.Data 18 | public class Info implements Serializable { 19 | /** 20 | * 21 | */ 22 | private static final long serialVersionUID = -8939503231561398583L; 23 | 24 | private static final Info EMPTY = new Info(Collections.emptyMap()); 25 | 26 | private final Map values; 27 | 28 | private Info(Map values) { 29 | if (values.isEmpty()) { 30 | this.values = Collections.emptyMap(); 31 | } else { 32 | this.values = Collections.unmodifiableMap(new LinkedHashMap<>(values)); 33 | } 34 | } 35 | 36 | public static Info from(@Nullable Map values) { 37 | if (values == null || values.isEmpty()) { 38 | return empty(); 39 | } 40 | return new Info(values); 41 | } 42 | 43 | public static Info empty() { 44 | return EMPTY; 45 | } 46 | 47 | @JsonAnyGetter 48 | public Map getValues() { 49 | return this.values; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/event/InstanceRegisteredEvent.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.event; 2 | /* 3 | * Copyright 2014-2018 the original author or authors. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | import java.time.Instant; 19 | 20 | import cn.pomit.boot.monitor.model.Registration; 21 | 22 | /** 23 | * This event gets emitted when an instance is registered. 24 | * 25 | * @author Johannes Edmeier 26 | */ 27 | @lombok.Data 28 | @lombok.EqualsAndHashCode(callSuper = true) 29 | @lombok.ToString(callSuper = true) 30 | public class InstanceRegisteredEvent extends InstanceEvent { 31 | private static final long serialVersionUID = 1L; 32 | private final Registration registration; 33 | 34 | public InstanceRegisteredEvent(String instance, long version, Registration registration) { 35 | this(instance, version, Instant.now(), registration); 36 | } 37 | 38 | public InstanceRegisteredEvent(String instance, long version, Instant timestamp, Registration registration) { 39 | super(instance, version, "REGISTERED", timestamp); 40 | this.registration = registration; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/img/icon-spring-boot-admin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/js/login.4fc89eff.js: -------------------------------------------------------------------------------- 1 | (function(e){function t(t){for(var n,i,a=t[0],c=t[1],l=t[2],p=0,s=[];p 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Spring Boot Monitor - Login 11 | 12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 | 23 |

Spring 24 | Boot Monitor

25 |
26 | 28 | 34 |
35 |
36 | 40 |
41 |
42 |
43 |
44 | 48 |
49 |
50 |
51 |
52 | 54 |
55 |
56 |
57 |
58 | 61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Registration.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import java.io.Serializable; 4 | import java.net.URI; 5 | import java.net.URISyntaxException; 6 | import java.time.Instant; 7 | import java.util.Collections; 8 | import java.util.LinkedHashMap; 9 | import java.util.Map; 10 | 11 | import org.springframework.lang.Nullable; 12 | import org.springframework.util.Assert; 13 | import org.springframework.util.StringUtils; 14 | 15 | import lombok.ToString; 16 | 17 | @lombok.Data 18 | @ToString(exclude = "metadata") 19 | public class Registration implements Serializable { 20 | /** 21 | * 22 | */ 23 | private static final long serialVersionUID = -2685324097568177886L; 24 | private final String name; 25 | @Nullable 26 | private final String managementUrl; 27 | private final String healthUrl; 28 | @Nullable 29 | private final String serviceUrl; 30 | private final String source; 31 | private final Map metadata; 32 | 33 | @lombok.Builder(builderClassName = "Builder", toBuilder = true) 34 | public Registration(String name, 35 | @Nullable String managementUrl, 36 | String healthUrl, 37 | @Nullable String serviceUrl, 38 | String source) { 39 | Assert.hasText(name, "'name' must not be empty."); 40 | Assert.hasText(healthUrl, "'healthUrl' must not be empty."); 41 | Assert.isTrue(checkUrl(healthUrl), "'healthUrl' is not valid: " + healthUrl); 42 | Assert.isTrue(StringUtils.isEmpty(managementUrl) || checkUrl(managementUrl), 43 | "'managementUrl' is not valid: " + managementUrl 44 | ); 45 | Assert.isTrue(StringUtils.isEmpty(serviceUrl) || checkUrl(serviceUrl), 46 | "'serviceUrl' is not valid: " + serviceUrl 47 | ); 48 | this.name = name; 49 | this.managementUrl = managementUrl; 50 | this.healthUrl = healthUrl; 51 | this.serviceUrl = serviceUrl; 52 | this.source = source; 53 | this.metadata = new LinkedHashMap<>(); 54 | metadata.put("startup", Instant.now().toString()); 55 | } 56 | 57 | public static Registration.Builder create(String name, String healthUrl) { 58 | return builder().name(name).healthUrl(healthUrl); 59 | } 60 | 61 | public static Registration.Builder copyOf(Registration registration) { 62 | return registration.toBuilder(); 63 | } 64 | 65 | public Map getMetadata() { 66 | return Collections.unmodifiableMap(metadata); 67 | } 68 | 69 | /** 70 | * Checks the syntax of the given URL. 71 | * 72 | * @param url The URL. 73 | * @return true, if valid. 74 | */ 75 | private boolean checkUrl(String url) { 76 | try { 77 | URI uri = new URI(url); 78 | return uri.isAbsolute(); 79 | } catch (URISyntaxException e) { 80 | return false; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/configuration/MonitorUiAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.configuration; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.List; 6 | 7 | import org.springframework.beans.factory.annotation.Value; 8 | import org.springframework.boot.actuate.endpoint.ExposableEndpoint; 9 | import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; 10 | import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; 11 | import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; 12 | import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; 13 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 14 | import org.springframework.context.annotation.Bean; 15 | import org.springframework.context.annotation.Configuration; 16 | import org.springframework.util.DigestUtils; 17 | 18 | import cn.pomit.boot.monitor.event.InstanceEventLog; 19 | import cn.pomit.boot.monitor.model.Application; 20 | import cn.pomit.boot.monitor.model.UserInfo; 21 | import cn.pomit.boot.monitor.ui.ApplicationController; 22 | import cn.pomit.boot.monitor.ui.UiController; 23 | 24 | @Configuration 25 | public class MonitorUiAutoConfiguration { 26 | @Value("${spring.application.name:localhost}") 27 | private String name; 28 | @Value("${spring.boot.monitor.username:#{null}}") 29 | private String userName; 30 | @Value("${spring.boot.monitor.password:#{null}}") 31 | private String password; 32 | @Value("${spring.boot.monitor.salt:pomit}") 33 | private String salt; 34 | 35 | @Bean 36 | @ConditionalOnMissingBean 37 | public UiController homeUiController() { 38 | return new UiController(userInfo()); 39 | } 40 | 41 | @Bean 42 | public ApplicationController applicationController(WebEndpointsSupplier webEndpointsSupplier, 43 | ServletEndpointsSupplier servletEndpointsSupplier, 44 | ControllerEndpointsSupplier controllerEndpointsSupplier) { 45 | List> allEndpoints = new ArrayList<>(); 46 | Collection webEndpoints = webEndpointsSupplier.getEndpoints(); 47 | allEndpoints.addAll(webEndpoints); 48 | allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); 49 | allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); 50 | return new ApplicationController(allEndpoints, application(), instanceEventLog(), userInfo()); 51 | } 52 | 53 | @Bean 54 | public InstanceEventLog instanceEventLog() { 55 | InstanceEventLog instanceEventLog = new InstanceEventLog(); 56 | return instanceEventLog; 57 | } 58 | 59 | @Bean 60 | public Application application() { 61 | Application application = new Application(); 62 | application.setName(name); 63 | return application; 64 | } 65 | 66 | @Bean 67 | public UserInfo userInfo() { 68 | UserInfo userInfo = new UserInfo(); 69 | userInfo.setPassword(password); 70 | userInfo.setUserName(userName); 71 | userInfo.setSalt(salt); 72 | if (userName != null) { 73 | String userNameToken = DigestUtils.md5DigestAsHex((userName + salt).getBytes()); 74 | userInfo.setUserNameToken(userNameToken); 75 | } 76 | return userInfo; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Tags.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import static java.util.stream.Collectors.toMap; 4 | 5 | import java.io.Serializable; 6 | import java.util.Collections; 7 | import java.util.LinkedHashMap; 8 | import java.util.Map; 9 | import java.util.Objects; 10 | import java.util.function.Function; 11 | import java.util.stream.Collector; 12 | 13 | import org.springframework.lang.Nullable; 14 | import org.springframework.util.StringUtils; 15 | 16 | import com.fasterxml.jackson.annotation.JsonAnyGetter; 17 | 18 | @lombok.EqualsAndHashCode 19 | @lombok.ToString 20 | public class Tags implements Serializable { 21 | /** 22 | * 23 | */ 24 | private static final long serialVersionUID = 9046830510037090817L; 25 | private final Map values; 26 | private static final Tags EMPTY = new Tags(Collections.emptyMap()); 27 | 28 | private Tags(Map tags) { 29 | if (tags.isEmpty()) { 30 | this.values = Collections.emptyMap(); 31 | } else { 32 | this.values = Collections.unmodifiableMap(new LinkedHashMap<>(tags)); 33 | } 34 | } 35 | 36 | @JsonAnyGetter 37 | public Map getValues() { 38 | return this.values; 39 | } 40 | 41 | public Tags append(Tags other) { 42 | Map newTags = new LinkedHashMap<>(this.values); 43 | newTags.putAll(other.values); 44 | return new Tags(newTags); 45 | } 46 | 47 | public static Tags empty() { 48 | return EMPTY; 49 | } 50 | 51 | public static Tags from(Map map) { 52 | return from(map, null); 53 | } 54 | 55 | @SuppressWarnings("unchecked") 56 | public static Tags from(Map map, @Nullable String prefix) { 57 | if (map.isEmpty()) { 58 | return empty(); 59 | } 60 | 61 | if (StringUtils.hasText(prefix)) { 62 | Object nestedTags = map.get(prefix); 63 | if (nestedTags instanceof Map) { 64 | return from((Map) nestedTags); 65 | } 66 | 67 | String flatPrefix = prefix + "."; 68 | return from(map.entrySet() 69 | .stream() 70 | .filter(e -> e.getKey().toLowerCase().startsWith(flatPrefix)) 71 | .collect(toLinkedHashMap(e -> e.getKey().substring(flatPrefix.length()), 72 | Map.Entry::getValue 73 | ))); 74 | } 75 | 76 | return new Tags(map.entrySet() 77 | .stream() 78 | .collect(toLinkedHashMap(Map.Entry::getKey, e -> Objects.toString(e.getValue())))); 79 | } 80 | 81 | private static Collector> toLinkedHashMap(Function keyMapper, 82 | Function valueMapper) { 83 | return toMap(keyMapper, 84 | valueMapper, 85 | (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }, 86 | LinkedHashMap::new 87 | ); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![License](http://img.shields.io/:license-apache-blue.svg "2.0")](http://www.apache.org/licenses/LICENSE-2.0.html) 2 | [![JDK 1.8](https://img.shields.io/badge/JDK-1.8-green.svg "JDK 1.8")]() 3 | [![Maven Central](https://img.shields.io/maven-central/v/cn.pomit/spring-boot-monitor.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22cn.pomit%22%20AND%20a:%22spring-boot-monitor%22) 4 | 5 | ## Spring-boot-monitor项目简介 6 | 7 | 在使用Spring Boot Actuator的时候,你是否想要一套界面来方便查看应用的指标呢? 8 | 9 | 在你搜索相关的ui的时候,是不是发现Spring boot Admin这个监控工具特别火呢? 10 | 11 | Spring boot Admin的ui是真的好看,可是它却令人又爱又恨,Server ?! 12 | 13 | 是的,它必须要求你重新部署一个应用,来做Admin Server,被监控的机器做Admin Client!简直遭罪啊,如果我只想要一个鸡腿,你却给我送个鸡爪子,不知道我不爱吃鸡爪么?我得部署个Server,而且指标数据还得从client传到server,再由Server传给前端,中间得网络开销也不小(metrics接口得数据特别大,可能查询这个接口要几秒)。 14 | 15 | 所以,我就想如何把Spring boot Admin部署到单机,或许有人说,可以把Server和Client都整合到一个应用里。累不累!数据要在localhost里转一圈,还特别浪费资源,我只想要一套界面而已! 16 | 17 | 这时候Spring Boot Monitor这个工具就应运而生,它把Spring boot Admin的界面拿了出来,并修改了数据来源,直接从Actuator拿数据,就是这么简单!对代码无任何侵入!和Spring boot Admin的功能一模一样。 18 | 19 | ## [Gitee](https://gitee.com/ffch/SpringBootMonitor) 20 | ## [Github](https://github.com/ffch/spring-boot-monitor) 21 | ## [Get Started](https://www.pomit.cn/SpringBootMonitor/) 22 | 23 | ## 主要功能 24 | 25 | v0.0.1: 26 | 1. 单机监控SpringBoot应用指标; 27 | 2. 无需额外配置; 28 | 3. 将前端资源归纳到/monitor路径中,隔离其他资源; 29 | 4. 去掉了Spring boot Admin的Server; 30 | 5. 去掉了Spring boot Admin对thymyleaf的依赖; 31 | 6. 去掉了Spring boot Admin的event流。 32 | 33 | v0.0.2: 34 | 1. 增加events接口,显示journal信息。 35 | 36 | v0.0.3: 37 | 1. 增加Spring boot admin的多语言支持特性,支持中文。 38 | 2. 支持日志文件查看和下载 39 | 3. 使用cookie实现简单的登陆控制。 40 | 41 | v0.0.4: 42 | 1. 修复logfile不能正常显示问题 43 | 44 | ## 使用说明 45 | 46 | jar包已经上传到maven中央仓库。 47 | https://search.maven.org/search?q=spring-boot-monitor ,groupId为cn.pomit。 48 | 49 | [使用文档地址](https://www.pomit.cn/SpringBootMonitor) 50 | 51 | ### maven依赖 52 | 53 | ```xml 54 | 55 | cn.pomit 56 | spring-boot-monitor 57 | 0.0.4 58 | 59 | ``` 60 | 61 | ### 启动 62 | 63 | 引入依赖即可。使用AutoConfiguration自动加载spring-boot-monitor相关配置。 64 | 65 | ### 配置actuator 66 | 同样,使用actuator还需加上actuator的配置,开放endpoints。 67 | 68 | ``` 69 | management.endpoints.web.exposure.include=* 70 | ``` 71 | 72 | ### 访问方式 73 | 74 | 如果当前的应用地址为http://127.0.0.1:8080, spring-boot-monitor的访问地址为:http://127.0.0.1:8080/monitor。 75 | 76 | 其他操作则是前端页面操作。和spring-boot-admin完全一样。 77 | 78 | ### 查看日志 79 | 80 | 如果要查看日志文件,项目需要增加日志的配置,比如: 81 | 82 | ``` 83 | logging.file=./log/monitor.log 84 | logging.pattern.file="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx" 85 | ``` 86 | 87 | ### 登录控制 88 | 89 | 如果要使用用户名密码进行访问控制,只需要配置参数即可: 90 | 91 | ``` 92 | spring.boot.monitor.username=cff 93 | spring.boot.monitor.password=123456 94 | spring.boot.monitor.salt=pomit 95 | ``` 96 | 97 | 其中,spring.boot.monitor.salt为可选参数,不配做默认值是pomit;spring.boot.monitor.username和spring.boot.monitor.password其中一个不配置,则**默认为不进行访问控制。** 98 | 99 | ## [Get-Started](https://www.pomit.cn/SpringBootMonitor) 100 | 101 | ## 版权声明 102 | spring-boot-monitor使用 Apache License 2.0 协议. 103 | 104 | ## 作者信息 105 | 106 | 作者博客:https://blog.csdn.net/feiyangtianyao 107 | 108 | 个人网站:https://www.pomit.cn 109 | 110 | 作者邮箱: fufeixiaoyu@163.com 111 | 112 | ## License 113 | Apache License V2 114 | 115 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Endpoints.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import static java.util.stream.Collectors.toMap; 4 | 5 | import java.io.Serializable; 6 | import java.util.Collection; 7 | import java.util.Collections; 8 | import java.util.HashMap; 9 | import java.util.Iterator; 10 | import java.util.Map; 11 | import java.util.Optional; 12 | import java.util.function.Function; 13 | import java.util.stream.Stream; 14 | 15 | import org.springframework.boot.actuate.endpoint.web.Link; 16 | import org.springframework.lang.Nullable; 17 | 18 | @lombok.EqualsAndHashCode 19 | @lombok.ToString 20 | public class Endpoints implements Iterable, Serializable { 21 | /** 22 | * 23 | */ 24 | private static final long serialVersionUID = 5621206253990279887L; 25 | private final Map endpoints; 26 | private static final Endpoints EMPTY = new Endpoints(Collections.emptyList()); 27 | 28 | private Endpoints(Collection endpoints) { 29 | if (endpoints.isEmpty()) { 30 | this.endpoints = Collections.emptyMap(); 31 | } else { 32 | this.endpoints = endpoints.stream().collect(toMap(Endpoint::getId, Function.identity())); 33 | } 34 | } 35 | 36 | public Endpoints(Map links) { 37 | if (links.isEmpty()) { 38 | this.endpoints = Collections.emptyMap(); 39 | } else { 40 | this.endpoints = new HashMap<>(); 41 | links.forEach((k,v) ->{ 42 | Endpoint endpoint = new Endpoint(k, v.getHref()); 43 | this.endpoints.put(k, endpoint); 44 | }); 45 | } 46 | } 47 | 48 | public Optional get(String id) { 49 | return Optional.ofNullable(this.endpoints.get(id)); 50 | } 51 | 52 | public boolean isPresent(String id) { 53 | return this.endpoints.containsKey(id); 54 | } 55 | 56 | @Override 57 | public Iterator iterator() { 58 | return new UnmodifiableIterator<>(this.endpoints.values().iterator()); 59 | } 60 | 61 | public static Endpoints empty() { 62 | return EMPTY; 63 | } 64 | 65 | public static Endpoints single(String id, String url) { 66 | return new Endpoints(Collections.singletonList(Endpoint.of(id, url))); 67 | } 68 | 69 | public static Endpoints of(@Nullable Collection endpoints) { 70 | if (endpoints == null || endpoints.isEmpty()) { 71 | return empty(); 72 | } 73 | return new Endpoints(endpoints); 74 | } 75 | 76 | public Endpoints withEndpoint(String id, String url) { 77 | Endpoint endpoint = Endpoint.of(id, url); 78 | HashMap newEndpoints = new HashMap<>(this.endpoints); 79 | newEndpoints.put(endpoint.getId(), endpoint); 80 | return new Endpoints(newEndpoints.values()); 81 | } 82 | 83 | public Stream stream() { 84 | return this.endpoints.values().stream(); 85 | } 86 | 87 | private static class UnmodifiableIterator implements Iterator { 88 | private final Iterator delegate; 89 | 90 | private UnmodifiableIterator(Iterator delegate) { 91 | this.delegate = delegate; 92 | } 93 | 94 | @Override 95 | public boolean hasNext() { 96 | return this.delegate.hasNext(); 97 | } 98 | 99 | @Override 100 | public T next() { 101 | return this.delegate.next(); 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/StatusInfo.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.model; 2 | 3 | import static java.util.Arrays.asList; 4 | 5 | import java.io.Serializable; 6 | import java.util.Collections; 7 | import java.util.Comparator; 8 | import java.util.HashMap; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | import org.springframework.lang.Nullable; 13 | import org.springframework.util.Assert; 14 | 15 | import com.fasterxml.jackson.annotation.JsonIgnore; 16 | 17 | /** 18 | * Instance status with details fetched from the info endpoint. 19 | * 20 | * @author Johannes Edmeier 21 | */ 22 | @lombok.Data 23 | public class StatusInfo implements Serializable { 24 | /** 25 | * 26 | */ 27 | private static final long serialVersionUID = -7029161032203941624L; 28 | public static final String STATUS_UNKNOWN = "UNKNOWN"; 29 | public static final String STATUS_OUT_OF_SERVICE = "OUT_OF_SERVICE"; 30 | public static final String STATUS_UP = "UP"; 31 | public static final String STATUS_DOWN = "DOWN"; 32 | public static final String STATUS_OFFLINE = "OFFLINE"; 33 | public static final String STATUS_RESTRICTED = "RESTRICTED"; 34 | private static final List STATUS_ORDER = asList(STATUS_DOWN, 35 | STATUS_OUT_OF_SERVICE, 36 | STATUS_OFFLINE, 37 | STATUS_UNKNOWN, 38 | STATUS_RESTRICTED, 39 | STATUS_UP 40 | ); 41 | 42 | private final String status; 43 | private final Map details; 44 | 45 | private StatusInfo(String status, @Nullable Map details) { 46 | Assert.hasText(status, "'status' must not be empty."); 47 | this.status = status.toUpperCase(); 48 | this.details = details != null ? new HashMap<>(details) : Collections.emptyMap(); 49 | } 50 | 51 | public static StatusInfo valueOf(String statusCode, @Nullable Map details) { 52 | return new StatusInfo(statusCode, details); 53 | } 54 | 55 | public static StatusInfo valueOf(String statusCode) { 56 | return valueOf(statusCode, null); 57 | } 58 | 59 | public static StatusInfo ofUnknown() { 60 | return valueOf(STATUS_UNKNOWN, null); 61 | } 62 | 63 | public static StatusInfo ofUp() { 64 | return ofUp(null); 65 | } 66 | 67 | public static StatusInfo ofDown() { 68 | return ofDown(null); 69 | } 70 | 71 | public static StatusInfo ofOffline() { 72 | return ofOffline(null); 73 | } 74 | 75 | public static StatusInfo ofUp(@Nullable Map details) { 76 | return valueOf(STATUS_UP, details); 77 | } 78 | 79 | public static StatusInfo ofDown(@Nullable Map details) { 80 | return valueOf(STATUS_DOWN, details); 81 | } 82 | 83 | public static StatusInfo ofOffline(@Nullable Map details) { 84 | return valueOf(STATUS_OFFLINE, details); 85 | } 86 | 87 | public Map getDetails() { 88 | return Collections.unmodifiableMap(details); 89 | } 90 | 91 | @JsonIgnore 92 | public boolean isUp() { 93 | return STATUS_UP.equals(status); 94 | } 95 | 96 | @JsonIgnore 97 | public boolean isOffline() { 98 | return STATUS_OFFLINE.equals(status); 99 | } 100 | 101 | @JsonIgnore 102 | public boolean isDown() { 103 | return STATUS_DOWN.equals(status); 104 | } 105 | 106 | @JsonIgnore 107 | public boolean isUnknown() { 108 | return STATUS_UNKNOWN.equals(status); 109 | } 110 | 111 | public static Comparator severity() { 112 | return Comparator.comparingInt(STATUS_ORDER::indexOf); 113 | } 114 | 115 | @SuppressWarnings("unchecked") 116 | public static StatusInfo from(Map body) { 117 | return StatusInfo.valueOf((String) (body).get("status"), (Map) body.get("details")); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/model/Instance.java: -------------------------------------------------------------------------------- 1 | 2 | package cn.pomit.boot.monitor.model; 3 | 4 | import java.io.Serializable; 5 | import java.time.Instant; 6 | import java.util.Arrays; 7 | import java.util.Map; 8 | import java.util.Objects; 9 | 10 | import org.springframework.lang.Nullable; 11 | import org.springframework.util.Assert; 12 | 13 | /** 14 | * The aggregate representing a registered application instance. 15 | * 16 | * @author Johannes Edmeier 17 | */ 18 | @lombok.Data 19 | public class Instance implements Serializable { 20 | /** 21 | * 22 | */ 23 | private static final long serialVersionUID = -5476210649123305653L; 24 | private final String id; 25 | private final long version; 26 | private final Registration registration; 27 | private final boolean registered; 28 | private final StatusInfo statusInfo; 29 | private final Instant statusTimestamp; 30 | private final Info info; 31 | private final Endpoints endpoints; 32 | private final String buildVersion; 33 | private final Tags tags; 34 | 35 | private Instance(String id) { 36 | this(id, -1L, null, false, StatusInfo.ofUnknown(), Instant.EPOCH, Info.empty(), Endpoints.empty(), null, 37 | Tags.empty()); 38 | } 39 | 40 | public Instance(String id, @Nullable Registration registration, Endpoints endpoints) { 41 | this.id = id; 42 | this.version = -1L; 43 | this.registration = registration; 44 | this.registered = true; 45 | this.statusInfo = StatusInfo.valueOf(StatusInfo.STATUS_UP); 46 | this.statusTimestamp = Instant.now(); 47 | this.info = Info.empty(); 48 | this.endpoints = endpoints; 49 | this.buildVersion = null; 50 | this.tags = Tags.empty(); 51 | } 52 | 53 | private Instance(String id, long version, @Nullable Registration registration, boolean registered, 54 | StatusInfo statusInfo, Instant statusTimestamp, Info info, Endpoints endpoints, 55 | @Nullable String buildVersion, Tags tags) { 56 | Assert.notNull(id, "'id' must not be null"); 57 | Assert.notNull(endpoints, "'endpoints' must not be null"); 58 | Assert.notNull(info, "'info' must not be null"); 59 | Assert.notNull(statusInfo, "'statusInfo' must not be null"); 60 | this.id = id; 61 | this.version = version; 62 | this.registration = registration; 63 | this.registered = registered; 64 | this.statusInfo = statusInfo; 65 | this.statusTimestamp = statusTimestamp; 66 | this.info = info; 67 | this.endpoints = registered && registration != null 68 | ? endpoints.withEndpoint(Endpoint.HEALTH, registration.getHealthUrl()) : endpoints; 69 | this.buildVersion = buildVersion; 70 | this.tags = tags; 71 | } 72 | 73 | public static Instance create(String id) { 74 | Assert.notNull(id, "'id' must not be null"); 75 | return new Instance(id); 76 | } 77 | 78 | public boolean isRegistered() { 79 | return this.registered; 80 | } 81 | 82 | public Registration getRegistration() { 83 | if (this.registration == null) { 84 | throw new IllegalStateException("Application '" + this.id + "' has no valid registration."); 85 | } 86 | return this.registration; 87 | } 88 | 89 | @Nullable 90 | @SafeVarargs 91 | private final String updateBuildVersion(Map... sources) { 92 | return Arrays.stream(sources).map(s -> from(s)).filter(Objects::nonNull).findFirst().orElse(null); 93 | } 94 | 95 | public static String from(Map map) { 96 | if (map.isEmpty()) { 97 | return null; 98 | } 99 | 100 | Object build = map.get("build"); 101 | if (build instanceof Map) { 102 | Object version = ((Map) build).get("version"); 103 | if (version instanceof String) { 104 | return (String) version; 105 | } 106 | } 107 | 108 | Object version = map.get("build.version"); 109 | if (version instanceof String) { 110 | return (String) version; 111 | } 112 | 113 | version = map.get("version"); 114 | if (version instanceof String) { 115 | return (String) version; 116 | } 117 | return null; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | cn.pomit 8 | spring-boot-monitor 9 | 0.0.4 10 | jar 11 | ${project.artifactId} 12 | https://www.pomit.cn 13 | Spring boot monitor , from the Spring boot admin 14 | 15 | 16 | UTF-8 17 | UTF-8 18 | 1.8 19 | 20 | 21 | 22 | The Apache Software License, Version 2.0 23 | http://www.apache.org/licenses/LICENSE-2.0.txt 24 | actable 25 | 26 | 27 | 28 | 29 | 30 | chenfufei 31 | fufeixiaoyu@163.com 32 | chenfufei 33 | https://github.com/ffch 34 | 35 | 36 | 37 | 38 | master 39 | git@github.com:ffch/consul-proxy.git 40 | scm:git:git@github.com:ffch/consul-proxy.git 41 | scm:git:git@github.com:ffch/consul-proxy.git 42 | 43 | 44 | 45 | sonatype-nexus-snapshots 46 | Sonatype Nexus Snapshots 47 | https://oss.sonatype.org/content/repositories/snapshots 48 | 49 | 50 | sonatype-nexus-staging 51 | Nexus Release Repository 52 | https://oss.sonatype.org/service/local/staging/deploy/maven2/ 53 | 54 | 55 | 56 | 57 | org.springframework.boot 58 | spring-boot-starter-web 59 | 2.1.4.RELEASE 60 | compile 61 | true 62 | 63 | 64 | org.projectlombok 65 | lombok 66 | 1.18.6 67 | compile 68 | true 69 | 70 | 71 | org.springframework.boot 72 | spring-boot-starter-actuator 73 | 2.0.4.RELEASE 74 | compile 75 | 76 | 77 | 78 | 79 | sonatype-oss-release 80 | 81 | 82 | 83 | org.apache.maven.plugins 84 | maven-compiler-plugin 85 | 3.1 86 | 87 | 1.8 88 | 1.8 89 | UTF-8 90 | 91 | 92 | 93 | org.apache.maven.plugins 94 | maven-source-plugin 95 | 2.1.2 96 | 97 | 98 | attach-sources 99 | 100 | jar-no-fork 101 | 102 | 103 | 104 | 105 | 106 | org.apache.maven.plugins 107 | maven-javadoc-plugin 108 | 2.9.1 109 | 110 | 111 | attach-javadocs 112 | 113 | jar 114 | 115 | 116 | 117 | 118 | true 119 | ${JAVA_HOME}/bin/javadoc 120 | 121 | 122 | 123 | org.apache.maven.plugins 124 | maven-gpg-plugin 125 | 1.1 126 | 127 | 128 | sign-artifacts 129 | verify 130 | 131 | sign 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /src/main/java/cn/pomit/boot/monitor/ui/ApplicationController.java: -------------------------------------------------------------------------------- 1 | package cn.pomit.boot.monitor.ui; 2 | 3 | import java.time.Instant; 4 | import java.util.ArrayList; 5 | import java.util.Arrays; 6 | import java.util.Collection; 7 | import java.util.Collections; 8 | import java.util.LinkedHashMap; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | 15 | import org.springframework.boot.actuate.endpoint.ExposableEndpoint; 16 | import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; 17 | import org.springframework.boot.actuate.endpoint.web.Link; 18 | import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoint; 19 | import org.springframework.boot.actuate.endpoint.web.WebOperation; 20 | import org.springframework.http.MediaType; 21 | import org.springframework.http.codec.ServerSentEvent; 22 | import org.springframework.web.bind.annotation.CookieValue; 23 | import org.springframework.web.bind.annotation.GetMapping; 24 | import org.springframework.web.bind.annotation.RequestMapping; 25 | import org.springframework.web.bind.annotation.ResponseBody; 26 | import org.springframework.web.bind.annotation.RestController; 27 | 28 | import cn.pomit.boot.monitor.event.InstanceEndpointsDetectedEvent; 29 | import cn.pomit.boot.monitor.event.InstanceEvent; 30 | import cn.pomit.boot.monitor.event.InstanceEventLog; 31 | import cn.pomit.boot.monitor.event.InstanceRegisteredEvent; 32 | import cn.pomit.boot.monitor.event.InstanceStatusChangedEvent; 33 | import cn.pomit.boot.monitor.model.Application; 34 | import cn.pomit.boot.monitor.model.Endpoints; 35 | import cn.pomit.boot.monitor.model.Instance; 36 | import cn.pomit.boot.monitor.model.Registration; 37 | import cn.pomit.boot.monitor.model.UserInfo; 38 | 39 | @RestController 40 | @RequestMapping("/monitor") 41 | public class ApplicationController { 42 | 43 | private Collection> endpoints; 44 | 45 | private Application application; 46 | 47 | private UserInfo userInfo; 48 | 49 | private InstanceEventLog instanceEventLog; 50 | 51 | public ApplicationController(Collection> endpoints, Application application, 52 | InstanceEventLog instanceEventLog, UserInfo userInfo) { 53 | this.endpoints = endpoints; 54 | this.application = application; 55 | this.instanceEventLog = instanceEventLog; 56 | this.userInfo = userInfo; 57 | } 58 | 59 | @ResponseBody 60 | @GetMapping(path = "/applications", produces = MediaType.APPLICATION_JSON_VALUE) 61 | public List applications(@CookieValue(name = "moni_id", required = false) String monitorId, 62 | HttpServletRequest request, HttpServletResponse response) { 63 | // 不设置用户名密码直接返回成功 64 | if (userInfo.getUserName() != null && userInfo.getPassword() != null) { 65 | if (monitorId == null || !monitorId.equals(userInfo.getUserNameToken())) { 66 | response.setStatus(401); 67 | return null; 68 | } 69 | } 70 | initApplicationInfo(request); 71 | return Arrays.asList(application); 72 | } 73 | 74 | /** 75 | * 组装application信息 76 | * 77 | * @param request 78 | */ 79 | public void initApplicationInfo(HttpServletRequest request) { 80 | String normalizedUrl = normalizeRequestUrl(request); 81 | Map links = new LinkedHashMap<>(); 82 | for (ExposableEndpoint endpoint : this.endpoints) { 83 | if (endpoint instanceof ExposableWebEndpoint) { 84 | collectLinks(links, (ExposableWebEndpoint) endpoint, normalizedUrl); 85 | } else if (endpoint instanceof PathMappedEndpoint) { 86 | links.put(endpoint.getId(), createLink(normalizedUrl, ((PathMappedEndpoint) endpoint).getRootPath())); 87 | } 88 | } 89 | Endpoints endpoints = new Endpoints(links); 90 | Registration registration = new Registration(application.getName(), normalizedUrl, normalizedUrl + "/health", 91 | hostUrl(request), "http-api"); 92 | Instance instance = new Instance(application.getName(), registration, endpoints); 93 | application.setInstances(Arrays.asList(instance)); 94 | 95 | if (!instanceEventLog.isHasInit()) { 96 | InstanceRegisteredEvent instanceRegisteredEvent = new InstanceRegisteredEvent(application.getName(), 0, 97 | Instant.now(), registration); 98 | instanceEventLog.add(instanceRegisteredEvent); 99 | InstanceStatusChangedEvent instanceStatusChangedEvent = new InstanceStatusChangedEvent( 100 | application.getName(), 1, Instant.now(), instance.getStatusInfo()); 101 | instanceEventLog.add(instanceStatusChangedEvent); 102 | InstanceEndpointsDetectedEvent instanceEndpointsDetectedEvent = new InstanceEndpointsDetectedEvent( 103 | application.getName(), 2, Instant.now(), endpoints); 104 | instanceEventLog.add(instanceEndpointsDetectedEvent); 105 | instanceEventLog.setHasInit(true); 106 | } 107 | } 108 | 109 | @ResponseBody 110 | @GetMapping(path = "/applications", produces = MediaType.TEXT_EVENT_STREAM_VALUE) 111 | public List applicationsStream(HttpServletRequest request, HttpServletResponse response) { 112 | initApplicationInfo(request); 113 | return Arrays.asList(application); 114 | } 115 | 116 | @ResponseBody 117 | @GetMapping(path = "instances/events", produces = MediaType.APPLICATION_JSON_VALUE) 118 | public List events(HttpServletRequest request, HttpServletResponse response) { 119 | if (!instanceEventLog.isHasInit()) { 120 | return Collections.emptyList(); 121 | } 122 | return instanceEventLog.getEventList(); 123 | } 124 | 125 | @ResponseBody 126 | @GetMapping(path = "instances/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) 127 | public List> eventsStream(HttpServletRequest request, HttpServletResponse response) { 128 | if (!instanceEventLog.isHasInit()) { 129 | return Collections.emptyList(); 130 | } 131 | List> retList = new ArrayList<>(); 132 | for (InstanceEvent event : instanceEventLog.getEventList()) { 133 | retList.add(ServerSentEvent.builder(event).build()); 134 | } 135 | return retList; 136 | } 137 | 138 | private String normalizeRequestUrl(HttpServletRequest request) { 139 | String uri = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 140 | + request.getContextPath(); 141 | 142 | if (!uri.endsWith("/")) { 143 | uri = uri + "/"; 144 | } 145 | 146 | return uri + "actuator"; 147 | } 148 | 149 | private String hostUrl(HttpServletRequest request) { 150 | String uri = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 151 | + request.getContextPath(); 152 | 153 | if (!uri.endsWith("/")) { 154 | uri = uri + "/"; 155 | } 156 | 157 | return uri; 158 | } 159 | 160 | private void collectLinks(Map links, ExposableWebEndpoint endpoint, String normalizedUrl) { 161 | for (WebOperation operation : endpoint.getOperations()) { 162 | links.put(operation.getId(), createLink(normalizedUrl, operation)); 163 | } 164 | } 165 | 166 | private Link createLink(String requestUrl, WebOperation operation) { 167 | return createLink(requestUrl, operation.getRequestPredicate().getPath()); 168 | } 169 | 170 | private Link createLink(String requestUrl, String path) { 171 | return new Link(requestUrl + (path.startsWith("/") ? path : "/" + path)); 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/js/login.4fc89eff.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/main/frontend/login.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","document","querySelectorAll","forEach","getAttribute","split","attribute","undefined","setAttribute","i18n","innerHTML"],"mappings":"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","file":"assets/js/login.4fc89eff.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"login\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1,\"chunk-vendors\",\"chunk-common\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/*\n * Copyright 2014-2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport '@/assets/css/base.scss';\nimport i18n from './i18n'\n\ndocument.querySelectorAll('[data-i18n]')\n .forEach(t => {\n let [attribute, key] = t.getAttribute('data-i18n').split(':');\n if (!key) {\n key = attribute;\n attribute = undefined;\n }\n\n if (attribute) {\n t.setAttribute(attribute, i18n.t(key));\n } else {\n t.innerHTML = i18n.t(key);\n }\n });\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/js/event-source-polyfill.9676e331.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["event-source-polyfill"],{"91a3":function(e,t,n){var o,r,i; 2 | /** @license 3 | * eventsource.js 4 | * Available under MIT License (MIT) 5 | * https://github.com/Yaffle/EventSource/ 6 | */(function(n){"use strict";var a=n.setTimeout,s=n.clearTimeout,c=n.XMLHttpRequest,d=n.XDomainRequest,u=n.ActiveXObject,h=n.EventSource,p=n.document,l=n.Promise,f=n.fetch,v=n.Response,y=n.TextDecoder,g=n.TextEncoder,w=n.AbortController;if("undefined"===typeof window||"readyState"in p||null!=p.body||(p.readyState="loading",window.addEventListener("load",(function(e){p.readyState="complete"}),!1)),null==c&&(c=function(){return new u("Microsoft.XMLHTTP")}),void 0==Object.create&&(Object.create=function(e){function t(){}return t.prototype=e,new t}),void 0==w){var b=f;f=function(e,t){var n=t.signal;return b(e,{headers:t.headers,credentials:t.credentials,cache:t.cache}).then((function(e){var t=e.body.getReader();return n._reader=t,n._aborted&&n._reader.cancel(),{status:e.status,statusText:e.statusText,headers:e.headers,body:{getReader:function(){return t}}}}))},w=function(){this.signal={_reader:null,_aborted:!1},this.abort=function(){null!=this.signal._reader&&this.signal._reader.cancel(),this.signal._aborted=!0}}}function E(){this.bitsNeeded=0,this.codePoint=0}E.prototype.decode=function(e){function t(e,t,n){if(1===n)return e>=128>>t&&e<=2048>>t&&e<=57344>>t&&e<=65536>>t&&e<>6>15?3:t>31?2:1;if(12===e)return t>15?3:2;if(18===e)return 3;throw new Error}for(var o=65533,r="",i=this.bitsNeeded,a=this.codePoint,s=0;s191||!t(a<<6|63&c,i-6,n(i,a)))&&(i=0,a=o,r+=String.fromCharCode(a)),0===i?(c>=0&&c<=127?(i=0,a=c):c>=192&&c<=223?(i=6,a=31&c):c>=224&&c<=239?(i=12,a=15&c):c>=240&&c<=247?(i=18,a=7&c):(i=0,a=o),0===i||t(a,i,n(i,a))||(i=0,a=o)):(i-=6,a=a<<6|63&c),0===i&&(a<=65535?r+=String.fromCharCode(a):(r+=String.fromCharCode(55296+(a-65535-1>>10)),r+=String.fromCharCode(56320+(a-65535-1&1023))))}return this.bitsNeeded=i,this.codePoint=a,r};var C=function(){try{return"test"===(new y).decode((new g).encode("test"),{stream:!0})}catch(e){console.debug("TextDecoder does not support streaming option. Using polyfill instead: "+e)}return!1};void 0!=y&&void 0!=g&&C()||(y=E);var T=function(){};function m(e){this.withCredentials=!1,this.readyState=0,this.status=0,this.statusText="",this.responseText="",this.onprogress=T,this.onload=T,this.onerror=T,this.onreadystatechange=T,this._contentType="",this._xhr=e,this._sendTimeout=0,this._abort=T}function _(e){return e.replace(/[A-Z]/g,(function(e){return String.fromCharCode(e.charCodeAt(0)+32)}))}function S(e){for(var t=Object.create(null),n=e.split("\r\n"),o=0;o {\n const localeFromFile = /^\\.\\/*\\/.*i18n\\.?([^/]*)\\.json$/.exec(key);\n const messages = context(key);\n if (localeFromFile[1]) {\n return {\n [localeFromFile[1]]: messages\n }\n } else {\n return messages;\n }\n })\n .reduce((prev, cur) => merge(prev, cur), {});\n\nexport const AVAILABLE_LANGUAGES = Object.keys(messages);\n\nlet browserLanguage = navigator.language;\nif (!browserLanguage.includes('zh')) {\n browserLanguage = browserLanguage.split('-')[0];\n}\n\nconst i18n = new VueI18n({\n fallbackLocale: 'en',\n locale: AVAILABLE_LANGUAGES.includes(browserLanguage) ? browserLanguage : 'en',\n silentFallbackWarn: process.env.NODE_ENV === 'production',\n silentTranslationWarn: process.env.NODE_ENV === 'production',\n messages\n});\n\nexport default i18n;\n","var map = {\n\t\"./i18n/i18n.de.json\": \"f1b9\",\n\t\"./i18n/i18n.en.json\": \"cab3\",\n\t\"./i18n/i18n.fr.json\": \"b2d5\",\n\t\"./i18n/i18n.ko.json\": \"9795\",\n\t\"./i18n/i18n.pt-BR.json\": \"cafe\",\n\t\"./i18n/i18n.ru.json\": \"6d37\",\n\t\"./i18n/i18n.zh-CN.json\": \"6f1a\",\n\t\"./i18n/i18n.zh-TW.json\": \"15b9\",\n\t\"./login.i18n.de.json\": \"0c56\",\n\t\"./login.i18n.en.json\": \"eeba\",\n\t\"./login.i18n.fr.json\": \"1d91\",\n\t\"./login.i18n.ko.json\": \"7f8d\",\n\t\"./login.i18n.pt-BR.json\": \"57d5\",\n\t\"./login.i18n.ru.json\": \"bd7b\",\n\t\"./login.i18n.zh-CN.json\": \"88c8\",\n\t\"./login.i18n.zh-TW.json\": \"9dea\",\n\t\"./shell/i18n.de.json\": \"e972\",\n\t\"./shell/i18n.en.json\": \"420f\",\n\t\"./shell/i18n.fr.json\": \"128b\",\n\t\"./shell/i18n.ko.json\": \"fde3\",\n\t\"./shell/i18n.ru.json\": \"6ff7\",\n\t\"./shell/i18n.zh-CN.json\": \"a590\",\n\t\"./shell/i18n.zh-TW.json\": \"8751\",\n\t\"./views/about/i18n.de.json\": \"4c1d\",\n\t\"./views/about/i18n.en.json\": \"956c\",\n\t\"./views/about/i18n.fr.json\": \"65db4\",\n\t\"./views/about/i18n.ko.json\": \"5cdf\",\n\t\"./views/about/i18n.pt-BR.json\": \"fa3d\",\n\t\"./views/about/i18n.ru.json\": \"5129\",\n\t\"./views/about/i18n.zh-CN.json\": \"5d58\",\n\t\"./views/about/i18n.zh-TW.json\": \"b0a7\",\n\t\"./views/applications/i18n.de.json\": \"b28c\",\n\t\"./views/applications/i18n.en.json\": \"b387\",\n\t\"./views/applications/i18n.fr.json\": \"6d92\",\n\t\"./views/applications/i18n.ko.json\": \"eb8f\",\n\t\"./views/applications/i18n.pt-BR.json\": \"5b64\",\n\t\"./views/applications/i18n.ru.json\": \"4c99\",\n\t\"./views/applications/i18n.zh-CN.json\": \"6016\",\n\t\"./views/applications/i18n.zh-TW.json\": \"fade\",\n\t\"./views/instances/auditevents/i18n.de.json\": \"2400\",\n\t\"./views/instances/auditevents/i18n.en.json\": \"c62f\",\n\t\"./views/instances/auditevents/i18n.fr.json\": \"75ab\",\n\t\"./views/instances/auditevents/i18n.ko.json\": \"e934\",\n\t\"./views/instances/auditevents/i18n.pt-BR.json\": \"49f9\",\n\t\"./views/instances/auditevents/i18n.ru.json\": \"f8de\",\n\t\"./views/instances/auditevents/i18n.zh-CN.json\": \"afd8\",\n\t\"./views/instances/auditevents/i18n.zh-TW.json\": \"c2fb\",\n\t\"./views/instances/beans/i18n.de.json\": \"68f0\",\n\t\"./views/instances/beans/i18n.en.json\": \"100f\",\n\t\"./views/instances/beans/i18n.fr.json\": \"8bf9\",\n\t\"./views/instances/beans/i18n.ko.json\": \"d64a\",\n\t\"./views/instances/beans/i18n.pt-BR.json\": \"daa6\",\n\t\"./views/instances/beans/i18n.ru.json\": \"dd43\",\n\t\"./views/instances/beans/i18n.zh-CN.json\": \"4f42\",\n\t\"./views/instances/beans/i18n.zh-TW.json\": \"9369\",\n\t\"./views/instances/caches/i18n.de.json\": \"6680\",\n\t\"./views/instances/caches/i18n.en.json\": \"6604\",\n\t\"./views/instances/caches/i18n.fr.json\": \"d73f\",\n\t\"./views/instances/caches/i18n.ko.json\": \"5ce0\",\n\t\"./views/instances/caches/i18n.pt-BR.json\": \"656d\",\n\t\"./views/instances/caches/i18n.ru.json\": \"66ae\",\n\t\"./views/instances/caches/i18n.zh-CN.json\": \"9116\",\n\t\"./views/instances/caches/i18n.zh-TW.json\": \"1e35\",\n\t\"./views/instances/configprops/i18n.de.json\": \"df78\",\n\t\"./views/instances/configprops/i18n.en.json\": \"74c2\",\n\t\"./views/instances/configprops/i18n.fr.json\": \"777e\",\n\t\"./views/instances/configprops/i18n.ko.json\": \"c87d\",\n\t\"./views/instances/configprops/i18n.pt-BR.json\": \"b17f\",\n\t\"./views/instances/configprops/i18n.ru.json\": \"3d34\",\n\t\"./views/instances/configprops/i18n.zh-CN.json\": \"7218\",\n\t\"./views/instances/configprops/i18n.zh-TW.json\": \"f299\",\n\t\"./views/instances/details/i18n.de.json\": \"fe4d\",\n\t\"./views/instances/details/i18n.en.json\": \"48c8\",\n\t\"./views/instances/details/i18n.fr.json\": \"c206\",\n\t\"./views/instances/details/i18n.ko.json\": \"ddc3\",\n\t\"./views/instances/details/i18n.pt-BR.json\": \"2693\",\n\t\"./views/instances/details/i18n.ru.json\": \"8311\",\n\t\"./views/instances/details/i18n.zh-CN.json\": \"05a0\",\n\t\"./views/instances/details/i18n.zh-TW.json\": \"2302\",\n\t\"./views/instances/env/i18n.de.json\": \"eb6d\",\n\t\"./views/instances/env/i18n.en.json\": \"bcc2\",\n\t\"./views/instances/env/i18n.fr.json\": \"162d\",\n\t\"./views/instances/env/i18n.ko.json\": \"46e1\",\n\t\"./views/instances/env/i18n.pt-BR.json\": \"5bc0\",\n\t\"./views/instances/env/i18n.ru.json\": \"c54c\",\n\t\"./views/instances/env/i18n.zh-CN.json\": \"2a5b\",\n\t\"./views/instances/env/i18n.zh-TW.json\": \"7497\",\n\t\"./views/instances/flyway/i18n.de.json\": \"5eb4\",\n\t\"./views/instances/flyway/i18n.en.json\": \"307c\",\n\t\"./views/instances/flyway/i18n.fr.json\": \"719e\",\n\t\"./views/instances/flyway/i18n.ko.json\": \"0c67\",\n\t\"./views/instances/flyway/i18n.pt-BR.json\": \"f5b8\",\n\t\"./views/instances/flyway/i18n.ru.json\": \"a0ee\",\n\t\"./views/instances/flyway/i18n.zh-CN.json\": \"e188\",\n\t\"./views/instances/flyway/i18n.zh-TW.json\": \"4b78\",\n\t\"./views/instances/gateway/i18n.de.json\": \"b604\",\n\t\"./views/instances/gateway/i18n.en.json\": \"e547\",\n\t\"./views/instances/gateway/i18n.fr.json\": \"80da\",\n\t\"./views/instances/gateway/i18n.ko.json\": \"858a\",\n\t\"./views/instances/gateway/i18n.pt-BR.json\": \"7e8e\",\n\t\"./views/instances/gateway/i18n.ru.json\": \"3bf0\",\n\t\"./views/instances/gateway/i18n.zh-CN.json\": \"aec7\",\n\t\"./views/instances/gateway/i18n.zh-TW.json\": \"fcb2\",\n\t\"./views/instances/heapdump/i18n.de.json\": \"3209\",\n\t\"./views/instances/heapdump/i18n.en.json\": \"bc18\",\n\t\"./views/instances/heapdump/i18n.fr.json\": \"5301\",\n\t\"./views/instances/heapdump/i18n.ko.json\": \"b626\",\n\t\"./views/instances/heapdump/i18n.pt-BR.json\": \"ed26\",\n\t\"./views/instances/heapdump/i18n.ru.json\": \"883f\",\n\t\"./views/instances/heapdump/i18n.zh-CN.json\": \"9144\",\n\t\"./views/instances/heapdump/i18n.zh-TW.json\": \"41cb\",\n\t\"./views/instances/httptrace/i18n.de.json\": \"f68d\",\n\t\"./views/instances/httptrace/i18n.en.json\": \"d26d\",\n\t\"./views/instances/httptrace/i18n.fr.json\": \"88a5\",\n\t\"./views/instances/httptrace/i18n.ko.json\": \"0ed2\",\n\t\"./views/instances/httptrace/i18n.pt-BR.json\": \"c767\",\n\t\"./views/instances/httptrace/i18n.ru.json\": \"c4c1\",\n\t\"./views/instances/httptrace/i18n.zh-CN.json\": \"add4\",\n\t\"./views/instances/httptrace/i18n.zh-TW.json\": \"16ea\",\n\t\"./views/instances/jolokia/i18n.de.json\": \"970c\",\n\t\"./views/instances/jolokia/i18n.en.json\": \"b840\",\n\t\"./views/instances/jolokia/i18n.fr.json\": \"5ed1\",\n\t\"./views/instances/jolokia/i18n.ko.json\": \"59e8\",\n\t\"./views/instances/jolokia/i18n.pt-BR.json\": \"f683\",\n\t\"./views/instances/jolokia/i18n.ru.json\": \"7e55\",\n\t\"./views/instances/jolokia/i18n.zh-CN.json\": \"4184\",\n\t\"./views/instances/jolokia/i18n.zh-TW.json\": \"b243\",\n\t\"./views/instances/liquibase/i18n.de.json\": \"e077\",\n\t\"./views/instances/liquibase/i18n.en.json\": \"9355\",\n\t\"./views/instances/liquibase/i18n.fr.json\": \"98d6\",\n\t\"./views/instances/liquibase/i18n.ko.json\": \"22b3\",\n\t\"./views/instances/liquibase/i18n.pt-BR.json\": \"fa78\",\n\t\"./views/instances/liquibase/i18n.ru.json\": \"ab30\",\n\t\"./views/instances/liquibase/i18n.zh-CN.json\": \"a935\",\n\t\"./views/instances/liquibase/i18n.zh-TW.json\": \"6cda\",\n\t\"./views/instances/logfile/i18n.de.json\": \"55fd\",\n\t\"./views/instances/logfile/i18n.en.json\": \"ef21\",\n\t\"./views/instances/logfile/i18n.fr.json\": \"3a9c\",\n\t\"./views/instances/logfile/i18n.ko.json\": \"e8ea\",\n\t\"./views/instances/logfile/i18n.pt-BR.json\": \"8e0e\",\n\t\"./views/instances/logfile/i18n.ru.json\": \"6e4e\",\n\t\"./views/instances/logfile/i18n.zh-CN.json\": \"90d3\",\n\t\"./views/instances/logfile/i18n.zh-TW.json\": \"0234\",\n\t\"./views/instances/loggers/i18n.de.json\": \"95a1\",\n\t\"./views/instances/loggers/i18n.en.json\": \"aea7\",\n\t\"./views/instances/loggers/i18n.fr.json\": \"0859\",\n\t\"./views/instances/loggers/i18n.ko.json\": \"1a45\",\n\t\"./views/instances/loggers/i18n.pt-BR.json\": \"e537\",\n\t\"./views/instances/loggers/i18n.ru.json\": \"777d\",\n\t\"./views/instances/loggers/i18n.zh-CN.json\": \"b79d\",\n\t\"./views/instances/loggers/i18n.zh-TW.json\": \"2d79\",\n\t\"./views/instances/mappings/i18n.de.json\": \"32cd\",\n\t\"./views/instances/mappings/i18n.en.json\": \"6486\",\n\t\"./views/instances/mappings/i18n.fr.json\": \"0e60\",\n\t\"./views/instances/mappings/i18n.ko.json\": \"10c5\",\n\t\"./views/instances/mappings/i18n.pt-BR.json\": \"d571\",\n\t\"./views/instances/mappings/i18n.ru.json\": \"897b\",\n\t\"./views/instances/mappings/i18n.zh-CN.json\": \"af14\",\n\t\"./views/instances/mappings/i18n.zh-TW.json\": \"2378\",\n\t\"./views/instances/metrics/i18n.de.json\": \"1ae1\",\n\t\"./views/instances/metrics/i18n.en.json\": \"2846\",\n\t\"./views/instances/metrics/i18n.fr.json\": \"db1c\",\n\t\"./views/instances/metrics/i18n.ko.json\": \"7227\",\n\t\"./views/instances/metrics/i18n.pt-BR.json\": \"f78b\",\n\t\"./views/instances/metrics/i18n.ru.json\": \"cdda\",\n\t\"./views/instances/metrics/i18n.zh-CN.json\": \"9cbc\",\n\t\"./views/instances/metrics/i18n.zh-TW.json\": \"d928\",\n\t\"./views/instances/scheduledtasks/i18n.de.json\": \"ac81\",\n\t\"./views/instances/scheduledtasks/i18n.en.json\": \"925c\",\n\t\"./views/instances/scheduledtasks/i18n.fr.json\": \"06f5\",\n\t\"./views/instances/scheduledtasks/i18n.ko.json\": \"d05c\",\n\t\"./views/instances/scheduledtasks/i18n.pt-BR.json\": \"a7d5\",\n\t\"./views/instances/scheduledtasks/i18n.ru.json\": \"25c3\",\n\t\"./views/instances/scheduledtasks/i18n.zh-CN.json\": \"7337\",\n\t\"./views/instances/scheduledtasks/i18n.zh-TW.json\": \"6619\",\n\t\"./views/instances/sessions/i18n.de.json\": \"5633\",\n\t\"./views/instances/sessions/i18n.en.json\": \"6e1e\",\n\t\"./views/instances/sessions/i18n.fr.json\": \"a662\",\n\t\"./views/instances/sessions/i18n.ko.json\": \"7b2f\",\n\t\"./views/instances/sessions/i18n.pt-BR.json\": \"a837\",\n\t\"./views/instances/sessions/i18n.ru.json\": \"2e679\",\n\t\"./views/instances/sessions/i18n.zh-CN.json\": \"cc7a\",\n\t\"./views/instances/sessions/i18n.zh-TW.json\": \"2187\",\n\t\"./views/instances/shell/i18n.de.json\": \"592f\",\n\t\"./views/instances/shell/i18n.en.json\": \"8369\",\n\t\"./views/instances/shell/i18n.fr.json\": \"19f0\",\n\t\"./views/instances/shell/i18n.ko.json\": \"70f5\",\n\t\"./views/instances/shell/i18n.pt-BR.json\": \"2647\",\n\t\"./views/instances/shell/i18n.ru.json\": \"cf2f\",\n\t\"./views/instances/shell/i18n.zh-CN.json\": \"d21a\",\n\t\"./views/instances/shell/i18n.zh-TW.json\": \"e39e\",\n\t\"./views/instances/threaddump/i18n.de.json\": \"dd4b\",\n\t\"./views/instances/threaddump/i18n.en.json\": \"a983\",\n\t\"./views/instances/threaddump/i18n.fr.json\": \"9ba3\",\n\t\"./views/instances/threaddump/i18n.ko.json\": \"57b3\",\n\t\"./views/instances/threaddump/i18n.pt-BR.json\": \"37e0\",\n\t\"./views/instances/threaddump/i18n.ru.json\": \"04bf\",\n\t\"./views/instances/threaddump/i18n.zh-CN.json\": \"f0cc\",\n\t\"./views/instances/threaddump/i18n.zh-TW.json\": \"fe37\",\n\t\"./views/journal/i18n.de.json\": \"8caa\",\n\t\"./views/journal/i18n.en.json\": \"3185\",\n\t\"./views/journal/i18n.fr.json\": \"a11a\",\n\t\"./views/journal/i18n.ko.json\": \"e2bf\",\n\t\"./views/journal/i18n.pt-BR.json\": \"c316\",\n\t\"./views/journal/i18n.ru.json\": \"e42a\",\n\t\"./views/journal/i18n.zh-CN.json\": \"944b\",\n\t\"./views/journal/i18n.zh-TW.json\": \"d897\",\n\t\"./views/wallboard/i18n.de.json\": \"dbb2\",\n\t\"./views/wallboard/i18n.en.json\": \"0328\",\n\t\"./views/wallboard/i18n.fr.json\": \"8c92\",\n\t\"./views/wallboard/i18n.ko.json\": \"073e\",\n\t\"./views/wallboard/i18n.pt-BR.json\": \"2585\",\n\t\"./views/wallboard/i18n.ru.json\": \"2a83\",\n\t\"./views/wallboard/i18n.zh-CN.json\": \"b992\",\n\t\"./views/wallboard/i18n.zh-TW.json\": \"d515\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"42e3\";"],"sourceRoot":""} -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/css/sba-core.0293d669.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Copyright 2014-2020 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */.confirm-button{-webkit-transition:all .15s ease-out;transition:all .15s ease-out}.formatted{white-space:pre} 16 | 17 | /*! 18 | * Copyright 2014-2020 the original author or authors. 19 | * 20 | * Licensed under the Apache License, Version 2.0 (the "License"); 21 | * you may not use this file except in compliance with the License. 22 | * You may obtain a copy of the License at 23 | * 24 | * http://www.apache.org/licenses/LICENSE-2.0 25 | * 26 | * Unless required by applicable law or agreed to in writing, software 27 | * distributed under the License is distributed on an "AS IS" BASIS, 28 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 29 | * See the License for the specific language governing permissions and 30 | * limitations under the License. 31 | */.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} 32 | 33 | /*! 34 | * Copyright 2014-2020 the original author or authors. 35 | * 36 | * Licensed under the Apache License, Version 2.0 (the "License"); 37 | * you may not use this file except in compliance with the License. 38 | * You may obtain a copy of the License at 39 | * 40 | * http://www.apache.org/licenses/LICENSE-2.0 41 | * 42 | * Unless required by applicable law or agreed to in writing, software 43 | * distributed under the License is distributed on an "AS IS" BASIS, 44 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 45 | * See the License for the specific language governing permissions and 46 | * limitations under the License. 47 | */.panel{margin-bottom:1.5rem}.panel__close{margin-right:.75em;color:#b5b5b5;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;justify-self:flex-end}.panel__header--sticky{position:-webkit-sticky;position:sticky;background-color:#fff;z-index:10} 48 | 49 | /*! 50 | * Copyright 2014-2020 the original author or authors. 51 | * 52 | * Licensed under the Apache License, Version 2.0 (the "License"); 53 | * you may not use this file except in compliance with the License. 54 | * You may obtain a copy of the License at 55 | * 56 | * http://www.apache.org/licenses/LICENSE-2.0 57 | * 58 | * Unless required by applicable law or agreed to in writing, software 59 | * distributed under the License is distributed on an "AS IS" BASIS, 60 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 61 | * See the License for the specific language governing permissions and 62 | * limitations under the License. 63 | */.application-status{text-align:center;line-height:1rem;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.application-status__icon{color:grey;margin:0 auto}.application-status__icon--UP{color:#48c774}.application-status__icon--RESTRICTED{color:#ffdd57}.application-status__icon--DOWN,.application-status__icon--OUT_OF_SERVICE{color:#f14668}.application-status__icon--OFFLINE,.application-status__icon--UNKNOWN{color:#7a7a7a} 64 | 65 | /*! 66 | * Copyright 2014-2020 the original author or authors. 67 | * 68 | * Licensed under the Apache License, Version 2.0 (the "License"); 69 | * you may not use this file except in compliance with the License. 70 | * You may obtain a copy of the License at 71 | * 72 | * http://www.apache.org/licenses/LICENSE-2.0 73 | * 74 | * Unless required by applicable law or agreed to in writing, software 75 | * distributed under the License is distributed on an "AS IS" BASIS, 76 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 77 | * See the License for the specific language governing permissions and 78 | * limitations under the License. 79 | */.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:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-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} 80 | 81 | /*! 82 | * Copyright 2014-2020 the original author or authors. 83 | * 84 | * Licensed under the Apache License, Version 2.0 (the "License"); 85 | * you may not use this file except in compliance with the License. 86 | * You may obtain a copy of the License at 87 | * 88 | * http://www.apache.org/licenses/LICENSE-2.0 89 | * 90 | * Unless required by applicable law or agreed to in writing, software 91 | * distributed under the License is distributed on an "AS IS" BASIS, 92 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 93 | * See the License for the specific language governing permissions and 94 | * limitations under the License. 95 | */.application-summary{display:contents}.application-summary__status{width:32px}.application-summary__name,.application-summary__version{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:50%;flex-basis:50%}.application-summary__name.title{margin:.75rem 0} 96 | 97 | /*! 98 | * Copyright 2014-2020 the original author or authors. 99 | * 100 | * Licensed under the Apache License, Version 2.0 (the "License"); 101 | * you may not use this file except in compliance with the License. 102 | * You may obtain a copy of the License at 103 | * 104 | * http://www.apache.org/licenses/LICENSE-2.0 105 | * 106 | * Unless required by applicable law or agreed to in writing, software 107 | * distributed under the License is distributed on an "AS IS" BASIS, 108 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 109 | * See the License for the specific language governing permissions and 110 | * limitations under the License. 111 | */.instances-list td{vertical-align:middle}.instance-list-item__status{width:32px}.instance-list-item__actions{text-align:right;opacity:0;-webkit-transition:all 86ms ease-out;transition:all 86ms ease-out;will-change:opacity;margin-right:32px}:hover>.instance-list-item__actions{opacity:1}.instance-list-item__actions>*{width:16px;height:16px} 112 | 113 | /*! 114 | * Copyright 2014-2020 the original author or authors. 115 | * 116 | * Licensed under the Apache License, Version 2.0 (the "License"); 117 | * you may not use this file except in compliance with the License. 118 | * You may obtain a copy of the License at 119 | * 120 | * http://www.apache.org/licenses/LICENSE-2.0 121 | * 122 | * Unless required by applicable law or agreed to in writing, software 123 | * distributed under the License is distributed on an "AS IS" BASIS, 124 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125 | * See the License for the specific language governing permissions and 126 | * limitations under the License. 127 | */.application-list-item{-webkit-transition:all 86ms ease-out;transition:all 86ms ease-out}.application-list-item.is-active{margin:.75rem -.75rem;max-width:unset}.application-list-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-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 .title{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:50%;flex-basis:50%;margin:.75rem 0}.application-list-item__header__actions{justify-self:end;opacity:0;-webkit-transition:all 86ms ease-out;transition:all 86ms ease-out;will-change:opacity;margin-right:16px;display:-webkit-box;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:16px;height:16px}.control.has-inline-text{line-height:2.25em} 128 | 129 | /*! 130 | * Copyright 2014-2019 the original author or authors. 131 | * 132 | * Licensed under the Apache License, Version 2.0 (the "License"); 133 | * you may not use this file except in compliance with the License. 134 | * You may obtain a copy of the License at 135 | * 136 | * http://www.apache.org/licenses/LICENSE-2.0 137 | * 138 | * Unless required by applicable law or agreed to in writing, software 139 | * distributed under the License is distributed on an "AS IS" BASIS, 140 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141 | * See the License for the specific language governing permissions and 142 | * limitations under the License. 143 | *//*! 144 | * Copyright 2014-2020 the original author or authors. 145 | * 146 | * Licensed under the Apache License, Version 2.0 (the "License"); 147 | * you may not use this file except in compliance with the License. 148 | * You may obtain a copy of the License at 149 | * 150 | * http://www.apache.org/licenses/LICENSE-2.0 151 | * 152 | * Unless required by applicable law or agreed to in writing, software 153 | * distributed under the License is distributed on an "AS IS" BASIS, 154 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 155 | * See the License for the specific language governing permissions and 156 | * limitations under the License. 157 | */.external-view{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:calc(100vh - 52px);-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.external-view>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:none;margin:0;padding:0}.auditevents{table-layout:fixed}.auditevents td{vertical-align:middle}.auditevents__event--is-detailed td{border:none!important}.auditevents__event-detail{overflow:auto} 158 | 159 | /*! 160 | * Copyright 2014-2020 the original author or authors. 161 | * 162 | * Licensed under the Apache License, Version 2.0 (the "License"); 163 | * you may not use this file except in compliance with the License. 164 | * You may obtain a copy of the License at 165 | * 166 | * http://www.apache.org/licenses/LICENSE-2.0 167 | * 168 | * Unless required by applicable law or agreed to in writing, software 169 | * distributed under the License is distributed on an "AS IS" BASIS, 170 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 171 | * See the License for the specific language governing permissions and 172 | * limitations under the License. 173 | */.beans table.beans__bean-detail tbody tr{pointer-events:none;background-color:#f5f5f5}.caches td,.caches th{vertical-align:middle} 174 | 175 | /*! 176 | * Copyright 2014-2020 the original author or authors. 177 | * 178 | * Licensed under the Apache License, Version 2.0 (the "License"); 179 | * you may not use this file except in compliance with the License. 180 | * You may obtain a copy of the License at 181 | * 182 | * http://www.apache.org/licenses/LICENSE-2.0 183 | * 184 | * Unless required by applicable law or agreed to in writing, software 185 | * distributed under the License is distributed on an "AS IS" BASIS, 186 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 187 | * See the License for the specific language governing permissions and 188 | * limitations under the License. 189 | */.cache-chart__svg{height:159px;width:100%}.cache-chart__area--miss{fill:#ffdd57;opacity:.8}.cache-chart__area--hit{fill:#3298dc;opacity:.8} 190 | 191 | /*! 192 | * Copyright 2014-2020 the original author or authors. 193 | * 194 | * Licensed under the Apache License, Version 2.0 (the "License"); 195 | * you may not use this file except in compliance with the License. 196 | * You may obtain a copy of the License at 197 | * 198 | * http://www.apache.org/licenses/LICENSE-2.0 199 | * 200 | * Unless required by applicable law or agreed to in writing, software 201 | * distributed under the License is distributed on an "AS IS" BASIS, 202 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 203 | * See the License for the specific language governing permissions and 204 | * limitations under the License. 205 | */.datasource-chart__svg{height:159px;width:100%}.datasource-chart__area--active{fill:#3298dc;opacity:.8}.datasource-chart__line--max{stroke:#7a7a7a}.datasource-current{margin-bottom:0!important}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} 206 | 207 | /*! 208 | * Copyright 2014-2020 the original author or authors. 209 | * 210 | * Licensed under the Apache License, Version 2.0 (the "License"); 211 | * you may not use this file except in compliance with the License. 212 | * You may obtain a copy of the License at 213 | * 214 | * http://www.apache.org/licenses/LICENSE-2.0 215 | * 216 | * Unless required by applicable law or agreed to in writing, software 217 | * distributed under the License is distributed on an "AS IS" BASIS, 218 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 219 | * See the License for the specific language governing permissions and 220 | * limitations under the License. 221 | */td.health-details__nested{padding:0 0 0 .75em;border-bottom:0}td.health-details__nested pre{padding:.5em .75em}.health-details__nested .table{margin-bottom:.5em}.health-details__status{float:right}.health-details__status--UP{color:#48c774}.health-details__status--RESTRICTED{color:#ffdd57}.health-details__status--DOWN,.health-details__status--OUT_OF_SERVICE{color:#f14668}.health-details__status--OFFLINE,.health-details__status--UNKNOWN{color:#7a7a7a}.info{overflow:auto}.info__key{vertical-align:top} 222 | 223 | /*! 224 | * Copyright 2014-2020 the original author or authors. 225 | * 226 | * Licensed under the Apache License, Version 2.0 (the "License"); 227 | * you may not use this file except in compliance with the License. 228 | * You may obtain a copy of the License at 229 | * 230 | * http://www.apache.org/licenses/LICENSE-2.0 231 | * 232 | * Unless required by applicable law or agreed to in writing, software 233 | * distributed under the License is distributed on an "AS IS" BASIS, 234 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 235 | * See the License for the specific language governing permissions and 236 | * limitations under the License. 237 | */.mem-chart__svg{height:159px;width:100%}.mem-chart__area--committed{fill:#ffdd57;opacity:.8}.mem-chart__area--used{fill:#3298dc;opacity:.8}.mem-chart__area--metaspace{fill:#42d3a5;opacity:.8}.mem-chart__line--max{stroke:#7a7a7a} 238 | 239 | /*! 240 | * Copyright 2014-2020 the original author or authors. 241 | * 242 | * Licensed under the Apache License, Version 2.0 (the "License"); 243 | * you may not use this file except in compliance with the License. 244 | * You may obtain a copy of the License at 245 | * 246 | * http://www.apache.org/licenses/LICENSE-2.0 247 | * 248 | * Unless required by applicable law or agreed to in writing, software 249 | * distributed under the License is distributed on an "AS IS" BASIS, 250 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 251 | * See the License for the specific language governing permissions and 252 | * limitations under the License. 253 | */.memory-current{margin-bottom:0!important}.metadata{overflow:auto}.metadata__key{vertical-align:top} 254 | 255 | /*! 256 | * Copyright 2014-2020 the original author or authors. 257 | * 258 | * Licensed under the Apache License, Version 2.0 (the "License"); 259 | * you may not use this file except in compliance with the License. 260 | * You may obtain a copy of the License at 261 | * 262 | * http://www.apache.org/licenses/LICENSE-2.0 263 | * 264 | * Unless required by applicable law or agreed to in writing, software 265 | * distributed under the License is distributed on an "AS IS" BASIS, 266 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 267 | * See the License for the specific language governing permissions and 268 | * limitations under the License. 269 | */.threads-chart__svg{height:159px;width:100%}.threads-chart__area--live{fill:#ffdd57;opacity:.8}.threads-chart__area--daemon{fill:#3298dc;opacity:.8}.threads-current{margin-bottom:0!important} 270 | 271 | /*! 272 | * Copyright 2014-2020 the original author or authors. 273 | * 274 | * Licensed under the Apache License, Version 2.0 (the "License"); 275 | * you may not use this file except in compliance with the License. 276 | * You may obtain a copy of the License at 277 | * 278 | * http://www.apache.org/licenses/LICENSE-2.0 279 | * 280 | * Unless required by applicable law or agreed to in writing, software 281 | * distributed under the License is distributed on an "AS IS" BASIS, 282 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 283 | * See the License for the specific language governing permissions and 284 | * limitations under the License. 285 | */.details-header{margin-bottom:1.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.details-header__urls{width:100%;text-align:center} 286 | 287 | /*! 288 | * Copyright 2014-2020 the original author or authors. 289 | * 290 | * Licensed under the Apache License, Version 2.0 (the "License"); 291 | * you may not use this file except in compliance with the License. 292 | * You may obtain a copy of the License at 293 | * 294 | * http://www.apache.org/licenses/LICENSE-2.0 295 | * 296 | * Unless required by applicable law or agreed to in writing, software 297 | * distributed under the License is distributed on an "AS IS" BASIS, 298 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 299 | * See the License for the specific language governing permissions and 300 | * limitations under the License. 301 | */.route-definition{display:block;min-width:12em;max-width:28em;padding:.5em;margin:1.25em;background-color:#fff;border-radius:6px;-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1)}.route-definition-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.route-definition-spacer{font-size:1.25rem;min-width:1em;max-width:3.5em}.route-definition-header{font-size:1.25rem}.route-definition-content{background-color:#42d3a5;color:#fff;border-radius:4px;padding:.25em;margin:.25em}.route-definition-category{font-weight:700;border-bottom:1px solid #fafafa;display:block}.routes td,.routes th{vertical-align:middle}.routes__delete-action{text-align:right}.heapdump{-ms-flex-pack:distribute;justify-content:space-around}.heapdump,.heapdump>div{display:-webkit-box;display:-ms-flexbox;display:flex}.heapdump>div{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column} 302 | 303 | /*! 304 | * Copyright 2014-2020 the original author or authors. 305 | * 306 | * Licensed under the Apache License, Version 2.0 (the "License"); 307 | * you may not use this file except in compliance with the License. 308 | * You may obtain a copy of the License at 309 | * 310 | * http://www.apache.org/licenses/LICENSE-2.0 311 | * 312 | * Unless required by applicable law or agreed to in writing, software 313 | * distributed under the License is distributed on an "AS IS" BASIS, 314 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 315 | * See the License for the specific language governing permissions and 316 | * limitations under the License. 317 | */.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:#48c774;opacity:.8}.trace-chart__area--totalClientErrors{fill:#ffdd57;opacity:.8}.trace-chart__area--totalServerErrors{fill:#f14668;opacity:.8} 318 | 319 | /*! 320 | * Copyright 2014-2020 the original author or authors. 321 | * 322 | * Licensed under the Apache License, Version 2.0 (the "License"); 323 | * you may not use this file except in compliance with the License. 324 | * You may obtain a copy of the License at 325 | * 326 | * http://www.apache.org/licenses/LICENSE-2.0 327 | * 328 | * Unless required by applicable law or agreed to in writing, software 329 | * distributed under the License is distributed on an "AS IS" BASIS, 330 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 331 | * See the License for the specific language governing permissions and 332 | * limitations under the License. 333 | */.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} 334 | 335 | /*! 336 | * Copyright 2014-2020 the original author or authors. 337 | * 338 | * Licensed under the Apache License, Version 2.0 (the "License"); 339 | * you may not use this file except in compliance with the License. 340 | * You may obtain a copy of the License at 341 | * 342 | * http://www.apache.org/licenses/LICENSE-2.0 343 | * 344 | * Unless required by applicable law or agreed to in writing, software 345 | * distributed under the License is distributed on an "AS IS" BASIS, 346 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 347 | * See the License for the specific language governing permissions and 348 | * limitations under the License. 349 | */.httptraces__limit{width:5em} 350 | 351 | /*! 352 | * Copyright 2014-2020 the original author or authors. 353 | * 354 | * Licensed under the Apache License, Version 2.0 (the "License"); 355 | * you may not use this file except in compliance with the License. 356 | * You may obtain a copy of the License at 357 | * 358 | * http://www.apache.org/licenses/LICENSE-2.0 359 | * 360 | * Unless required by applicable law or agreed to in writing, software 361 | * distributed under the License is distributed on an "AS IS" BASIS, 362 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 363 | * See the License for the specific language governing permissions and 364 | * limitations under the License. 365 | */.m-bean-attribute--text{resize:vertical;min-height:120px} 366 | 367 | /*! 368 | * Copyright 2014-2020 the original author or authors. 369 | * 370 | * Licensed under the Apache License, Version 2.0 (the "License"); 371 | * you may not use this file except in compliance with the License. 372 | * You may obtain a copy of the License at 373 | * 374 | * http://www.apache.org/licenses/LICENSE-2.0 375 | * 376 | * Unless required by applicable law or agreed to in writing, software 377 | * distributed under the License is distributed on an "AS IS" BASIS, 378 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 379 | * See the License for the specific language governing permissions and 380 | * limitations under the License. 381 | */.m-bean{-webkit-transition:all 86ms ease-out;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} 382 | 383 | /*! 384 | * Copyright 2014-2020 the original author or authors. 385 | * 386 | * Licensed under the Apache License, Version 2.0 (the "License"); 387 | * you may not use this file except in compliance with the License. 388 | * You may obtain a copy of the License at 389 | * 390 | * http://www.apache.org/licenses/LICENSE-2.0 391 | * 392 | * Unless required by applicable law or agreed to in writing, software 393 | * distributed under the License is distributed on an "AS IS" BASIS, 394 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 395 | * See the License for the specific language governing permissions and 396 | * limitations under the License. 397 | */.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:68px;right:16px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:-webkit-sticky;position:sticky;float:right}.logfile-view-actions__navigation{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-right:.5rem}.rotated{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.logger-control__level--inherited{opacity:.5}.logger-control__level--inherited:hover{opacity:1} 398 | 399 | /*! 400 | * Copyright 2014-2020 the original author or authors. 401 | * 402 | * Licensed under the Apache License, Version 2.0 (the "License"); 403 | * you may not use this file except in compliance with the License. 404 | * You may obtain a copy of the License at 405 | * 406 | * http://www.apache.org/licenses/LICENSE-2.0 407 | * 408 | * Unless required by applicable law or agreed to in writing, software 409 | * distributed under the License is distributed on an "AS IS" BASIS, 410 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 411 | * See the License for the specific language governing permissions and 412 | * limitations under the License. 413 | */.loggers__header{background-color:#fff;z-index:10;padding:.5em 1em}.loggers__toggle-scope{width:10em}.sessions td,.sessions th{vertical-align:middle} 414 | 415 | /*! 416 | * Copyright 2014-2020 the original author or authors. 417 | * 418 | * Licensed under the Apache License, Version 2.0 (the "License"); 419 | * you may not use this file except in compliance with the License. 420 | * You may obtain a copy of the License at 421 | * 422 | * http://www.apache.org/licenses/LICENSE-2.0 423 | * 424 | * Unless required by applicable law or agreed to in writing, software 425 | * distributed under the License is distributed on an "AS IS" BASIS, 426 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 427 | * See the License for the specific language governing permissions and 428 | * limitations under the License. 429 | */.sidebar{height:100%;width:100%;background-color:#fafafa;border-right:1px solid #dbdbdb;overflow-x:auto}.sidebar .instance-summary{padding:1rem .5rem;color:#4a4a4a;background-color:#7a7a7a;text-align:center}.sidebar .instance-summary:hover{background-color:hsla(0,0%,47.8%,.9)}.sidebar .instance-summary__name{max-width:175px;margin:0 auto;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:#f14668}.sidebar .instance-summary--DOWN:hover,.sidebar .instance-summary--OUT_OF_SERVICE:hover{background-color:rgba(241,70,104,.9)}.sidebar a{border-radius:2px;color:#4a4a4a;overflow:hidden;text-overflow:ellipsis;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{-webkit-box-shadow:inset 4px 0 0 #42d3a5;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:999;background-color:#fff;min-width:150px;-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1)} 430 | 431 | /*! 432 | * Copyright 2014-2020 the original author or authors. 433 | * 434 | * Licensed under the Apache License, Version 2.0 (the "License"); 435 | * you may not use this file except in compliance with the License. 436 | * You may obtain a copy of the License at 437 | * 438 | * http://www.apache.org/licenses/LICENSE-2.0 439 | * 440 | * Unless required by applicable law or agreed to in writing, software 441 | * distributed under the License is distributed on an "AS IS" BASIS, 442 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 443 | * See the License for the specific language governing permissions and 444 | * limitations under the License. 445 | */.instances{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.instances,.instances__body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.instances__sidebar,.instances__view{position:relative}.instances__sidebar{z-index:20;position:fixed;top:52px;bottom:0;left:0;width:220px}.instances__view{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;z-index:10;max-width:100%;padding-left:220px} 446 | 447 | /*! 448 | * Copyright 2014-2020 the original author or authors. 449 | * 450 | * Licensed under the Apache License, Version 2.0 (the "License"); 451 | * you may not use this file except in compliance with the License. 452 | * You may obtain a copy of the License at 453 | * 454 | * http://www.apache.org/licenses/LICENSE-2.0 455 | * 456 | * Unless required by applicable law or agreed to in writing, software 457 | * distributed under the License is distributed on an "AS IS" BASIS, 458 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 459 | * See the License for the specific language governing permissions and 460 | * limitations under the License. 461 | */.thread-tag{width:2em}.thread-tag--runnable{color:#fff!important;background-color:#48c774!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:#f14668!important}.thread-tag--blocked:before{content:"B"}.thread-tag--terminated{color:rgba(0,0,0,.7)!important;background-color:#f5f5f5!important}.thread-tag--terminated:before{content:"T"}.thread-tag--new{color:rgba(0,0,0,.7)!important;background-color:#f5f5f5!important}.thread-tag--new:before{content:"N"} 462 | 463 | /*! 464 | * Copyright 2014-2020 the original author or authors. 465 | * 466 | * Licensed under the Apache License, Version 2.0 (the "License"); 467 | * you may not use this file except in compliance with the License. 468 | * You may obtain a copy of the License at 469 | * 470 | * http://www.apache.org/licenses/LICENSE-2.0 471 | * 472 | * Unless required by applicable law or agreed to in writing, software 473 | * distributed under the License is distributed on an "AS IS" BASIS, 474 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 475 | * See the License for the specific language governing permissions and 476 | * limitations under the License. 477 | */.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{stroke:#0a0a0a;stroke-width:1px;stroke-opacity:.1}.thread--runnable{fill:#48c774}.thread--runnable.thread--clicked,.thread--runnable:hover{fill:#288147}.thread--waiting{fill:#ffdd57}.thread--waiting.thread--clicked,.thread--waiting:hover{fill:#f0c000}.thread--timed_waiting{fill:#ffdd57}.thread--timed_waiting.thread--clicked,.thread--timed_waiting:hover{fill:#f0c000}.thread--blocked{fill:#f14668}.thread--blocked.thread--clicked,.thread--blocked:hover{fill:#f0c000} 478 | 479 | /*! 480 | * Copyright 2014-2020 the original author or authors. 481 | * 482 | * Licensed under the Apache License, Version 2.0 (the "License"); 483 | * you may not use this file except in compliance with the License. 484 | * You may obtain a copy of the License at 485 | * 486 | * http://www.apache.org/licenses/LICENSE-2.0 487 | * 488 | * Unless required by applicable law or agreed to in writing, software 489 | * distributed under the License is distributed on an "AS IS" BASIS, 490 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 491 | * See the License for the specific language governing permissions and 492 | * limitations under the License. 493 | */.hex-mesh{background-color:#4a4a4a;width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.hex{fill-opacity:.05;stroke-width:.5;stroke-opacity:.8}.hex polygon{fill:none;stroke:#7a7a7a;-webkit-transition:all .25s ease-out;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:#3298dc;fill-opacity:.3;stroke:#3298dc;stroke-opacity:.95;stroke-width:1.5}.hex.is-success polygon{fill:#48c774;fill-opacity:.3;stroke:#48c774;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:#f14668;fill-opacity:.3;stroke:#f14668;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:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center} 494 | 495 | /*! 496 | * Copyright 2014-2020 the original author or authors. 497 | * 498 | * Licensed under the Apache License, Version 2.0 (the "License"); 499 | * you may not use this file except in compliance with the License. 500 | * You may obtain a copy of the License at 501 | * 502 | * http://www.apache.org/licenses/LICENSE-2.0 503 | * 504 | * Unless required by applicable law or agreed to in writing, software 505 | * distributed under the License is distributed on an "AS IS" BASIS, 506 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 507 | * See the License for the specific language governing permissions and 508 | * limitations under the License. 509 | */.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:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-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} -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/monitor/assets/js/event-source-polyfill.9676e331.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./node_modules/event-source-polyfill/src/eventsource.js"],"names":["global","setTimeout","clearTimeout","XMLHttpRequest","XDomainRequest","ActiveXObject","NativeEventSource","EventSource","document","Promise","fetch","Response","TextDecoder","TextEncoder","AbortController","window","body","readyState","addEventListener","event","undefined","Object","create","C","F","prototype","originalFetch2","url","options","signal","headers","credentials","cache","then","response","reader","getReader","_reader","_aborted","cancel","status","statusText","this","abort","TextDecoderPolyfill","bitsNeeded","codePoint","decode","octets","valid","shift","octetsCount","Error","REPLACER","string","i","length","octet","String","fromCharCode","supportsStreamOption","encode","stream","error","console","debug","k","XHRWrapper","xhr","withCredentials","responseText","onprogress","onload","onerror","onreadystatechange","_contentType","_xhr","_sendTimeout","_abort","toLowerCase","name","replace","c","charCodeAt","HeadersPolyfill","all","map","array","split","line","parts","value","join","_map","XHRTransport","HeadersWrapper","_headers","FetchTransport","EventTarget","_listeners","throwError","e","Event","type","target","MessageEvent","call","data","lastEventId","ConnectionEvent","ErrorEvent","open","method","that","state","timeout","silent","onabort","onStart","contentType","getResponseHeader","onProgress","onFinish","preventDefault","TypeError","onReadyStateChange","onTimeout","indexOf","setRequestHeader","getAllResponseHeaders","send","error1","get","HEADERS_RECEIVED","onStartCallback","onProgressCallback","onFinishCallback","offset","chunk","slice","hasOwnProperty","controller","textDecoder","resolve","reject","readNextChunk","read","result","done","dispatchEvent","typeListeners","listener","handleEvent","listeners","found","push","removeEventListener","filtered","WAITING","CONNECTING","OPEN","CLOSED","AFTER_CR","FIELD_START","FIELD","VALUE_START","VALUE","contentTypeRegExp","MINIMUM_DURATION","MAXIMUM_DURATION","parseDuration","def","n","parseInt","clampDuration","Math","min","max","fire","f","EventSourcePolyfill","onopen","onmessage","_close","start","getBestXHRTransport","isFetchSupported","es","Boolean","initialRetry","heartbeatTimeout","retry","wasActivity","textLength","TransportOption","Transport","transport","abortController","currentState","dataBuffer","lastEventIdBuffer","eventTypeBuffer","textBuffer","fieldStart","valueStart","test","message","close","textChunk","position","field","requestURL","encodeURIComponent","requestHeaders","R","factory","module","exports","v","self"],"mappings":"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","file":"assets/js/event-source-polyfill.9676e331.js","sourcesContent":["/** @license\r\n * eventsource.js\r\n * Available under MIT License (MIT)\r\n * https://github.com/Yaffle/EventSource/\r\n */\r\n\r\n/*jslint indent: 2, vars: true, plusplus: true */\r\n/*global setTimeout, clearTimeout */\r\n\r\n(function (global) {\r\n \"use strict\";\r\n\r\n var setTimeout = global.setTimeout;\r\n var clearTimeout = global.clearTimeout;\r\n var XMLHttpRequest = global.XMLHttpRequest;\r\n var XDomainRequest = global.XDomainRequest;\r\n var ActiveXObject = global.ActiveXObject;\r\n var NativeEventSource = global.EventSource;\r\n\r\n var document = global.document;\r\n var Promise = global.Promise;\r\n var fetch = global.fetch;\r\n var Response = global.Response;\r\n var TextDecoder = global.TextDecoder;\r\n var TextEncoder = global.TextEncoder;\r\n var AbortController = global.AbortController;\r\n\r\n if (typeof window !== \"undefined\" && !(\"readyState\" in document) && document.body == null) { // Firefox 2\r\n document.readyState = \"loading\";\r\n window.addEventListener(\"load\", function (event) {\r\n document.readyState = \"complete\";\r\n }, false);\r\n }\r\n\r\n if (XMLHttpRequest == null) { // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest_in_IE6\r\n XMLHttpRequest = function () {\r\n return new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n };\r\n }\r\n\r\n if (Object.create == undefined) {\r\n Object.create = function (C) {\r\n function F(){}\r\n F.prototype = C;\r\n return new F();\r\n };\r\n }\r\n\r\n // see #118 (Promise#finally with polyfilled Promise)\r\n // see #123 (data URLs crash Edge)\r\n // see #125 (CSP violations)\r\n // see pull/#138\r\n // => No way to polyfill Promise#finally\r\n\r\n if (AbortController == undefined) {\r\n var originalFetch2 = fetch;\r\n fetch = function (url, options) {\r\n var signal = options.signal;\r\n return originalFetch2(url, {headers: options.headers, credentials: options.credentials, cache: options.cache}).then(function (response) {\r\n var reader = response.body.getReader();\r\n signal._reader = reader;\r\n if (signal._aborted) {\r\n signal._reader.cancel();\r\n }\r\n return {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n body: {\r\n getReader: function () {\r\n return reader;\r\n }\r\n }\r\n };\r\n });\r\n };\r\n AbortController = function () {\r\n this.signal = {\r\n _reader: null,\r\n _aborted: false\r\n };\r\n this.abort = function () {\r\n if (this.signal._reader != null) {\r\n this.signal._reader.cancel();\r\n }\r\n this.signal._aborted = true;\r\n };\r\n };\r\n }\r\n\r\n function TextDecoderPolyfill() {\r\n this.bitsNeeded = 0;\r\n this.codePoint = 0;\r\n }\r\n\r\n TextDecoderPolyfill.prototype.decode = function (octets) {\r\n function valid(codePoint, shift, octetsCount) {\r\n if (octetsCount === 1) {\r\n return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07FF;\r\n }\r\n if (octetsCount === 2) {\r\n return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xD7FF || codePoint >= 0xE000 >> shift && codePoint << shift <= 0xFFFF;\r\n }\r\n if (octetsCount === 3) {\r\n return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10FFFF;\r\n }\r\n throw new Error();\r\n }\r\n function octetsCount(bitsNeeded, codePoint) {\r\n if (bitsNeeded === 6 * 1) {\r\n return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\r\n }\r\n if (bitsNeeded === 6 * 2) {\r\n return codePoint > 15 ? 3 : 2;\r\n }\r\n if (bitsNeeded === 6 * 3) {\r\n return 3;\r\n }\r\n throw new Error();\r\n }\r\n var REPLACER = 0xFFFD;\r\n var string = \"\";\r\n var bitsNeeded = this.bitsNeeded;\r\n var codePoint = this.codePoint;\r\n for (var i = 0; i < octets.length; i += 1) {\r\n var octet = octets[i];\r\n if (bitsNeeded !== 0) {\r\n if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\r\n bitsNeeded = 0;\r\n codePoint = REPLACER;\r\n string += String.fromCharCode(codePoint);\r\n }\r\n }\r\n if (bitsNeeded === 0) {\r\n if (octet >= 0 && octet <= 127) {\r\n bitsNeeded = 0;\r\n codePoint = octet;\r\n } else if (octet >= 192 && octet <= 223) {\r\n bitsNeeded = 6 * 1;\r\n codePoint = octet & 31;\r\n } else if (octet >= 224 && octet <= 239) {\r\n bitsNeeded = 6 * 2;\r\n codePoint = octet & 15;\r\n } else if (octet >= 240 && octet <= 247) {\r\n bitsNeeded = 6 * 3;\r\n codePoint = octet & 7;\r\n } else {\r\n bitsNeeded = 0;\r\n codePoint = REPLACER;\r\n }\r\n if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\r\n bitsNeeded = 0;\r\n codePoint = REPLACER;\r\n }\r\n } else {\r\n bitsNeeded -= 6;\r\n codePoint = codePoint << 6 | octet & 63;\r\n }\r\n if (bitsNeeded === 0) {\r\n if (codePoint <= 0xFFFF) {\r\n string += String.fromCharCode(codePoint);\r\n } else {\r\n string += String.fromCharCode(0xD800 + (codePoint - 0xFFFF - 1 >> 10));\r\n string += String.fromCharCode(0xDC00 + (codePoint - 0xFFFF - 1 & 0x3FF));\r\n }\r\n }\r\n }\r\n this.bitsNeeded = bitsNeeded;\r\n this.codePoint = codePoint;\r\n return string;\r\n };\r\n\r\n // Firefox < 38 throws an error with stream option\r\n var supportsStreamOption = function () {\r\n try {\r\n return new TextDecoder().decode(new TextEncoder().encode(\"test\"), {stream: true}) === \"test\";\r\n } catch (error) {\r\n console.debug(\"TextDecoder does not support streaming option. Using polyfill instead: \" + error);\r\n }\r\n return false;\r\n };\r\n\r\n // IE, Edge\r\n if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\r\n TextDecoder = TextDecoderPolyfill;\r\n }\r\n\r\n var k = function () {\r\n };\r\n\r\n function XHRWrapper(xhr) {\r\n this.withCredentials = false;\r\n this.readyState = 0;\r\n this.status = 0;\r\n this.statusText = \"\";\r\n this.responseText = \"\";\r\n this.onprogress = k;\r\n this.onload = k;\r\n this.onerror = k;\r\n this.onreadystatechange = k;\r\n this._contentType = \"\";\r\n this._xhr = xhr;\r\n this._sendTimeout = 0;\r\n this._abort = k;\r\n }\r\n\r\n XHRWrapper.prototype.open = function (method, url) {\r\n this._abort(true);\r\n\r\n var that = this;\r\n var xhr = this._xhr;\r\n var state = 1;\r\n var timeout = 0;\r\n\r\n this._abort = function (silent) {\r\n if (that._sendTimeout !== 0) {\r\n clearTimeout(that._sendTimeout);\r\n that._sendTimeout = 0;\r\n }\r\n if (state === 1 || state === 2 || state === 3) {\r\n state = 4;\r\n xhr.onload = k;\r\n xhr.onerror = k;\r\n xhr.onabort = k;\r\n xhr.onprogress = k;\r\n xhr.onreadystatechange = k;\r\n // IE 8 - 9: XDomainRequest#abort() does not fire any event\r\n // Opera < 10: XMLHttpRequest#abort() does not fire any event\r\n xhr.abort();\r\n if (timeout !== 0) {\r\n clearTimeout(timeout);\r\n timeout = 0;\r\n }\r\n if (!silent) {\r\n that.readyState = 4;\r\n that.onabort(null);\r\n that.onreadystatechange();\r\n }\r\n }\r\n state = 0;\r\n };\r\n\r\n var onStart = function () {\r\n if (state === 1) {\r\n //state = 2;\r\n var status = 0;\r\n var statusText = \"\";\r\n var contentType = undefined;\r\n if (!(\"contentType\" in xhr)) {\r\n try {\r\n status = xhr.status;\r\n statusText = xhr.statusText;\r\n contentType = xhr.getResponseHeader(\"Content-Type\");\r\n } catch (error) {\r\n // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\r\n // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\r\n // https://bugs.webkit.org/show_bug.cgi?id=29121\r\n status = 0;\r\n statusText = \"\";\r\n contentType = undefined;\r\n // Firefox < 14, Chrome ?, Safari ?\r\n // https://bugs.webkit.org/show_bug.cgi?id=29658\r\n // https://bugs.webkit.org/show_bug.cgi?id=77854\r\n }\r\n } else {\r\n status = 200;\r\n statusText = \"OK\";\r\n contentType = xhr.contentType;\r\n }\r\n if (status !== 0) {\r\n state = 2;\r\n that.readyState = 2;\r\n that.status = status;\r\n that.statusText = statusText;\r\n that._contentType = contentType;\r\n that.onreadystatechange();\r\n }\r\n }\r\n };\r\n var onProgress = function () {\r\n onStart();\r\n if (state === 2 || state === 3) {\r\n state = 3;\r\n var responseText = \"\";\r\n try {\r\n responseText = xhr.responseText;\r\n } catch (error) {\r\n // IE 8 - 9 with XMLHttpRequest\r\n }\r\n that.readyState = 3;\r\n that.responseText = responseText;\r\n that.onprogress();\r\n }\r\n };\r\n var onFinish = function (type, event) {\r\n if (event == null || event.preventDefault == null) {\r\n event = {\r\n preventDefault: k\r\n };\r\n }\r\n // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\r\n // IE 8 fires \"onload\" without \"onprogress\"\r\n onProgress();\r\n if (state === 1 || state === 2 || state === 3) {\r\n state = 4;\r\n if (timeout !== 0) {\r\n clearTimeout(timeout);\r\n timeout = 0;\r\n }\r\n that.readyState = 4;\r\n if (type === \"load\") {\r\n that.onload(event);\r\n } else if (type === \"error\") {\r\n that.onerror(event);\r\n } else if (type === \"abort\") {\r\n that.onabort(event);\r\n } else {\r\n throw new TypeError();\r\n }\r\n that.onreadystatechange();\r\n }\r\n };\r\n var onReadyStateChange = function (event) {\r\n if (xhr != undefined) { // Opera 12\r\n if (xhr.readyState === 4) {\r\n if (!(\"onload\" in xhr) || !(\"onerror\" in xhr) || !(\"onabort\" in xhr)) {\r\n onFinish(xhr.responseText === \"\" ? \"error\" : \"load\", event);\r\n }\r\n } else if (xhr.readyState === 3) {\r\n if (!(\"onprogress\" in xhr)) { // testing XMLHttpRequest#responseText too many times is too slow in IE 11\r\n // and in Firefox 3.6\r\n onProgress();\r\n }\r\n } else if (xhr.readyState === 2) {\r\n onStart();\r\n }\r\n }\r\n };\r\n var onTimeout = function () {\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, 500);\r\n if (xhr.readyState === 3) {\r\n onProgress();\r\n }\r\n };\r\n\r\n // XDomainRequest#abort removes onprogress, onerror, onload\r\n if (\"onload\" in xhr) {\r\n xhr.onload = function (event) {\r\n onFinish(\"load\", event);\r\n };\r\n }\r\n if (\"onerror\" in xhr) {\r\n xhr.onerror = function (event) {\r\n onFinish(\"error\", event);\r\n };\r\n }\r\n // improper fix to match Firefox behaviour, but it is better than just ignore abort\r\n // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\r\n // https://code.google.com/p/chromium/issues/detail?id=153570\r\n // IE 8 fires \"onload\" without \"onprogress\r\n if (\"onabort\" in xhr) {\r\n xhr.onabort = function (event) {\r\n onFinish(\"abort\", event);\r\n };\r\n }\r\n\r\n if (\"onprogress\" in xhr) {\r\n xhr.onprogress = onProgress;\r\n }\r\n\r\n // IE 8 - 9 (XMLHTTPRequest)\r\n // Opera < 12\r\n // Firefox < 3.5\r\n // Firefox 3.5 - 3.6 - ? < 9.0\r\n // onprogress is not fired sometimes or delayed\r\n // see also #64 (significant lag in IE 11)\r\n if (\"onreadystatechange\" in xhr) {\r\n xhr.onreadystatechange = function (event) {\r\n onReadyStateChange(event);\r\n };\r\n }\r\n\r\n if (\"contentType\" in xhr || !(\"ontimeout\" in XMLHttpRequest.prototype)) {\r\n url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"padding=true\";\r\n }\r\n xhr.open(method, url, true);\r\n\r\n if (\"readyState\" in xhr) {\r\n // workaround for Opera 12 issue with \"progress\" events\r\n // #91 (XMLHttpRequest onprogress not fired for streaming response in Edge 14-15-?)\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, 0);\r\n }\r\n };\r\n XHRWrapper.prototype.abort = function () {\r\n this._abort(false);\r\n };\r\n XHRWrapper.prototype.getResponseHeader = function (name) {\r\n return this._contentType;\r\n };\r\n XHRWrapper.prototype.setRequestHeader = function (name, value) {\r\n var xhr = this._xhr;\r\n if (\"setRequestHeader\" in xhr) {\r\n xhr.setRequestHeader(name, value);\r\n }\r\n };\r\n XHRWrapper.prototype.getAllResponseHeaders = function () {\r\n // XMLHttpRequest#getAllResponseHeaders returns null for CORS requests in Firefox 3.6.28\r\n return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() || \"\" : \"\";\r\n };\r\n XHRWrapper.prototype.send = function () {\r\n // loading indicator in Safari < ? (6), Chrome < 14, Firefox\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\r\n if ((!(\"ontimeout\" in XMLHttpRequest.prototype) || (!(\"sendAsBinary\" in XMLHttpRequest.prototype) && !(\"mozAnon\" in XMLHttpRequest.prototype))) &&\r\n document != undefined &&\r\n document.readyState != undefined &&\r\n document.readyState !== \"complete\") {\r\n var that = this;\r\n that._sendTimeout = setTimeout(function () {\r\n that._sendTimeout = 0;\r\n that.send();\r\n }, 4);\r\n return;\r\n }\r\n\r\n var xhr = this._xhr;\r\n // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\r\n if (\"withCredentials\" in xhr) {\r\n xhr.withCredentials = this.withCredentials;\r\n }\r\n try {\r\n // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\r\n xhr.send(undefined);\r\n } catch (error1) {\r\n // Safari 5.1.7, Opera 12\r\n throw error1;\r\n }\r\n };\r\n\r\n function toLowerCase(name) {\r\n return name.replace(/[A-Z]/g, function (c) {\r\n return String.fromCharCode(c.charCodeAt(0) + 0x20);\r\n });\r\n }\r\n\r\n function HeadersPolyfill(all) {\r\n // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\r\n var map = Object.create(null);\r\n var array = all.split(\"\\r\\n\");\r\n for (var i = 0; i < array.length; i += 1) {\r\n var line = array[i];\r\n var parts = line.split(\": \");\r\n var name = parts.shift();\r\n var value = parts.join(\": \");\r\n map[toLowerCase(name)] = value;\r\n }\r\n this._map = map;\r\n }\r\n HeadersPolyfill.prototype.get = function (name) {\r\n return this._map[toLowerCase(name)];\r\n };\r\n \r\n if (XMLHttpRequest != null && XMLHttpRequest.HEADERS_RECEIVED == null) { // IE < 9, Firefox 3.6\r\n XMLHttpRequest.HEADERS_RECEIVED = 2;\r\n }\r\n\r\n function XHRTransport() {\r\n }\r\n\r\n XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n xhr.open(\"GET\", url);\r\n var offset = 0;\r\n xhr.onprogress = function () {\r\n var responseText = xhr.responseText;\r\n var chunk = responseText.slice(offset);\r\n offset += chunk.length;\r\n onProgressCallback(chunk);\r\n };\r\n xhr.onerror = function (event) {\r\n event.preventDefault();\r\n onFinishCallback(new Error(\"NetworkError\"));\r\n };\r\n xhr.onload = function () {\r\n onFinishCallback(null);\r\n };\r\n xhr.onabort = function () {\r\n onFinishCallback(null);\r\n };\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {\r\n var status = xhr.status;\r\n var statusText = xhr.statusText;\r\n var contentType = xhr.getResponseHeader(\"Content-Type\");\r\n var headers = xhr.getAllResponseHeaders();\r\n onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers));\r\n }\r\n };\r\n xhr.withCredentials = withCredentials;\r\n for (var name in headers) {\r\n if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n xhr.setRequestHeader(name, headers[name]);\r\n }\r\n }\r\n xhr.send();\r\n return xhr;\r\n };\r\n\r\n function HeadersWrapper(headers) {\r\n this._headers = headers;\r\n }\r\n HeadersWrapper.prototype.get = function (name) {\r\n return this._headers.get(name);\r\n };\r\n\r\n function FetchTransport() {\r\n }\r\n\r\n FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n var reader = null;\r\n var controller = new AbortController();\r\n var signal = controller.signal;\r\n var textDecoder = new TextDecoder();\r\n fetch(url, {\r\n headers: headers,\r\n credentials: withCredentials ? \"include\" : \"same-origin\",\r\n signal: signal,\r\n cache: \"no-store\"\r\n }).then(function (response) {\r\n reader = response.body.getReader();\r\n onStartCallback(response.status, response.statusText, response.headers.get(\"Content-Type\"), new HeadersWrapper(response.headers));\r\n // see https://github.com/promises-aplus/promises-spec/issues/179\r\n return new Promise(function (resolve, reject) {\r\n var readNextChunk = function () {\r\n reader.read().then(function (result) {\r\n if (result.done) {\r\n //Note: bytes in textDecoder are ignored\r\n resolve(undefined);\r\n } else {\r\n var chunk = textDecoder.decode(result.value, {stream: true});\r\n onProgressCallback(chunk);\r\n readNextChunk();\r\n }\r\n })[\"catch\"](function (error) {\r\n reject(error);\r\n });\r\n };\r\n readNextChunk();\r\n });\r\n })[\"catch\"](function (error) {\r\n if (error.name === \"AbortError\") {\r\n return undefined;\r\n } else {\r\n return error;\r\n }\r\n }).then(function (error) {\r\n onFinishCallback(error);\r\n });\r\n return {\r\n abort: function () {\r\n if (reader != null) {\r\n reader.cancel(); // https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\r\n }\r\n controller.abort();\r\n }\r\n };\r\n };\r\n\r\n function EventTarget() {\r\n this._listeners = Object.create(null);\r\n }\r\n\r\n function throwError(e) {\r\n setTimeout(function () {\r\n throw e;\r\n }, 0);\r\n }\r\n\r\n EventTarget.prototype.dispatchEvent = function (event) {\r\n event.target = this;\r\n var typeListeners = this._listeners[event.type];\r\n if (typeListeners != undefined) {\r\n var length = typeListeners.length;\r\n for (var i = 0; i < length; i += 1) {\r\n var listener = typeListeners[i];\r\n try {\r\n if (typeof listener.handleEvent === \"function\") {\r\n listener.handleEvent(event);\r\n } else {\r\n listener.call(this, event);\r\n }\r\n } catch (e) {\r\n throwError(e);\r\n }\r\n }\r\n }\r\n };\r\n EventTarget.prototype.addEventListener = function (type, listener) {\r\n type = String(type);\r\n var listeners = this._listeners;\r\n var typeListeners = listeners[type];\r\n if (typeListeners == undefined) {\r\n typeListeners = [];\r\n listeners[type] = typeListeners;\r\n }\r\n var found = false;\r\n for (var i = 0; i < typeListeners.length; i += 1) {\r\n if (typeListeners[i] === listener) {\r\n found = true;\r\n }\r\n }\r\n if (!found) {\r\n typeListeners.push(listener);\r\n }\r\n };\r\n EventTarget.prototype.removeEventListener = function (type, listener) {\r\n type = String(type);\r\n var listeners = this._listeners;\r\n var typeListeners = listeners[type];\r\n if (typeListeners != undefined) {\r\n var filtered = [];\r\n for (var i = 0; i < typeListeners.length; i += 1) {\r\n if (typeListeners[i] !== listener) {\r\n filtered.push(typeListeners[i]);\r\n }\r\n }\r\n if (filtered.length === 0) {\r\n delete listeners[type];\r\n } else {\r\n listeners[type] = filtered;\r\n }\r\n }\r\n };\r\n\r\n function Event(type) {\r\n this.type = type;\r\n this.target = undefined;\r\n }\r\n\r\n function MessageEvent(type, options) {\r\n Event.call(this, type);\r\n this.data = options.data;\r\n this.lastEventId = options.lastEventId;\r\n }\r\n\r\n MessageEvent.prototype = Object.create(Event.prototype);\r\n\r\n function ConnectionEvent(type, options) {\r\n Event.call(this, type);\r\n this.status = options.status;\r\n this.statusText = options.statusText;\r\n this.headers = options.headers;\r\n }\r\n\r\n ConnectionEvent.prototype = Object.create(Event.prototype);\r\n\r\n function ErrorEvent(type, options) {\r\n Event.call(this, type);\r\n this.error = options.error;\r\n }\r\n\r\n ErrorEvent.prototype = Object.create(Event.prototype);\r\n\r\n var WAITING = -1;\r\n var CONNECTING = 0;\r\n var OPEN = 1;\r\n var CLOSED = 2;\r\n\r\n var AFTER_CR = -1;\r\n var FIELD_START = 0;\r\n var FIELD = 1;\r\n var VALUE_START = 2;\r\n var VALUE = 3;\r\n\r\n var contentTypeRegExp = /^text\\/event\\-stream;?(\\s*charset\\=utf\\-8)?$/i;\r\n\r\n var MINIMUM_DURATION = 1000;\r\n var MAXIMUM_DURATION = 18000000;\r\n\r\n var parseDuration = function (value, def) {\r\n var n = value == null ? def : parseInt(value, 10);\r\n if (n !== n) {\r\n n = def;\r\n }\r\n return clampDuration(n);\r\n };\r\n var clampDuration = function (n) {\r\n return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\r\n };\r\n\r\n var fire = function (that, f, event) {\r\n try {\r\n if (typeof f === \"function\") {\r\n f.call(that, event);\r\n }\r\n } catch (e) {\r\n throwError(e);\r\n }\r\n };\r\n\r\n function EventSourcePolyfill(url, options) {\r\n EventTarget.call(this);\r\n options = options || {};\r\n\r\n this.onopen = undefined;\r\n this.onmessage = undefined;\r\n this.onerror = undefined;\r\n\r\n this.url = undefined;\r\n this.readyState = undefined;\r\n this.withCredentials = undefined;\r\n this.headers = undefined;\r\n\r\n this._close = undefined;\r\n\r\n start(this, url, options);\r\n }\r\n\r\n function getBestXHRTransport() {\r\n return (XMLHttpRequest != undefined && (\"withCredentials\" in XMLHttpRequest.prototype)) || XDomainRequest == undefined\r\n ? new XMLHttpRequest()\r\n : new XDomainRequest();\r\n }\r\n\r\n var isFetchSupported = fetch != undefined && Response != undefined && \"body\" in Response.prototype;\r\n\r\n function start(es, url, options) {\r\n url = String(url);\r\n var withCredentials = Boolean(options.withCredentials);\r\n\r\n var initialRetry = clampDuration(1000);\r\n var heartbeatTimeout = parseDuration(options.heartbeatTimeout, 45000);\r\n\r\n var lastEventId = \"\";\r\n var retry = initialRetry;\r\n var wasActivity = false;\r\n var textLength = 0;\r\n var headers = options.headers || {};\r\n var TransportOption = options.Transport;\r\n var xhr = isFetchSupported && TransportOption == undefined ? undefined : new XHRWrapper(TransportOption != undefined ? new TransportOption() : getBestXHRTransport());\r\n var transport = TransportOption != null && typeof TransportOption !== \"string\" ? new TransportOption() : (xhr == undefined ? new FetchTransport() : new XHRTransport());\r\n var abortController = undefined;\r\n var timeout = 0;\r\n var currentState = WAITING;\r\n var dataBuffer = \"\";\r\n var lastEventIdBuffer = \"\";\r\n var eventTypeBuffer = \"\";\r\n\r\n var textBuffer = \"\";\r\n var state = FIELD_START;\r\n var fieldStart = 0;\r\n var valueStart = 0;\r\n\r\n var onStart = function (status, statusText, contentType, headers) {\r\n if (currentState === CONNECTING) {\r\n if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\r\n currentState = OPEN;\r\n wasActivity = true;\r\n retry = initialRetry;\r\n es.readyState = OPEN;\r\n var event = new ConnectionEvent(\"open\", {\r\n status: status,\r\n statusText: statusText,\r\n headers: headers\r\n });\r\n es.dispatchEvent(event);\r\n fire(es, es.onopen, event);\r\n } else {\r\n var message = \"\";\r\n if (status !== 200) {\r\n if (statusText) {\r\n statusText = statusText.replace(/\\s+/g, \" \");\r\n }\r\n message = \"EventSource's response has a status \" + status + \" \" + statusText + \" that is not 200. Aborting the connection.\";\r\n } else {\r\n message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? \"-\" : contentType.replace(/\\s+/g, \" \")) + \". Aborting the connection.\";\r\n }\r\n close();\r\n var event = new ConnectionEvent(\"error\", {\r\n status: status,\r\n statusText: statusText,\r\n headers: headers\r\n });\r\n es.dispatchEvent(event);\r\n fire(es, es.onerror, event);\r\n console.error(message);\r\n }\r\n }\r\n };\r\n\r\n var onProgress = function (textChunk) {\r\n if (currentState === OPEN) {\r\n var n = -1;\r\n for (var i = 0; i < textChunk.length; i += 1) {\r\n var c = textChunk.charCodeAt(i);\r\n if (c === \"\\n\".charCodeAt(0) || c === \"\\r\".charCodeAt(0)) {\r\n n = i;\r\n }\r\n }\r\n var chunk = (n !== -1 ? textBuffer : \"\") + textChunk.slice(0, n + 1);\r\n textBuffer = (n === -1 ? textBuffer : \"\") + textChunk.slice(n + 1);\r\n if (textChunk !== \"\") {\r\n wasActivity = true;\r\n textLength += textChunk.length;\r\n }\r\n for (var position = 0; position < chunk.length; position += 1) {\r\n var c = chunk.charCodeAt(position);\r\n if (state === AFTER_CR && c === \"\\n\".charCodeAt(0)) {\r\n state = FIELD_START;\r\n } else {\r\n if (state === AFTER_CR) {\r\n state = FIELD_START;\r\n }\r\n if (c === \"\\r\".charCodeAt(0) || c === \"\\n\".charCodeAt(0)) {\r\n if (state !== FIELD_START) {\r\n if (state === FIELD) {\r\n valueStart = position + 1;\r\n }\r\n var field = chunk.slice(fieldStart, valueStart - 1);\r\n var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === \" \".charCodeAt(0) ? 1 : 0), position);\r\n if (field === \"data\") {\r\n dataBuffer += \"\\n\";\r\n dataBuffer += value;\r\n } else if (field === \"id\") {\r\n lastEventIdBuffer = value;\r\n } else if (field === \"event\") {\r\n eventTypeBuffer = value;\r\n } else if (field === \"retry\") {\r\n initialRetry = parseDuration(value, initialRetry);\r\n retry = initialRetry;\r\n } else if (field === \"heartbeatTimeout\") {\r\n heartbeatTimeout = parseDuration(value, heartbeatTimeout);\r\n if (timeout !== 0) {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, heartbeatTimeout);\r\n }\r\n }\r\n }\r\n if (state === FIELD_START) {\r\n if (dataBuffer !== \"\") {\r\n lastEventId = lastEventIdBuffer;\r\n if (eventTypeBuffer === \"\") {\r\n eventTypeBuffer = \"message\";\r\n }\r\n var event = new MessageEvent(eventTypeBuffer, {\r\n data: dataBuffer.slice(1),\r\n lastEventId: lastEventIdBuffer\r\n });\r\n es.dispatchEvent(event);\r\n if (eventTypeBuffer === \"open\") {\r\n fire(es, es.onopen, event);\r\n } else if (eventTypeBuffer === \"message\") {\r\n fire(es, es.onmessage, event);\r\n } else if (eventTypeBuffer === \"error\") {\r\n fire(es, es.onerror, event);\r\n }\r\n if (currentState === CLOSED) {\r\n return;\r\n }\r\n }\r\n dataBuffer = \"\";\r\n eventTypeBuffer = \"\";\r\n }\r\n state = c === \"\\r\".charCodeAt(0) ? AFTER_CR : FIELD_START;\r\n } else {\r\n if (state === FIELD_START) {\r\n fieldStart = position;\r\n state = FIELD;\r\n }\r\n if (state === FIELD) {\r\n if (c === \":\".charCodeAt(0)) {\r\n valueStart = position + 1;\r\n state = VALUE_START;\r\n }\r\n } else if (state === VALUE_START) {\r\n state = VALUE;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n var onFinish = function (error) {\r\n if (currentState === OPEN || currentState === CONNECTING) {\r\n currentState = WAITING;\r\n if (timeout !== 0) {\r\n clearTimeout(timeout);\r\n timeout = 0;\r\n }\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, retry);\r\n retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\r\n\r\n es.readyState = CONNECTING;\r\n var event = new ErrorEvent(\"error\", {error: error});\r\n es.dispatchEvent(event);\r\n fire(es, es.onerror, event);\r\n }\r\n };\r\n\r\n var close = function () {\r\n currentState = CLOSED;\r\n if (abortController != undefined) {\r\n abortController.abort();\r\n abortController = undefined;\r\n }\r\n if (timeout !== 0) {\r\n clearTimeout(timeout);\r\n timeout = 0;\r\n }\r\n es.readyState = CLOSED;\r\n };\r\n\r\n var onTimeout = function () {\r\n timeout = 0;\r\n\r\n if (currentState !== WAITING) {\r\n if (!wasActivity && abortController != undefined) {\r\n onFinish(new Error(\"No activity within \" + heartbeatTimeout + \" milliseconds.\" + \" \" + (currentState === CONNECTING ? \"No response received.\" : textLength + \" chars received.\") + \" \" + \"Reconnecting.\"));\r\n if (abortController != undefined) {\r\n abortController.abort();\r\n abortController = undefined;\r\n }\r\n } else {\r\n wasActivity = false;\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, heartbeatTimeout);\r\n }\r\n return;\r\n }\r\n\r\n wasActivity = false;\r\n textLength = 0;\r\n timeout = setTimeout(function () {\r\n onTimeout();\r\n }, heartbeatTimeout);\r\n\r\n currentState = CONNECTING;\r\n dataBuffer = \"\";\r\n eventTypeBuffer = \"\";\r\n lastEventIdBuffer = lastEventId;\r\n textBuffer = \"\";\r\n fieldStart = 0;\r\n valueStart = 0;\r\n state = FIELD_START;\r\n\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\r\n // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\r\n var requestURL = url;\r\n if (url.slice(0, 5) !== \"data:\" && url.slice(0, 5) !== \"blob:\") {\r\n if (lastEventId !== \"\") {\r\n requestURL += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"lastEventId=\" + encodeURIComponent(lastEventId);\r\n }\r\n }\r\n var withCredentials = es.withCredentials;\r\n var requestHeaders = {};\r\n requestHeaders[\"Accept\"] = \"text/event-stream\";\r\n var headers = es.headers;\r\n if (headers != undefined) {\r\n for (var name in headers) {\r\n if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n requestHeaders[name] = headers[name];\r\n }\r\n }\r\n }\r\n try {\r\n abortController = transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\r\n } catch (error) {\r\n close();\r\n throw error;\r\n }\r\n };\r\n\r\n es.url = url;\r\n es.readyState = CONNECTING;\r\n es.withCredentials = withCredentials;\r\n es.headers = headers;\r\n es._close = close;\r\n\r\n onTimeout();\r\n }\r\n\r\n EventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\r\n EventSourcePolyfill.prototype.CONNECTING = CONNECTING;\r\n EventSourcePolyfill.prototype.OPEN = OPEN;\r\n EventSourcePolyfill.prototype.CLOSED = CLOSED;\r\n EventSourcePolyfill.prototype.close = function () {\r\n this._close();\r\n };\r\n\r\n EventSourcePolyfill.CONNECTING = CONNECTING;\r\n EventSourcePolyfill.OPEN = OPEN;\r\n EventSourcePolyfill.CLOSED = CLOSED;\r\n EventSourcePolyfill.prototype.withCredentials = undefined;\r\n \r\n var R = NativeEventSource\r\n if (XMLHttpRequest != undefined && (NativeEventSource == undefined || !(\"withCredentials\" in NativeEventSource.prototype))) {\r\n // Why replace a native EventSource ?\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=444328\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=831392\r\n // https://code.google.com/p/chromium/issues/detail?id=260144\r\n // https://code.google.com/p/chromium/issues/detail?id=225654\r\n // ...\r\n R = EventSourcePolyfill;\r\n }\r\n\r\n (function (factory) {\r\n if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n var v = factory(exports);\r\n if (v !== undefined) module.exports = v;\r\n }\r\n else if (typeof define === \"function\" && define.amd) {\r\n define([\"exports\"], factory);\r\n }\r\n else {\r\n factory(global);\r\n }\r\n })(function (exports) {\r\n exports.EventSourcePolyfill = EventSourcePolyfill;\r\n exports.NativeEventSource = NativeEventSource;\r\n exports.EventSource = R;\r\n });\r\n}(typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : this));\r\n"],"sourceRoot":""} --------------------------------------------------------------------------------