| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- @page
- @model IndexModel
- @using SharedKernel.Extensions
- @{
- ViewData["Title"] = "상황판";
- var h = Model.MailHealth;
- // 상태 단계 결정 (가장 심각한 시그널 기준)
- string mailLevel = "ok";
- string mailMessage = "정상";
- if (h.ProcessingStuckCount > 0)
- {
- mailLevel = "danger";
- mailMessage = $"Processing 갇힘 {h.ProcessingStuckCount}건 — 워커 다운/락 의심";
- }
- else if (h.StalePendingCount > 0)
- {
- mailLevel = "danger";
- mailMessage = $"24시간 이상 미처리 Pending {h.StalePendingCount}건 — Janitor 또는 SMTP 점검";
- }
- else if (h.PendingCount >= 1000)
- {
- mailLevel = "danger";
- mailMessage = $"큐 적체 {h.PendingCount:N0}건 — 큰 폭 처리 지연";
- }
- else if (h.PendingCount >= 100)
- {
- mailLevel = "warning";
- mailMessage = $"큐 적체 {h.PendingCount:N0}건 — 처리 지연 주의";
- }
- else if (h.OldestPendingAt.HasValue && (DateTime.UtcNow - h.OldestPendingAt.Value).TotalHours >= 1)
- {
- mailLevel = "warning";
- mailMessage = $"가장 오래된 Pending이 1시간 이상 — 폴링 점검";
- }
- string mailBadgeClass = mailLevel switch
- {
- "danger" => "bg-danger",
- "warning" => "bg-warning text-dark",
- _ => "bg-success"
- };
- string mailBadgeLabel = mailLevel switch
- {
- "danger" => "위험",
- "warning" => "주의",
- _ => "정상"
- };
- string oldestPendingDisplay = h.OldestPendingAt.HasValue
- ? $"{h.OldestPendingAt.Value.GetDateAt()} ({(int)(DateTime.UtcNow - h.OldestPendingAt.Value).TotalMinutes}분 전)"
- : "-";
- }
- <div class="container-fluid">
- <h3>@ViewData["Title"]</h3>
- <hr />
- <div class="row g-3">
- <div class="col-12 col-xl-6">
- <div class="card">
- <div class="card-header d-flex justify-content-between align-items-center">
- <strong>Mail Queue 상태</strong>
- <span class="badge @mailBadgeClass">@mailBadgeLabel</span>
- </div>
- <div class="card-body">
- <p class="text-muted small mb-3">@mailMessage</p>
- <div class="row row-cols-2 row-cols-md-3 g-2 mb-3">
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">대기</div>
- <div class="fs-5 fw-bold @(h.PendingCount >= 1000 ? "text-danger" : h.PendingCount >= 100 ? "text-warning" : null)">@h.PendingCount.ToString("N0")</div>
- </div>
- </div>
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">처리 중 (5분 +)</div>
- <div class="fs-5 fw-bold @(h.ProcessingStuckCount > 0 ? "text-danger" : null)">@h.ProcessingStuckCount.ToString("N0")</div>
- </div>
- </div>
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">stale (24h +)</div>
- <div class="fs-5 fw-bold @(h.StalePendingCount > 0 ? "text-danger" : null)">@h.StalePendingCount.ToString("N0")</div>
- </div>
- </div>
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">최근 24h 발송</div>
- <div class="fs-5 fw-bold text-success">@h.Sent24hCount.ToString("N0")</div>
- </div>
- </div>
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">최근 24h 실패</div>
- <div class="fs-5 fw-bold @(h.Failed24hCount > 0 ? "text-warning" : null)">@h.Failed24hCount.ToString("N0")</div>
- </div>
- </div>
- <div class="col">
- <div class="border rounded p-2 text-center">
- <div class="text-muted small">전체 행 수</div>
- <div class="fs-5 fw-bold">@h.TotalRowCount.ToString("N0")</div>
- </div>
- </div>
- </div>
- <table class="table table-sm mb-3">
- <tbody>
- <tr>
- <th class="w-25 text-muted fw-normal">가장 오래된 Pending</th>
- <td>@oldestPendingDisplay</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
|