func checkRecentToken(client *influx.Client, token, host string, errors chan error) { for _, qfmt := range influxDbSeriesCheckQueries { query := fmt.Sprintf(qfmt, token) results, err := client.Query(query, influx.Second) if err != nil || len(results) == 0 { errors <- fmt.Errorf("at=influxdb-health err=%q result_length=%d host=%q query=%q", err, len(results), host, query) continue } t, ok := results[0].Points[0][0].(float64) if !ok { errors <- fmt.Errorf("at=influxdb-health err=\"time column was not a number\" host=%q query=%q", host, query) continue } ts := time.Unix(int64(t), int64(0)).UTC() now := time.Now().UTC() if now.Sub(ts) > influxDbStaleTimeout { errors <- fmt.Errorf("at=influxdb-health err=\"stale data\" host=%q ts=%q now=%q query=%q", host, ts, now, query) } } }
func send(r metrics.Registry, client *influxClient.Client) error { series := []*influxClient.Series{} r.Each(func(name string, i interface{}) { now := getCurrentTime() switch metric := i.(type) { case metrics.Counter: series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.count", name), Columns: []string{"time", "count"}, Points: [][]interface{}{ {now, metric.Count()}, }, }) case metrics.Gauge: series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.value", name), Columns: []string{"time", "value"}, Points: [][]interface{}{ {now, metric.Value()}, }, }) case metrics.GaugeFloat64: series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.value", name), Columns: []string{"time", "value"}, Points: [][]interface{}{ {now, metric.Value()}, }, }) case metrics.Histogram: h := metric.Snapshot() ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.histogram", name), Columns: []string{"time", "count", "min", "max", "mean", "std-dev", "50-percentile", "75-percentile", "95-percentile", "99-percentile", "999-percentile"}, Points: [][]interface{}{ {now, h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(), ps[0], ps[1], ps[2], ps[3], ps[4]}, }, }) case metrics.Meter: m := metric.Snapshot() series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.meter", name), Columns: []string{"count", "one-minute", "five-minute", "fifteen-minute", "mean"}, Points: [][]interface{}{ {m.Count(), m.Rate1(), m.Rate5(), m.Rate15(), m.RateMean()}, }, }) case metrics.Timer: h := metric.Snapshot() ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) series = append(series, &influxClient.Series{ Name: fmt.Sprintf("%s.timer", name), Columns: []string{"count", "min", "max", "mean", "std-dev", "50-percentile", "75-percentile", "95-percentile", "99-percentile", "999-percentile", "one-minute", "five-minute", "fifteen-minute", "mean-rate"}, Points: [][]interface{}{ {h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(), ps[0], ps[1], ps[2], ps[3], ps[4], h.Rate1(), h.Rate5(), h.Rate15(), h.RateMean()}, }, }) } }) if err := client.WriteSeries(series); err != nil { log.Println(err) } return nil }