Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/pkg/querier/http.go

79 lines
1.6 KiB

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
}
}