package net
import (
"fmt"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/weaveworks/common/logging"
weaveworks "github.com/weaveworks/common/server"
)
type TargetServer struct {
logger log.Logger
config *weaveworks.Config
metricsNamespace string
server *weaveworks.Server
}
func NewTargetServer(logger log.Logger, metricsNamespace string, reg prometheus.Registerer, config *ServerConfig) (*TargetServer, error) {
if !model.IsValidMetricName(model.LabelValue(metricsNamespace)) {
return nil, fmt.Errorf("metrics namespace is not prometheus compatiible: %s", metricsNamespace)
}
ts := &TargetServer{
logger: logger,
metricsNamespace: metricsNamespace,
}
if config == nil {
config = &ServerConfig{}
}
serverCfg := config.Convert()
serverCfg.ExcludeRequestInLog = true
serverCfg.Registerer = reg
ts.config = &serverCfg
ts.config.MetricsNamespace = ts.metricsNamespace
ts.config.RegisterInstrumentation = false
ts.config.Log = logging.GoKit(ts.logger)
return ts, nil
}
func (ts *TargetServer) MountAndRun(mountRoute func(router *mux.Router)) error {
level.Info(ts.logger).Log("msg", "starting server")
srv, err := weaveworks.New(*ts.config)
if err != nil {
return err
}
ts.server = srv
mountRoute(ts.server.HTTP)
go func() {
err := srv.Run()
if err != nil {
level.Error(ts.logger).Log("msg", "server shutdown with error", "err", err)
}
}()
return nil
}
func (ts *TargetServer) HTTPListenAddr() string {
return ts.server.HTTPListenAddr().String()
}
func (ts *TargetServer) GRPCListenAddr() string {
return ts.server.GRPCListenAddr().String()
}
func (ts *TargetServer) StopAndShutdown() {
ts.server.Stop()
ts.server.Shutdown()
}