code: 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()
  }
docs: // Send queues the given notification requests for processing.
  // Panics if called on a handler that is not running.