github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/periodic.go (about) 1 package metric 2 3 import ( 4 "os" 5 "runtime" 6 "time" 7 8 "code.cloudfoundry.org/lager" 9 "github.com/tedsuo/ifrit" 10 ) 11 12 func PeriodicallyEmit(logger lager.Logger, m *Monitor, interval time.Duration) ifrit.Runner { 13 return ifrit.RunFunc(func(signals <-chan os.Signal, ready chan<- struct{}) error { 14 ticker := time.NewTicker(interval) 15 defer ticker.Stop() 16 17 close(ready) 18 19 for { 20 select { 21 case <-signals: 22 return nil 23 case <-ticker.C: 24 tick(logger.Session("tick"), m) 25 } 26 } 27 }) 28 } 29 30 func tick(logger lager.Logger, m *Monitor) { 31 m.emit( 32 logger.Session("database-queries"), 33 Event{ 34 Name: "database queries", 35 Value: m.DatabaseQueries.Delta(), 36 }, 37 ) 38 39 if len(m.Databases) > 0 { 40 for _, database := range m.Databases { 41 m.emit( 42 logger.Session("database-connections"), 43 Event{ 44 Name: "database connections", 45 Value: float64(database.Stats().OpenConnections), 46 Attributes: map[string]string{ 47 "ConnectionName": database.Name(), 48 }, 49 }, 50 ) 51 } 52 } 53 54 m.emit( 55 logger.Session("containers-deleted"), 56 Event{ 57 Name: "containers deleted", 58 Value: m.ContainersDeleted.Delta(), 59 }, 60 ) 61 62 m.emit( 63 logger.Session("volumes-deleted"), 64 Event{ 65 Name: "volumes deleted", 66 Value: m.VolumesDeleted.Delta(), 67 }, 68 ) 69 70 m.emit( 71 logger.Session("checks-deleted"), 72 Event{ 73 Name: "checks deleted", 74 Value: m.ChecksDeleted.Delta(), 75 }, 76 ) 77 78 m.emit( 79 logger.Session("volumes-streamed"), 80 Event{ 81 Name: "volumes streamed", 82 Value: m.VolumesStreamed.Delta(), 83 }, 84 ) 85 86 m.emit( 87 logger.Session("containers-created"), 88 Event{ 89 Name: "containers created", 90 Value: m.ContainersCreated.Delta(), 91 }, 92 ) 93 94 m.emit( 95 logger.Session("volumes-created"), 96 Event{ 97 Name: "volumes created", 98 Value: m.VolumesCreated.Delta(), 99 }, 100 ) 101 102 m.emit( 103 logger.Session("failed-containers"), 104 Event{ 105 Name: "failed containers", 106 Value: m.FailedContainers.Delta(), 107 }, 108 ) 109 110 m.emit( 111 logger.Session("failed-volumes"), 112 Event{ 113 Name: "failed volumes", 114 Value: m.FailedVolumes.Delta(), 115 }, 116 ) 117 118 m.emit( 119 logger.Session("jobs-scheduled"), 120 Event{ 121 Name: "jobs scheduled", 122 Value: m.JobsScheduled.Delta(), 123 }, 124 ) 125 126 m.emit( 127 logger.Session("jobs-scheduling"), 128 Event{ 129 Name: "jobs scheduling", 130 Value: m.JobsScheduling.Max(), 131 }, 132 ) 133 134 m.emit( 135 logger.Session("builds-started"), 136 Event{ 137 Name: "builds started", 138 Value: m.BuildsStarted.Delta(), 139 }, 140 ) 141 142 m.emit( 143 logger.Session("builds-running"), 144 Event{ 145 Name: "builds running", 146 Value: m.BuildsRunning.Max(), 147 }, 148 ) 149 150 for action, gauge := range m.ConcurrentRequests { 151 m.emit( 152 logger.Session("concurrent-requests"), 153 Event{ 154 Name: "concurrent requests", 155 Value: gauge.Max(), 156 Attributes: map[string]string{ 157 "action": action, 158 }, 159 }, 160 ) 161 } 162 163 for action, counter := range m.ConcurrentRequestsLimitHit { 164 m.emit( 165 logger.Session("concurrent-requests-limit-hit"), 166 Event{ 167 Name: "concurrent requests limit hit", 168 Value: counter.Delta(), 169 Attributes: map[string]string{ 170 "action": action, 171 }, 172 }, 173 ) 174 } 175 176 for labels, gauge := range m.TasksWaiting { 177 m.emit( 178 logger.Session("tasks-waiting"), 179 Event{ 180 Name: "tasks waiting", 181 Value: gauge.Max(), 182 Attributes: map[string]string{ 183 "teamId": labels.TeamId, 184 "workerTags": labels.WorkerTags, 185 "platform": labels.Platform, 186 }, 187 }, 188 ) 189 } 190 191 m.emit( 192 logger.Session("checks-finished-with-error"), 193 Event{ 194 Name: "checks finished", 195 Value: m.ChecksFinishedWithError.Delta(), 196 Attributes: map[string]string{ 197 "status": "error", 198 }, 199 }, 200 ) 201 202 m.emit( 203 logger.Session("checks-finished-with-success"), 204 Event{ 205 Name: "checks finished", 206 Value: m.ChecksFinishedWithSuccess.Delta(), 207 Attributes: map[string]string{ 208 "status": "success", 209 }, 210 }, 211 ) 212 213 m.emit( 214 215 logger.Session("checks-started"), 216 Event{ 217 Name: "checks started", 218 Value: m.ChecksStarted.Delta(), 219 }, 220 ) 221 222 m.emit( 223 224 logger.Session("checks-enqueued"), 225 Event{ 226 Name: "checks enqueued", 227 Value: m.ChecksEnqueued.Delta(), 228 }, 229 ) 230 231 var memStats runtime.MemStats 232 runtime.ReadMemStats(&memStats) 233 234 m.emit( 235 logger.Session("gc-pause-total-duration"), 236 Event{ 237 Name: "gc pause total duration", 238 Value: float64(memStats.PauseTotalNs), 239 }, 240 ) 241 242 m.emit( 243 logger.Session("mallocs"), 244 Event{ 245 Name: "mallocs", 246 Value: float64(memStats.Mallocs), 247 }, 248 ) 249 250 m.emit( 251 logger.Session("frees"), 252 Event{ 253 Name: "frees", 254 Value: float64(memStats.Frees), 255 }, 256 ) 257 258 m.emit( 259 logger.Session("goroutines"), 260 Event{ 261 Name: "goroutines", 262 Value: float64(runtime.NumGoroutine()), 263 }, 264 ) 265 }