blob: 8df399fea0c04e397db56b6350dd6310d40c642c [file] [log] [blame]
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You under the Apache License, Version 2.0
~ (the "License"); you may not use this file except in compliance with
~ the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<!DOCTYPE html>
<html xmlns:layout="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml"
layout:decorate="~{fragments/main_layout}">
<head>
<title>Alpha Admin - Transactions Details</title>
</head>
<body>
<div layout:fragment="content" class="container-fluid">
<h1 class="h3 mb-4 text-gray-800" th:text="'Transaction [' + ${globalTxId} + '] Details'"></h1>
<div class="row">
<div class="col-xl-8 col-lg-7">
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Events</h6>
</div>
<div class="card-body">
<div class="events" th:each="event,stat : ${events}">
<div th:class="${event.type}=='TxAbortedEvent' or ${event.type}=='TxCompensateAckFailedEvent' or ${event.type}=='SagaAbortedEvent' ? 'row text-danger' : 'row'">
<div class="col-xl-6 col-lg-6">
<div><i class="fas fa-envelope"></i> <span th:class="${event.type}=='TxAbortedEvent' or ${event.type}=='TxCompensateAckFailedEvent' or ${event.type}=='SagaAbortedEvent' ? 'small text-danger' : 'small text-success'" th:text="${event.type}"></span></div>
<div><i class="fas fa-bell"></i> <span class="small" th:text="${event.serviceName} + '(' + ${event.instanceId} + ')'"></span></div>
<div><i class="fas fa-mars-stroke"></i> <span class="small" th:text="${event.parentTxId}"></span></div>
<div><i class="fas fa-transgender"></i> <span class="small" th:text="${event.localTxId}"></span></div>
</div>
<div class="col-xl-6 col-lg-6">
<div><i class="fas fa-calendar"></i> <span class="small" th:text="${event.createTime}"></span></div>
<div th:if="${event.type}==SagaStartedEvent"><i class="fas fa-clock"></i> <span class="small" th:text="${event.timeout}+'ms'"></span></div>
<div th:if="${event.type}==TxStartedEvent"><i class="fas fa-undo"></i> <span class="small" th:text="${event.reverseRetries} + '(delay ' + ${event.retryDelayInMilliseconds} + 'ms, timeout ' + ${event.reverseTimeout} + 's)'"></span></div>
<div th:if="${event.type}==TxStartedEvent"><i class="fas fa-redo"></i> <span class="small" th:text="${event.forwardRetries} + '(delay ' + ${event.retryDelayInMilliseconds} + 'ms, timeout ' + ${event.forwardTimeout} + 's)'"></span></div>
<div th:if="${event.type}==TxStartedEvent or ${event.type}==TxAbortedEvent or ${event.type}==TxCompensateAckFailedEvent or ${event.type}=='SagaAbortedEvent'" class="position-absolute" style="bottom: 0px; right: 15px;">
<i name="event_more" class="fas fa-caret-square-down" style="cursor:pointer" th:target="'div-more-'+${stat.index}"></i>
</div>
</div>
</div>
<!-- TxStartedEvent more -->
<div th:id="'div-more-'+${stat.index}" th:if="${event.type}==TxStartedEvent" class="d-none" style="padding-top: 10px">
<div class="card border-primary">
<div class="card-header small border-primary bg-primary text-white">Compensation Method</div>
<div class="card-body">
<span class="small" th:text="${event.compensationMethod}"></span>
</div>
</div>
</div>
<!-- TxAbortedEvent more -->
<div th:id="'div-more-'+${stat.index}" th:if="${event.type}==TxAbortedEvent or ${event.type}==TxCompensateAckFailedEvent or ${event.type}==SagaAbortedEvent" class="d-none" style="padding-top: 10px">
<div class="card border-danger">
<div class="card-header small border-danger bg-danger text-white">Exception Stack</div>
<div class="card-body">
<span class="small" style="white-space: pre-line" th:text="${event.exception}"></span>
</div>
</div>
</div>
<hr th:if="${!stat.last}"/>
</div>
<div class="events">
<hr/>
<div th:if="${state}=='SUSPENDED'" class="row text-danger">
<div class="col-xl-12 col-lg-12">
<div><span class="small" th:text="'Suspended Type: ' + ${suspendedType} + ' - ' + ${endTime}"></span></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Top Chart -->
<div class="col-xl-4 col-lg-5">
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Sub Transactions</h6>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="subTransactions" th:each="subTransaction, stat: ${subTransactions}">
<div><i class="fas fa-transgender"></i> <span class="small" th:text="${subTransaction.localTxId}"></span></div>
<div><i class="fas fa-calendar"></i> <span class="small" th:text="${subTransaction.beginTime}"></span></div>
<div><i class="fas fa-calendar"></i> <span class="small" th:text="${subTransaction.endTime}"></span></div>
<div><i class="fas fa-bullhorn"></i> <span class="small" th:text="${subTransaction.state}"></span></div>
<div><i class="fas fa-clock"></i> <span class="small" th:text="${subTransaction.durationTime}+' ms'"></span></div>
<hr th:if="${!stat.last}"/>
</div>
</div>
</div>
</div>
</div>
</div>
<div layout:fragment="scripts">
<script th:src="@{/js/alpha-transaction-details.js}"></script>
</div>
</body>
</html>