|
|
|
@ -18,6 +18,7 @@ import (
|
|
|
|
|
"sort"
|
|
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
|
|
dto "github.com/prometheus/client_model/go"
|
|
|
|
|
"github.com/prometheus/common/expfmt"
|
|
|
|
|
"github.com/prometheus/common/log"
|
|
|
|
@ -27,6 +28,13 @@ import (
|
|
|
|
|
"github.com/prometheus/prometheus/storage/metric"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
federationErrors = prometheus.NewCounter(prometheus.CounterOpts{
|
|
|
|
|
Name: "prometheus_web_federation_errors_total",
|
|
|
|
|
Help: "Total number of errors that occurred while sending federation responses.",
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
h.mtx.RLock()
|
|
|
|
|
defer h.mtx.RUnlock()
|
|
|
|
@ -52,6 +60,7 @@ func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
|
|
|
|
|
q, err := h.storage.Querier()
|
|
|
|
|
if err != nil {
|
|
|
|
|
federationErrors.Inc()
|
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
@ -59,6 +68,7 @@ func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
|
|
|
|
|
vector, err := q.LastSampleForLabelMatchers(h.context, minTimestamp, matcherSets...)
|
|
|
|
|
if err != nil {
|
|
|
|
|
federationErrors.Inc()
|
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
@ -92,6 +102,7 @@ func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
// creating the new one.
|
|
|
|
|
if protMetricFam != nil {
|
|
|
|
|
if err := enc.Encode(protMetricFam); err != nil {
|
|
|
|
|
federationErrors.Inc()
|
|
|
|
|
log.With("err", err).Error("federation failed")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
@ -133,6 +144,7 @@ func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
// Still have to ship off the last MetricFamily, if any.
|
|
|
|
|
if protMetricFam != nil {
|
|
|
|
|
if err := enc.Encode(protMetricFam); err != nil {
|
|
|
|
|
federationErrors.Inc()
|
|
|
|
|
log.With("err", err).Error("federation failed")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|