Use common/expfmt in federation
This commit is contained in:
parent
11a577fcd0
commit
47aa0d536c
|
@ -1,18 +1,15 @@
|
||||||
package web
|
package web
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"bitbucket.org/ww/goautoneg"
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"github.com/prometheus/client_golang/text"
|
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/promql"
|
"github.com/prometheus/prometheus/promql"
|
||||||
"github.com/prometheus/prometheus/storage/local"
|
"github.com/prometheus/prometheus/storage/local"
|
||||||
|
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
"github.com/prometheus/common/expfmt"
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -36,8 +33,10 @@ func (fed *Federation) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enc, contentType := chooseEncoder(req)
|
format := expfmt.Negotiate(req.Header)
|
||||||
w.Header().Set("Content-Type", contentType)
|
w.Header().Set("Content-Type", string(format))
|
||||||
|
|
||||||
|
enc := expfmt.NewEncoder(w, format)
|
||||||
|
|
||||||
protMetric := &dto.Metric{
|
protMetric := &dto.Metric{
|
||||||
Label: []*dto.LabelPair{},
|
Label: []*dto.LabelPair{},
|
||||||
|
@ -70,39 +69,10 @@ func (fed *Federation) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
protMetric.TimestampMs = (*int64)(&sp.Timestamp)
|
protMetric.TimestampMs = (*int64)(&sp.Timestamp)
|
||||||
protMetric.Untyped.Value = (*float64)(&sp.Value)
|
protMetric.Untyped.Value = (*float64)(&sp.Value)
|
||||||
|
|
||||||
if _, err := enc(w, protMetricFam); err != nil {
|
if err := enc.Encode(protMetricFam); err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type encoder func(w io.Writer, p *dto.MetricFamily) (int, error)
|
|
||||||
|
|
||||||
func chooseEncoder(req *http.Request) (encoder, string) {
|
|
||||||
accepts := goautoneg.ParseAccept(req.Header.Get("Accept"))
|
|
||||||
for _, accept := range accepts {
|
|
||||||
switch {
|
|
||||||
case accept.Type == "application" &&
|
|
||||||
accept.SubType == "vnd.google.protobuf" &&
|
|
||||||
accept.Params["proto"] == "io.prometheus.client.MetricFamily":
|
|
||||||
switch accept.Params["encoding"] {
|
|
||||||
case "delimited":
|
|
||||||
return text.WriteProtoDelimited, prometheus.DelimitedTelemetryContentType
|
|
||||||
case "text":
|
|
||||||
return text.WriteProtoText, prometheus.ProtoTextTelemetryContentType
|
|
||||||
case "compact-text":
|
|
||||||
return text.WriteProtoCompactText, prometheus.ProtoCompactTextTelemetryContentType
|
|
||||||
default:
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
case accept.Type == "text" &&
|
|
||||||
accept.SubType == "plain" &&
|
|
||||||
(accept.Params["version"] == "0.0.4" || accept.Params["version"] == ""):
|
|
||||||
return text.MetricFamilyToText, prometheus.TextTelemetryContentType
|
|
||||||
default:
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return text.MetricFamilyToText, prometheus.TextTelemetryContentType
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue