Merge branch 'master' into 7748-datamanager-dry-run
[arvados.git] / services / datamanager / loggerutil / loggerutil.go
index f97f7c16c4d98eeb2da523a51a259475340c08a4..8c655cd5ff68a981146493bfa21fd71693ba12c0 100644 (file)
@@ -5,18 +5,47 @@ package loggerutil
 import (
        "git.curoverse.com/arvados.git/sdk/go/logger"
        "log"
+       "os"
+       "runtime"
        "time"
 )
 
-// Assumes you haven't already called arvLogger.Edit()!
-// If you have called arvLogger.Edit() this method will hang waiting
-// for the lock you're already holding.
+// Useful to call at the begining of execution to log info about the
+// current run.
+func LogRunInfo(arvLogger *logger.Logger) {
+       if arvLogger != nil {
+               now := time.Now()
+               arvLogger.Update(func(p map[string]interface{}, e map[string]interface{}) {
+                       runInfo := logger.GetOrCreateMap(p, "run_info")
+                       runInfo["started_at"] = now
+                       runInfo["args"] = os.Args
+                       hostname, err := os.Hostname()
+                       if err != nil {
+                               runInfo["hostname_error"] = err.Error()
+                       } else {
+                               runInfo["hostname"] = hostname
+                       }
+                       runInfo["pid"] = os.Getpid()
+               })
+       }
+}
+
+// A LogMutator that records the current memory usage. This is most useful as a logger write hook.
+func LogMemoryAlloc(p map[string]interface{}, e map[string]interface{}) {
+       runInfo := logger.GetOrCreateMap(p, "run_info")
+       var memStats runtime.MemStats
+       runtime.ReadMemStats(&memStats)
+       runInfo["memory_bytes_in_use"] = memStats.Alloc
+       runInfo["memory_bytes_reserved"] = memStats.Sys
+}
+
 func FatalWithMessage(arvLogger *logger.Logger, message string) {
        if arvLogger != nil {
-               properties, _ := arvLogger.Edit()
-               properties["FATAL"] = message
-               properties["run_info"].(map[string]interface{})["end_time"] = time.Now()
-               arvLogger.ForceRecord()
+               arvLogger.FinalUpdate(func(p map[string]interface{}, e map[string]interface{}) {
+                       p["FATAL"] = message
+                       runInfo := logger.GetOrCreateMap(p, "run_info")
+                       runInfo["finished_at"] = time.Now()
+               })
        }
 
        log.Fatalf(message)