From ba67312c93c367daade780aff2b718409bca63a3 Mon Sep 17 00:00:00 2001 From: Lou Knauer Date: Fri, 1 Apr 2022 14:01:43 +0200 Subject: [PATCH] More debug options --- api.go | 19 +++++++++++++++++++ cc-metric-store.go | 31 +++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/api.go b/api.go index 8484f58..9753345 100644 --- a/api.go +++ b/api.go @@ -145,10 +145,29 @@ func handleWrite(rw http.ResponseWriter, r *http.Request) { bytes, err := io.ReadAll(r.Body) if err != nil { + log.Printf("error while reading request body: %s", err.Error()) http.Error(rw, err.Error(), http.StatusInternalServerError) return } + if debugDump != io.Discard { + now := time.Now() + msg := make([]byte, 0, 512) + msg = append(msg, "\n--- local unix time: "...) + msg = strconv.AppendInt(msg, now.Unix(), 10) + msg = append(msg, " ---\n"...) + + debugDumpLock.Lock() + defer debugDumpLock.Unlock() + if _, err := debugDump.Write(msg); err != nil { + log.Printf("error while writing to debug dump: %s", err.Error()) + } + if _, err := debugDump.Write(bytes); err != nil { + log.Printf("error while writing to debug dump: %s", err.Error()) + } + return + } + dec := lineprotocol.NewDecoderWithBytes(bytes) if err := decodeLine(dec, r.URL.Query().Get("cluster")); err != nil { log.Printf("/api/write error: %s", err.Error()) diff --git a/cc-metric-store.go b/cc-metric-store.go index 5dfe64b..8e69c95 100644 --- a/cc-metric-store.go +++ b/cc-metric-store.go @@ -6,6 +6,7 @@ import ( "encoding/json" "flag" "fmt" + "io" "log" "os" "os/signal" @@ -101,12 +102,19 @@ type Config struct { RootDir string `json:"directory"` DeleteInstead bool `json:"delete-instead"` } `json:"archive"` + Debug struct { + EnableGops bool `json:"gops"` + DumpToFile string `json:"dump-to-file"` + } `json:"debug"` } var conf Config var memoryStore *MemoryStore = nil var lastCheckpoint time.Time +var debugDumpLock sync.Mutex +var debugDump io.Writer = io.Discard + func loadConfiguration(file string) Config { var config Config configFile, err := os.Open(file) @@ -232,15 +240,24 @@ func main() { flag.BoolVar(&enableGopsAgent, "gops", false, "Listen via github.com/google/gops/agent") flag.Parse() - if enableGopsAgent { + startupTime := time.Now() + conf = loadConfiguration(configFile) + memoryStore = NewMemoryStore(conf.Metrics) + + if enableGopsAgent || conf.Debug.EnableGops { if err := agent.Listen(agent.Options{}); err != nil { log.Fatal(err) } } - startupTime := time.Now() - conf = loadConfiguration(configFile) - memoryStore = NewMemoryStore(conf.Metrics) + if conf.Debug.DumpToFile != "" { + f, err := os.Create(conf.Debug.DumpToFile) + if err != nil { + log.Fatal(err) + } + + debugDump = f + } d, err := time.ParseDuration(conf.Checkpoints.Restore) if err != nil { @@ -323,4 +340,10 @@ func main() { log.Printf("Writing checkpoint failed: %s\n", err.Error()) } log.Printf("Done! (%d files written)\n", files) + + if closer, ok := debugDump.(io.Closer); ok { + if err := closer.Close(); err != nil { + log.Printf("error: %s", err.Error()) + } + } }