Skip to content

Commit

Permalink
embed: configure 'ListenMetricsUrls'
Browse files Browse the repository at this point in the history
Signed-off-by: Gyu-Ho Lee <gyuhox@gmail.com>
  • Loading branch information
gyuho committed Jul 12, 2017
1 parent fd3516f commit 99c1ef6
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
21 changes: 17 additions & 4 deletions embed/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,12 @@ type Config struct {

// debug

Debug bool `json:"debug"`
LogPkgLevels string `json:"log-package-levels"`
EnablePprof bool
Metrics string `json:"metrics"`
Debug bool `json:"debug"`
LogPkgLevels string `json:"log-package-levels"`
EnablePprof bool
Metrics string `json:"metrics"`
ListenMetricsUrls []url.URL
ListenMetricsUrlsJSON string `json:"listen-metrics-urls"`

// ForceNewCluster starts a new cluster even if previously started; unsafe.
ForceNewCluster bool `json:"force-new-cluster"`
Expand Down Expand Up @@ -255,6 +257,14 @@ func (cfg *configYAML) configFromFile(path string) error {
cfg.ACUrls = []url.URL(u)
}

if cfg.ListenMetricsUrlsJSON != "" {
u, err := types.NewURLs(strings.Split(cfg.ListenMetricsUrlsJSON, ","))
if err != nil {
plog.Fatalf("unexpected error setting up listen-metrics-urls: %v", err)
}
cfg.ListenMetricsUrls = []url.URL(u)
}

// If a discovery flag is set, clear default initial cluster set by InitialClusterFromName
if (cfg.Durl != "" || cfg.DNSCluster != "") && cfg.InitialCluster == defaultInitialCluster {
cfg.InitialCluster = ""
Expand Down Expand Up @@ -285,6 +295,9 @@ func (cfg *Config) Validate() error {
if err := checkBindURLs(cfg.LCUrls); err != nil {
return err
}
if err := checkBindURLs(cfg.ListenMetricsUrls); err != nil {
return err
}

// Check if conflicting flags are passed.
nSet := 0
Expand Down
37 changes: 34 additions & 3 deletions embed/etcd.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
defaultLog "log"
"net"
"net/http"
"net/url"
"path/filepath"
"sync"
"time"
Expand All @@ -35,6 +36,7 @@ import (
"github.com/coreos/etcd/pkg/types"
"github.com/coreos/etcd/rafthttp"
"github.com/coreos/pkg/capnslog"
"github.com/prometheus/client_golang/prometheus"
)

var plog = capnslog.NewPackageLogger("github.com/coreos/etcd", "embed")
Expand All @@ -55,9 +57,10 @@ const (

// Etcd contains a running etcd server and its listeners.
type Etcd struct {
Peers []*peerListener
Clients []net.Listener
Server *etcdserver.EtcdServer
Peers []*peerListener
Clients []net.Listener
metricsListeners []net.Listener
Server *etcdserver.EtcdServer

cfg Config
stopc chan struct{}
Expand Down Expand Up @@ -205,6 +208,11 @@ func (e *Etcd) Close() {
e.Clients[i].Close()
}
}
for i := range e.metricsListeners {
if e.metricsListeners[i] != nil {
e.metricsListeners[i].Close()
}
}

// close rafthttp transports
if e.Server != nil {
Expand Down Expand Up @@ -400,6 +408,29 @@ func (e *Etcd) serve() (err error) {
e.errHandler(s.serve(e.Server, &e.cfg.ClientTLSInfo, h, e.errHandler))
}(sctx)
}

if len(e.cfg.ListenMetricsUrls) > 0 {
// TODO: maybe etcdhttp.MetricsPath or get the path from the user-provided URL
metricsMux := http.NewServeMux()
metricsMux.Handle("/metrics", prometheus.Handler())

for _, murl := range e.cfg.ListenMetricsUrls {
if murl.Scheme == "https" {
murl.Scheme = "http"
plog.Warningf("serving non-secured '/metrics' for %s", murl.String())
}
ml, err := transport.NewListener(murl.Host, murl.Scheme, nil)
if err != nil {
return err
}
e.metricsListeners = append(e.metricsListeners, ml)
go func(u url.URL, ln net.Listener) {
plog.Info("listening for metrics on ", u.String())
e.errHandler(http.Serve(ln, metricsMux))
}(murl, ml)
}
}

return nil
}

Expand Down

0 comments on commit 99c1ef6

Please sign in to comment.