Added memory alloc in use to stats exported to log. Also added EditHooks to Logger...
[arvados.git] / services / datamanager / datamanager.go
index 4c12c45badfe71c1b4b4758f45e4da2c39805603..bf989026c45189db29a7a1ca10c8c785c7a383ac 100644 (file)
@@ -11,6 +11,7 @@ import (
        "git.curoverse.com/arvados.git/services/datamanager/keep"
        "log"
        "os"
+       "runtime"
        "time"
 )
 
@@ -23,7 +24,7 @@ func init() {
        flag.StringVar(&logEventType, 
                "log-event-type",
                "experimental-data-manager-report",
-               "event_type to use in our arvados log entries.")
+               "event_type to use in our arvados log entries. Set to empty to turn off logging")
        flag.IntVar(&logFrequencySeconds, 
                "log-frequency-seconds",
                20,
@@ -44,28 +45,37 @@ func main() {
                log.Fatalf("Current user is not an admin. Datamanager can only be run by admins.")
        }
 
-       arvLogger := logger.NewLogger(logger.LoggerParams{Client: arv,
-               EventType: logEventType,
-               MinimumWriteInterval: time.Second * time.Duration(logFrequencySeconds)})
+       var arvLogger *logger.Logger
+       if logEventType != "" {
+               arvLogger = logger.NewLogger(logger.LoggerParams{Client: arv,
+                       EventType: logEventType,
+                       MinimumWriteInterval: time.Second * time.Duration(logFrequencySeconds)})
+       }
 
-       {
+       if arvLogger != nil {
                properties, _ := arvLogger.Edit()
-               properties["start_time"] = time.Now()
-               properties["args"] = os.Args
+               runInfo := make(map[string]interface{})
+               runInfo["start_time"] = time.Now()
+               runInfo["args"] = os.Args
                hostname, err := os.Hostname()
                if err != nil {
-                       properties["hostname_error"] = err.Error()
+                       runInfo["hostname_error"] = err.Error()
                } else {
-                       properties["hostname"] = hostname
+                       runInfo["hostname"] = hostname
                }
+               runInfo["pid"] = os.Getpid()
+               properties["run_info"] = runInfo
+
+               arvLogger.AddEditHook(LogMemoryAlloc)
+
+               arvLogger.Record()
        }
-       arvLogger.Record()
 
        // TODO(misha): Read Collections and Keep Contents concurrently as goroutines.
        // This requires waiting on them to finish before you let main() exit.
 
        RunCollections(collection.GetCollectionsParams{
-               Client: arv, Logger: arvLogger, BatchSize: 500})
+               Client: arv, Logger: arvLogger, BatchSize: 100})
 
        RunKeep(keep.GetKeepServersParams{Client: arv, Limit: 1000})
 }
@@ -109,3 +119,11 @@ func ComputeSizeOfOwnedCollections(readCollections collection.ReadCollections) (
        }
        return
 }
+
+func LogMemoryAlloc(properties map[string]interface{}, entry map[string]interface{}) {
+       _ = entry  // keep the compiler from complaining
+       runInfo := properties["run_info"].(map[string]interface{})
+       var memStats runtime.MemStats
+       runtime.ReadMemStats(&memStats)
+       runInfo["alloc_bytes_in_use"] = memStats.Alloc
+}