Skip to content
Open
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
2 changes: 1 addition & 1 deletion cmd/coroot-windows-agent/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func runAgent(stop <-chan struct{}) {
TLSConfig: api.TlsConfig(*flags.CAFile, *flags.InsecureSkipVerify),
}, machineId, hostname, version)

nodeCollector := node.NewCollector(hostname, osVersion, metadata.Overrides{
nodeCollector := node.NewCollector(hostname, osVersion, version, metadata.Overrides{
Provider: flags.GetString(flags.Provider),
Region: flags.GetString(flags.Region),
AvailabilityZone: flags.GetString(flags.AvailabilityZone),
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ func main() {
TLSConfig: api.TlsConfig(*flags.CAFile, *flags.InsecureSkipVerify),
}, machineId, hostname, version)

nodeCollector := node.NewCollector(hostname, kv, metadata.Overrides{
nodeCollector := node.NewCollector(hostname, kv, version, metadata.Overrides{
Provider: flags.GetString(flags.Provider),
Region: flags.GetString(flags.Region),
AvailabilityZone: flags.GetString(flags.AvailabilityZone),
Expand Down
2 changes: 1 addition & 1 deletion metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ var (
NodeGpuTemperature = metric("node_resources_gpu_temperature_celsius", "Current temperature of the GPU in Celsius", "gpu_uuid")
NodeGpuPowerWatts = metric("node_resources_gpu_power_usage_watts", "Current power usage of the GPU in watts", "gpu_uuid")

NodeInfo = metric("node_info", "Meta information about the node", "hostname", "kernel_version")
NodeInfo = metric("node_info", "Meta information about the node", "hostname", "kernel_version", "agent_version")
NodeCloudInfo = metric("node_cloud_info", "Meta information about the cloud instance", "provider", "account_id", "instance_id", "instance_type", "instance_life_cycle", "region", "availability_zone", "availability_zone_id", "local_ipv4", "public_ipv4")
NodeUptime = metric("node_uptime_seconds", "Uptime of the node in seconds")
NodeCPUUsage = metric("node_resources_cpu_usage_seconds_total", "The amount of CPU time spent in each mode", "mode")
Expand Down
4 changes: 3 additions & 1 deletion node/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ import (
type Collector struct {
hostname string
kernelVersion string
agentVersion string
instanceMetadata *metadata.CloudMetadata
}

func NewCollector(hostname, kernelVersion string, overrides metadata.Overrides) *Collector {
func NewCollector(hostname, kernelVersion, agentVersion string, overrides metadata.Overrides) *Collector {
md := metadata.GetInstanceMetadata()
if md == nil {
md = &metadata.CloudMetadata{}
Expand All @@ -23,6 +24,7 @@ func NewCollector(hostname, kernelVersion string, overrides metadata.Overrides)
return &Collector{
hostname: hostname,
kernelVersion: kernelVersion,
agentVersion: agentVersion,
instanceMetadata: md,
}
}
Expand Down
55 changes: 55 additions & 0 deletions node/collector_agent_version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
//go:build linux

package node

import (
"strings"
"testing"

"github.com/coroot/coroot-node-agent/node/metadata"
"github.com/prometheus/client_golang/prometheus"
dto "github.com/prometheus/client_model/go"
)

// TestNodeInfoIncludesAgentVersion verifies that the node_info metric carries
// the agent_version label, as documented at
// https://docs.coroot.com/metrics/node-agent/#node_info (see issue #215).
func TestNodeInfoIncludesAgentVersion(t *testing.T) {
c := &Collector{
hostname: "test-host",
kernelVersion: "6.1.0-test",
agentVersion: "v1.2.3-test",
instanceMetadata: &metadata.CloudMetadata{},
}

ch := make(chan prometheus.Metric, 1024)
go func() {
c.Collect(ch)
close(ch)
}()

var nodeInfo *dto.Metric
for m := range ch {
if !strings.Contains(m.Desc().String(), `fqName: "node_info"`) {
continue
}
var pb dto.Metric
if err := m.Write(&pb); err != nil {
t.Fatalf("failed to write node_info metric: %v", err)
}
nodeInfo = &pb
}

if nodeInfo == nil {
t.Fatal("node_info metric was not emitted")
}

labels := map[string]string{}
for _, lp := range nodeInfo.Label {
labels[lp.GetName()] = lp.GetValue()
}

if got := labels["agent_version"]; got != "v1.2.3-test" {
t.Fatalf("node_info agent_version label = %q, want %q (all labels: %v)", got, "v1.2.3-test", labels)
}
}
2 changes: 1 addition & 1 deletion node/collector_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ type CpuUsage struct {
}

func (c *Collector) Collect(ch chan<- prometheus.Metric) {
ch <- metrics.Gauge(metrics.NodeInfo, 1, c.hostname, c.kernelVersion)
ch <- metrics.Gauge(metrics.NodeInfo, 1, c.hostname, c.kernelVersion, c.agentVersion)

v, err := uptime(procRoot)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion node/collector_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
)

func (c *Collector) Collect(ch chan<- prometheus.Metric) {
ch <- metrics.Gauge(metrics.NodeInfo, 1, c.hostname, c.kernelVersion)
ch <- metrics.Gauge(metrics.NodeInfo, 1, c.hostname, c.kernelVersion, c.agentVersion)

if up, err := host.Uptime(); err != nil {
klog.Errorln("failed to get uptime:", err)
Expand Down