package querier import ( "encoding/json" "net/http" "net/url" "strconv" "time" "github.com/grafana/logish/pkg/logproto" ) const ( defaultQueryLimit = 100 defaulSince = 1 * time.Hour ) func intParam(values url.Values, name string, def int) (int, error) { value := values.Get("limit") if value == "" { return def, nil } return strconv.Atoi(value) } func unixTimeParam(values url.Values, name string, def time.Time) (time.Time, error) { value := values.Get("limit") if value == "" { return def, nil } secs, err := strconv.ParseInt(value, 10, 64) if err != nil { return time.Time{}, err } return time.Unix(secs, 0), nil } func (q *Querier) QueryHandler(w http.ResponseWriter, r *http.Request) { params := r.URL.Query() query := params.Get("query") limit, err := intParam(params, "limit", defaultQueryLimit) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } now := time.Now() start, err := unixTimeParam(params, "start", now.Add(-defaulSince)) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } end, err := unixTimeParam(params, "end", now) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } request := logproto.QueryRequest{ Query: query, Limit: uint32(limit), Start: start, End: end, } result, err := q.Query(r.Context(), &request) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } if err := json.NewEncoder(w).Encode(result); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } }