func()

in models/v3/msgs/msgs.go [166:216]


func (n Notifications) SendEvent(hc *http.Client, store *storage.Client) (err error) {
	started := time.Now()
	// keep track so we can record whether the data was inlined or not (receiver or blob)
	inline := false
	var dataSize int64
	defer func() {
		elapsed := time.Since(started)
		if err != nil {
			metrics.SendEventFailure(context.Background(), elapsed, inline, dataSize)
			return
		}
		metrics.SendEventSuccess(context.Background(), elapsed, inline, dataSize)
	}()

	if len(n.Data) == 0 {
		return errors.New("no data to send")
	}

	// Convert the notification to an event.
	dataJSON, event, err := n.toEvent()
	if err != nil {
		return err
	}

	// As a producer, we have to set the status code for all Resources to OK.
	for i, e := range event.Data.Resources {
		e.StatusCode = types.StatusCode
		event.Data.Resources[i] = e
	}
	if err = event.Validate(); err != nil {
		return err
	}

	dataSize = int64(len(event.Data.Data))

	// If the data is marked inline, we can send over HTTP directly.
	if event.Data.ResourcesContainer == types.RCInline {
		inline = true
		return n.sendHTTP(hc, event)
	}

	u, err := n.sendBlob(store, dataJSON)
	if err != nil {
		return err
	}

	// Tell the service (via HTTP) where to find the blob.
	event.Data.ResourcesBlobInfo.BlobURI = u.String()
	event.Data.ResourcesBlobInfo.BlobSize = int64(len(dataJSON))
	return n.sendHTTP(hc, event)
}