func (s *httpServer) graphiteHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { return nil, http_api.Err{400, "INVALID_REQUEST"} } metric, err := reqParams.Get("metric") if err != nil || metric != "rate" { return nil, http_api.Err{404, "INVALID_ARG_METRIC"} } target, err := reqParams.Get("target") if err != nil { return nil, http_api.Err{404, "INVALID_ARG_TARGET"} } params := url.Values{} params.Set("from", fmt.Sprintf("-%dsec", s.ctx.nsqadmin.opts.StatsdInterval*2/time.Second)) params.Set("until", fmt.Sprintf("-%dsec", s.ctx.nsqadmin.opts.StatsdInterval/time.Second)) params.Set("format", "json") params.Set("target", target) query := fmt.Sprintf("/render?%s", params.Encode()) url := s.ctx.nsqadmin.opts.GraphiteURL + query s.ctx.nsqadmin.logf("GRAPHITE: %s", url) var response []struct { Target string `json:"target"` DataPoints [][]*float64 `json:"datapoints"` } err = http_api.GETV1(url, &response) if err != nil { s.ctx.nsqadmin.logf("ERROR: graphite request failed - %s", err) return nil, http_api.Err{500, "INTERNAL_ERROR"} } var rateStr string rate := *response[0].DataPoints[0][0] if rate < 0 { rateStr = "N/A" } else { rateDivisor := s.ctx.nsqadmin.opts.StatsdInterval / time.Second rateStr = fmt.Sprintf("%.2f", rate/float64(rateDivisor)) } return struct { Rate string `json:"rate"` }{rateStr}, nil }
func QueryAuthd(authd, remoteIP, tlsEnabled, authSecret string) (*State, error) { v := url.Values{} v.Set("remote_ip", remoteIP) v.Set("tls", tlsEnabled) v.Set("secret", authSecret) endpoint := fmt.Sprintf("http://%s/auth?%s", authd, v.Encode()) var authState State if err := http_api.GETV1(endpoint, &authState); err != nil { return nil, err } // validation on response for _, auth := range authState.Authorizations { for _, p := range auth.Permissions { switch p { case "subscribe", "publish": default: return nil, fmt.Errorf("unknown permission %s", p) } } if _, err := regexp.Compile(auth.Topic); err != nil { return nil, fmt.Errorf("unable to compile topic %q %s", auth.Topic, err) } for _, channel := range auth.Channels { if _, err := regexp.Compile(channel); err != nil { return nil, fmt.Errorf("unable to compile channel %q %s", channel, err) } } } if authState.TTL <= 0 { return nil, fmt.Errorf("invalid TTL %d (must be >0)", authState.TTL) } authState.Expires = time.Now().Add(time.Duration(authState.TTL) * time.Second) return &authState, nil }