func (n *Manager) Send(alerts ...*Alert) {
	n.mtx.Lock()
	defer n.mtx.Unlock()

	// Attach external labels before relabelling and sending.
	for _, a := range alerts {
		lb := labels.NewBuilder(a.Labels)

		for _, l := range n.opts.ExternalLabels {
			if a.Labels.Get(l.Name) == "" {
				lb.Set(l.Name, l.Value)
			}
		}

		a.Labels = lb.Labels()
	}

	alerts = n.relabelAlerts(alerts)

	// Queue capacity should be significantly larger than a single alert
	// batch could be.
	if d := len(alerts) - n.opts.QueueCapacity; d > 0 {
		alerts = alerts[d:]

		level.Warn(n.logger).Log("msg", "Alert batch larger than queue capacity, dropping alerts", "num_dropped", d)
		n.metrics.dropped.Add(float64(d))
	}

	// If the queue is full, remove the oldest alerts in favor
	// of newer ones.
	if d := (len(n.queue) + len(alerts)) - n.opts.QueueCapacity; d > 0 {
		n.queue = n.queue[d:]

		level.Warn(n.logger).Log("msg", "Alert notification queue full, dropping alerts", "num_dropped", d)
		n.metrics.dropped.Add(float64(d))
	}
	n.queue = append(n.queue, alerts...)

	// Notify sending goroutine that there are alerts to be processed.
	n.setMore()
}
func (n *Manager) Send(alerts ...*Alert) {
	n.mtx.Lock()
	defer n.mtx.Unlock()

	
	for _, a := range alerts {
		lb := labels.NewBuilder(a.Labels)

		for _, l := range n.opts.ExternalLabels {
			if a.Labels.Get(l.Name) == "" {
				lb.Set(l.Name, l.Value)
			}
		}

		a.Labels = lb.Labels()
	}

	alerts = n.relabelAlerts(alerts)

	
	
	if d := len(alerts) - n.opts.QueueCapacity; d > 0 {
		alerts = alerts[d:]

		level.Warn(n.logger).Log("msg", "Alert batch larger than queue capacity, dropping alerts", "num_dropped", d)
		n.metrics.dropped.Add(float64(d))
	}

	
	
	if d := (len(n.queue) + len(alerts)) - n.opts.QueueCapacity; d > 0 {
		n.queue = n.queue[d:]

		level.Warn(n.logger).Log("msg", "Alert notification queue full, dropping alerts", "num_dropped", d)
		n.metrics.dropped.Add(float64(d))
	}
	n.queue = append(n.queue, alerts...)

	
	n.setMore()
}
func ( n * Manager ) Send ( alerts ... * Alert ) { n . mtx . Lock ( ) defer n . mtx . Unlock ( ) // Attach external labels before relabelling and sending. for _ , a := range alerts { lb := labels . NewBuilder ( a . Labels ) for _ , l := range n . opts . ExternalLabels { if a . Labels . Get ( l . Name ) == " " { lb . Set ( l . Name , l . Value ) } } a . Labels = lb . Labels ( ) } alerts = n . relabelAlerts ( alerts ) // Queue capacity should be significantly larger than a single alert // batch could be. if d := len ( alerts ) - n . opts . QueueCapacity ; d > 0 { alerts = alerts [ d : ] level . Warn ( n . logger ) . Log ( " " , " " , " " , d ) n . metrics . dropped . Add ( float64 ( d ) ) } // If the queue is full, remove the oldest alerts in favor // of newer ones. if d := ( len ( n . queue ) + len ( alerts ) ) - n . opts . QueueCapacity ; d > 0 { n . queue = n . queue [ d : ] level . Warn ( n . logger ) . Log ( " " , " " , " " , d ) n . metrics . dropped . Add ( float64 ( d ) ) } n . queue = append ( n . queue , alerts ... ) // Notify sending goroutine that there are alerts to be processed. n . setMore ( ) }
// Send queues the given notification requests for processing.
// Panics if called on a handler that is not running.
Send queues the given notification requests for processing . Panics if called on a handler that is not running .