Skip to content

Commit

Permalink
feat: emit more data in prom metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
dhanusaputra committed Apr 1, 2023
1 parent d31a30f commit 899aa26
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 9 deletions.
8 changes: 4 additions & 4 deletions server/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ func startStandAlone(svrCtx *Context, appCreator types.AppCreator) error {
return err
}

if _, err := startTelemetry(config); err != nil {
if _, err := startTelemetry(config, home); err != nil {
return err
}

Expand Down Expand Up @@ -349,7 +349,7 @@ func startInProcess(svrCtx *Context, clientCtx client.Context, appCreator types.
app.RegisterNodeService(clientCtx)
}

metrics, err := startTelemetry(config)
metrics, err := startTelemetry(config, home)
if err != nil {
return err
}
Expand Down Expand Up @@ -462,12 +462,12 @@ func startInProcess(svrCtx *Context, clientCtx client.Context, appCreator types.
return g.Wait()
}

func startTelemetry(cfg serverconfig.Config) (*telemetry.Metrics, error) {
func startTelemetry(cfg serverconfig.Config, rootDir string) (*telemetry.Metrics, error) {
if !cfg.Telemetry.Enabled {
return nil, nil
}

return telemetry.New(cfg.Telemetry)
return telemetry.New(cfg.Telemetry, rootDir)
}

// wrapCPUProfile starts CPU profiling, if enabled, and executes the provided
Expand Down
46 changes: 45 additions & 1 deletion telemetry/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ import (
"bytes"
"encoding/json"
"fmt"
"os"
"path/filepath"
"strconv"
"time"

"github.com/armon/go-metrics"
metricsprom "github.com/armon/go-metrics/prometheus"
"github.com/cosmos/cosmos-sdk/version"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/expfmt"
)
Expand Down Expand Up @@ -71,7 +75,7 @@ type GatherResponse struct {
}

// New creates a new instance of Metrics
func New(cfg Config) (_ *Metrics, rerr error) {
func New(cfg Config, rootDir string) (_ *Metrics, rerr error) {
if !cfg.Enabled {
return nil, nil
}
Expand All @@ -84,6 +88,7 @@ func New(cfg Config) (_ *Metrics, rerr error) {

globalLabels = parsedGlobalLabels
}
globalLabels = append(globalLabels, getDefaultGlobalLabels(rootDir)...)

metricsConf := metrics.DefaultConfig(cfg.ServiceName)
metricsConf.EnableHostname = cfg.EnableHostname
Expand Down Expand Up @@ -176,3 +181,42 @@ func (m *Metrics) gatherGeneric() (GatherResponse, error) {

return GatherResponse{ContentType: "application/json", Metrics: content}, nil
}

func getDefaultGlobalLabels(rootDir string) []metrics.Label {
var ls []metrics.Label

versionInfo := version.NewInfo()
if len(versionInfo.GoVersion) > 0 {
ls = append(ls, NewLabel("go", versionInfo.GoVersion))
}
if len(versionInfo.CosmosSdkVersion) > 0 {
ls = append(ls, NewLabel("version", versionInfo.CosmosSdkVersion))
}

upgradeInfoPath := filepath.Join(rootDir, "data", "upgrade-info.json") // the path is the expected upgrade-info filename created by `x/upgrade/keeper`.
if upgradeInfo, err := getUpgradeInfo(upgradeInfoPath); err == nil {
ls = append(ls, NewLabel("upgrade_height", strconv.FormatInt(upgradeInfo.Height, 10)))
}

return ls
}

type plan struct {
Name string `json:"name,omitempty"`
Height int64 `json:"height,omitempty"`
Info string `json:"info,omitempty"`
}

func getUpgradeInfo(path string) (plan, error) {
data, err := os.ReadFile(path)
if err != nil {
return plan{}, err
}

var upgradeInfo plan
if err := json.Unmarshal(data, &upgradeInfo); err != nil {
return plan{}, err
}

return upgradeInfo, nil
}
88 changes: 85 additions & 3 deletions telemetry/metrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import (
"time"

"github.com/armon/go-metrics"
"github.com/cosmos/cosmos-sdk/version"
"github.com/prometheus/common/expfmt"
"github.com/stretchr/testify/require"
)

func TestMetrics_Disabled(t *testing.T) {
m, err := New(Config{Enabled: false})
m, err := New(Config{Enabled: false}, "")
require.Nil(t, m)
require.Nil(t, err)
}
Expand All @@ -22,7 +23,7 @@ func TestMetrics_InMem(t *testing.T) {
Enabled: true,
EnableHostname: false,
ServiceName: "test",
})
}, "")
require.NoError(t, err)
require.NotNil(t, m)

Expand All @@ -47,7 +48,7 @@ func TestMetrics_Prom(t *testing.T) {
ServiceName: "test",
PrometheusRetentionTime: 60,
EnableHostnameLabel: false,
})
}, "")
require.NoError(t, err)
require.NotNil(t, m)
require.True(t, m.prometheusEnabled)
Expand All @@ -74,3 +75,84 @@ func emitMetrics() {
}
}
}

func TestMetrics_getDefaultGlobalLabels(t *testing.T) {
type args struct {
rootDir string
}
tests := []struct {
name string
args args
versionInfo version.Info
want []metrics.Label
}{
{
name: "happy path",
args: args{
rootDir: "./testdata/valid",
},
versionInfo: version.Info{
GoVersion: "go version go1.14 linux/amd64",
CosmosSdkVersion: "0.42.5",
},
want: []metrics.Label{
NewLabel("go", "go version go1.14 linux/amd64"),
NewLabel("version", "0.42.5"),
NewLabel("upgrade_height", "123"),
},
},
{
name: "empty versionInfo",
args: args{
rootDir: "./testdata/valid",
},
want: []metrics.Label{
NewLabel("upgrade_height", "123"),
},
},
{
name: "upgrade-info.json is not available",
args: args{
rootDir: "./home",
},
versionInfo: version.Info{
GoVersion: "go version go1.14 linux/amd64",
CosmosSdkVersion: "0.42.5",
},
want: []metrics.Label{
NewLabel("go", "go version go1.14 linux/amd64"),
NewLabel("version", "0.42.5"),
},
},
{
name: "upgrade-info.json unmarshal failed",
args: args{
rootDir: "./testdata/invalid",
},
versionInfo: version.Info{
GoVersion: "go version go1.14 linux/amd64",
CosmosSdkVersion: "0.42.5",
},
want: []metrics.Label{
NewLabel("go", "go version go1.14 linux/amd64"),
NewLabel("version", "0.42.5"),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mockVersionNewInfo(t, tt.versionInfo)
require.ElementsMatch(t, tt.want, getDefaultGlobalLabels(tt.args.rootDir))
})
}
}

func mockVersionNewInfo(t *testing.T, newInfo version.Info) {
oriNewInfo := version.NewInfo
version.NewInfo = func() version.Info {
return newInfo
}
t.Cleanup(func() {
version.NewInfo = oriNewInfo
})
}
Empty file.
1 change: 1 addition & 0 deletions telemetry/testdata/valid/data/upgrade-info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name": "upgrade1", "info": "some info", "height": 123}
2 changes: 1 addition & 1 deletion version/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ type Info struct {
CosmosSdkVersion string `json:"cosmos_sdk_version" yaml:"cosmos_sdk_version"`
}

func NewInfo() Info {
var NewInfo = func() Info {
sdkVersion := getSDKVersion()
return Info{
Name: Name,
Expand Down

0 comments on commit 899aa26

Please sign in to comment.