func()

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)
	}
}