Skip to content

Commit 6d9c5ad

Browse files
authored
Merge pull request #268 from DocGrid/fix/266
[Fix] 24시간 처리 성공률 — 처리 이력 없을 때 100% 오표시
2 parents 0578682 + 26994e3 commit 6d9c5ad

5 files changed

Lines changed: 23 additions & 5 deletions

File tree

backend/src/main/java/com/opensource/docgrid/domain/sync/dto/response/SyncEventSummaryResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public record SyncEventSummaryResponse(
1414
long processedLast24hCount,
1515
long failedLast24hCount,
1616
long retriedLast24hCount,
17-
double successRateLast24h,
17+
Double successRateLast24h,
1818
UUID lastProcessedEventId,
1919
LocalDateTime lastProcessedAt
2020
) {

backend/src/main/java/com/opensource/docgrid/domain/sync/service/query/SyncAdminQueryService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ private Long oldestPendingAgeSeconds(LocalDateTime capturedAt) {
170170
.orElse(null);
171171
}
172172

173-
private double successRate(long processedCount, long failedCount) {
173+
static Double successRate(long processedCount, long failedCount) {
174174
long completedCount = processedCount + failedCount;
175175
if (completedCount == 0) {
176-
return 100.0;
176+
return null;
177177
}
178178
return Math.round(processedCount * 1000.0 / completedCount) / 10.0;
179179
}

backend/src/test/java/com/opensource/docgrid/domain/sync/service/query/SyncAdminQueryServiceTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ void getSummary_aggregatesOperationalSnapshot() {
102102
assertThat(result.reconciliation().detectedCount()).isEqualTo(3);
103103
}
104104

105+
@Test
106+
@DisplayName("처리 이력이 없으면 성공률은 null이다")
107+
void successRate_returnsNull_whenNoEventsCompleted() {
108+
assertThat(SyncAdminQueryService.successRate(0L, 0L)).isNull();
109+
}
110+
111+
@Test
112+
@DisplayName("성공만 있으면 성공률은 100%다")
113+
void successRate_returns100_whenOnlySucceeded() {
114+
assertThat(SyncAdminQueryService.successRate(1L, 0L)).isEqualTo(100.0);
115+
}
116+
117+
@Test
118+
@DisplayName("실패만 있으면 성공률은 0%다")
119+
void successRate_returns0_whenOnlyFailed() {
120+
assertThat(SyncAdminQueryService.successRate(0L, 1L)).isEqualTo(0.0);
121+
}
122+
105123
private SyncOutboxEvent processedEvent() {
106124
SyncOutboxEvent event = SyncOutboxEvent.builder()
107125
.eventId(UUID.randomUUID())

frontend/app/features/AdminPages.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export function DashboardPage({ notify }: { notify: (message: string) => void })
114114
<div className="metric-card"><span>Outbox 대기</span><b>{formatMetric(syncSummary.events.pendingCount)}</b><small>최대 지연 {formatAge(syncSummary.events.oldestPendingAgeSeconds)}</small></div>
115115
<div className="metric-card"><span>Dispatcher 처리 중</span><b>{formatMetric(syncSummary.events.processingCount)}</b><small>Lease 소유 Event</small></div>
116116
<div className={`metric-card ${syncSummary.events.failedCount > 0 ? "danger-metric" : "success-metric"}`}><span>Event 최종 실패</span><b>{formatMetric(syncSummary.events.failedCount)}</b><small>최근 24시간 {formatMetric(syncSummary.events.failedLast24hCount)}</small></div>
117-
<div className="metric-card success-metric"><span>24시간 처리 성공률</span><b>{syncSummary.events.successRateLast24h}%</b><small>성공 {formatMetric(syncSummary.events.processedLast24hCount)} · 재시도 {formatMetric(syncSummary.events.retriedLast24hCount)}</small></div>
117+
<div className="metric-card success-metric"><span>24시간 처리 성공률</span><b>{syncSummary.events.successRateLast24h == null ? "—" : `${syncSummary.events.successRateLast24h}%`}</b><small>성공 {formatMetric(syncSummary.events.processedLast24hCount)} · 재시도 {formatMetric(syncSummary.events.retriedLast24hCount)}</small></div>
118118
<div className={`metric-card ${syncSummary.issues.openCount > 0 ? "danger-metric" : "success-metric"}`}><span>미해결 정합성 Issue</span><b>{formatMetric(syncSummary.issues.openCount)}</b><small>복구 중 {formatMetric(syncSummary.issues.repairingCount)}</small></div>
119119
<div className="metric-card success-metric"><span>24시간 자동 복구</span><b>{formatMetric(syncSummary.issues.autoResolvedLast24hCount)}</b><small>실패 {formatMetric(syncSummary.issues.failedRepairCount)}</small></div>
120120
<div className="metric-card"><span>마지막 Reconciliation</span><b className="metric-status">{syncSummary.reconciliation?.status ?? "미실행"}</b><small>{syncSummary.reconciliation ? `${syncSummary.reconciliation.scannedCount}개 검사 · ${syncSummary.reconciliation.detectedCount}개 탐지` : "실행 이력 없음"}</small></div>

frontend/app/lib/api-types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ export type SyncEventSummary = {
313313
processedLast24hCount: number;
314314
failedLast24hCount: number;
315315
retriedLast24hCount: number;
316-
successRateLast24h: number;
316+
successRateLast24h: number | null;
317317
lastProcessedEventId: string | null;
318318
lastProcessedAt: string | null;
319319
};

0 commit comments

Comments
 (0)