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