// parseTcollectorValue parses a tcollector-style line into a data point. func parseTcollectorValue(line string) (*opentsdb.DataPoint, error) { sp := strings.Fields(line) if len(sp) < 3 { return nil, fmt.Errorf("bad line: %s", line) } ts, err := strconv.ParseInt(sp[1], 10, 64) if err != nil { return nil, fmt.Errorf("bad timestamp: %s", sp[1]) } val, err := strconv.ParseFloat(sp[2], 64) if err != nil { return nil, fmt.Errorf("bad value: %s", sp[2]) } if !opentsdb.ValidTag(sp[0]) { return nil, fmt.Errorf("bad metric: %s", sp[0]) } dp := opentsdb.DataPoint{ Metric: sp[0], Timestamp: ts, Value: val, } tags := opentsdb.TagSet{} for _, tag := range sp[3:] { ts, err := opentsdb.ParseTags(tag) if err != nil { return nil, fmt.Errorf("bad tag, metric %s: %v: %v", sp[0], tag, err) } tags.Merge(ts) } setExternalTags(tags) dp.Tags = tags return &dp, nil }
func (to *TagOverride) ApplyTags(t opentsdb.TagSet) { if to.tags != nil { t = t.Merge(to.tags) } }
func c_varnish_unix() (opentsdb.MultiDataPoint, error) { var md opentsdb.MultiDataPoint const metric = "varnish." r, err := util.Command(5*time.Second, nil, "varnishstat", "-j") if err != nil { return nil, err } var stats varnishStats if err := json.NewDecoder(r).Decode(&stats); err != nil { return nil, err } for name, raw := range stats { if name == "timestamp" { continue } var v varnishStat if err := json.Unmarshal(raw, &v); err != nil { slog.Errorln("varnish parser error:", name, err) continue } ts := opentsdb.TagSet{} // special case for backend stats. extract backend name, host and port, put // them in tags and remove them in name. // the format is like "name(host,,port)" for the "ident" field of "VBE" type if v.Type == "VBE" { subtype := v.SubType name = strings.Replace(name, "."+subtype, "", -1) idx := strings.Index(subtype, "(") if idx < 0 || len(subtype)-idx < 4 { // output format changed, ignore continue } ss := strings.Split(subtype[idx+1:len(subtype)-1], ",") if len(ss) != 3 { // output format changed, ignore continue } ts.Merge(opentsdb.TagSet{"backend": subtype[:idx]}) ts.Merge(opentsdb.TagSet{"endpoint": ss[0] + "_" + ss[2]}) } rate := metadata.RateType(metadata.Gauge) if flag := v.Flag; flag == "a" || flag == "c" { rate = metadata.Counter } unit := metadata.Unit(metadata.Count) if v.Format == "B" { unit = metadata.Bytes } Add(&md, metric+strings.ToLower(name), v.Value, ts, rate, unit, v.Desc) } return md, nil }