in cli/silence_import.go [81:145]
func (c *silenceImportCmd) bulkImport(ctx context.Context, _ *kingpin.ParseContext) error {
input := os.Stdin
var err error
if c.file != "" {
input, err = os.Open(c.file)
if err != nil {
return err
}
defer input.Close()
}
dec := json.NewDecoder(input)
// read open square bracket
_, err = dec.Token()
if err != nil {
return fmt.Errorf("couldn't unmarshal input data, is it JSON?: %w", err)
}
amclient := NewAlertmanagerClient(alertmanagerURL)
silencec := make(chan *models.PostableSilence, 100)
errc := make(chan error, 100)
var wg sync.WaitGroup
for w := 0; w < c.workers; w++ {
wg.Add(1)
go func() {
addSilenceWorker(ctx, amclient.Silence, silencec, errc)
wg.Done()
}()
}
errCount := 0
go func() {
for err := range errc {
if err != nil {
errCount++
}
}
}()
count := 0
for dec.More() {
var s models.PostableSilence
err := dec.Decode(&s)
if err != nil {
return fmt.Errorf("couldn't unmarshal input data, is it JSON?: %w", err)
}
if c.force {
// reset the silence ID so Alertmanager will always create new silence
s.ID = ""
}
silencec <- &s
count++
}
close(silencec)
wg.Wait()
close(errc)
if errCount > 0 {
return fmt.Errorf("couldn't import %v out of %v silences", errCount, count)
}
return nil
}