More debug options

This commit is contained in:
Lou Knauer 2022-04-01 14:01:43 +02:00
parent f3d7e5c28a
commit ba67312c93
2 changed files with 46 additions and 4 deletions

19
api.go
View File

@ -145,10 +145,29 @@ func handleWrite(rw http.ResponseWriter, r *http.Request) {
bytes, err := io.ReadAll(r.Body) bytes, err := io.ReadAll(r.Body)
if err != nil { if err != nil {
log.Printf("error while reading request body: %s", err.Error())
http.Error(rw, err.Error(), http.StatusInternalServerError) http.Error(rw, err.Error(), http.StatusInternalServerError)
return 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) dec := lineprotocol.NewDecoderWithBytes(bytes)
if err := decodeLine(dec, r.URL.Query().Get("cluster")); err != nil { if err := decodeLine(dec, r.URL.Query().Get("cluster")); err != nil {
log.Printf("/api/write error: %s", err.Error()) log.Printf("/api/write error: %s", err.Error())

View File

@ -6,6 +6,7 @@ import (
"encoding/json" "encoding/json"
"flag" "flag"
"fmt" "fmt"
"io"
"log" "log"
"os" "os"
"os/signal" "os/signal"
@ -101,12 +102,19 @@ type Config struct {
RootDir string `json:"directory"` RootDir string `json:"directory"`
DeleteInstead bool `json:"delete-instead"` DeleteInstead bool `json:"delete-instead"`
} `json:"archive"` } `json:"archive"`
Debug struct {
EnableGops bool `json:"gops"`
DumpToFile string `json:"dump-to-file"`
} `json:"debug"`
} }
var conf Config var conf Config
var memoryStore *MemoryStore = nil var memoryStore *MemoryStore = nil
var lastCheckpoint time.Time var lastCheckpoint time.Time
var debugDumpLock sync.Mutex
var debugDump io.Writer = io.Discard
func loadConfiguration(file string) Config { func loadConfiguration(file string) Config {
var config Config var config Config
configFile, err := os.Open(file) configFile, err := os.Open(file)
@ -232,15 +240,24 @@ func main() {
flag.BoolVar(&enableGopsAgent, "gops", false, "Listen via github.com/google/gops/agent") flag.BoolVar(&enableGopsAgent, "gops", false, "Listen via github.com/google/gops/agent")
flag.Parse() 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 { if err := agent.Listen(agent.Options{}); err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
startupTime := time.Now() if conf.Debug.DumpToFile != "" {
conf = loadConfiguration(configFile) f, err := os.Create(conf.Debug.DumpToFile)
memoryStore = NewMemoryStore(conf.Metrics) if err != nil {
log.Fatal(err)
}
debugDump = f
}
d, err := time.ParseDuration(conf.Checkpoints.Restore) d, err := time.ParseDuration(conf.Checkpoints.Restore)
if err != nil { if err != nil {
@ -323,4 +340,10 @@ func main() {
log.Printf("Writing checkpoint failed: %s\n", err.Error()) log.Printf("Writing checkpoint failed: %s\n", err.Error())
} }
log.Printf("Done! (%d files written)\n", files) 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())
}
}
} }