diff options
author | Nayana Bidari <nybidari@google.com> | 2021-04-22 16:04:40 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-04-22 16:07:15 -0700 |
commit | 0a6eaed50b83a35a687699aa5e871b80605c9f46 (patch) | |
tree | 5db0976f79c0781ef803f1299bf4781b29c1b08c | |
parent | d93907110eebdfb1e51dacd9ccffd0f0c2633a81 (diff) |
Add weirdness sentry metric.
Weirdness metric contains fields to track the number of clock fallback,
partial result and vsyscalls. This metric will avoid the overhead of
having three different metrics (fallbackMetric, partialResultMetric,
vsyscallCount).
PiperOrigin-RevId: 369970218
-rw-r--r-- | pkg/metric/metric.go | 18 | ||||
-rw-r--r-- | pkg/sentry/fsimpl/testutil/BUILD | 1 | ||||
-rw-r--r-- | pkg/sentry/fsimpl/testutil/kernel.go | 3 | ||||
-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/BUILD | 1 | ||||
-rw-r--r-- | runsc/boot/loader.go | 3 |
8 files changed, 29 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/fsimpl/testutil/BUILD b/pkg/sentry/fsimpl/testutil/BUILD index b3f9d1010..c766164c7 100644 --- a/pkg/sentry/fsimpl/testutil/BUILD +++ b/pkg/sentry/fsimpl/testutil/BUILD @@ -17,6 +17,7 @@ go_library( "//pkg/fspath", "//pkg/hostarch", "//pkg/memutil", + "//pkg/metric", "//pkg/sentry/fsbridge", "//pkg/sentry/fsimpl/tmpfs", "//pkg/sentry/kernel", diff --git a/pkg/sentry/fsimpl/testutil/kernel.go b/pkg/sentry/fsimpl/testutil/kernel.go index 807e4f44a..33e52ce64 100644 --- a/pkg/sentry/fsimpl/testutil/kernel.go +++ b/pkg/sentry/fsimpl/testutil/kernel.go @@ -25,6 +25,7 @@ import ( "gvisor.dev/gvisor/pkg/cpuid" "gvisor.dev/gvisor/pkg/fspath" "gvisor.dev/gvisor/pkg/memutil" + "gvisor.dev/gvisor/pkg/metric" "gvisor.dev/gvisor/pkg/sentry/fsbridge" "gvisor.dev/gvisor/pkg/sentry/fsimpl/tmpfs" "gvisor.dev/gvisor/pkg/sentry/kernel" @@ -62,6 +63,8 @@ func Boot() (*kernel.Kernel, error) { return nil, fmt.Errorf("creating platform: %v", err) } + metric.CreateSentryMetrics() + kernel.VFS2Enabled = true k := &kernel.Kernel{ Platform: plat, 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/BUILD b/runsc/boot/BUILD index a79afbdc4..d51347fe1 100644 --- a/runsc/boot/BUILD +++ b/runsc/boot/BUILD @@ -38,6 +38,7 @@ go_library( "//pkg/fspath", "//pkg/log", "//pkg/memutil", + "//pkg/metric", "//pkg/rand", "//pkg/refs", "//pkg/refsvfs2", 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 |