Skip to content

Commit

Permalink
Added optional metrics gathering via Prometheus client.
Browse files Browse the repository at this point in the history
  • Loading branch information
adewes committed Jul 23, 2021
1 parent b15c8a7 commit cc83aa2
Show file tree
Hide file tree
Showing 15 changed files with 118 additions and 20 deletions.
2 changes: 0 additions & 2 deletions cmd/eps/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,13 @@ import (
"github.com/iris-connect/eps"
"github.com/iris-connect/eps/cmd/helpers"
"github.com/iris-connect/eps/definitions"
"github.com/iris-connect/eps/metrics"
)

func main() {
if settings, err := helpers.Settings(&definitions.Default); err != nil {
eps.Log.Error(err)
return
} else {
metrics.OpenPrometheusEndpoint()
helpers.CLI(settings)
}
}
9 changes: 9 additions & 0 deletions cmd/helpers/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package helpers
import (
"github.com/iris-connect/eps"
"github.com/iris-connect/eps/helpers"
"github.com/iris-connect/eps/metrics"
"github.com/urfave/cli"
"os"
"os/signal"
Expand Down Expand Up @@ -83,6 +84,8 @@ func Server(settings *eps.Settings) ([]cli.Command, error) {
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)

metricsServer := metrics.MakePrometheusMetricsServer(settings.Metrics)

eps.Log.Info("Waiting for CTRL-C...")

<-sigchan
Expand All @@ -91,6 +94,12 @@ func Server(settings *eps.Settings) ([]cli.Command, error) {

closeChannels(channels)

if metricsServer != nil {
if err := metricsServer.Stop(); err != nil {
eps.Log.Error(err)
}
}

return nil
},
},
Expand Down
17 changes: 16 additions & 1 deletion cmd/proxy/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ func CLI(settings *proxy.Settings) {
eps.Log.Fatal(err)
}

metricsServer := metrics.MakePrometheusMetricsServer(settings.Metrics)

// we wait for CTRL-C / Interrupt
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
Expand All @@ -112,6 +114,12 @@ func CLI(settings *proxy.Settings) {
eps.Log.Fatal(err)
}

if metricsServer != nil {
if err := metricsServer.Stop(); err != nil {
eps.Log.Fatal(err)
}
}

return nil
},
},
Expand All @@ -136,6 +144,8 @@ func CLI(settings *proxy.Settings) {
eps.Log.Fatal(err)
}

metricsServer := metrics.MakePrometheusMetricsServer(settings.Metrics)

// we wait for CTRL-C / Interrupt
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
Expand All @@ -150,6 +160,12 @@ func CLI(settings *proxy.Settings) {
eps.Log.Fatal(err)
}

if metricsServer != nil {
if err := metricsServer.Stop(); err != nil {
eps.Log.Fatal(err)
}
}

return nil
},
},
Expand All @@ -172,7 +188,6 @@ func main() {
eps.Log.Error(err)
return
} else {
metrics.OpenPrometheusEndpoint()
CLI(settings)
}
}
9 changes: 8 additions & 1 deletion cmd/sd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ func CLI(settings *sd.Settings) {
eps.Log.Fatal(err)
}

metricsServer := metrics.MakePrometheusMetricsServer(settings.Metrics)

// we wait for CTRL-C / Interrupt
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
Expand All @@ -103,6 +105,12 @@ func CLI(settings *sd.Settings) {
eps.Log.Fatal(err)
}

if metricsServer != nil {
if err := metricsServer.Stop(); err != nil {
eps.Log.Fatal(err)
}
}

return nil
},
},
Expand All @@ -123,7 +131,6 @@ func main() {
eps.Log.Error(err)
return
} else {
metrics.OpenPrometheusEndpoint()
CLI(settings)
}
}
1 change: 0 additions & 1 deletion examples/eps-ls/ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ func main() {
if server, err := jsonrpc.MakeJSONRPCServer(settings, handler); err != nil {
eps.Log.Fatal(err)
} else {
metrics.OpenPrometheusEndpoint()
server.Start()

// we wait for CTRL-C / Interrupt
Expand Down
1 change: 0 additions & 1 deletion examples/internal-server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ func main() {
if server, err := http.MakeHTTPServer(settings, routeGroups); err != nil {
eps.Log.Fatal(err)
} else {
metrics.OpenPrometheusEndpoint()
server.Start()

// we wait for CTRL-C / Interrupt
Expand Down
20 changes: 20 additions & 0 deletions forms/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,17 @@ var ChannelForm = forms.Form{
},
}

var MetricsSettingsForm = forms.Form{
Fields: []forms.Field{
{
Name: "bind_address",
Validators: []forms.Validator{
forms.IsString{},
},
},
},
}

var SettingsForm = forms.Form{
Fields: []forms.Field{
{
Expand All @@ -80,6 +91,15 @@ var SettingsForm = forms.Form{
},
},
},
{
Name: "metrics",
Validators: []forms.Validator{
forms.IsOptional{},
forms.IsStringMap{
Form: &MetricsSettingsForm,
},
},
},
{
Name: "signing",
Validators: []forms.Validator{
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/protocolbuffers/protobuf v3.15.8+incompatible/go.mod h1:DdhgU1nye99PVSHQwKVPGBaTs902wvndr/KhlFhJxmw=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
Expand Down Expand Up @@ -189,6 +190,7 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
Expand Down
46 changes: 32 additions & 14 deletions metrics/metrics.go
Original file line number Diff line number Diff line change
@@ -1,29 +1,47 @@
package metrics

import (
"fmt"
"context"
"github.com/iris-connect/eps"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"os"
"time"
)

const (
prometheusPort = 2112
prometheusPath = "/metrics"
)
type PrometheusMetricsServer struct {
server *http.Server
}

func MakePrometheusMetricsServer(settings *eps.MetricsSettings) *PrometheusMetricsServer {

func OpenPrometheusEndpoint() {
if os.Getenv("METRICS_ENABLED") != "true" {
return
if settings == nil {
return nil
}

p := &PrometheusMetricsServer{
server: &http.Server{Addr: settings.BindAddress, Handler: promhttp.Handler()},
}

eps.Log.Infof("Serving metrics on %s...", settings.BindAddress)

go func() {
eps.Log.Infof("Starting Prometheus listener at http://localhost:%d%s", prometheusPort, prometheusPath)
http.Handle(prometheusPath, promhttp.Handler())
err := http.ListenAndServe(fmt.Sprintf(":%d", prometheusPort), nil)
if err != nil {
eps.Log.Error("Could not open prometheus endpoint: ", err)
if err := p.server.ListenAndServe(); err != nil {
if err != http.ErrServerClosed {
eps.Log.Error(err)
}
}
}()

return p
}

func (p *PrometheusMetricsServer) Stop() error {

eps.Log.Info("Shutting down Prometheus metrics server...")

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
return p.server.Shutdown(ctx)

return nil
}
10 changes: 10 additions & 0 deletions proxy/forms.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package proxy

import (
"fmt"
epsForms "github.com/iris-connect/eps/forms"
"github.com/iris-connect/eps/jsonrpc"
"github.com/iris-connect/eps/tls"
"github.com/kiprotect/go-helpers/forms"
Expand All @@ -41,6 +42,15 @@ var DirectorySettingsForm = forms.Form{

var SettingsForm = forms.Form{
Fields: []forms.Field{
{
Name: "metrics",
Validators: []forms.Validator{
forms.IsOptional{},
forms.IsStringMap{
Form: &epsForms.MetricsSettingsForm,
},
},
},
{
Name: "public",
Validators: []forms.Validator{
Expand Down
2 changes: 2 additions & 0 deletions proxy/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package proxy

import (
"github.com/iris-connect/eps"
"github.com/iris-connect/eps/jsonrpc"
"github.com/iris-connect/eps/tls"
"time"
Expand All @@ -28,6 +29,7 @@ const (
)

type Settings struct {
Metrics *eps.MetricsSettings `json:"metrics"`
Private *PrivateServerSettings `json:"private"`
Public *PublicServerSettings `json:"public"`
}
Expand Down
10 changes: 10 additions & 0 deletions sd/forms.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,22 @@
package sd

import (
epsForms "github.com/iris-connect/eps/forms"
"github.com/iris-connect/eps/jsonrpc"
"github.com/kiprotect/go-helpers/forms"
)

var RecordDirectorySettingsForm = forms.Form{
Fields: []forms.Field{
{
Name: "metrics",
Validators: []forms.Validator{
forms.IsOptional{},
forms.IsStringMap{
Form: &epsForms.MetricsSettingsForm,
},
},
},
{
Name: "ca_certificate_files",
Validators: []forms.Validator{
Expand Down
2 changes: 2 additions & 0 deletions sd/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
package sd

import (
"github.com/iris-connect/eps"
"github.com/iris-connect/eps/jsonrpc"
)

type Settings struct {
Metrics *eps.MetricsSettings `json:"metrics"`
JSONRPCServer *jsonrpc.JSONRPCServerSettings `json:"jsonrpc_server`
Directory *RecordDirectorySettings `json:"directory"`
}
5 changes: 5 additions & 0 deletions settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,16 @@ type SigningSettings struct {
KeyFile string `json:"key_file"`
}

type MetricsSettings struct {
BindAddress string `json:"bind_address"`
}

type Settings struct {
Signing *SigningSettings `json:"signing"`
Definitions *Definitions `json:"definitions"`
Channels []*ChannelSettings `json:"channels"`
Directory *DirectorySettings `json:"directory"`
Metrics *MetricsSettings `json:"metrics"`
Name string `json:"name"`
}

Expand Down
2 changes: 2 additions & 0 deletions settings/dev/roles/hd-1/001_default.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
name: hd-1
metrics:
bind_address: "localhost:2112"
directory:
# to use the JSON directory, uncomment this and comment everything below...
# type: json
Expand Down

0 comments on commit cc83aa2

Please sign in to comment.