func (rp *relayProxy) ServeHTTP(responseWriter http.ResponseWriter, r *http.Request) { clean := func(s string) string { return opentsdb.MustReplace(s, "_") } reader := &passthru{ReadCloser: r.Body} r.Body = reader w := &relayWriter{ResponseWriter: responseWriter} rp.ReverseProxy.ServeHTTP(w, r) indexTSDB(r, reader.buf.Bytes()) tags := opentsdb.TagSet{"path": clean(r.URL.Path), "remote": clean(strings.Split(r.RemoteAddr, ":")[0])} collect.Add("relay.bytes", tags, int64(reader.buf.Len())) tags["status"] = strconv.Itoa(w.code) collect.Add("relay.response", tags, 1) }
func indexTSDB(r *http.Request, body []byte) { clean := func(s string) string { return opentsdb.MustReplace(s, "_") } if r, err := gzip.NewReader(bytes.NewReader(body)); err == nil { body, _ = ioutil.ReadAll(r) r.Close() } var dp opentsdb.DataPoint var mdp opentsdb.MultiDataPoint if err := json.Unmarshal(body, &mdp); err == nil { } else if err = json.Unmarshal(body, &dp); err == nil { mdp = opentsdb.MultiDataPoint{&dp} } if len(mdp) > 0 { ra := strings.Split(r.RemoteAddr, ":")[0] tags := opentsdb.TagSet{"remote": clean(ra)} collect.Add("search.puts_relayed", tags, 1) collect.Add("search.datapoints_relayed", tags, int64(len(mdp))) schedule.Search.Index(mdp) } }