This is an automated email from the ASF dual-hosted git repository. ningjiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-pack.git
commit eb7abdeff5a0c63caf7c432463a96cbef44d363a Author: Lei Zhang <[email protected]> AuthorDate: Thu Aug 8 23:52:55 2019 +0800 SCB-1411 Push metrics to dashboard active transactions based on WebSocket --- alpha/alpha-ui/pom.xml | 14 +++ .../pack/alpha/ui/UIAutoConfiguration.java | 5 +- .../WebSocketConfig.java} | 26 +++-- .../alpha/ui/{ => controller}/IndexController.java | 4 +- .../ui/{ => controller}/TransactionController.java | 121 +++++++++------------ .../main/resources/static/js/alpha-dashboard.js | 84 ++++++++------ .../src/main/resources/templates/index.html | 10 +- 7 files changed, 143 insertions(+), 121 deletions(-) diff --git a/alpha/alpha-ui/pom.xml b/alpha/alpha-ui/pom.xml index ac995ac..c84b7f8 100644 --- a/alpha/alpha-ui/pom.xml +++ b/alpha/alpha-ui/pom.xml @@ -85,6 +85,16 @@ <artifactId>datatables</artifactId> <version>1.10.19</version> </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>sockjs-client</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>stomp-websocket</artifactId> + <version>2.3.3</version> + </dependency> <!-- spring boot --> @@ -113,6 +123,10 @@ <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + </dependency> + <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> </dependency> diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java index 38d0166..4fed08f 100644 --- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java +++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java @@ -17,6 +17,9 @@ package org.apache.servicecomb.pack.alpha.ui; +import org.apache.servicecomb.pack.alpha.ui.config.WebSocketConfig; +import org.apache.servicecomb.pack.alpha.ui.controller.IndexController; +import org.apache.servicecomb.pack.alpha.ui.controller.TransactionController; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +28,7 @@ import org.springframework.web.client.RestTemplate; @Configuration @ConditionalOnProperty(value = {"alpha.feature.akka.enabled"}) -@Import({IndexController.class,TransactionController.class}) +@Import({WebSocketConfig.class, IndexController.class, TransactionController.class}) public class UIAutoConfiguration { @Bean diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/config/WebSocketConfig.java similarity index 54% copy from alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java copy to alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/config/WebSocketConfig.java index 38d0166..adbafc9 100644 --- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/UIAutoConfiguration.java +++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/config/WebSocketConfig.java @@ -15,21 +15,25 @@ * limitations under the License. */ -package org.apache.servicecomb.pack.alpha.ui; +package org.apache.servicecomb.pack.alpha.ui.config; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.web.client.RestTemplate; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration -@ConditionalOnProperty(value = {"alpha.feature.akka.enabled"}) -@Import({IndexController.class,TransactionController.class}) -public class UIAutoConfiguration { +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - @Bean - public RestTemplate restTemplate(){ - return new RestTemplate(); + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/websocket-config").withSockJS(); } } diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/IndexController.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/IndexController.java similarity index 97% rename from alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/IndexController.java rename to alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/IndexController.java index cfb0c68..a86a0f6 100644 --- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/IndexController.java +++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/IndexController.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.servicecomb.pack.alpha.ui; +package org.apache.servicecomb.pack.alpha.ui.controller; import java.util.List; import java.util.concurrent.TimeUnit; @@ -38,7 +38,7 @@ public class IndexController implements ErrorController { // index @GetMapping("/admin") public String index(ModelMap map) { - map.put("systemInfo",getSystemInfo()); + map.put("systemInfo", getSystemInfo()); return "index"; } diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/TransactionController.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java similarity index 68% rename from alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/TransactionController.java rename to alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java index b8015b6..0ef8530 100644 --- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/TransactionController.java +++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.servicecomb.pack.alpha.ui; +package org.apache.servicecomb.pack.alpha.ui.controller; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; +import org.apache.servicecomb.pack.alpha.core.api.APIv1; import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction; import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions; import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics; @@ -32,11 +32,11 @@ import org.apache.servicecomb.pack.alpha.ui.vo.SubTransactionDTO; import org.apache.servicecomb.pack.alpha.ui.vo.TransactionRowDTO; import org.apache.servicecomb.pack.alpha.ui.vo.TransactionStatisticsDTO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; @@ -44,31 +44,29 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; @Controller -public class TransactionController implements ApplicationListener<WebServerInitializedEvent> { +@EnableScheduling +public class TransactionController { + + private static final String WEBSOCKET_BROKER_METRICES_TOPIC = "/topic/metrics"; + + @Autowired + SimpMessagingTemplate template; @Autowired - RestTemplate restTemplate; + APIv1 apiv1; - int serverPort; + boolean applicationReady = false; @PostMapping("/ui/transaction/sagalist") @ResponseBody - public DataTablesResponseDTO sagaList(@ModelAttribute DataTablesRequestDTO dataTablesRequestDTO, - HttpServletRequest request) { - UriComponents uriComponents = UriComponentsBuilder - .fromUriString("http://localhost:" + serverPort + "/alpha/api/v1/transaction") - .queryParam("page", dataTablesRequestDTO.getStart()/dataTablesRequestDTO.getLength()) - .queryParam("size", dataTablesRequestDTO.getLength()) - .build(); + public DataTablesResponseDTO sagaList(@ModelAttribute DataTablesRequestDTO dataTablesRequestDTO) + throws Exception { List<TransactionRowDTO> data = new ArrayList<>(); - ResponseEntity<PagingGlobalTransactions> entity = restTemplate - .getForEntity(uriComponents.toUriString(), PagingGlobalTransactions.class); - PagingGlobalTransactions pagingGlobalTransactions = entity.getBody(); + PagingGlobalTransactions pagingGlobalTransactions = apiv1 + .getTransactions(dataTablesRequestDTO.getStart() / dataTablesRequestDTO.getLength(), + dataTablesRequestDTO.getLength()); pagingGlobalTransactions.getGlobalTransactions().forEach(globalTransaction -> { data.add(TransactionRowDTO.builder() .serviceName(globalTransaction.getServiceName()) @@ -105,9 +103,10 @@ public class TransactionController implements ApplicationListener<WebServerIniti @PostMapping("/ui/transaction/search") @ResponseBody public DataTablesResponseDTO searchList( - @ModelAttribute DataTablesRequestDTO dataTablesRequestDTO) { + @ModelAttribute DataTablesRequestDTO dataTablesRequestDTO) throws Exception { List<TransactionRowDTO> data = new ArrayList<>(); - GlobalTransaction globalTransaction = findGlobalTransactionByGlobalTxId(dataTablesRequestDTO.getQuery()); + GlobalTransaction globalTransaction = findGlobalTransactionByGlobalTxId( + dataTablesRequestDTO.getQuery()); if (globalTransaction != null) { data.add(TransactionRowDTO.builder() .serviceName(globalTransaction.getServiceName()) @@ -129,7 +128,8 @@ public class TransactionController implements ApplicationListener<WebServerIniti } @GetMapping("/ui/transaction/{globalTxId}") - public String getGlobalTransaction(ModelMap map, @PathVariable("globalTxId") String globalTxId) { + public String getGlobalTransaction(ModelMap map, @PathVariable("globalTxId") String globalTxId) + throws Exception { List<EventDTO> events = new ArrayList<>(); List<SubTransactionDTO> subTransactions = new ArrayList<>(); GlobalTransaction globalTransaction = findGlobalTransactionByGlobalTxId(globalTxId); @@ -144,28 +144,28 @@ public class TransactionController implements ApplicationListener<WebServerIniti .localTxId(event.get("localTxId").toString()) .createTime(new Date(Long.valueOf(event.get("createTime").toString()))) .build(); - if(eventDTO.getType().equals("TxStartedEvent")){ + if (eventDTO.getType().equals("TxStartedEvent")) { // TxStartedEvent properties - if(event.containsKey("compensationMethod")){ + if (event.containsKey("compensationMethod")) { eventDTO.setCompensationMethod(event.get("compensationMethod").toString()); } - if(event.containsKey("retries")){ + if (event.containsKey("retries")) { eventDTO.setRetries(Long.valueOf(event.get("retries").toString())); } - if(event.containsKey("timeout")){ + if (event.containsKey("timeout")) { eventDTO.setTimeout(Long.valueOf(event.get("timeout").toString())); } } - if(eventDTO.getType().equals("TxAbortedEvent")){ + if (eventDTO.getType().equals("TxAbortedEvent")) { // TxAbortedEvent properties - if(event.containsKey("payloads")){ + if (event.containsKey("payloads")) { eventDTO.setException(event.get("payloads").toString()); } } events.add(eventDTO); }); - globalTransaction.getSubTransactions().forEach( sub -> { + globalTransaction.getSubTransactions().forEach(sub -> { subTransactions.add( SubTransactionDTO.builder().parentTxId(globalTxId).localTxId(sub.getLocalTxId()) .beginTime(sub.getBeginTime()).endTime(sub.getEndTime()) @@ -181,19 +181,14 @@ public class TransactionController implements ApplicationListener<WebServerIniti @ResponseBody public TransactionStatisticsDTO getGlobalTransactionStatistics() { TransactionStatisticsDTO statisticsDTO = new TransactionStatisticsDTO(); - UriComponents uriComponents = UriComponentsBuilder - .fromUriString("http://localhost:" + serverPort + "/alpha/api/v1/transaction/statistics") - .build(); - ResponseEntity<Map> entity = restTemplate - .getForEntity(uriComponents.toUriString(), Map.class); - Map<String,Number> statistics = entity.getBody(); - if(statistics.containsKey("COMMITTED")){ + Map<String, Long> statistics = apiv1.getTransactionStatistics(); + if (statistics.containsKey("COMMITTED")) { statisticsDTO.setSuccessful(statistics.get("COMMITTED").longValue()); } - if(statistics.containsKey("SUSPENDED")){ + if (statistics.containsKey("SUSPENDED")) { statisticsDTO.setFailed(statistics.get("SUSPENDED").longValue()); } - if(statistics.containsKey("COMPENSATED")){ + if (statistics.containsKey("COMPENSATED")) { statisticsDTO.setCompensated(statistics.get("COMPENSATED").longValue()); } return statisticsDTO; @@ -203,15 +198,8 @@ public class TransactionController implements ApplicationListener<WebServerIniti @ResponseBody public List<TransactionRowDTO> getSlowGlobalTransactionTopN() { List<TransactionRowDTO> transactionRowDTOS = new ArrayList<>(); - UriComponents uriComponents = UriComponentsBuilder - .fromUriString("http://localhost:" + serverPort + "/alpha/api/v1/transaction/slow") - .build(); - ResponseEntity<List<GlobalTransaction>> entity = restTemplate - .exchange(uriComponents.toUriString(), HttpMethod.GET, null, - new ParameterizedTypeReference<List<GlobalTransaction>>() { - }); - List<GlobalTransaction> transactions = entity.getBody(); - transactions.stream().forEach( globalTransaction -> { + List<GlobalTransaction> transactions = apiv1.getSlowTransactions(); + transactions.stream().forEach(globalTransaction -> { transactionRowDTOS.add(TransactionRowDTO.builder() .serviceName(globalTransaction.getServiceName()) .instanceId(globalTransaction.getInstanceId()) @@ -232,28 +220,25 @@ public class TransactionController implements ApplicationListener<WebServerIniti return getAlphaMetrics(); } - private GlobalTransaction findGlobalTransactionByGlobalTxId(String globalTxId){ - UriComponents uriComponents = UriComponentsBuilder - .fromUriString("http://localhost:" + serverPort + "/alpha/api/v1/transaction/"+globalTxId) - .build(); - ResponseEntity<GlobalTransaction> entity = restTemplate - .getForEntity(uriComponents.toUriString(), GlobalTransaction.class); - GlobalTransaction globalTransaction = entity.getBody(); + @Scheduled(fixedDelay = 1000) + public void publishUpdates() { + if (applicationReady) { + template.convertAndSend(WEBSOCKET_BROKER_METRICES_TOPIC, getAlphaMetrics()); + } + } + + private GlobalTransaction findGlobalTransactionByGlobalTxId(String globalTxId) throws Exception { + GlobalTransaction globalTransaction = apiv1.getTransactionByGlobalTxId(globalTxId); return globalTransaction; } - private AlphaMetrics getAlphaMetrics(){ - UriComponents uriComponents = UriComponentsBuilder - .fromUriString("http://localhost:" + serverPort + "/alpha/api/v1/metrics") - .build(); - ResponseEntity<AlphaMetrics> entity = restTemplate - .getForEntity(uriComponents.toUriString(), AlphaMetrics.class); - AlphaMetrics alphaMetrics = entity.getBody(); + private AlphaMetrics getAlphaMetrics() { + AlphaMetrics alphaMetrics = apiv1.getMetrics(); return alphaMetrics; } - @Override - public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) { - serverPort = webServerInitializedEvent.getWebServer().getPort(); + @EventListener(ApplicationReadyEvent.class) + public void startUp() { + applicationReady = true; } } diff --git a/alpha/alpha-ui/src/main/resources/static/js/alpha-dashboard.js b/alpha/alpha-ui/src/main/resources/static/js/alpha-dashboard.js index d661bd7..8ede713 100644 --- a/alpha/alpha-ui/src/main/resources/static/js/alpha-dashboard.js +++ b/alpha/alpha-ui/src/main/resources/static/js/alpha-dashboard.js @@ -47,47 +47,61 @@ $(document).ready(function () { }); $.ajax('/ui/transaction/metrics', { - success: function (data) { - //events - $('#metrics-events-received').text(digitUnit(data.metrics.eventReceived,0)); - $('#metrics-events-accepted').text(digitUnit(data.metrics.eventAccepted,0)); - $('#metrics-events-rejected').text(digitUnit(data.metrics.eventRejected,0)); - $('#metrics-events-average-time').text(data.metrics.eventAvgTime+' ms / event'); - $('#metrics-events-received-progress').css('width',data.metrics.eventReceived==0?'0%':'100%'); - $('#metrics-events-accepted-progress').css('width',(data.metrics.eventAccepted/data.metrics.eventReceived)*100+'%'); - $('#metrics-events-rejected-progress').css('width',(data.metrics.eventRejected/data.metrics.eventReceived)*100+'%'); - //actors - $('#metrics-actors-received').text(digitUnit(data.metrics.actorReceived,0)); - $('#metrics-actors-accepted').text(digitUnit(data.metrics.actorAccepted,0)); - $('#metrics-actors-rejected').text(digitUnit(data.metrics.actorRejected,0)); - $('#metrics-actors-average-time').text(data.metrics.actorAvgTime+' ms / event'); - $('#metrics-actors-received-progress').css('width',data.metrics.actorReceived==0?'0%':'100%'); - $('#metrics-actors-accepted-progress').css('width',(data.metrics.actorAccepted/data.metrics.actorReceived)*100+'%'); - $('#metrics-actors-rejected-progress').css('width',(data.metrics.actorRejected/data.metrics.actorReceived)*100+'%'); - //persistence - $('#metrics-persistence-received').text(digitUnit(data.metrics.repositoryReceived,0)); - $('#metrics-persistence-accepted').text(digitUnit(data.metrics.repositoryAccepted,0)); - $('#metrics-persistence-rejected').text(digitUnit(data.metrics.repositoryRejected,0)); - $('#metrics-persistence-average-time').text(data.metrics.repositoryAvgTime+' ms / transaction'); - $('#metrics-persistence-received-progress').css('width',data.metrics.repositoryReceived==0?'0%':'100%'); - $('#metrics-persistence-accepted-progress').css('width',(data.metrics.repositoryAccepted/data.metrics.repositoryReceived)*100+'%'); - $('#metrics-persistence-rejected-progress').css('width',(data.metrics.repositoryRejected/data.metrics.repositoryReceived)*100+'%'); - //saga - $('#metrics-saga-begin').text(digitUnit(data.metrics.sagaBeginCounter,0)); - $('#metrics-saga-end').text(digitUnit(data.metrics.sagaEndCounter,0)); - $('#metrics-saga-average-time').text(data.metrics.sagaAvgTime+' ms / transaction'); - $('#metrics-saga-begin-progress').css('width',data.metrics.sagaBeginCounter==0?'0%':'100%'); - $('#metrics-saga-end-progress').css('width',(data.metrics.sagaEndCounter/data.metrics.sagaBeginCounter)*100+'%'); - //counter - $('#metrics-committed').text(digitUnit(data.metrics.committed,2)); - $('#metrics-compensated').text(digitUnit(data.metrics.compensated,2)); - $('#metrics-suspended').text(digitUnit(data.metrics.suspended,2)); + success: function (metrics) { + refreshActiveTransactionCard(metrics); }, error: function (state) { // TODO show message } }); + var socket = new SockJS('/websocket-config'); + stompClient = Stomp.over(socket); + stompClient.connect({}, function (frame) { + console.log('Connected: ' + frame); + stompClient.subscribe('/topic/metrics', function (metrics) { + //console.log(JSON.parse(metrics.body).content) + refreshActiveTransactionCard(JSON.parse(metrics.body)) + }); + }); + + function refreshActiveTransactionCard(data){ + //events + $('#metrics-events-received').text(data.metrics.eventReceived); + $('#metrics-events-accepted').text(data.metrics.eventAccepted); + $('#metrics-events-rejected').text(data.metrics.eventRejected); + $('#metrics-events-average-time').text(data.metrics.eventAvgTime+' ms / event'); + $('#metrics-events-received-progress').css('width',data.metrics.eventReceived==0?'0%':'100%'); + $('#metrics-events-accepted-progress').css('width',(data.metrics.eventAccepted/data.metrics.eventReceived)*100+'%'); + $('#metrics-events-rejected-progress').css('width',(data.metrics.eventRejected/data.metrics.eventReceived)*100+'%'); + //actors + $('#metrics-actors-received').text(data.metrics.actorReceived); + $('#metrics-actors-accepted').text(data.metrics.actorAccepted); + $('#metrics-actors-rejected').text(data.metrics.actorRejected); + $('#metrics-actors-average-time').text(data.metrics.actorAvgTime+' ms / event'); + $('#metrics-actors-received-progress').css('width',data.metrics.actorReceived==0?'0%':'100%'); + $('#metrics-actors-accepted-progress').css('width',(data.metrics.actorAccepted/data.metrics.actorReceived)*100+'%'); + $('#metrics-actors-rejected-progress').css('width',(data.metrics.actorRejected/data.metrics.actorReceived)*100+'%'); + //persistence + $('#metrics-persistence-received').text(data.metrics.repositoryReceived); + $('#metrics-persistence-accepted').text(data.metrics.repositoryAccepted); + $('#metrics-persistence-rejected').text(data.metrics.repositoryRejected); + $('#metrics-persistence-average-time').text(data.metrics.repositoryAvgTime+' ms / transaction'); + $('#metrics-persistence-received-progress').css('width',data.metrics.repositoryReceived==0?'0%':'100%'); + $('#metrics-persistence-accepted-progress').css('width',(data.metrics.repositoryAccepted/data.metrics.repositoryReceived)*100+'%'); + $('#metrics-persistence-rejected-progress').css('width',(data.metrics.repositoryRejected/data.metrics.repositoryReceived)*100+'%'); + //saga + $('#metrics-saga-begin').text(data.metrics.sagaBeginCounter); + $('#metrics-saga-end').text(data.metrics.sagaEndCounter); + $('#metrics-saga-average-time').text(data.metrics.sagaAvgTime+' ms / transaction'); + $('#metrics-saga-begin-progress').css('width',data.metrics.sagaBeginCounter==0?'0%':'100%'); + $('#metrics-saga-end-progress').css('width',(data.metrics.sagaEndCounter/data.metrics.sagaBeginCounter)*100+'%'); + //counter + $('#metrics-committed').text(digitUnit(data.metrics.committed,2)); + $('#metrics-compensated').text(digitUnit(data.metrics.compensated,2)); + $('#metrics-suspended').text(digitUnit(data.metrics.suspended,2)); + } + function digitUnit(n, d) { if (n >= 1000) { var x = ('' + parseInt(n, 10)).length; diff --git a/alpha/alpha-ui/src/main/resources/templates/index.html b/alpha/alpha-ui/src/main/resources/templates/index.html index 7d4f7b5..98d801e 100644 --- a/alpha/alpha-ui/src/main/resources/templates/index.html +++ b/alpha/alpha-ui/src/main/resources/templates/index.html @@ -119,15 +119,15 @@ <!-- Card Body --> <div class="card-body"> <div class="row"> - <div class="col-xl-4 col-md-8 mb-4"> + <div class="col-xl-4 col-md-4 mb-4"> <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">COMMITTED</div> <div class="h5 mb-0 font-weight-bold text-gray-800" id="metrics-committed">0</div> </div> - <div class="col-xl-4 col-md-8 mb-4"> + <div class="col-xl-4 col-md-4 mb-4"> <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">COMPENSATED</div> <div class="h5 mb-0 font-weight-bold text-gray-800" id="metrics-compensated">0</div> </div> - <div class="col-xl-4 col-md-8 mb-4"> + <div class="col-xl-4 col-md-4 mb-4"> <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">SUSPENDED</div> <div class="h5 mb-0 font-weight-bold text-gray-800" id="metrics-suspended">0</div> </div> @@ -193,7 +193,7 @@ </div> <div class="col-xl-6 col-lg-6"> <!-- Persistence health --> - <h4 class="small font-weight-bold">Persistence<span + <h4 class="small font-weight-bold">DB<span class="float-right font-weight-light" id="metrics-persistence-average-time"></span></h4> <div class="small">Received<span id="metrics-persistence-received" class="float-right">0</span></div> <div class="progress mb-3"> @@ -309,6 +309,8 @@ </div> <div layout:fragment="scripts"> <script th:src="@{/js/alpha-dashboard.js}"></script> + <script th:src="@{/webjars/sockjs-client/sockjs.min.js}"></script> + <script th:src="@{/webjars/stomp-websocket/stomp.min.js}"></script> </div> </body> </html>
