From c4f9d29bcb0fc19d73f911e541c19da68028640a Mon Sep 17 00:00:00 2001 From: zhengkunwang <31820853+zhengkunwang223@users.noreply.github.com> Date: Mon, 13 Jan 2025 23:08:05 +0800 Subject: [PATCH] feat(log): Handle Errors in Event Stream (#7708) --- agent/app/service/container.go | 30 +++++++++++++------ .../src/components/container-log/index.vue | 4 +++ frontend/src/components/hightlight/index.vue | 5 ++-- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/agent/app/service/container.go b/agent/app/service/container.go index 9f391504f..8dffcaac8 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -811,10 +811,8 @@ func (u *ContainerService) StreamLogs(ctx *gin.Context, params dto.StreamLog) { } return true case err := <-errorChan: - _, err = fmt.Fprintf(w, "data: {\"event\": \"error\", \"data\": \"%s\"}\n\n", err.Error()) - if err != nil { - return false - } + errorMsg := fmt.Sprintf("event: error\ndata: %v\n\n", err.Error()) + _, err = fmt.Fprintf(w, errorMsg) return false case <-ctx.Request.Context().Done(): return false @@ -843,14 +841,19 @@ func collectLogs(params dto.StreamLog, messageChan chan<- string, errorChan chan if params.Container != "" { cmdArgs = append(cmdArgs, params.Container) } - cmd := exec.Command("docker", cmdArgs...) + dockerCmd := exec.Command("docker", cmdArgs...) - stdout, err := cmd.StdoutPipe() + stdout, err := dockerCmd.StdoutPipe() if err != nil { errorChan <- fmt.Errorf("failed to get stdout pipe: %v", err) return } - if err := cmd.Start(); err != nil { + stderr, err := dockerCmd.StderrPipe() + if err != nil { + errorChan <- fmt.Errorf("failed to get stderr pipe: %v", err) + return + } + if err = dockerCmd.Start(); err != nil { errorChan <- fmt.Errorf("failed to start command: %v", err) return } @@ -869,11 +872,20 @@ func collectLogs(params dto.StreamLog, messageChan chan<- string, errorChan chan } } - if err := scanner.Err(); err != nil { + if err = scanner.Err(); err != nil { errorChan <- fmt.Errorf("scanner error: %v", err) return } - cmd.Wait() + + errScanner := bufio.NewScanner(stderr) + for errScanner.Scan() { + line := errScanner.Text() + errorChan <- fmt.Errorf("%v", line) + } + if err = dockerCmd.Wait(); err != nil { + errorChan <- fmt.Errorf("%v", err) + return + } } func (u *ContainerService) DownloadContainerLogs(containerType, container, since, tail string, c *gin.Context) error { diff --git a/frontend/src/components/container-log/index.vue b/frontend/src/components/container-log/index.vue index d1682143a..fa62b61f4 100644 --- a/frontend/src/components/container-log/index.vue +++ b/frontend/src/components/container-log/index.vue @@ -139,6 +139,10 @@ const searchLogs = async () => { } }); }; + eventSource.onerror = (event: MessageEvent) => { + stopListening(); + MsgError(event.data); + }; }; const onDownload = async () => { diff --git a/frontend/src/components/hightlight/index.vue b/frontend/src/components/hightlight/index.vue index 4535ae404..0e9bd8ce6 100644 --- a/frontend/src/components/hightlight/index.vue +++ b/frontend/src/components/hightlight/index.vue @@ -30,13 +30,12 @@ const nginxRules: TokenRule[] = [ }, { type: 'path', - pattern: - /(?:(?<=GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+|(?<=open\(\s*")|(?<="\s*))(\/[^"\s]+(?:\.\w+)?(?:\?\w+=\w+)?)/g, + pattern: /(?<=[\s"])\/[^"\s]+(?:\.\w+)?(?:\?\w+=\w+)?/g, color: '#B87A2B', }, { type: 'http-method', - pattern: /(?<=")(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)(?=\s)/g, + pattern: /(?<=)(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)(?=\s)/g, color: '#27AE60', }, {