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  }