chore: debug level executor logs
All checks were successful
submodules sync / sync (push) Successful in 44s
build / build (push) Successful in 1m32s
build / trigger-build-image (push) Successful in 8s

This commit is contained in:
张泊明518370910136 2024-11-14 06:45:40 -05:00
parent 4b418600e3
commit 158bba1460
GPG Key ID: D47306D7062CDA9D
4 changed files with 121 additions and 62 deletions

View File

@ -96,6 +96,12 @@ func setupSlog(logPath string) error {
Level: stderrLogLevel, Level: stderrLogLevel,
}) })
handlers = append(handlers, stderrHandler) handlers = append(handlers, stderrHandler)
if runningTest {
stderrJSONHandler := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
Level: stderrLogLevel,
})
handlers = append(handlers, stderrJSONHandler)
}
// Create a multi-handler // Create a multi-handler
multiHandler := &multiHandler{handlers: handlers} multiHandler := &multiHandler{handlers: handlers}
multiHandlerWithAttrs := multiHandler.WithAttrs( multiHandlerWithAttrs := multiHandler.WithAttrs(

View File

@ -7,7 +7,6 @@ import (
"strings" "strings"
"unicode" "unicode"
"github.com/criyle/go-judge/envexec"
"github.com/joint-online-judge/JOJ3/internal/stage" "github.com/joint-online-judge/JOJ3/internal/stage"
) )
@ -36,15 +35,6 @@ type Conf struct {
} }
} }
type DiffParserSummary struct {
Status stage.Status
ExitStatus int
Error string
Time uint64
Memory uint64
RunTime uint64
}
type Diff struct{} type Diff struct{}
func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
@ -60,25 +50,10 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
var res []stage.ParserResult var res []stage.ParserResult
forceQuit := false forceQuit := false
var summary DiffParserSummary
summary.Status = stage.Status(envexec.StatusAccepted)
for i, caseConf := range conf.Cases { for i, caseConf := range conf.Cases {
result := results[i] result := results[i]
score := 0 score := 0
comment := "" comment := ""
if result.Status != stage.Status(envexec.StatusAccepted) &&
summary.Status == stage.Status(envexec.StatusAccepted) {
summary.Status = result.Status
}
if result.ExitStatus != 0 && summary.ExitStatus == 0 {
summary.ExitStatus = result.ExitStatus
}
if result.Error != "" && summary.Error == "" {
summary.Error = result.Error
}
summary.Time += result.Time
summary.Memory += result.Memory
summary.RunTime += result.RunTime
for _, output := range caseConf.Outputs { for _, output := range caseConf.Outputs {
answer, err := os.ReadFile(output.AnswerPath) answer, err := os.ReadFile(output.AnswerPath)
if err != nil { if err != nil {
@ -124,22 +99,11 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
} }
} }
} }
caseSummary := DiffParserSummary{
Status: result.Status,
ExitStatus: result.ExitStatus,
Error: result.Error,
Time: result.Time,
Memory: result.Memory,
RunTime: result.RunTime,
}
slog.Debug("diff parser case parse done",
"case", i, "caseSummary", caseSummary)
res = append(res, stage.ParserResult{ res = append(res, stage.ParserResult{
Score: score, Score: score,
Comment: comment, Comment: comment,
}) })
} }
slog.Debug("diff parser run done", "diffParserSummary", summary)
return res, forceQuit, nil return res, forceQuit, nil
} }

View File

@ -121,25 +121,26 @@ type ExecutorResult struct {
Buffs map[string][]byte `json:"-"` Buffs map[string][]byte `json:"-"`
} }
type ExecutorResultSummary struct {
Status Status `json:"status"`
ExitStatus int `json:"exitStatus"`
Error string `json:"error,omitempty"`
Time uint64 `json:"time"`
Memory uint64 `json:"memory"`
RunTime uint64 `json:"runTime"`
Files map[string]string `json:"files,omitempty"`
FileIDs map[string]string `json:"fileIds,omitempty"`
FileError []FileError `json:"fileError,omitempty"`
}
func (r ExecutorResult) String() string { func (r ExecutorResult) String() string {
type Result struct { d := ExecutorResultSummary{
Status Status
ExitStatus int
Error string
Time uint64
RunTime uint64
Memory envexec.Size
Files map[string]string
FileIDs map[string]string
FileError []FileError
}
d := Result{
Status: r.Status, Status: r.Status,
ExitStatus: r.ExitStatus, ExitStatus: r.ExitStatus,
Error: r.Error, Error: r.Error,
Time: r.Time, Time: r.Time,
Memory: r.Memory,
RunTime: r.RunTime, RunTime: r.RunTime,
Memory: envexec.Size(r.Memory),
Files: make(map[string]string), Files: make(map[string]string),
FileIDs: r.FileIDs, FileIDs: r.FileIDs,
FileError: r.FileError, FileError: r.FileError,
@ -150,6 +151,45 @@ func (r ExecutorResult) String() string {
return fmt.Sprintf("%+v", d) return fmt.Sprintf("%+v", d)
} }
func (r ExecutorResult) MarshalJSON() ([]byte, error) {
d := ExecutorResultSummary{
Status: r.Status,
ExitStatus: r.ExitStatus,
Error: r.Error,
Time: r.Time,
Memory: r.Memory,
RunTime: r.RunTime,
Files: make(map[string]string),
FileIDs: r.FileIDs,
FileError: r.FileError,
}
for k, v := range r.Files {
d.Files[k] = "len:" + strconv.Itoa(len(v))
}
return json.Marshal(d)
}
func SummarizeExecutorResults(results []ExecutorResult) ExecutorResultSummary {
var summary ExecutorResultSummary
summary.Status = Status(envexec.StatusAccepted)
for _, result := range results {
if result.Status != Status(envexec.StatusAccepted) &&
summary.Status == Status(envexec.StatusAccepted) {
summary.Status = result.Status
}
if result.ExitStatus != 0 && summary.ExitStatus == 0 {
summary.ExitStatus = result.ExitStatus
}
if result.Error != "" && summary.Error == "" {
summary.Error = result.Error
}
summary.Time += result.Time
summary.Memory += result.Memory
summary.RunTime += result.RunTime
}
return summary
}
type StageExecutor struct { type StageExecutor struct {
Name string Name string
Cmds []Cmd Cmds []Cmd

View File

@ -12,30 +12,65 @@ func Run(stages []Stage) (stageResults []StageResult, forceQuit bool, err error)
slog.Info("stage run start") slog.Info("stage run start")
for _, stage := range stages { for _, stage := range stages {
slog.Info("stage start", "name", stage.Name) slog.Info("stage start", "name", stage.Name)
slog.Info("executor run start", "name", stage.Executor.Name) slog.Info(
slog.Debug("executor run start", "name", stage.Executor.Name, "executor run start",
"cmds", stage.Executor.Cmds) "stageName", stage.Name,
"name", stage.Executor.Name,
)
slog.Debug(
"executor run start",
"stageName", stage.Name,
"name", stage.Executor.Name,
"cmds", stage.Executor.Cmds,
)
executor, ok := executorMap[stage.Executor.Name] executor, ok := executorMap[stage.Executor.Name]
if !ok { if !ok {
slog.Error("executor not found", "name", stage.Executor.Name) slog.Error(
"executor not found",
"stageName", stage.Name,
"name", stage.Executor.Name,
)
err = fmt.Errorf("executor not found: %s", stage.Executor.Name) err = fmt.Errorf("executor not found: %s", stage.Executor.Name)
return return
} }
executorResults, err = executor.Run(stage.Executor.Cmds) executorResults, err = executor.Run(stage.Executor.Cmds)
if err != nil { if err != nil {
slog.Error("executor run error", "name", stage.Executor.Name, "error", err) slog.Error(
"executor run error",
"stageName", stage.Name,
"name", stage.Executor.Name,
"error", err,
)
return return
} }
slog.Debug("executor run done", "results", executorResults) slog.Debug(
"executor run done",
"stageName", stage.Name,
"name", stage.Executor.Name,
"results", executorResults,
"summary", SummarizeExecutorResults(executorResults),
)
parserResults = []ParserResult{} parserResults = []ParserResult{}
forceQuit = false forceQuit = false
for _, stageParser := range stage.Parsers { for _, stageParser := range stage.Parsers {
slog.Info("parser run start", "name", stageParser.Name) slog.Info(
slog.Debug("parser run start", "name", stageParser.Name, "parser run start",
"conf", stageParser.Conf) "stageName", stage.Name,
"name", stageParser.Name,
)
slog.Debug(
"parser run start",
"stageName", stage.Name,
"name", stageParser.Name,
"conf", stageParser.Conf,
)
parser, ok := parserMap[stageParser.Name] parser, ok := parserMap[stageParser.Name]
if !ok { if !ok {
slog.Error("parser not found", "name", stageParser.Name) slog.Error(
"parser not found",
"stageName", stage.Name,
"name", stageParser.Name,
)
err = fmt.Errorf("parser not found: %s", stageParser.Name) err = fmt.Errorf("parser not found: %s", stageParser.Name)
return return
} }
@ -43,14 +78,28 @@ func Run(stages []Stage) (stageResults []StageResult, forceQuit bool, err error)
tmpParserResults, parserForceQuit, err = parser.Run( tmpParserResults, parserForceQuit, err = parser.Run(
executorResults, stageParser.Conf) executorResults, stageParser.Conf)
if err != nil { if err != nil {
slog.Error("parser run error", "name", stageParser.Name, "error", err) slog.Error(
"parser run error",
"stageName", stage.Name,
"name", stageParser.Name,
"error", err,
)
return return
} }
if parserForceQuit { if parserForceQuit {
slog.Error("parser force quit", "name", stageParser.Name) slog.Error(
"parser force quit",
"stageName", stage.Name,
"name", stageParser.Name,
)
} }
forceQuit = forceQuit || parserForceQuit forceQuit = forceQuit || parserForceQuit
slog.Debug("parser run done", "results", tmpParserResults) slog.Debug(
"parser run done",
"stageName", stage.Name,
"name", stageParser.Name,
"results", tmpParserResults,
)
if len(parserResults) == 0 { if len(parserResults) == 0 {
parserResults = tmpParserResults parserResults = tmpParserResults
} else { } else {