func()

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
}