// Compile all Filter lists into filter.Filter objects. func (f *Filter) Compile() error { if len(f.NameDrop) == 0 && len(f.NamePass) == 0 && len(f.FieldDrop) == 0 && len(f.FieldPass) == 0 && len(f.TagInclude) == 0 && len(f.TagExclude) == 0 && len(f.TagPass) == 0 && len(f.TagDrop) == 0 { return nil } f.isActive = true var err error f.nameDrop, err = filter.Compile(f.NameDrop) if err != nil { return fmt.Errorf("Error compiling 'namedrop', %s", err) } f.namePass, err = filter.Compile(f.NamePass) if err != nil { return fmt.Errorf("Error compiling 'namepass', %s", err) } f.fieldDrop, err = filter.Compile(f.FieldDrop) if err != nil { return fmt.Errorf("Error compiling 'fielddrop', %s", err) } f.fieldPass, err = filter.Compile(f.FieldPass) if err != nil { return fmt.Errorf("Error compiling 'fieldpass', %s", err) } f.tagExclude, err = filter.Compile(f.TagExclude) if err != nil { return fmt.Errorf("Error compiling 'tagexclude', %s", err) } f.tagInclude, err = filter.Compile(f.TagInclude) if err != nil { return fmt.Errorf("Error compiling 'taginclude', %s", err) } for i, _ := range f.TagDrop { f.TagDrop[i].filter, err = filter.Compile(f.TagDrop[i].Filter) if err != nil { return fmt.Errorf("Error compiling 'tagdrop', %s", err) } } for i, _ := range f.TagPass { f.TagPass[i].filter, err = filter.Compile(f.TagPass[i].Filter) if err != nil { return fmt.Errorf("Error compiling 'tagpass', %s", err) } } return nil }
// Gather collects the configured stats from varnish_stat and adds them to the // Accumulator // // The prefix of each stat (eg MAIN, MEMPOOL, LCK, etc) will be used as a // 'section' tag and all stats that share that prefix will be reported as fields // with that tag func (s *Varnish) Gather(acc telegraf.Accumulator) error { if s.filter == nil { var err error if len(s.Stats) == 0 { s.filter, err = filter.Compile(defaultStats) } else { // legacy support, change "all" -> "*": if s.Stats[0] == "all" { s.Stats[0] = "*" } s.filter, err = filter.Compile(s.Stats) } if err != nil { return err } } out, err := s.run(s.Binary) if err != nil { return fmt.Errorf("error gathering metrics: %s", err) } sectionMap := make(map[string]map[string]interface{}) scanner := bufio.NewScanner(out) for scanner.Scan() { cols := strings.Fields(scanner.Text()) if len(cols) < 2 { continue } if !strings.Contains(cols[0], ".") { continue } stat := cols[0] value := cols[1] if s.filter != nil && !s.filter.Match(stat) { continue } parts := strings.SplitN(stat, ".", 2) section := parts[0] field := parts[1] // Init the section if necessary if _, ok := sectionMap[section]; !ok { sectionMap[section] = make(map[string]interface{}) } sectionMap[section][field], err = strconv.ParseUint(value, 10, 64) if err != nil { fmt.Fprintf(os.Stderr, "Expected a numeric value for %s = %v\n", stat, value) } } for section, fields := range sectionMap { tags := map[string]string{ "section": section, } if len(fields) == 0 { continue } acc.AddFields("varnish", fields, tags) } return nil }