github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/metrics.go (about)

     1  package metric
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/pf-qiu/concourse/v6/atc/db/lock"
     9  
    10  	"code.cloudfoundry.org/lager"
    11  	"github.com/pf-qiu/concourse/v6/atc/db"
    12  )
    13  
    14  type TasksWaitingLabels struct {
    15  	TeamId     string
    16  	WorkerTags string
    17  	Platform   string
    18  }
    19  
    20  type TasksWaitingDuration struct {
    21  	Labels   TasksWaitingLabels
    22  	Duration time.Duration
    23  }
    24  
    25  func (event TasksWaitingDuration) Emit(logger lager.Logger) {
    26  	Metrics.emit(
    27  		logger.Session("tasks-waiting-duration"),
    28  		Event{
    29  			Name:  "tasks waiting duration",
    30  			Value: event.Duration.Seconds(),
    31  			Attributes: map[string]string{
    32  				"teamId":     event.Labels.TeamId,
    33  				"workerTags": event.Labels.WorkerTags,
    34  				"platform":   event.Labels.Platform,
    35  			},
    36  		},
    37  	)
    38  }
    39  
    40  type BuildCollectorDuration struct {
    41  	Duration time.Duration
    42  }
    43  
    44  func (event BuildCollectorDuration) Emit(logger lager.Logger) {
    45  	Metrics.emit(
    46  		logger.Session("gc-build-collector-duration"),
    47  		Event{
    48  			Name:  "gc: build collector duration (ms)",
    49  			Value: ms(event.Duration),
    50  		},
    51  	)
    52  }
    53  
    54  type WorkerCollectorDuration struct {
    55  	Duration time.Duration
    56  }
    57  
    58  func (event WorkerCollectorDuration) Emit(logger lager.Logger) {
    59  	Metrics.emit(
    60  		logger.Session("gc-worker-collector-duration"),
    61  		Event{
    62  			Name:  "gc: worker collector duration (ms)",
    63  			Value: ms(event.Duration),
    64  		},
    65  	)
    66  }
    67  
    68  type ResourceCacheUseCollectorDuration struct {
    69  	Duration time.Duration
    70  }
    71  
    72  func (event ResourceCacheUseCollectorDuration) Emit(logger lager.Logger) {
    73  	Metrics.emit(
    74  		logger.Session("gc-resource-cache-use-collector-duration"),
    75  		Event{
    76  			Name:  "gc: resource cache use collector duration (ms)",
    77  			Value: ms(event.Duration),
    78  		},
    79  	)
    80  }
    81  
    82  type ResourceConfigCollectorDuration struct {
    83  	Duration time.Duration
    84  }
    85  
    86  func (event ResourceConfigCollectorDuration) Emit(logger lager.Logger) {
    87  	Metrics.emit(
    88  		logger.Session("gc-resource-config-collector-duration"),
    89  		Event{
    90  			Name:  "gc: resource config collector duration (ms)",
    91  			Value: ms(event.Duration),
    92  		},
    93  	)
    94  }
    95  
    96  type ResourceCacheCollectorDuration struct {
    97  	Duration time.Duration
    98  }
    99  
   100  func (event ResourceCacheCollectorDuration) Emit(logger lager.Logger) {
   101  	Metrics.emit(
   102  		logger.Session("gc-resource-cache-collector-duration"),
   103  		Event{
   104  			Name:  "gc: resource cache collector duration (ms)",
   105  			Value: ms(event.Duration),
   106  		},
   107  	)
   108  }
   109  
   110  type ResourceConfigCheckSessionCollectorDuration struct {
   111  	Duration time.Duration
   112  }
   113  
   114  func (event ResourceConfigCheckSessionCollectorDuration) Emit(logger lager.Logger) {
   115  	Metrics.emit(
   116  		logger.Session("gc-resource-config-check-session-collector-duration"),
   117  		Event{
   118  			Name:  "gc: resource config check session collector duration (ms)",
   119  			Value: ms(event.Duration),
   120  		},
   121  	)
   122  }
   123  
   124  type ArtifactCollectorDuration struct {
   125  	Duration time.Duration
   126  }
   127  
   128  func (event ArtifactCollectorDuration) Emit(logger lager.Logger) {
   129  	Metrics.emit(
   130  		logger.Session("gc-artifact-collector-duration"),
   131  		Event{
   132  			Name:  "gc: artifact collector duration (ms)",
   133  			Value: ms(event.Duration),
   134  		},
   135  	)
   136  }
   137  
   138  type ContainerCollectorDuration struct {
   139  	Duration time.Duration
   140  }
   141  
   142  func (event ContainerCollectorDuration) Emit(logger lager.Logger) {
   143  	Metrics.emit(
   144  		logger.Session("gc-container-collector-duration"),
   145  		Event{
   146  			Name:  "gc: container collector duration (ms)",
   147  			Value: ms(event.Duration),
   148  		},
   149  	)
   150  }
   151  
   152  type VolumeCollectorDuration struct {
   153  	Duration time.Duration
   154  }
   155  
   156  func (event VolumeCollectorDuration) Emit(logger lager.Logger) {
   157  	Metrics.emit(
   158  		logger.Session("gc-volume-collector-duration"),
   159  		Event{
   160  			Name:  "gc: volume collector duration (ms)",
   161  			Value: ms(event.Duration),
   162  		},
   163  	)
   164  }
   165  
   166  type SchedulingJobDuration struct {
   167  	PipelineName string
   168  	JobName      string
   169  	JobID        int
   170  	Duration     time.Duration
   171  }
   172  
   173  func (event SchedulingJobDuration) Emit(logger lager.Logger) {
   174  	Metrics.emit(
   175  		logger.Session("job-scheduling-duration"),
   176  		Event{
   177  			Name:  "scheduling: job duration (ms)",
   178  			Value: ms(event.Duration),
   179  			Attributes: map[string]string{
   180  				"pipeline": event.PipelineName,
   181  				"job":      event.JobName,
   182  				"job_id":   strconv.Itoa(event.JobID),
   183  			},
   184  		},
   185  	)
   186  }
   187  
   188  type WorkerContainers struct {
   189  	WorkerName string
   190  	Platform   string
   191  	Containers int
   192  	TeamName   string
   193  	Tags       []string
   194  }
   195  
   196  func (event WorkerContainers) Emit(logger lager.Logger) {
   197  	Metrics.emit(
   198  		logger.Session("worker-containers"),
   199  		Event{
   200  			Name:  "worker containers",
   201  			Value: float64(event.Containers),
   202  			Attributes: map[string]string{
   203  				"worker":    event.WorkerName,
   204  				"platform":  event.Platform,
   205  				"team_name": event.TeamName,
   206  				"tags":      strings.Join(event.Tags[:], "/"),
   207  			},
   208  		},
   209  	)
   210  }
   211  
   212  type WorkerUnknownContainers struct {
   213  	WorkerName string
   214  	Containers int
   215  }
   216  
   217  func (event WorkerUnknownContainers) Emit(logger lager.Logger) {
   218  	Metrics.emit(
   219  		logger.Session("worker-unknown-containers"),
   220  		Event{
   221  			Name:  "worker unknown containers",
   222  			Value: float64(event.Containers),
   223  			Attributes: map[string]string{
   224  				"worker": event.WorkerName,
   225  			},
   226  		},
   227  	)
   228  }
   229  
   230  type WorkerVolumes struct {
   231  	WorkerName string
   232  	Platform   string
   233  	Volumes    int
   234  	TeamName   string
   235  	Tags       []string
   236  }
   237  
   238  func (event WorkerVolumes) Emit(logger lager.Logger) {
   239  	Metrics.emit(
   240  		logger.Session("worker-volumes"),
   241  		Event{
   242  			Name:  "worker volumes",
   243  			Value: float64(event.Volumes),
   244  			Attributes: map[string]string{
   245  				"worker":    event.WorkerName,
   246  				"platform":  event.Platform,
   247  				"team_name": event.TeamName,
   248  				"tags":      strings.Join(event.Tags[:], "/"),
   249  			},
   250  		},
   251  	)
   252  }
   253  
   254  type WorkerUnknownVolumes struct {
   255  	WorkerName string
   256  	Volumes    int
   257  }
   258  
   259  func (event WorkerUnknownVolumes) Emit(logger lager.Logger) {
   260  	Metrics.emit(
   261  		logger.Session("worker-unknown-volumes"),
   262  		Event{
   263  			Name:  "worker unknown volumes",
   264  			Value: float64(event.Volumes),
   265  			Attributes: map[string]string{
   266  				"worker": event.WorkerName,
   267  			},
   268  		},
   269  	)
   270  }
   271  
   272  type WorkerTasks struct {
   273  	WorkerName string
   274  	Platform   string
   275  	Tasks      int
   276  }
   277  
   278  func (event WorkerTasks) Emit(logger lager.Logger) {
   279  	Metrics.emit(
   280  		logger.Session("worker-tasks"),
   281  		Event{
   282  			Name:  "worker tasks",
   283  			Value: float64(event.Tasks),
   284  			Attributes: map[string]string{
   285  				"worker":   event.WorkerName,
   286  				"platform": event.Platform,
   287  			},
   288  		},
   289  	)
   290  }
   291  
   292  type VolumesToBeGarbageCollected struct {
   293  	Volumes int
   294  }
   295  
   296  func (event VolumesToBeGarbageCollected) Emit(logger lager.Logger) {
   297  	Metrics.emit(
   298  		logger.Session("gc-found-orphaned-volumes-for-deletion"),
   299  		Event{
   300  			Name:       "orphaned volumes to be garbage collected",
   301  			Value:      float64(event.Volumes),
   302  			Attributes: map[string]string{},
   303  		},
   304  	)
   305  }
   306  
   307  type CreatingContainersToBeGarbageCollected struct {
   308  	Containers int
   309  }
   310  
   311  func (event CreatingContainersToBeGarbageCollected) Emit(logger lager.Logger) {
   312  	Metrics.emit(
   313  		logger.Session("gc-found-creating-containers-for-deletion"),
   314  		Event{
   315  			Name:       "creating containers to be garbage collected",
   316  			Value:      float64(event.Containers),
   317  			Attributes: map[string]string{},
   318  		},
   319  	)
   320  }
   321  
   322  type CreatedContainersToBeGarbageCollected struct {
   323  	Containers int
   324  }
   325  
   326  func (event CreatedContainersToBeGarbageCollected) Emit(logger lager.Logger) {
   327  	Metrics.emit(
   328  		logger.Session("gc-found-created-ccontainers-for-deletion"),
   329  		Event{
   330  			Name:       "created containers to be garbage collected",
   331  			Value:      float64(event.Containers),
   332  			Attributes: map[string]string{},
   333  		},
   334  	)
   335  }
   336  
   337  type DestroyingContainersToBeGarbageCollected struct {
   338  	Containers int
   339  }
   340  
   341  func (event DestroyingContainersToBeGarbageCollected) Emit(logger lager.Logger) {
   342  	Metrics.emit(
   343  		logger.Session("gc-found-destroying-containers-for-deletion"),
   344  		Event{
   345  			Name:       "destroying containers to be garbage collected",
   346  			Value:      float64(event.Containers),
   347  			Attributes: map[string]string{},
   348  		},
   349  	)
   350  }
   351  
   352  type FailedContainersToBeGarbageCollected struct {
   353  	Containers int
   354  }
   355  
   356  func (event FailedContainersToBeGarbageCollected) Emit(logger lager.Logger) {
   357  	Metrics.emit(
   358  		logger.Session("gc-found-failed-containers-for-deletion"),
   359  		Event{
   360  			Name:       "failed containers to be garbage collected",
   361  			Value:      float64(event.Containers),
   362  			Attributes: map[string]string{},
   363  		},
   364  	)
   365  }
   366  
   367  type CreatedVolumesToBeGarbageCollected struct {
   368  	Volumes int
   369  }
   370  
   371  func (event CreatedVolumesToBeGarbageCollected) Emit(logger lager.Logger) {
   372  	Metrics.emit(
   373  		logger.Session("gc-found-created-volumes-for-deletion"),
   374  		Event{
   375  			Name:       "created volumes to be garbage collected",
   376  			Value:      float64(event.Volumes),
   377  			Attributes: map[string]string{},
   378  		},
   379  	)
   380  }
   381  
   382  type DestroyingVolumesToBeGarbageCollected struct {
   383  	Volumes int
   384  }
   385  
   386  func (event DestroyingVolumesToBeGarbageCollected) Emit(logger lager.Logger) {
   387  	Metrics.emit(
   388  		logger.Session("gc-found-destroying-volumes-for-deletion"),
   389  		Event{
   390  			Name:       "destroying volumes to be garbage collected",
   391  			Value:      float64(event.Volumes),
   392  			Attributes: map[string]string{},
   393  		},
   394  	)
   395  }
   396  
   397  type FailedVolumesToBeGarbageCollected struct {
   398  	Volumes int
   399  }
   400  
   401  func (event FailedVolumesToBeGarbageCollected) Emit(logger lager.Logger) {
   402  	Metrics.emit(
   403  		logger.Session("gc-found-failed-volumes-for-deletion"),
   404  		Event{
   405  			Name:       "failed volumes to be garbage collected",
   406  			Value:      float64(event.Volumes),
   407  			Attributes: map[string]string{},
   408  		},
   409  	)
   410  }
   411  
   412  type GarbageCollectionContainerCollectorJobDropped struct {
   413  	WorkerName string
   414  }
   415  
   416  func (event GarbageCollectionContainerCollectorJobDropped) Emit(logger lager.Logger) {
   417  	Metrics.emit(
   418  		logger.Session("gc-container-collector-dropped"),
   419  		Event{
   420  			Name:  "GC container collector job dropped",
   421  			Value: 1,
   422  			Attributes: map[string]string{
   423  				"worker": event.WorkerName,
   424  			},
   425  		},
   426  	)
   427  }
   428  
   429  type BuildStarted struct {
   430  	Build db.Build
   431  }
   432  
   433  func (event BuildStarted) Emit(logger lager.Logger) {
   434  	Metrics.emit(
   435  		logger.Session("build-started"),
   436  		Event{
   437  			Name:       "build started",
   438  			Value:      float64(event.Build.ID()),
   439  			Attributes: event.Build.TracingAttrs(),
   440  		},
   441  	)
   442  }
   443  
   444  type BuildFinished struct {
   445  	Build db.Build
   446  }
   447  
   448  func (event BuildFinished) Emit(logger lager.Logger) {
   449  	attrs := event.Build.TracingAttrs()
   450  	attrs["build_status"] = event.Build.Status().String()
   451  
   452  	Metrics.emit(
   453  		logger.Session("build-finished"),
   454  		Event{
   455  			Name:       "build finished",
   456  			Value:      ms(event.Build.EndTime().Sub(event.Build.StartTime())),
   457  			Attributes: attrs,
   458  		},
   459  	)
   460  }
   461  
   462  func ms(duration time.Duration) float64 {
   463  	return float64(duration) / 1000000
   464  }
   465  
   466  type ErrorLog struct {
   467  	Message string
   468  	Value   int
   469  }
   470  
   471  func (e ErrorLog) Emit(logger lager.Logger, m *Monitor) {
   472  	m.emit(
   473  		logger.Session("error-log"),
   474  		Event{
   475  			Name:  "error log",
   476  			Value: float64(e.Value),
   477  			Attributes: map[string]string{
   478  				"message": e.Message,
   479  			},
   480  		},
   481  	)
   482  }
   483  
   484  type HTTPResponseTime struct {
   485  	Route      string
   486  	Path       string
   487  	Method     string
   488  	StatusCode int
   489  	Duration   time.Duration
   490  }
   491  
   492  func (event HTTPResponseTime) Emit(logger lager.Logger, m *Monitor) {
   493  	m.emit(
   494  		logger.Session("http-response-time"),
   495  		Event{
   496  			Name:  "http response time",
   497  			Value: ms(event.Duration),
   498  			Attributes: map[string]string{
   499  				"route":  event.Route,
   500  				"path":   event.Path,
   501  				"method": event.Method,
   502  				"status": strconv.Itoa(event.StatusCode),
   503  			},
   504  		},
   505  	)
   506  }
   507  
   508  var lockTypeNames = map[int]string{
   509  	lock.LockTypeResourceConfigChecking: "ResourceConfigChecking",
   510  	lock.LockTypeBuildTracking:          "BuildTracking",
   511  	lock.LockTypeJobScheduling:          "JobScheduling",
   512  	lock.LockTypeBatch:                  "Batch",
   513  	lock.LockTypeVolumeCreating:         "VolumeCreating",
   514  	lock.LockTypeContainerCreating:      "ContainerCreating",
   515  	lock.LockTypeDatabaseMigration:      "DatabaseMigration",
   516  	lock.LockTypeActiveTasks:            "ActiveTasks",
   517  	lock.LockTypeResourceScanning:       "ResourceScanning",
   518  }
   519  
   520  type LockAcquired struct {
   521  	LockType string
   522  }
   523  
   524  func (event LockAcquired) Emit(logger lager.Logger) {
   525  	Metrics.emit(
   526  		logger.Session("lock-acquired"),
   527  		Event{
   528  			Name:  "lock held",
   529  			Value: 1,
   530  			Attributes: map[string]string{
   531  				"type": event.LockType,
   532  			},
   533  		},
   534  	)
   535  }
   536  
   537  type LockReleased struct {
   538  	LockType string
   539  }
   540  
   541  func (event LockReleased) Emit(logger lager.Logger) {
   542  	Metrics.emit(
   543  		logger.Session("lock-released"),
   544  		Event{
   545  			Name:  "lock held",
   546  			Value: 0,
   547  			Attributes: map[string]string{
   548  				"type": event.LockType,
   549  			},
   550  		},
   551  	)
   552  }
   553  
   554  func LogLockAcquired(logger lager.Logger, lockID lock.LockID) {
   555  	logger.Debug("acquired")
   556  
   557  	if len(lockID) == 0 {
   558  		return
   559  	}
   560  
   561  	if lockType, ok := lockTypeNames[lockID[0]]; ok {
   562  		LockAcquired{LockType: lockType}.Emit(logger)
   563  	}
   564  }
   565  
   566  func LogLockReleased(logger lager.Logger, lockID lock.LockID) {
   567  	logger.Debug("released")
   568  
   569  	if len(lockID) == 0 {
   570  		return
   571  	}
   572  
   573  	if lockType, ok := lockTypeNames[lockID[0]]; ok {
   574  		LockReleased{LockType: lockType}.Emit(logger)
   575  	}
   576  }
   577  
   578  type WorkersState struct {
   579  	WorkerStateByName map[string]db.WorkerState
   580  }
   581  
   582  func (event WorkersState) Emit(logger lager.Logger, m *Monitor) {
   583  	for _, state := range db.AllWorkerStates() {
   584  		count := 0
   585  		for _, workerState := range event.WorkerStateByName {
   586  			if workerState == state {
   587  				count += 1
   588  			}
   589  		}
   590  
   591  		m.emit(
   592  			logger.Session("worker-state"),
   593  			Event{
   594  				Name:  "worker state",
   595  				Value: float64(count),
   596  				Attributes: map[string]string{
   597  					"state": string(state),
   598  				},
   599  			},
   600  		)
   601  	}
   602  }