From c835f51cc41bd19872184ef11f504b2d2c09a73d Mon Sep 17 00:00:00 2001 From: Amir Raminfar Date: Tue, 16 Aug 2022 13:53:31 -0700 Subject: [PATCH] Support for JSON logs (#1759) * WIP for using json all the time * Updates to render * adds a new component for json * Updates styles * Adds nesting * Adds field list * Adds expanding * Adds new composable for event source * Creates an add button * Removes unused code * Adds and removes fields with defaults * Fixes jumping when adding new fields * Returns JSON correctly * Fixes little bugs * Fixes js tests * Adds vscode * Fixes json buffer error * Fixes extra line * Fixes tests * Fixes tests and adds support for search * Refactors visible payload keys to a composable * Fixes typescript errors and refactors * Fixes visible keys by ComputedRef * Fixes search bugs * Updates tests * Fixes go tests * Fixes scroll view * Fixes vue tsc errors * Fixes EOF error * Fixes build error * Uses application/ld+json * Fixes arrays and records * Marks for json too --- .gitignore | 1 + assets/App.vue | 2 +- assets/components.d.ts | 2 + assets/components/ContainerStat.vue | 24 +-- assets/components/ContainerTitle.vue | 9 +- assets/components/FieldList.vue | 84 +++++++++ assets/components/InfiniteLoader.vue | 4 +- assets/components/JSONPayload.vue | 55 ++++++ assets/components/LogActionsToolbar.vue | 10 +- assets/components/LogContainer.vue | 12 +- assets/components/LogEventSource.spec.ts | 64 ++----- assets/components/LogEventSource.vue | 132 ++------------ assets/components/LogViewer.vue | 59 ++++--- assets/components/LogViewerWithSource.vue | 8 +- assets/components/ScrollableView.vue | 96 +++++----- .../__snapshots__/LogEventSource.spec.ts.snap | 75 ++++---- assets/composables/eventsource.ts | 111 ++++++++++++ assets/composables/search.ts | 41 ++++- assets/composables/visible.ts | 13 ++ assets/styles.scss | 118 +++++-------- assets/types/Container.d.ts | 1 + assets/types/LogEntry.d.ts | 14 +- assets/types/VisibleLogEntry.ts | 51 ++++++ assets/utils/index.ts | 39 ++++ docker/types.go | 7 + package.json | 167 +++++++++--------- pnpm-lock.yaml | 49 +++++ tsconfig.json | 3 +- web/__snapshots__/web.snapshot | 6 +- web/logs.go | 103 ++++++++--- 30 files changed, 836 insertions(+), 524 deletions(-) create mode 100644 assets/components/FieldList.vue create mode 100644 assets/components/JSONPayload.vue create mode 100644 assets/composables/eventsource.ts create mode 100644 assets/composables/visible.ts create mode 100644 assets/types/VisibleLogEntry.ts diff --git a/.gitignore b/.gitignore index 95509123..9ca9313f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ static dozzle coverage .pnpm-debug.log +.vscode diff --git a/assets/App.vue b/assets/App.vue index 89135025..df84c6d4 100644 --- a/assets/App.vue +++ b/assets/App.vue @@ -107,7 +107,7 @@ function showFuzzySearch() { active: true, }); } -function onResized(e) { +function onResized(e: any) { if (e.length == 2) { menuWidth.value = e[0].size; } diff --git a/assets/components.d.ts b/assets/components.d.ts index 7882658b..323db965 100644 --- a/assets/components.d.ts +++ b/assets/components.d.ts @@ -13,8 +13,10 @@ declare module '@vue/runtime-core' { ContainerStat: typeof import('./components/ContainerStat.vue')['default'] ContainerTitle: typeof import('./components/ContainerTitle.vue')['default'] DropdownMenu: typeof import('./components/DropdownMenu.vue')['default'] + FieldList: typeof import('./components/FieldList.vue')['default'] FuzzySearchModal: typeof import('./components/FuzzySearchModal.vue')['default'] InfiniteLoader: typeof import('./components/InfiniteLoader.vue')['default'] + JSONPayload: typeof import('./components/JSONPayload.vue')['default'] LogActionsToolbar: typeof import('./components/LogActionsToolbar.vue')['default'] LogContainer: typeof import('./components/LogContainer.vue')['default'] LogEventSource: typeof import('./components/LogEventSource.vue')['default'] diff --git a/assets/components/ContainerStat.vue b/assets/components/ContainerStat.vue index 934083a8..0abc1aff 100644 --- a/assets/components/ContainerStat.vue +++ b/assets/components/ContainerStat.vue @@ -1,34 +1,28 @@ diff --git a/assets/components/FieldList.vue b/assets/components/FieldList.vue new file mode 100644 index 00000000..1c6ceb1b --- /dev/null +++ b/assets/components/FieldList.vue @@ -0,0 +1,84 @@ + + + + diff --git a/assets/components/InfiniteLoader.vue b/assets/components/InfiniteLoader.vue index c2c42a67..db2deab5 100644 --- a/assets/components/InfiniteLoader.vue +++ b/assets/components/InfiniteLoader.vue @@ -22,7 +22,7 @@ const root = ref(); const observer = new IntersectionObserver(async (entries) => { if (entries[0].intersectionRatio <= 0) return; if (props.onLoadMore && props.enabled) { - const scrollingParent = root.value.closest("[data-scrolling]") || document.documentElement; + const scrollingParent = root.value?.closest("[data-scrolling]") || document.documentElement; const previousHeight = scrollingParent.scrollHeight; isLoading.value = true; await props.onLoadMore(); @@ -32,7 +32,7 @@ const observer = new IntersectionObserver(async (entries) => { } }); -onMounted(() => observer.observe(root.value)); +onMounted(() => observer.observe(root.value!)); onUnmounted(() => observer.disconnect()); diff --git a/assets/components/JSONPayload.vue b/assets/components/JSONPayload.vue new file mode 100644 index 00000000..3bfc137a --- /dev/null +++ b/assets/components/JSONPayload.vue @@ -0,0 +1,55 @@ + + + + diff --git a/assets/components/LogActionsToolbar.vue b/assets/components/LogActionsToolbar.vue index 42e82b50..0ab3d526 100644 --- a/assets/components/LogActionsToolbar.vue +++ b/assets/components/LogActionsToolbar.vue @@ -41,11 +41,11 @@ diff --git a/assets/components/LogContainer.vue b/assets/components/LogContainer.vue index 32481d5d..d8cbcbef 100644 --- a/assets/components/LogContainer.vue +++ b/assets/components/LogContainer.vue @@ -3,14 +3,14 @@ diff --git a/assets/components/LogViewer.vue b/assets/components/LogViewer.vue index 04e2a0ed..68c8c23c 100644 --- a/assets/components/LogViewer.vue +++ b/assets/components/LogViewer.vue @@ -2,14 +2,14 @@