in cli/silence_add.go [91:174]
func (c *silenceAddCmd) add(ctx context.Context, _ *kingpin.ParseContext) error {
var err error
if len(c.matchers) > 0 {
// If the parser fails then we likely don't have a (=|=~|!=|!~) so lets
// assume that the user wants alertname=<arg> and prepend `alertname=`
// to the front.
_, err := compat.Matcher(c.matchers[0], "cli")
if err != nil {
c.matchers[0] = fmt.Sprintf("alertname=%s", strconv.Quote(c.matchers[0]))
}
}
matchers := make([]labels.Matcher, 0, len(c.matchers))
for _, s := range c.matchers {
m, err := compat.Matcher(s, "cli")
if err != nil {
return err
}
matchers = append(matchers, *m)
}
if len(matchers) < 1 {
return fmt.Errorf("no matchers specified")
}
var startsAt time.Time
if c.start != "" {
startsAt, err = time.Parse(time.RFC3339, c.start)
if err != nil {
return err
}
} else {
startsAt = time.Now().UTC()
}
var endsAt time.Time
if c.end != "" {
endsAt, err = time.Parse(time.RFC3339, c.end)
if err != nil {
return err
}
} else {
d, err := model.ParseDuration(c.duration)
if err != nil {
return err
}
if d == 0 {
return fmt.Errorf("silence duration must be greater than 0")
}
endsAt = startsAt.UTC().Add(time.Duration(d))
}
if startsAt.After(endsAt) {
return errors.New("silence cannot start after it ends")
}
if c.requireComment && c.comment == "" {
return errors.New("comment required by config")
}
start := strfmt.DateTime(startsAt)
end := strfmt.DateTime(endsAt)
ps := &models.PostableSilence{
Silence: models.Silence{
Matchers: TypeMatchers(matchers),
StartsAt: &start,
EndsAt: &end,
CreatedBy: &c.author,
Comment: &c.comment,
},
}
silenceParams := silence.NewPostSilencesParams().WithContext(ctx).
WithSilence(ps)
amclient := NewAlertmanagerClient(alertmanagerURL)
postOk, err := amclient.Silence.PostSilences(silenceParams)
if err != nil {
return err
}
_, err = fmt.Println(postOk.Payload.SilenceID)
return err
}