in network/gitlab.go [713:769]
func (n *GitLabClient) PatchTrace(
config common.RunnerConfig,
jobCredentials *common.JobCredentials,
content []byte,
startOffset int,
debugTraceEnabled bool,
) common.PatchTraceResult {
id := jobCredentials.ID
baseLog := config.Log().WithField("job", id)
if len(content) == 0 {
baseLog.Info("Appending trace to coordinator...", "skipped due to empty patch")
return common.NewPatchTraceResult(startOffset, common.PatchSucceeded, 0)
}
endOffset := startOffset + len(content)
contentRange := fmt.Sprintf("%d-%d", startOffset, endOffset-1)
headers := JobTokenHeader(jobCredentials.Token)
headers.Set("Content-Range", contentRange)
bodyProvider := common.BytesProvider{Data: content}
response, err := n.doMeasuredRaw(
context.Background(),
config.Log(),
config.RunnerCredentials.ShortDescription(),
config.SystemIDState.GetSystemID(),
apiEndpointPatchTrace,
doRawParams{
credentials: &config.RunnerCredentials,
method: "PATCH",
uri: fmt.Sprintf("jobs/%d/trace?%s", id, patchTraceQuery(debugTraceEnabled)),
request: bodyProvider,
requestType: "text/plain",
headers: headers,
},
)
if err != nil {
config.Log().Errorln("Appending trace to coordinator...", "error", err.Error())
return common.NewPatchTraceResult(startOffset, common.PatchFailed, 0)
}
defer func() { n.handleResponse(context.TODO(), response, true) }()
tracePatchResponse := NewTracePatchResponse(response, baseLog)
log := baseLog.WithFields(logrus.Fields{
"sent-log": contentRange,
"job-log": tracePatchResponse.RemoteRange,
"job-status": tracePatchResponse.RemoteState,
"code": response.StatusCode,
"status": response.Status,
"update-interval": tracePatchResponse.RemoteUpdateInterval,
})
return n.createPatchTraceResult(startOffset, tracePatchResponse, response, endOffset, log)
}