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>

Reply via email to