code: func (a *Agent) UserEvent(dc, token string, params *UserEvent) error {
  	// Validate the params
  	if err := validateUserEventParams(params); err != nil {
  		return err
  	}
  
  	// Format message
  	var err error
  	if params.ID, err = uuid.GenerateUUID(); err != nil {
  		return fmt.Errorf("UUID generation failed: %v", err)
  	}
  	params.Version = userEventMaxVersion
  	payload, err := encodeMsgPack(&params)
  	if err != nil {
  		return fmt.Errorf("UserEvent encoding failed: %v", err)
  	}
  
  	// Service the event fire over RPC. This ensures that we authorize
  	// the request against the token first.
  	args := structs.EventFireRequest{
  		Datacenter:   dc,
  		Name:         params.Name,
  		Payload:      payload,
  		QueryOptions: structs.QueryOptions{Token: token},
  	}
  
  	// Any server can process in the remote DC, since the
  	// gossip will take over anyways
  	args.AllowStale = true
  	var out structs.EventFireResponse
  	return a.RPC("Internal.EventFire", &args, &out)
  }
docs: // UserEvent is used to fire an event via the Serf layer on the LAN