mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
*: Change gRPC proxy to expose etcd server endpoint /metrics
This PR resolves an issue where the `/metrics` endpoints exposed by the proxy were not returning metrics of the etcd members servers but of the proxy itself. Signed-off-by: Sam Batschelet <sbatsche@redhat.com>
This commit is contained in:
committed by
Sam Batschelet
parent
cc08c1bd2e
commit
9915d02022
@@ -14,7 +14,17 @@
|
||||
|
||||
package grpcproxy
|
||||
|
||||
import "github.com/prometheus/client_golang/prometheus"
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"go.etcd.io/etcd/etcdserver/api/etcdhttp"
|
||||
)
|
||||
|
||||
var (
|
||||
watchersCoalescing = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
@@ -56,3 +66,49 @@ func init() {
|
||||
prometheus.MustRegister(cacheHits)
|
||||
prometheus.MustRegister(cachedMisses)
|
||||
}
|
||||
|
||||
// HandleMetrics performs a GET request against etcd endpoint and returns '/metrics'.
|
||||
func HandleMetrics(mux *http.ServeMux, c *http.Client, eps []string) {
|
||||
// random shuffle endpoints
|
||||
r := rand.New(rand.NewSource(int64(time.Now().Nanosecond())))
|
||||
if len(eps) > 1 {
|
||||
eps = shuffleEndpoints(r, eps)
|
||||
}
|
||||
|
||||
pathMetrics := etcdhttp.PathMetrics
|
||||
mux.HandleFunc(pathMetrics, func(w http.ResponseWriter, r *http.Request) {
|
||||
target := fmt.Sprintf("%s%s", eps[0], pathMetrics)
|
||||
if !strings.HasPrefix(target, "http") {
|
||||
scheme := "http"
|
||||
if r.TLS != nil {
|
||||
scheme = "https"
|
||||
}
|
||||
target = fmt.Sprintf("%s://%s", scheme, target)
|
||||
}
|
||||
|
||||
resp, err := c.Get(target)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
w.Header().Set("Content-Type", "text/plain; version=0.0.4")
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
fmt.Fprintf(w, "%s", body)
|
||||
})
|
||||
}
|
||||
|
||||
func shuffleEndpoints(r *rand.Rand, eps []string) []string {
|
||||
// copied from Go 1.9<= rand.Rand.Perm
|
||||
n := len(eps)
|
||||
p := make([]int, n)
|
||||
for i := 0; i < n; i++ {
|
||||
j := r.Intn(i + 1)
|
||||
p[i] = p[j]
|
||||
p[j] = i
|
||||
}
|
||||
neps := make([]string, n)
|
||||
for i, k := range p {
|
||||
neps[i] = eps[k]
|
||||
}
|
||||
return neps
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user