Forward OS/Kernel version to checkpoint

Useful to prioritize ebpf testing

Also:
* Make treatment of kernel release and version consistent across Darwin/Linux
This commit is contained in:
Alfonso Acosta
2016-12-19 13:27:17 +00:00
parent e70f2b98c0
commit 06ff64d477
9 changed files with 48 additions and 26 deletions

View File

@@ -1,6 +1,7 @@
package host package host
import ( import (
"fmt"
"net" "net"
"runtime" "runtime"
"sync" "sync"
@@ -120,10 +121,11 @@ func (r *Reporter) Report() (report.Report, error) {
return rep, err return rep, err
} }
kernel, err := GetKernelVersion() kernelRelease, kernelVersion, err := GetKernelReleaseAndVersion()
if err != nil { if err != nil {
return rep, err return rep, err
} }
kernel := fmt.Sprintf("%s %s", kernelRelease, kernelVersion)
rep.Host = rep.Host.WithMetadataTemplates(MetadataTemplates) rep.Host = rep.Host.WithMetadataTemplates(MetadataTemplates)
rep.Host = rep.Host.WithMetricTemplates(MetricTemplates) rep.Host = rep.Host.WithMetricTemplates(MetricTemplates)

View File

@@ -34,22 +34,22 @@ func TestReporter(t *testing.T) {
defer mtime.NowReset() defer mtime.NowReset()
var ( var (
oldGetKernelVersion = host.GetKernelVersion oldGetKernelReleaseAndVersion = host.GetKernelReleaseAndVersion
oldGetLoad = host.GetLoad oldGetLoad = host.GetLoad
oldGetUptime = host.GetUptime oldGetUptime = host.GetUptime
oldGetCPUUsagePercent = host.GetCPUUsagePercent oldGetCPUUsagePercent = host.GetCPUUsagePercent
oldGetMemoryUsageBytes = host.GetMemoryUsageBytes oldGetMemoryUsageBytes = host.GetMemoryUsageBytes
oldGetLocalNetworks = host.GetLocalNetworks oldGetLocalNetworks = host.GetLocalNetworks
) )
defer func() { defer func() {
host.GetKernelVersion = oldGetKernelVersion host.GetKernelReleaseAndVersion = oldGetKernelReleaseAndVersion
host.GetLoad = oldGetLoad host.GetLoad = oldGetLoad
host.GetUptime = oldGetUptime host.GetUptime = oldGetUptime
host.GetCPUUsagePercent = oldGetCPUUsagePercent host.GetCPUUsagePercent = oldGetCPUUsagePercent
host.GetMemoryUsageBytes = oldGetMemoryUsageBytes host.GetMemoryUsageBytes = oldGetMemoryUsageBytes
host.GetLocalNetworks = oldGetLocalNetworks host.GetLocalNetworks = oldGetLocalNetworks
}() }()
host.GetKernelVersion = func() (string, error) { return release + " " + version, nil } host.GetKernelReleaseAndVersion = func() (string, string, error) { return release, version, nil }
host.GetLoad = func(time.Time) report.Metrics { return metrics } host.GetLoad = func(time.Time) report.Metrics { return metrics }
host.GetUptime = func() (time.Duration, error) { return time.ParseDuration(uptime) } host.GetUptime = func() (time.Duration, error) { return time.ParseDuration(uptime) }
host.GetCPUUsagePercent = func() (float64, float64) { return 30.0, 100.0 } host.GetCPUUsagePercent = func() (float64, float64) { return 30.0, 100.0 }

View File

@@ -1,7 +1,7 @@
package host package host
import ( import (
"fmt" "bytes"
"os/exec" "os/exec"
"regexp" "regexp"
"strconv" "strconv"
@@ -11,22 +11,23 @@ import (
) )
var ( var (
unameRe = regexp.MustCompile(`Darwin Kernel Version ([0-9\.]+)\:`)
loadRe = regexp.MustCompile(`load averages: ([0-9\.]+) ([0-9\.]+) ([0-9\.]+)`) loadRe = regexp.MustCompile(`load averages: ([0-9\.]+) ([0-9\.]+) ([0-9\.]+)`)
uptimeRe = regexp.MustCompile(`up ([0-9]+) day[s]*,[ ]+([0-9]+)\:([0-9][0-9])`) uptimeRe = regexp.MustCompile(`up ([0-9]+) day[s]*,[ ]+([0-9]+)\:([0-9][0-9])`)
) )
// GetKernelVersion returns the kernel version as reported by uname. // GetKernelReleaseAndVersion returns the kernel version as reported by uname.
var GetKernelVersion = func() (string, error) { var GetKernelReleaseAndVersion = func() (string, string, error) {
out, err := exec.Command("uname", "-v").CombinedOutput() release, err := exec.Command("uname", "-r").CombinedOutput()
if err != nil { if err != nil {
return "Darwin unknown", err return "unknown", "unknown", err
} }
matches := unameRe.FindAllStringSubmatch(string(out), -1) release = bytes.Trim(release, " \n")
if matches == nil || len(matches) < 1 || len(matches[0]) < 1 { version, err := exec.Command("uname", "-v").CombinedOutput()
return "Darwin unknown", nil if err != nil {
return string(release), "unknown", err
} }
return fmt.Sprintf("Darwin %s", matches[0][1]), nil version = bytes.Trim(version, " \n")
return string(release), string(version), nil
} }
// GetLoad returns the current load averages as metrics. // GetLoad returns the current load averages as metrics.

View File

@@ -19,15 +19,15 @@ const kb = 1024
// Uname is swappable for mocking in tests. // Uname is swappable for mocking in tests.
var Uname = syscall.Uname var Uname = syscall.Uname
// GetKernelVersion returns the kernel version as reported by uname. // GetKernelReleaseAndVersion returns the kernel version as reported by uname.
var GetKernelVersion = func() (string, error) { var GetKernelReleaseAndVersion = func() (string, string, error) {
var utsname syscall.Utsname var utsname syscall.Utsname
if err := Uname(&utsname); err != nil { if err := Uname(&utsname); err != nil {
return "unknown", err return "unknown", "unknown", err
} }
release := marshal.FromUtsname(utsname.Release) release := marshal.FromUtsname(utsname.Release)
version := marshal.FromUtsname(utsname.Version) version := marshal.FromUtsname(utsname.Version)
return fmt.Sprintf("%s %s", release, version), nil return release, version, nil
} }
// GetLoad returns the current load averages as metrics. // GetLoad returns the current load averages as metrics.

View File

@@ -22,10 +22,11 @@ func TestUname(t *testing.T) {
return nil return nil
} }
have, err := host.GetKernelVersion() haveRelease, haveVersion, err := host.GetKernelReleaseAndVersion()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
have := fmt.Sprintf("%s %s", haveRelease, haveVersion)
if want := fmt.Sprintf("%s %s", release, version); want != have { if want := fmt.Sprintf("%s %s", release, version); want != have {
t.Errorf("want %q, have %q", want, have) t.Errorf("want %q, have %q", want, have)
} }

View File

@@ -1,6 +1,7 @@
package host_test package host_test
import ( import (
"fmt"
"strings" "strings"
"testing" "testing"
"time" "time"
@@ -9,10 +10,11 @@ import (
) )
func TestGetKernelVersion(t *testing.T) { func TestGetKernelVersion(t *testing.T) {
have, err := host.GetKernelVersion() release, version, err := host.GetKernelReleaseAndVersion()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
have := fmt.Sprintf("%s %s", release, version)
if strings.Contains(have, "unknown") { if strings.Contains(have, "unknown") {
t.Fatal(have) t.Fatal(have)
} }

View File

@@ -246,6 +246,7 @@ func appMain(flags appFlags) {
checkpoint.CheckInterval(&checkpoint.CheckParams{ checkpoint.CheckInterval(&checkpoint.CheckParams{
Product: "scope-app", Product: "scope-app",
Version: app.Version, Version: app.Version,
Flags: makeBaseCheckpointFlags(),
}, versionCheckPeriod, func(r *checkpoint.CheckResponse, err error) { }, versionCheckPeriod, func(r *checkpoint.CheckResponse, err error) {
if err != nil { if err != nil {
log.Errorf("Error checking version: %v", err) log.Errorf("Error checking version: %v", err)

View File

@@ -7,6 +7,7 @@ import (
"net" "net"
"os" "os"
"regexp" "regexp"
"runtime"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@@ -16,6 +17,7 @@ import (
"github.com/weaveworks/scope/app" "github.com/weaveworks/scope/app"
"github.com/weaveworks/scope/common/xfer" "github.com/weaveworks/scope/common/xfer"
"github.com/weaveworks/scope/probe/appclient" "github.com/weaveworks/scope/probe/appclient"
"github.com/weaveworks/scope/probe/host"
"github.com/weaveworks/scope/probe/kubernetes" "github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/render" "github.com/weaveworks/scope/render"
"github.com/weaveworks/weave/common" "github.com/weaveworks/weave/common"
@@ -215,6 +217,18 @@ func logCensoredArgs() {
log.Infof("command line args:%s", prettyPrintedArgs) log.Infof("command line args:%s", prettyPrintedArgs)
} }
func makeBaseCheckpointFlags() map[string]string {
release, _, err := host.GetKernelReleaseAndVersion()
if err != nil {
release = "unknown"
}
return map[string]string{
// Inconsistent key (using a dash) to match Weave Net
"kernel-version": release,
"os": runtime.GOOS,
}
}
func main() { func main() {
var ( var (
flags = flags{} flags = flags{}

View File

@@ -91,7 +91,8 @@ func probeMain(flags probeFlags, targets []appclient.Target) {
hostID = hostName // TODO(pb): we should sanitize the hostname hostID = hostName // TODO(pb): we should sanitize the hostname
) )
log.Infof("probe starting, version %s, ID %s", version, probeID) log.Infof("probe starting, version %s, ID %s", version, probeID)
checkpointFlags := map[string]string{}
checkpointFlags := makeBaseCheckpointFlags()
if flags.kubernetesEnabled { if flags.kubernetesEnabled {
checkpointFlags["kubernetes_enabled"] = "true" checkpointFlags["kubernetes_enabled"] = "true"
} }