5736: Fix typo in Node Manager test comments.
[arvados.git] / services / datamanager / loggerutil / loggerutil.go
index c19a7abba2708a2e0afd15f08e57abccfec2f650..58abb119ac128a7ba94920ad6e3a29101df8e8cc 100644 (file)
@@ -5,14 +5,47 @@ package loggerutil
 import (
        "git.curoverse.com/arvados.git/sdk/go/logger"
        "log"
+       "os"
+       "runtime"
        "time"
 )
 
+// 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 := make(map[string]interface{})
+                       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()
+                       p["run_info"] = runInfo
+               })
+       }
+}
+
+// A LogMutator that records the current memory usage. This is most useful as a logger write hook.
+//
+// Assumes we already have a map named "run_info" in properties. LogRunInfo() can create such a map for you if you call it.
+func LogMemoryAlloc(p map[string]interface{}, e map[string]interface{}) {
+       runInfo := p["run_info"].(map[string]interface{})
+       var memStats runtime.MemStats
+       runtime.ReadMemStats(&memStats)
+       runInfo["alloc_bytes_in_use"] = memStats.Alloc
+}
+
 func FatalWithMessage(arvLogger *logger.Logger, message string) {
        if arvLogger != nil {
                arvLogger.FinalUpdate(func(p map[string]interface{}, e map[string]interface{}) {
                        p["FATAL"] = message
-                       p["run_info"].(map[string]interface{})["time_finished"] = time.Now()
+                       p["run_info"].(map[string]interface{})["finished_at"] = time.Now()
                })
        }