Documentation
¶
Overview ¶
Package notifier entrega avisos de mudança de estado.
Um sistema de monitoramento que exige alguém olhando a tela não monitora nada. É aqui que a informação sai da ferramenta e chega em quem pode agir.
Index ¶
Constants ¶
const ( // DefaultMaxAttempts é quantas vezes uma entrega é tentada. // // Falha momentânea é o caso comum, então desistir na primeira // perderia avisos por um soluço de rede; retentar para sempre // transformaria um destino removido num laço infinito. DefaultMaxAttempts = 4 // DefaultRetryDelay é a espera antes da primeira retentativa. Cresce a // cada tentativa. DefaultRetryDelay = 2 * time.Second // DefaultQueueSize dá folga para uma rajada de incidentes. DefaultQueueSize = 256 // DefaultWorkers entrega em paralelo, para um canal lento não segurar // os demais. DefaultWorkers = 4 )
Padrões do despachante.
Variables ¶
This section is empty.
Functions ¶
func Marcadores ¶ added in v0.2.0
func Marcadores() []string
Marcadores são as variáveis que um mapeamento de corpo pode usar.
Exportado porque a interface precisa mostrar a lista a quem escreve o mapeamento: um recurso cuja única documentação está no README vira um recurso que ninguém usa. Um teste garante que esta lista e os valores realmente produzidos não se separem.
func Render ¶
func Render(n Notification) string
Render descreve o evento em uma frase.
Escrita para ser lida no celular às três da manhã: o que caiu, o que aconteceu e há quanto tempo — nessa ordem, sem preâmbulo.
Types ¶
type Dispatcher ¶
type Dispatcher struct {
// contains filtered or unexported fields
}
Dispatcher entrega avisos fora do caminho crítico do monitoramento.
A separação é o ponto do componente: um canal fora do ar não pode atrasar o registro das batidas, e uma tempestade de incidentes não pode travar o agendador.
func NewDispatcher ¶
func NewDispatcher(opts DispatcherOptions) *Dispatcher
NewDispatcher cria o despachante. É preciso chamar Run para ele operar.
func (*Dispatcher) Dropped ¶
func (d *Dispatcher) Dropped() int64
Dropped conta os avisos descartados por fila cheia ou tentativas esgotadas.
func (*Dispatcher) Enqueue ¶
func (d *Dispatcher) Enqueue(n Notification, channels []Notifier)
Enqueue aceita um aviso para entrega.
Nunca bloqueia. Quem chama está no caminho crítico do monitoramento, e prendê-lo atrás de um canal lento faria o agendador parar de verificar alvos — perder um aviso é ruim, parar de monitorar é pior. O descarte é contado para não acontecer em silêncio.
func (*Dispatcher) MaxAttempts ¶
func (d *Dispatcher) MaxAttempts() int
MaxAttempts é o teto de tentativas por entrega.
func (*Dispatcher) Run ¶
func (d *Dispatcher) Run(ctx context.Context)
Run entrega os avisos até o contexto terminar.
type DispatcherOptions ¶
type DispatcherOptions struct {
MaxAttempts int
RetryDelay time.Duration
QueueSize int
Workers int
Clock clock.Clock
// Counters separa entregue de descartado na exposição de métricas.
//
// Opcional: o contador nulo aceita observações sem fazer nada, então
// quem monta um despachante em teste não precisa saber que ele
// existe.
Counters *metrics.Counters
}
DispatcherOptions configura o despachante.
type Notification ¶
type Notification struct {
Monitor domain.Monitor
Event domain.StateChange
// Message é a causa observada, quando houver. É o que decide se
// alguém precisa levantar da cadeira.
Message string
}
Notification é o que se quer contar.
func (Notification) Status ¶
func (n Notification) Status() string
Status é o estado que passou a valer, em texto.
type Notifier ¶
type Notifier interface {
Send(ctx context.Context, n Notification) error
}
Notifier entrega uma notificação por um canal.
func Build ¶
func Build(kind string, config json.RawMessage) (Notifier, error)
Build monta o notificador do tipo pedido.
func NewDiscord ¶
func NewDiscord(raw json.RawMessage) (Notifier, error)
NewDiscord cria o canal do Discord.
func NewSlack ¶
func NewSlack(raw json.RawMessage) (Notifier, error)
NewSlack cria o canal do Slack.
func NewWebhook ¶
func NewWebhook(raw json.RawMessage) (Notifier, error)
NewWebhook cria o canal genérico.
O corpo é um JSON estável com os campos crus além do texto: quem integra costuma querer o dado, não a frase.