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 }