Skip to content
This repository has been archived by the owner on Sep 23, 2024. It is now read-only.

Add prometheus boilerplate #13

Merged
merged 5 commits into from
Nov 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 73 additions & 7 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,31 @@ package main

import (
"context"
"errors"
"fmt"
"math/big"
"net/http"
"os"
"os/signal"
"time"

beethoven "github.com/0xPolygon/beethoven"
"github.com/0xPolygon/beethoven/config"
"github.com/0xPolygon/beethoven/db"
"github.com/0xPolygon/beethoven/etherman"
"github.com/0xPolygon/beethoven/rpc"
"github.com/0xPolygon/cdk-data-availability/dummyinterfaces"
dbConf "github.com/0xPolygon/cdk-validium-node/db"
"github.com/0xPolygon/cdk-validium-node/ethtxmanager"
"github.com/0xPolygon/cdk-validium-node/jsonrpc"
"github.com/0xPolygon/cdk-validium-node/log"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/crypto"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/urfave/cli/v2"

"github.com/0xPolygon/beethoven/config"
"github.com/0xPolygon/beethoven/db"
"github.com/0xPolygon/beethoven/etherman"
"github.com/0xPolygon/beethoven/pkg/network"
"github.com/0xPolygon/beethoven/rpc"
)

const appName = "cdk-beethoven"
Expand Down Expand Up @@ -60,6 +67,7 @@ func start(cliCtx *cli.Context) error {
if err != nil {
panic(err)
}

setupLog(c.Log)

// Load private key
Expand All @@ -74,7 +82,7 @@ func start(cliCtx *cli.Context) error {
if err != nil {
log.Fatal(err)
}
if err := db.RunMigrationsUp(pg); err != nil {
if err = db.RunMigrationsUp(pg); err != nil {
log.Fatal(err)
}
storage := db.New(pg)
Expand Down Expand Up @@ -117,17 +125,73 @@ func start(cliCtx *cli.Context) error {
log.Fatal(err)
}
}()

// Run EthTxMan
go etm.Start()

waitSignal(nil)
// Run prometheus server
closePrometheus, err := runPrometheusServer(c)
if err != nil {
log.Fatal(err)
}

// Stop services
waitSignal([]context.CancelFunc{
etm.Stop,
func() {
if err := server.Stop(); err != nil {
log.Error(err)
}
},
ethTxManagerStorage.Close,
closePrometheus,
})

return nil
}

func setupLog(c log.Config) {
log.Init(c)
}

func runPrometheusServer(c *config.Config) (func(), error) {
if c.Telemetry.PrometheusAddr == "" {
return nil, nil
}

addr, err := network.ResolveAddr(c.Telemetry.PrometheusAddr, network.AllInterfacesBinding)
if err != nil {
return nil, err
}

srv := &http.Server{
Addr: addr.String(),
Handler: promhttp.InstrumentMetricHandler(
prometheus.DefaultRegisterer, promhttp.HandlerFor(
prometheus.DefaultGatherer,
promhttp.HandlerOpts{},
),
),
ReadHeaderTimeout: 60 * time.Second,
}

log.Infof("prometheus server started: %s", addr)

go func() {
if err := srv.ListenAndServe(); err != nil {
if !errors.Is(err, http.ErrServerClosed) {
log.Errorf("prometheus HTTP server ListenAndServe: %w", err)
}
}
}()

return func() {
if err := srv.Close(); err != nil {
log.Errorf("prometheus HTTP server closing failed: %w", err)
}
}, nil
}

func waitSignal(cancelFuncs []context.CancelFunc) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, os.Interrupt)
Expand All @@ -139,7 +203,9 @@ func waitSignal(cancelFuncs []context.CancelFunc) {

exitStatus := 0
for _, cancel := range cancelFuncs {
cancel()
if cancel != nil {
cancel()
}
}
os.Exit(exitStatus)
}
Expand Down
5 changes: 5 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,18 @@ type Config struct {
DB db.Config `mapstructure:"DB"`
EthTxManager ethtxmanager.Config `mapstructure:"EthTxManager"`
L1 L1Config `mapstructure:"L1"`
Telemetry Telemetry `mapstructure:"Telemetry"`
}

type L1Config struct {
ChainID int64
NodeURL string
}

type Telemetry struct {
PrometheusAddr string
}

// Load loads the configuration baseed on the cli context
func Load(ctx *cli.Context) (*Config, error) {
cfg, err := Default()
Expand Down
3 changes: 3 additions & 0 deletions config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ PrivateKeys = [
[L1]
ChainID = 1337
NodeURL = "http://l1:8545"

[Telemetry]
PrometheusAddr = "0.0.0.0:2223"
`

// Default parses the default configuration values.
Expand Down
5 changes: 4 additions & 1 deletion docker/data/beethoven/beethoven.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,7 @@ PrivateKeys = [

[L1]
ChainID = 1337
NodeURL = "http://l1:8545"
NodeURL = "http://l1:8545"

[Telemetry]
PrometheusAddr = "0.0.0.0:2223"
1 change: 1 addition & 0 deletions docker/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ services:
condition: service_healthy
ports:
- '8444:8444'
- '2223:2223'
volumes:
- ./data/beethoven/beethoven.keystore:/pk/beethoven.keystore
- ./data/beethoven/beethoven.toml:/config/beethoven.toml
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (
github.com/gobuffalo/packr/v2 v2.8.3
github.com/jackc/pgx/v4 v4.18.1
github.com/mitchellh/mapstructure v1.5.0
github.com/prometheus/client_golang v1.16.0
github.com/rubenv/sql-migrate v1.5.2
github.com/spf13/viper v1.17.0
github.com/stretchr/testify v1.8.4
Expand Down Expand Up @@ -82,7 +83,6 @@ require (
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.16.0 // indirect
github.com/prometheus/client_model v0.4.0 // indirect
github.com/prometheus/common v0.44.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
Expand Down
25 changes: 25 additions & 0 deletions pkg/network/network.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package network

import (
"fmt"
"net"
)

const (
AllInterfacesBinding = "0.0.0.0"
)

// ResolveAddr resolves the passed in TCP address
// The second param is the default ip to bind to, if no ip address is specified
func ResolveAddr(address string, defaultIp string) (*net.TCPAddr, error) {
addr, err := net.ResolveTCPAddr("tcp", address)
if err != nil {
return nil, fmt.Errorf("failed to parse addr '%s': %w", address, err)
}

if addr.IP == nil {
addr.IP = net.ParseIP(defaultIp)
}

return addr, nil
}