diff --git a/cmd/celestia/util.go b/cmd/celestia/util.go index a38860d1f7..85505c3a60 100644 --- a/cmd/celestia/util.go +++ b/cmd/celestia/util.go @@ -26,6 +26,12 @@ func persistentPreRunEnv(cmd *cobra.Command, nodeType node.Type, _ []string) err return err } ctx = cmdnode.WithNetwork(ctx, parsedNetwork) + ctx = cmdnode.WithNodeBuildInfo(ctx, &node.BuildInfo{ + LastCommit: lastCommit, + SemanticVersion: semanticVersion, + SystemVersion: systemVersion, + GolangVersion: golangVersion, + }) // loads existing config into the environment ctx, err = cmdnode.ParseNodeFlags(ctx, cmd, cmdnode.Network(ctx)) diff --git a/cmd/celestia/version.go b/cmd/celestia/version.go index f6fba4a007..462f17b474 100644 --- a/cmd/celestia/version.go +++ b/cmd/celestia/version.go @@ -11,6 +11,9 @@ var ( buildTime string lastCommit string semanticVersion string + + systemVersion = fmt.Sprintf("%s/%s", runtime.GOARCH, runtime.GOOS) + golangVersion = runtime.Version() ) var versionCmd = &cobra.Command{ @@ -24,6 +27,6 @@ func printBuildInfo(_ *cobra.Command, _ []string) { fmt.Printf("Semantic version: %s\n", semanticVersion) fmt.Printf("Commit: %s\n", lastCommit) fmt.Printf("Build Date: %s\n", buildTime) - fmt.Printf("System version: %s/%s\n", runtime.GOARCH, runtime.GOOS) - fmt.Printf("Golang version: %s\n", runtime.Version()) + fmt.Printf("System version: %s\n", systemVersion) + fmt.Printf("Golang version: %s\n", golangVersion) } diff --git a/cmd/env.go b/cmd/env.go index f9860a2de8..ca915d884f 100644 --- a/cmd/env.go +++ b/cmd/env.go @@ -38,6 +38,11 @@ func NodeConfig(ctx context.Context) nodebuilder.Config { return cfg } +// NodeInfo reads the node build inforamtion from the context. +func NodeInfo(ctx context.Context) node.BuildInfo { + return ctx.Value(buildInfo{}).(node.BuildInfo) +} + // WithNodeType sets the node type in the given context. func WithNodeType(ctx context.Context, tp node.Type) context.Context { return context.WithValue(ctx, nodeTypeKey{}, tp) @@ -73,10 +78,16 @@ func WithNodeConfig(ctx context.Context, config *nodebuilder.Config) context.Con return context.WithValue(ctx, configKey{}, *config) } +// WithNodeConfig sets the node config build information. +func WithNodeBuildInfo(ctx context.Context, info *node.BuildInfo) context.Context { + return context.WithValue(ctx, buildInfo{}, *info) +} + type ( optionsKey struct{} configKey struct{} storePathKey struct{} nodeTypeKey struct{} networkKey struct{} + buildInfo struct{} ) diff --git a/cmd/flags_misc.go b/cmd/flags_misc.go index f671840eab..4483e17201 100644 --- a/cmd/flags_misc.go +++ b/cmd/flags_misc.go @@ -262,7 +262,7 @@ func ParseMiscFlags(ctx context.Context, cmd *cobra.Command) (context.Context, e opts = append(opts, otlpmetrichttp.WithInsecure()) } - ctx = WithNodeOptions(ctx, nodebuilder.WithMetrics(opts, NodeType(ctx))) + ctx = WithNodeOptions(ctx, nodebuilder.WithMetrics(opts, NodeType(ctx), NodeInfo(ctx))) } ok, err = cmd.Flags().GetBool(p2pMetrics) diff --git a/nodebuilder/node/buildInfo.go b/nodebuilder/node/buildInfo.go new file mode 100644 index 0000000000..5f5bdde28e --- /dev/null +++ b/nodebuilder/node/buildInfo.go @@ -0,0 +1,9 @@ +package node + +// BuildInfo stores all necessary information for the current build. +type BuildInfo struct { + LastCommit string + SemanticVersion string + SystemVersion string + GolangVersion string +} diff --git a/nodebuilder/node_test.go b/nodebuilder/node_test.go index aa22b0fcc7..11b27b076a 100644 --- a/nodebuilder/node_test.go +++ b/nodebuilder/node_test.go @@ -80,6 +80,7 @@ func TestLifecycle_WithMetrics(t *testing.T) { otlpmetrichttp.WithInsecure(), }, tt.tp, + node.BuildInfo{}, ), ) require.NotNil(t, node) diff --git a/nodebuilder/settings.go b/nodebuilder/settings.go index 67a30793f8..8da9f90da6 100644 --- a/nodebuilder/settings.go +++ b/nodebuilder/settings.go @@ -62,9 +62,10 @@ func WithPyroscope(endpoint string, nodeType node.Type) fx.Option { } // WithMetrics enables metrics exporting for the node. -func WithMetrics(metricOpts []otlpmetrichttp.Option, nodeType node.Type) fx.Option { +func WithMetrics(metricOpts []otlpmetrichttp.Option, nodeType node.Type, buildInfo node.BuildInfo) fx.Option { baseComponents := fx.Options( fx.Supply(metricOpts), + fx.Supply(buildInfo), fx.Invoke(initializeMetrics), fx.Invoke(state.WithMetrics), fx.Invoke(fraud.WithMetrics), @@ -109,6 +110,7 @@ func initializeMetrics( lc fx.Lifecycle, peerID peer.ID, nodeType node.Type, + buildInfo node.BuildInfo, opts []otlpmetrichttp.Option, ) error { exp, err := otlpmetrichttp.New(ctx, opts...) @@ -120,17 +122,15 @@ func initializeMetrics( metric.WithReader(metric.NewPeriodicReader(exp, metric.WithTimeout(2*time.Second))), metric.WithResource(resource.NewWithAttributes( semconv.SchemaURL, - semconv.ServiceNameKey.String(fmt.Sprintf("Celestia-%s", nodeType.String())), - // TODO(@Wondertan): Versioning: semconv.ServiceVersionKey + semconv.ServiceNamespaceKey.String(fmt.Sprintf("Celestia-%s", nodeType.String())), + semconv.ServiceNameKey.String(fmt.Sprintf("semver-%s", buildInfo.SemanticVersion)), semconv.ServiceInstanceIDKey.String(peerID.String()), ))) - lc.Append(fx.Hook{ OnStop: func(ctx context.Context) error { return provider.Shutdown(ctx) }, }) global.SetMeterProvider(provider) - return nil }