godev/cmd/telemetrygodev: log the upload failure reason Help investigate uploads that do not validate, by logging their failure reason. Change-Id: Ie409c5923d26d7b65bfd84701a6a05dae82ee623 Reviewed-on: https://go-review.googlesource.com/c/telemetry/+/575515 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> Auto-Submit: Robert Findley <rfindley@google.com>
diff --git a/godev/cmd/telemetrygodev/main.go b/godev/cmd/telemetrygodev/main.go index 47411de..d09492e 100644 --- a/godev/cmd/telemetrygodev/main.go +++ b/godev/cmd/telemetrygodev/main.go
@@ -63,13 +63,14 @@ fsys := fsys(cfg.DevMode) mux := http.NewServeMux() + logger := slog.Default() mux.Handle("/", handleRoot(fsys, buckets)) mux.Handle("/config", handleConfig(fsys, ucfg)) - mux.Handle("/upload/", handleUpload(ucfg, buckets)) + mux.Handle("/upload/", handleUpload(ucfg, buckets, logger)) mux.Handle("/charts/", handleChart(fsys, buckets)) mw := middleware.Chain( - middleware.Log(slog.Default()), + middleware.Log(logger), middleware.Timeout(cfg.RequestTimeout), middleware.RequestSize(cfg.MaxRequestBytes), middleware.Recover(), @@ -150,18 +151,30 @@ } } -func handleUpload(ucfg *tconfig.Config, buckets *storage.API) content.HandlerFunc { +func handleUpload(ucfg *tconfig.Config, buckets *storage.API, log *slog.Logger) content.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) error { if r.Method == "POST" { + ctx := r.Context() + // Log the error, but only the first 80 characters. + // This prevents excessive logging related to broken payloads. + // The first line should give us a sense of the failure mode. + warn := func(msg string, err error) { + errs := []rune(err.Error()) + if len(errs) > 80 { + errs = append(errs[:79], '…') + } + log.WarnContext(ctx, msg+": "+string(errs)) + } var report telemetry.Report if err := json.NewDecoder(r.Body).Decode(&report); err != nil { + warn("invalid JSON payload", err) return content.Error(err, http.StatusBadRequest) } if err := validate(&report, ucfg); err != nil { + warn("invalid report", err) return content.Error(err, http.StatusBadRequest) } // TODO: capture metrics for collisions. - ctx := r.Context() name := fmt.Sprintf("%s/%g.json", report.Week, report.X) f, err := buckets.Upload.Object(name).NewWriter(ctx) if err != nil {