|
|
|
|
@ -93,6 +93,9 @@ func (api *API) Register(r *route.Router) { |
|
|
|
|
r.Get("/query_range", instr("query_range", api.queryRange)) |
|
|
|
|
|
|
|
|
|
r.Get("/label/:name/values", instr("label_values", api.labelValues)) |
|
|
|
|
|
|
|
|
|
r.Get("/series", instr("series", api.series)) |
|
|
|
|
r.Del("/series", instr("drop_series", api.dropSeries)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type queryData struct { |
|
|
|
|
@ -180,6 +183,60 @@ func (api *API) labelValues(r *http.Request) (interface{}, *apiError) { |
|
|
|
|
return vals, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (api *API) series(r *http.Request) (interface{}, *apiError) { |
|
|
|
|
r.ParseForm() |
|
|
|
|
if len(r.Form["match[]"]) == 0 { |
|
|
|
|
return nil, &apiError{errorBadData, fmt.Errorf("no match[] parameter provided")} |
|
|
|
|
} |
|
|
|
|
fps := map[clientmodel.Fingerprint]struct{}{} |
|
|
|
|
|
|
|
|
|
for _, lm := range r.Form["match[]"] { |
|
|
|
|
matchers, err := promql.ParseMetricSelector(lm) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, &apiError{errorBadData, err} |
|
|
|
|
} |
|
|
|
|
for _, fp := range api.Storage.FingerprintsForLabelMatchers(matchers) { |
|
|
|
|
fps[fp] = struct{}{} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
metrics := make([]clientmodel.Metric, 0, len(fps)) |
|
|
|
|
for fp := range fps { |
|
|
|
|
if met := api.Storage.MetricForFingerprint(fp).Metric; met != nil { |
|
|
|
|
metrics = append(metrics, met) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return metrics, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (api *API) dropSeries(r *http.Request) (interface{}, *apiError) { |
|
|
|
|
r.ParseForm() |
|
|
|
|
if len(r.Form["match[]"]) == 0 { |
|
|
|
|
return nil, &apiError{errorBadData, fmt.Errorf("no match[] parameter provided")} |
|
|
|
|
} |
|
|
|
|
fps := map[clientmodel.Fingerprint]struct{}{} |
|
|
|
|
|
|
|
|
|
for _, lm := range r.Form["match[]"] { |
|
|
|
|
matchers, err := promql.ParseMetricSelector(lm) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, &apiError{errorBadData, err} |
|
|
|
|
} |
|
|
|
|
for _, fp := range api.Storage.FingerprintsForLabelMatchers(matchers) { |
|
|
|
|
fps[fp] = struct{}{} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for fp := range fps { |
|
|
|
|
api.Storage.DropMetricsForFingerprints(fp) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res := struct { |
|
|
|
|
NumDeleted int `json:"numDeleted"` |
|
|
|
|
}{ |
|
|
|
|
NumDeleted: len(fps), |
|
|
|
|
} |
|
|
|
|
return res, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func respond(w http.ResponseWriter, data interface{}) { |
|
|
|
|
w.WriteHeader(200) |
|
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
|
|