Skip to content

Commit c4f9d29

Browse files
feat(log): Handle Errors in Event Stream (#7708)
1 parent e2354b8 commit c4f9d29

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

agent/app/service/container.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -811,10 +811,8 @@ func (u *ContainerService) StreamLogs(ctx *gin.Context, params dto.StreamLog) {
811811
}
812812
return true
813813
case err := <-errorChan:
814-
_, err = fmt.Fprintf(w, "data: {\"event\": \"error\", \"data\": \"%s\"}\n\n", err.Error())
815-
if err != nil {
816-
return false
817-
}
814+
errorMsg := fmt.Sprintf("event: error\ndata: %v\n\n", err.Error())
815+
_, err = fmt.Fprintf(w, errorMsg)
818816
return false
819817
case <-ctx.Request.Context().Done():
820818
return false
@@ -843,14 +841,19 @@ func collectLogs(params dto.StreamLog, messageChan chan<- string, errorChan chan
843841
if params.Container != "" {
844842
cmdArgs = append(cmdArgs, params.Container)
845843
}
846-
cmd := exec.Command("docker", cmdArgs...)
844+
dockerCmd := exec.Command("docker", cmdArgs...)
847845

848-
stdout, err := cmd.StdoutPipe()
846+
stdout, err := dockerCmd.StdoutPipe()
849847
if err != nil {
850848
errorChan <- fmt.Errorf("failed to get stdout pipe: %v", err)
851849
return
852850
}
853-
if err := cmd.Start(); err != nil {
851+
stderr, err := dockerCmd.StderrPipe()
852+
if err != nil {
853+
errorChan <- fmt.Errorf("failed to get stderr pipe: %v", err)
854+
return
855+
}
856+
if err = dockerCmd.Start(); err != nil {
854857
errorChan <- fmt.Errorf("failed to start command: %v", err)
855858
return
856859
}
@@ -869,11 +872,20 @@ func collectLogs(params dto.StreamLog, messageChan chan<- string, errorChan chan
869872
}
870873
}
871874

872-
if err := scanner.Err(); err != nil {
875+
if err = scanner.Err(); err != nil {
873876
errorChan <- fmt.Errorf("scanner error: %v", err)
874877
return
875878
}
876-
cmd.Wait()
879+
880+
errScanner := bufio.NewScanner(stderr)
881+
for errScanner.Scan() {
882+
line := errScanner.Text()
883+
errorChan <- fmt.Errorf("%v", line)
884+
}
885+
if err = dockerCmd.Wait(); err != nil {
886+
errorChan <- fmt.Errorf("%v", err)
887+
return
888+
}
877889
}
878890

879891
func (u *ContainerService) DownloadContainerLogs(containerType, container, since, tail string, c *gin.Context) error {

frontend/src/components/container-log/index.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ const searchLogs = async () => {
139139
}
140140
});
141141
};
142+
eventSource.onerror = (event: MessageEvent) => {
143+
stopListening();
144+
MsgError(event.data);
145+
};
142146
};
143147
144148
const onDownload = async () => {

frontend/src/components/hightlight/index.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,12 @@ const nginxRules: TokenRule[] = [
3030
},
3131
{
3232
type: 'path',
33-
pattern:
34-
/(?:(?<=GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+|(?<=open\(\s*")|(?<="\s*))(\/[^"\s]+(?:\.\w+)?(?:\?\w+=\w+)?)/g,
33+
pattern: /(?<=[\s"])\/[^"\s]+(?:\.\w+)?(?:\?\w+=\w+)?/g,
3534
color: '#B87A2B',
3635
},
3736
{
3837
type: 'http-method',
39-
pattern: /(?<=")(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)(?=\s)/g,
38+
pattern: /(?<=)(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)(?=\s)/g,
4039
color: '#27AE60',
4140
},
4241
{

0 commit comments

Comments
 (0)