summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/metric/metric.go18
-rw-r--r--pkg/sentry/fsimpl/testutil/BUILD1
-rw-r--r--pkg/sentry/fsimpl/testutil/kernel.go3
-rw-r--r--pkg/sentry/kernel/task_syscall.go1
-rw-r--r--pkg/sentry/syscalls/linux/error.go1
-rw-r--r--pkg/sentry/time/calibrated_clock.go1
-rw-r--r--runsc/boot/BUILD1
-rw-r--r--runsc/boot/loader.go3
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