github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/model/event/task_resource.go (about)

     1  package event
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/evergreen-ci/evergreen/db/bsonutil"
     7  	"github.com/mongodb/grip"
     8  	"github.com/mongodb/grip/message"
     9  )
    10  
    11  const (
    12  	EventTaskSystemInfo  = "TASK_SYSTEM_INFO"
    13  	EventTaskProcessInfo = "TASK_PROCESS_INFO"
    14  )
    15  
    16  // TaskSystemResourceData wraps a grip/message.SystemInfo struct in a
    17  // type that implements the event.Data interface. SystemInfo structs
    18  // capture aggregated system metrics (cpu, memory, network) for the
    19  // system as a whole.
    20  type TaskSystemResourceData struct {
    21  	ResourceType string              `bson:"r_type" json:"resource_type"`
    22  	SystemInfo   *message.SystemInfo `bson:"system_info" json:"system_info" yaml:"system_info"`
    23  }
    24  
    25  var (
    26  	TaskSystemResourceDataSysInfoKey      = bsonutil.MustHaveTag(TaskSystemResourceData{}, "SystemInfo")
    27  	TaskSystemResourceDataResourceTypeKey = bsonutil.MustHaveTag(TaskSystemResourceData{}, "ResourceType")
    28  
    29  	SysInfoCPUKey      = bsonutil.MustHaveTag(message.SystemInfo{}, "CPU")
    30  	SysInfoNumCPUKey   = bsonutil.MustHaveTag(message.SystemInfo{}, "NumCPU")
    31  	SysInfoVMStatKey   = bsonutil.MustHaveTag(message.SystemInfo{}, "VMStat")
    32  	SysInfoNetStatKey  = bsonutil.MustHaveTag(message.SystemInfo{}, "NetStat")
    33  	SysInfoPartionsKey = bsonutil.MustHaveTag(message.SystemInfo{}, "Partitions")
    34  	SysInfoUsageKey    = bsonutil.MustHaveTag(message.SystemInfo{}, "Usage")
    35  	SysInfoIoStatKey   = bsonutil.MustHaveTag(message.SystemInfo{}, "IOStat")
    36  	SysInfoErrorsKey   = bsonutil.MustHaveTag(message.SystemInfo{}, "Errors")
    37  
    38  	SysInfoCPUTimesStatCPUKey         = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "CPU")
    39  	SysInfoCPUTimesStatUserKey        = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "User")
    40  	SysInfoCPUTimesStatSystemKey      = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "System")
    41  	SysInfoCPUTimesStatIdleKey        = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Idle")
    42  	SysInfoCPUTimesStatNiceKey        = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Nice")
    43  	SysInfoCPUTimesStatIowaitKey      = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Iowait")
    44  	SysInfoCPUTimesStatIrqKey         = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Irq")
    45  	SysInfoCPUTimesStatSoftirqKey     = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Softirq")
    46  	SysInfoCPUTimesStatStealKey       = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Steal")
    47  	SysInfoCPUTimesStatGuestNiceKey   = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "GuestNice")
    48  	SysInfoCPUTimesStatGuestStolenKey = bsonutil.MustHaveTag(message.SystemInfo{}.CPU, "Stolen")
    49  
    50  	SysInfoVMStatTotalKey        = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Total")
    51  	SysInfoVMStatAvailableKey    = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Available")
    52  	SysInfoVMStatUsedKey         = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Used")
    53  	SysInfoVMStatUsedPercentKey  = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "UsedPercent")
    54  	SysInfoVMStatFreeKey         = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Free")
    55  	SysInfoVMStatActiveKey       = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Active")
    56  	SysInfoVMStatInactiveKey     = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Inactive")
    57  	SysInfoVMStatWiredKey        = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Wired")
    58  	SysInfoVMStatBuffersKey      = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Buffers")
    59  	SysInfoVMStatCachedKey       = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Cached")
    60  	SysInfoVMStatWritebackKey    = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Writeback")
    61  	SysInfoVMStatDirtyKey        = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Dirty")
    62  	SysInfoVMStatWritebackTmpKey = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "WritebackTmp")
    63  	SysInfoVMStatSharedKey       = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Shared")
    64  	SysInfoVMStatSlabKey         = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "Slab")
    65  	SysInfoVMStatPageTablesKey   = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "PageTables")
    66  	SysInfoVMStatSwapCachedKey   = bsonutil.MustHaveTag(message.SystemInfo{}.VMStat, "SwapCached")
    67  
    68  	SysInfoNetIOCountersNameKey        = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Name")
    69  	SysInfoNetIOCountersBytesSentKey   = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "BytesSent")
    70  	SysInfoNetIOCountersBytesRecvKey   = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "BytesRecv")
    71  	SysInfoNetIOCountersPacketsSentKey = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "PacketsSent")
    72  	SysInfoNetIOCountersPacketsRecvKey = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "PacketsRecv")
    73  	SysInfoNetIOCountersErrinKey       = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Errin")
    74  	SysInfoNetIOCountersErroutKey      = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Errout")
    75  	SysInfoNetIOCountersDropinKey      = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Dropin")
    76  	SysInfoNetIOCountersDropoutKey     = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Dropout")
    77  	SysInfoNetIOCountersFifoinKey      = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Fifoin")
    78  	SysInfoNetIOCountersFifooutKey     = bsonutil.MustHaveTag(message.SystemInfo{}.NetStat, "Fifoout")
    79  
    80  	SysInfoPartitionStatDeviceKey     = bsonutil.MustHaveTag(message.SystemInfo{}.Partitions, "Device")
    81  	SysInfoPartitionStatMountpointKey = bsonutil.MustHaveTag(message.SystemInfo{}.Partitions, "Mountpoint")
    82  	SysInfoPartitionStatFSTypeKey     = bsonutil.MustHaveTag(message.SystemInfo{}.Partitions, "Fstype")
    83  	SysInfoPartitionStatOptsKey       = bsonutil.MustHaveTag(message.SystemInfo{}.Partitions, "Opts")
    84  
    85  	SysInfoUsageStatPathKey              = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "Path")
    86  	SysInfoUsageStatFSTypeKey            = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "Fstype")
    87  	SysInfoUsageStatTotalKey             = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "Total")
    88  	SysInfoUsageStatFreeKey              = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "Free")
    89  	SysInfoUsageStatUsedKey              = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "Used")
    90  	SysInfoUsageStatUsedPercentKey       = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "UsedPercent")
    91  	SysInfoUsageStatInodesTotalKey       = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "InodesTotal")
    92  	SysInfoUsageStatInodesUsedKey        = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "InodesUsed")
    93  	SysInfoUsageStatInodesFreeKey        = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "InodesFree")
    94  	SysInfoUsageStatInodesUsedPercentKey = bsonutil.MustHaveTag(message.SystemInfo{}.Usage, "InodesUsedPercent")
    95  
    96  	SysInfoDiskIOCountersReadCountKey        = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "ReadCount")
    97  	SysInfoDiskIOCountersMergedReadCountKey  = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "MergedReadCount")
    98  	SysInfoDiskIOCountersWriteCountKey       = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "WriteCount")
    99  	SysInfoDiskIOCountersMergedWriteCountKey = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "MergedWriteCount")
   100  	SysInfoDiskIOCountersReadBytesKey        = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "ReadBytes")
   101  	SysInfoDiskIOCountersWriteBytesKey       = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "WriteBytes")
   102  	SysInfoDiskIOCountersReadTimeKey         = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "ReadTime")
   103  	SysInfoDiskIOCountersWriteTimeKey        = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "WriteTime")
   104  	SysInfoDiskIOCountersIopsInProgressKey   = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "IopsInProgress")
   105  	SysInfoDiskIOCountersIoTimeKey           = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "IoTime")
   106  	SysInfoDiskIOCountersWeigtedIoKey        = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "WeightedIO")
   107  	SysInfoDiskIOCountersNameKey             = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "Name")
   108  	SysInfoDiskIOCountersSerialNumberKey     = bsonutil.MustHaveTag(message.SystemInfo{}.IOStat, "SerialNumber")
   109  )
   110  
   111  // IsValid is part of the Data interface used in the conversion of
   112  // Event documents from to TaskSystemResourceData.
   113  func (d TaskSystemResourceData) IsValid() bool {
   114  	return d.ResourceType == EventTaskSystemInfo
   115  }
   116  
   117  // LogTaskSystemData saves a SystemInfo object to the event log for a
   118  // task.
   119  func LogTaskSystemData(taskId string, info *message.SystemInfo) {
   120  	event := Event{
   121  		ResourceId: taskId,
   122  		Timestamp:  info.Base.Time,
   123  		EventType:  EventTaskSystemInfo,
   124  	}
   125  
   126  	info.Base = message.Base{}
   127  	data := TaskSystemResourceData{
   128  		ResourceType: EventTaskSystemInfo,
   129  		SystemInfo:   info,
   130  	}
   131  	event.Data = DataWrapper{data}
   132  
   133  	grip.Error(message.NewErrorWrap(NewDBEventLogger(TaskLogCollection).LogEvent(event),
   134  		"problem system info event"))
   135  }
   136  
   137  // TaskProcessResourceData wraps a slice of grip/message.ProcessInfo structs
   138  // in a type that implements the event.Data interface. ProcessInfo structs
   139  // represent system resource usage information for a single process (PID).
   140  type TaskProcessResourceData struct {
   141  	ResourceType string                 `bson:"r_type" json:"resource_type"`
   142  	Processes    []*message.ProcessInfo `bson:"processes" json:"processes"`
   143  }
   144  
   145  var (
   146  	TaskProcessResourceDataSysInfoKey      = bsonutil.MustHaveTag(TaskProcessResourceData{}, "Processes")
   147  	TaskProcessResourceDataResourceTypeKey = bsonutil.MustHaveTag(TaskProcessResourceData{}, "ResourceType")
   148  
   149  	ProcInfoPidKey     = bsonutil.MustHaveTag(message.ProcessInfo{}, "Pid")
   150  	ProcInfoParentKey  = bsonutil.MustHaveTag(message.ProcessInfo{}, "Parent")
   151  	ProcInfoThreadsKey = bsonutil.MustHaveTag(message.ProcessInfo{}, "Threads")
   152  	ProcInfoCommandKey = bsonutil.MustHaveTag(message.ProcessInfo{}, "Command")
   153  	ProcInfoErrorsKey  = bsonutil.MustHaveTag(message.ProcessInfo{}, "Errors")
   154  
   155  	ProcInfoCPUKey            = bsonutil.MustHaveTag(message.ProcessInfo{}, "CPU")
   156  	ProcInfoIoStatKey         = bsonutil.MustHaveTag(message.ProcessInfo{}, "IoStat")
   157  	ProcInfoMemoryKey         = bsonutil.MustHaveTag(message.ProcessInfo{}, "Memory")
   158  	ProcInfoMemoryPlatformKey = bsonutil.MustHaveTag(message.ProcessInfo{}, "MemoryPlatform")
   159  	ProcInfoNetStatKey        = bsonutil.MustHaveTag(message.ProcessInfo{}, "NetStat")
   160  
   161  	ProcInfoCPUTimesStatCPUKey         = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "CPU")
   162  	ProcInfoCPUTimesStatUserKey        = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "User")
   163  	ProcInfoCPUTimesStatSystemKey      = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "System")
   164  	ProcInfoCPUTimesStatIdleKey        = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Idle")
   165  	ProcInfoCPUTimesStatNiceKey        = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Nice")
   166  	ProcInfoCPUTimesStatIowaitKey      = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Iowait")
   167  	ProcInfoCPUTimesStatIrqKey         = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Irq")
   168  	ProcInfoCPUTimesStatSoftirqKey     = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Softirq")
   169  	ProcInfoCPUTimesStatStealKey       = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Steal")
   170  	ProcInfoCPUTimesStatGuestNiceKey   = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "GuestNice")
   171  	ProcInfoCPUTimesStatGuestStolenKey = bsonutil.MustHaveTag(message.ProcessInfo{}.CPU, "Stolen")
   172  
   173  	ProcInfoIoStatReadCountKey  = bsonutil.MustHaveTag(message.ProcessInfo{}.IoStat, "ReadCount")
   174  	ProcInfoIoStatReadBytesKey  = bsonutil.MustHaveTag(message.ProcessInfo{}.IoStat, "ReadBytes")
   175  	ProcInfoIoStatWriteCountKey = bsonutil.MustHaveTag(message.ProcessInfo{}.IoStat, "WriteCount")
   176  	ProcInfoIoStatWriteBytesKey = bsonutil.MustHaveTag(message.ProcessInfo{}.IoStat, "WriteBytes")
   177  
   178  	ProcInfoNetStatNameKey        = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Name")
   179  	ProcInfoNetStatBytesSentKey   = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "BytesSent")
   180  	ProcInfoNetStatBytesRecvKey   = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "BytesRecv")
   181  	ProcInfoNetStatPacketsSentKey = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "PacketsSent")
   182  	ProcInfoNetStatPacketsRecvKey = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "PacketsRecv")
   183  	ProcInfoNetStatErrinKey       = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Errin")
   184  	ProcInfoNetStatErroutKey      = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Errout")
   185  	ProcInfoNetStatDropinKey      = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Dropin")
   186  	ProcInfoNetStatDropoutKey     = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Dropout")
   187  	ProcInfoNetStatFifoinKey      = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Fifoin")
   188  	ProcInfoNetStatFifooutKey     = bsonutil.MustHaveTag(message.ProcessInfo{}.NetStat, "Fifoout")
   189  
   190  	ProcInfoMemInfoStatRSSKey  = bsonutil.MustHaveTag(message.ProcessInfo{}.Memory, "RSS")
   191  	ProcInfoMemInfoStatVMSKey  = bsonutil.MustHaveTag(message.ProcessInfo{}.Memory, "VMS")
   192  	ProcInfoMemInfoStatSwapKey = bsonutil.MustHaveTag(message.ProcessInfo{}.Memory, "Swap")
   193  )
   194  
   195  // IsValid is part of the Data interface used in the conversion of
   196  // Event documents from to TaskProcessResourceData..
   197  func (d TaskProcessResourceData) IsValid() bool {
   198  	return d.ResourceType == EventTaskProcessInfo
   199  }
   200  
   201  // LogTaskProcessData saves a slice of ProcessInfo objects to the
   202  // event log under the specified task.
   203  func LogTaskProcessData(taskId string, procs []*message.ProcessInfo) {
   204  	ts := time.Now()
   205  	b := message.Base{}
   206  	for _, p := range procs {
   207  		// if p.Parent is 0, then this is the root of the
   208  		// process, and we should use the timestamp from this
   209  		// collector.
   210  		if p.Parent == 0 {
   211  			ts = p.Base.Time
   212  		}
   213  
   214  		p.Base = b
   215  	}
   216  
   217  	data := TaskProcessResourceData{
   218  		ResourceType: EventTaskProcessInfo,
   219  		Processes:    procs,
   220  	}
   221  
   222  	event := Event{
   223  		Timestamp:  ts,
   224  		ResourceId: taskId,
   225  		EventType:  EventTaskProcessInfo,
   226  		Data:       DataWrapper{data},
   227  	}
   228  
   229  	grip.Error(message.NewErrorWrap(NewDBEventLogger(TaskLogCollection).LogEvent(event),
   230  		"problem logging task process info event"))
   231  }