From d99964bbe7fc77819717418fe930c4f0591eec00 Mon Sep 17 00:00:00 2001 From: Amir Raminfar Date: Sun, 10 Nov 2024 19:44:19 -0800 Subject: [PATCH] fix: fixes pagination when logs are very long packed together. see #3373 (#3377) --- assets/composable/eventStreams.ts | 2 ++ internal/web/logs.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/assets/composable/eventStreams.ts b/assets/composable/eventStreams.ts index b7232d86..3c223283 100644 --- a/assets/composable/eventStreams.ts +++ b/assets/composable/eventStreams.ts @@ -161,6 +161,7 @@ function useLogStream(url: Ref, loadMoreUrl?: Ref) { if (isLoadingMore.value) return; const to = messages.value[0].date; + const lastSeenId = messages.value[0].id; const last = messages.value[Math.min(messages.value.length - 1, 300)].date; const delta = to.getTime() - last.getTime(); const from = new Date(to.getTime() + delta); @@ -174,6 +175,7 @@ function useLogStream(url: Ref, loadMoreUrl?: Ref) { loadMoreParams.append("from", from.toISOString()); loadMoreParams.append("to", to.toISOString()); loadMoreParams.append("minimum", "100"); + loadMoreParams.append("lastSeenId", String(lastSeenId)); return withBase(`${loadMoreUrl.value}?${loadMoreParams.toString()}`); }); diff --git a/internal/web/logs.go b/internal/web/logs.go index 4ff29d75..8ced4578 100644 --- a/internal/web/logs.go +++ b/internal/web/logs.go @@ -146,7 +146,19 @@ func (h *handler) fetchLogsBetweenDates(w http.ResponseWriter, r *http.Request) levels[level] = struct{}{} } + lastSeenId := uint32(0) + if r.URL.Query().Has("lastSeenId") { + to = to.Add(50 * time.Millisecond) // Add a little buffer to ensure we get the last event + num, err := strconv.ParseUint(r.URL.Query().Get("lastSeenId"), 10, 32) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + lastSeenId = uint32(num) + } + encoder := json.NewEncoder(w) +outer: for { if buffer.Len() > minimum { break @@ -185,6 +197,11 @@ func (h *handler) fetchLogsBetweenDates(w http.ResponseWriter, r *http.Request) continue } + if lastSeenId != 0 && event.Id == lastSeenId { + log.Debug().Uint32("lastSeenId", lastSeenId).Msg("found last seen id") + break outer + } + buffer.Push(event) }