github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/node/metrics.go (about)

     1  package node
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"go.opentelemetry.io/otel"
     8  	"go.opentelemetry.io/otel/attribute"
     9  	"go.opentelemetry.io/otel/metric"
    10  )
    11  
    12  var meter = otel.Meter("node")
    13  
    14  var (
    15  	timeStarted time.Time
    16  	nodeStarted bool
    17  )
    18  
    19  // WithMetrics registers node metrics.
    20  func WithMetrics() error {
    21  	nodeStartTS, err := meter.Int64ObservableGauge(
    22  		"node_start_ts",
    23  		metric.WithDescription("timestamp when the node was started"),
    24  	)
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	totalNodeRunTime, err := meter.Float64ObservableCounter(
    30  		"node_runtime_counter_in_seconds",
    31  		metric.WithDescription("total time the node has been running"),
    32  	)
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	buildInfoGauge, err := meter.Float64ObservableGauge(
    38  		"build_info",
    39  		metric.WithDescription("Celestia Node build information"),
    40  	)
    41  	if err != nil {
    42  		return err
    43  	}
    44  
    45  	callback := func(ctx context.Context, observer metric.Observer) error {
    46  		if !nodeStarted {
    47  			// Observe node start timestamp
    48  			timeStarted = time.Now()
    49  			observer.ObserveInt64(nodeStartTS, timeStarted.Unix())
    50  			nodeStarted = true
    51  		}
    52  
    53  		observer.ObserveFloat64(totalNodeRunTime, time.Since(timeStarted).Seconds())
    54  
    55  		// Observe build info with labels
    56  		labels := metric.WithAttributes(
    57  			attribute.String("build_time", buildTime),
    58  			attribute.String("last_commit", lastCommit),
    59  			attribute.String("semantic_version", semanticVersion),
    60  			attribute.String("system_version", systemVersion),
    61  			attribute.String("golang_version", golangVersion),
    62  		)
    63  
    64  		observer.ObserveFloat64(buildInfoGauge, 1, labels)
    65  
    66  		return nil
    67  	}
    68  
    69  	_, err = meter.RegisterCallback(callback, nodeStartTS, totalNodeRunTime, buildInfoGauge)
    70  
    71  	return err
    72  }