in metrics/internal/handlers/job_webhook.go [158:216]
func (j *jobWebhook) jobWebhook(project string, writer http.ResponseWriter, request *http.Request) {
token := request.Header.Get("X-Gitlab-Token")
if !j.checkToken(project, token) {
http.Error(writer, "Invalid token", http.StatusUnauthorized)
return
}
// Read a max of 1 MB
request.Body = http.MaxBytesReader(writer, request.Body, 1048576)
body, err := io.ReadAll(request.Body)
if err != nil {
http.Error(writer, err.Error(), http.StatusBadRequest)
return
}
event, err := gitlab.ParseWebhook(gitlab.HookEventType(request), body)
if err != nil {
http.Error(writer, err.Error(), http.StatusBadRequest)
return
}
jobEvent, ok := event.(*gitlab.JobEvent)
if !ok {
http.Error(writer, "Request is expected to be a Job event", http.StatusBadRequest)
return
}
autoDeployPipeline := isAutoDeployPipeline(jobEvent.Commit.Name, project)
if autoDeployPipeline {
jobEventMetric.Inc(project, "auto_deploy")
} else {
jobEventMetric.Inc(project, "others")
// Make sure we are only populating metrics using data from auto-deploy and downstream pipelines.
return
}
if jobEvent.RetriesCount > 0 && jobEvent.BuildStatus == buildStatusCreated {
jobRetriesMetric.Inc(project, jobEvent.BuildName)
}
// Job failure lost seconds
if jobEvent.BuildStatus == buildStatusFailed {
jobFailureLostSecondsMetric.Add(jobEvent.BuildDuration, project, jobEvent.BuildName)
}
if jobEvent.BuildStatus == buildStatusRunning && jobEvent.RetriesCount > 0 {
createdAt, _ := time.Parse(time.RFC3339, jobEvent.BuildCreatedAt)
finishedAt := jobFailureLastOccurrence(jobEvent.ProjectID, jobEvent.PipelineID, jobEvent.BuildName)
if finishedAt == nil {
return
}
secondsLost := createdAt.Sub(*finishedAt).Seconds()
jobFailureLostSecondsMetric.Add(secondsLost, project, jobEvent.BuildName)
}
}