diff options
-rw-r--r-- | pkg/metric/metric.go | 18 | ||||
-rw-r--r-- | pkg/sentry/kernel/task_syscall.go | 1 | ||||
-rw-r--r-- | pkg/sentry/syscalls/linux/error.go | 1 | ||||
-rw-r--r-- | pkg/sentry/time/calibrated_clock.go | 1 | ||||
-rw-r--r-- | runsc/boot/loader.go | 3 |
5 files changed, 24 insertions, 0 deletions
diff --git a/pkg/metric/metric.go b/pkg/metric/metric.go index 2a2f0d611..c23a1b52c 100644 --- a/pkg/metric/metric.go +++ b/pkg/metric/metric.go @@ -35,6 +35,11 @@ var ( // ErrInitializationDone indicates that the caller tried to create a // new metric after initialization. ErrInitializationDone = errors.New("metric cannot be created after initialization is complete") + + // WeirdnessMetric is a metric with fields created to track the number + // of weird occurrences such as clock fallback, partial_result and + // vsyscall count. + WeirdnessMetric *Uint64Metric ) // Uint64Metric encapsulates a uint64 that represents some kind of metric to be @@ -380,3 +385,16 @@ func EmitMetricUpdate() { eventchannel.Emit(&m) } + +// CreateSentryMetrics creates the sentry metrics during kernel initialization. +func CreateSentryMetrics() { + if WeirdnessMetric != nil { + return + } + + WeirdnessMetric = MustCreateNewUint64Metric("/weirdness", true /* sync */, "Increment for weird occurrences of problems such as clock fallback, partial result and vsyscalls invoked in the sandbox", + Field{ + name: "weirdness_type", + allowedValues: []string{"fallback", "partial_result", "vsyscall_count"}, + }) +} diff --git a/pkg/sentry/kernel/task_syscall.go b/pkg/sentry/kernel/task_syscall.go index 2c658d001..36855e3ec 100644 --- a/pkg/sentry/kernel/task_syscall.go +++ b/pkg/sentry/kernel/task_syscall.go @@ -285,6 +285,7 @@ func (*runSyscallExit) execute(t *Task) taskRunState { // task's next run state. func (t *Task) doVsyscall(addr hostarch.Addr, sysno uintptr) taskRunState { vsyscallCount.Increment() + metric.WeirdnessMetric.Increment("vsyscall_count") // Grab the caller up front, to make sure there's a sensible stack. caller := t.Arch().Native(uintptr(0)) diff --git a/pkg/sentry/syscalls/linux/error.go b/pkg/sentry/syscalls/linux/error.go index 37121186a..c668e81ac 100644 --- a/pkg/sentry/syscalls/linux/error.go +++ b/pkg/sentry/syscalls/linux/error.go @@ -39,6 +39,7 @@ var ( // takes a variadic number of arguments. func incrementPartialResultMetric() { partialResultMetric.Increment() + metric.WeirdnessMetric.Increment("partial_result") } // HandleIOErrorVFS2 handles special error cases for partial results. For some diff --git a/pkg/sentry/time/calibrated_clock.go b/pkg/sentry/time/calibrated_clock.go index f9a93115d..94f98d746 100644 --- a/pkg/sentry/time/calibrated_clock.go +++ b/pkg/sentry/time/calibrated_clock.go @@ -103,6 +103,7 @@ func (c *CalibratedClock) resetLocked(str string, v ...interface{}) { c.ready = false c.ref.Reset() fallbackMetric.Increment() + metric.WeirdnessMetric.Increment("fallback") } // updateParams updates the timekeeping parameters based on the passed diff --git a/runsc/boot/loader.go b/runsc/boot/loader.go index 798c1a7a7..25f06165f 100644 --- a/runsc/boot/loader.go +++ b/runsc/boot/loader.go @@ -34,6 +34,7 @@ import ( "gvisor.dev/gvisor/pkg/fd" "gvisor.dev/gvisor/pkg/log" "gvisor.dev/gvisor/pkg/memutil" + "gvisor.dev/gvisor/pkg/metric" "gvisor.dev/gvisor/pkg/rand" "gvisor.dev/gvisor/pkg/refs" "gvisor.dev/gvisor/pkg/refsvfs2" @@ -217,6 +218,8 @@ func New(args Args) (*Loader, error) { return nil, fmt.Errorf("setting up memory usage: %v", err) } + metric.CreateSentryMetrics() + // Is this a VFSv2 kernel? if args.Conf.VFS2 { kernel.VFS2Enabled = true |