in pipeline/endpoints/servicecontrol.go [88:135]
func (ep *ServiceControlEndpoint) Send(report pipeline.EndpointReport) error {
operation := ep.format(report)
req := &servicecontrol.ReportRequest{
Operations: []*servicecontrol.Operation{operation},
}
glog.V(2).Infoln("ServiceControlEndpoint:Send(): serviceName: ", ep.serviceName, " body: ", func() string {
reqJson, _ := req.MarshalJSON()
return string(reqJson)
}())
// Check only every 60 seconds, following recommendation from https://godoc.org/google.golang.org/api/servicecontrol/v1#ServicesService.Check
if ep.clock.Now().After(ep.nextCheck) {
// Check requests can not have user labels.
opNoLabels := *operation
opNoLabels.UserLabels = nil
checkReq := &servicecontrol.CheckRequest{
Operation: &opNoLabels,
}
checkResp, err := ep.service.Services.Check(ep.serviceName, checkReq).Do()
if err != nil && !googleapi.IsNotModified(err) {
return err
}
if len(checkResp.CheckErrors) > 0 {
return checkErrorsToError(checkResp.CheckErrors)
}
ep.nextCheck = ep.clock.Now().Add(checkCacheTimeout)
}
resp, err := ep.service.Services.Report(ep.serviceName, req).Do()
if err != nil && !googleapi.IsNotModified(err) {
return err
}
// This will retry reporting all operations.
// However, identical operations are de-duped for billing
if len(resp.ReportErrors) > 0 {
var errs []error
for _, reportErr := range resp.ReportErrors {
errs = append(errs, reportErrorToError(reportErr))
}
return errors.Join(errs...)
}
glog.V(2).Infoln("ServiceControlEndpoint:Send(): success")
return nil
}