diff --git a/metrics/cgroups/cgroups.go b/metrics/cgroups/cgroups.go index 830df8b24..6807b19b8 100644 --- a/metrics/cgroups/cgroups.go +++ b/metrics/cgroups/cgroups.go @@ -19,20 +19,13 @@ package cgroups import ( - "context" - "github.com/containerd/cgroups" - eventstypes "github.com/containerd/containerd/api/events" - "github.com/containerd/containerd/errdefs" - "github.com/containerd/containerd/events" - "github.com/containerd/containerd/log" - "github.com/containerd/containerd/namespaces" + v1 "github.com/containerd/containerd/metrics/cgroups/v1" + v2 "github.com/containerd/containerd/metrics/cgroups/v2" "github.com/containerd/containerd/platforms" "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/runtime" - "github.com/containerd/containerd/runtime/v1/linux" metrics "github.com/docker/go-metrics" - "github.com/sirupsen/logrus" ) // Config for the cgroups monitor @@ -56,8 +49,15 @@ func New(ic *plugin.InitContext) (interface{}, error) { if !config.NoPrometheus { ns = metrics.NewNamespace("container", "", nil) } - collector := newCollector(ns) - oom, err := newOOMCollector(ns) + var ( + tm runtime.TaskMonitor + err error + ) + if cgroups.Mode() == cgroups.Unified { + tm, err = v2.NewTaskMonitor(ic.Context, ic.Events, ns) + } else { + tm, err = v1.NewTaskMonitor(ic.Context, ic.Events, ns) + } if err != nil { return nil, err } @@ -65,54 +65,5 @@ func New(ic *plugin.InitContext) (interface{}, error) { metrics.Register(ns) } ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec()) - return &cgroupsMonitor{ - collector: collector, - oom: oom, - context: ic.Context, - publisher: ic.Events, - }, nil -} - -type cgroupsMonitor struct { - collector *collector - oom *oomCollector - context context.Context - publisher events.Publisher -} - -func (m *cgroupsMonitor) Monitor(c runtime.Task) error { - if err := m.collector.Add(c); err != nil { - return err - } - t, ok := c.(*linux.Task) - if !ok { - return nil - } - cg, err := t.Cgroup() - if err != nil { - if errdefs.IsNotFound(err) { - return nil - } - return err - } - err = m.oom.Add(c.ID(), c.Namespace(), cg, m.trigger) - if err == cgroups.ErrMemoryNotSupported { - logrus.WithError(err).Warn("OOM monitoring failed") - return nil - } - return err -} - -func (m *cgroupsMonitor) Stop(c runtime.Task) error { - m.collector.Remove(c) - return nil -} - -func (m *cgroupsMonitor) trigger(id, namespace string, cg cgroups.Cgroup) { - ctx := namespaces.WithNamespace(m.context, namespace) - if err := m.publisher.Publish(ctx, runtime.TaskOOMEventTopic, &eventstypes.TaskOOM{ - ContainerID: id, - }); err != nil { - log.G(m.context).WithError(err).Error("post OOM event") - } + return tm, nil } diff --git a/metrics/cgroups/blkio.go b/metrics/cgroups/v1/blkio.go similarity index 99% rename from metrics/cgroups/blkio.go rename to metrics/cgroups/v1/blkio.go index 1d1f0a999..d532bc7a7 100644 --- a/metrics/cgroups/blkio.go +++ b/metrics/cgroups/v1/blkio.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( "strconv" diff --git a/metrics/cgroups/v1/cgroups.go b/metrics/cgroups/v1/cgroups.go new file mode 100644 index 000000000..23e4893da --- /dev/null +++ b/metrics/cgroups/v1/cgroups.go @@ -0,0 +1,93 @@ +// +build linux + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package v1 + +import ( + "context" + + "github.com/containerd/cgroups" + eventstypes "github.com/containerd/containerd/api/events" + "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/events" + "github.com/containerd/containerd/log" + "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/runtime" + "github.com/containerd/containerd/runtime/v1/linux" + metrics "github.com/docker/go-metrics" + "github.com/sirupsen/logrus" +) + +// NewTaskMonitor returns a new cgroups monitor +func NewTaskMonitor(ctx context.Context, publisher events.Publisher, ns *metrics.Namespace) (runtime.TaskMonitor, error) { + collector := newCollector(ns) + oom, err := newOOMCollector(ns) + if err != nil { + return nil, err + } + return &cgroupsMonitor{ + collector: collector, + oom: oom, + context: ctx, + publisher: publisher, + }, nil +} + +type cgroupsMonitor struct { + collector *collector + oom *oomCollector + context context.Context + publisher events.Publisher +} + +func (m *cgroupsMonitor) Monitor(c runtime.Task) error { + if err := m.collector.Add(c); err != nil { + return err + } + t, ok := c.(*linux.Task) + if !ok { + return nil + } + cg, err := t.Cgroup() + if err != nil { + if errdefs.IsNotFound(err) { + return nil + } + return err + } + err = m.oom.Add(c.ID(), c.Namespace(), cg, m.trigger) + if err == cgroups.ErrMemoryNotSupported { + logrus.WithError(err).Warn("OOM monitoring failed") + return nil + } + return err +} + +func (m *cgroupsMonitor) Stop(c runtime.Task) error { + m.collector.Remove(c) + return nil +} + +func (m *cgroupsMonitor) trigger(id, namespace string, cg cgroups.Cgroup) { + ctx := namespaces.WithNamespace(m.context, namespace) + if err := m.publisher.Publish(ctx, runtime.TaskOOMEventTopic, &eventstypes.TaskOOM{ + ContainerID: id, + }); err != nil { + log.G(m.context).WithError(err).Error("post OOM event") + } +} diff --git a/metrics/cgroups/cpu.go b/metrics/cgroups/v1/cpu.go similarity index 99% rename from metrics/cgroups/cpu.go rename to metrics/cgroups/v1/cpu.go index 686977b3d..0abe0fb7f 100644 --- a/metrics/cgroups/cpu.go +++ b/metrics/cgroups/v1/cpu.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( "strconv" diff --git a/metrics/cgroups/hugetlb.go b/metrics/cgroups/v1/hugetlb.go similarity index 99% rename from metrics/cgroups/hugetlb.go rename to metrics/cgroups/v1/hugetlb.go index fbd5d3ba7..97ca890a6 100644 --- a/metrics/cgroups/hugetlb.go +++ b/metrics/cgroups/v1/hugetlb.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( v1 "github.com/containerd/containerd/metrics/types/v1" diff --git a/metrics/cgroups/memory.go b/metrics/cgroups/v1/memory.go similarity index 99% rename from metrics/cgroups/memory.go rename to metrics/cgroups/v1/memory.go index 9925f01e3..915a36c7f 100644 --- a/metrics/cgroups/memory.go +++ b/metrics/cgroups/v1/memory.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( v1 "github.com/containerd/containerd/metrics/types/v1" diff --git a/metrics/cgroups/metric.go b/metrics/cgroups/v1/metric.go similarity index 99% rename from metrics/cgroups/metric.go rename to metrics/cgroups/v1/metric.go index c242bc85a..14a9410b9 100644 --- a/metrics/cgroups/metric.go +++ b/metrics/cgroups/v1/metric.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( v1 "github.com/containerd/containerd/metrics/types/v1" diff --git a/metrics/cgroups/metrics.go b/metrics/cgroups/v1/metrics.go similarity index 99% rename from metrics/cgroups/metrics.go rename to metrics/cgroups/v1/metrics.go index 23808731f..e4a41edd6 100644 --- a/metrics/cgroups/metrics.go +++ b/metrics/cgroups/v1/metrics.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( "context" diff --git a/metrics/cgroups/oom.go b/metrics/cgroups/v1/oom.go similarity index 99% rename from metrics/cgroups/oom.go rename to metrics/cgroups/v1/oom.go index 212dfb510..a31b813f2 100644 --- a/metrics/cgroups/oom.go +++ b/metrics/cgroups/v1/oom.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( "sync" diff --git a/metrics/cgroups/pids.go b/metrics/cgroups/v1/pids.go similarity index 98% rename from metrics/cgroups/pids.go rename to metrics/cgroups/v1/pids.go index c61fd6a97..6bb1876e6 100644 --- a/metrics/cgroups/pids.go +++ b/metrics/cgroups/v1/pids.go @@ -16,7 +16,7 @@ limitations under the License. */ -package cgroups +package v1 import ( v1 "github.com/containerd/containerd/metrics/types/v1" diff --git a/metrics/cgroups/v2/cgroups.go b/metrics/cgroups/v2/cgroups.go index b22d4ed2a..1f54049f1 100644 --- a/metrics/cgroups/v2/cgroups.go +++ b/metrics/cgroups/v2/cgroups.go @@ -23,43 +23,18 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/events" - "github.com/containerd/containerd/platforms" - "github.com/containerd/containerd/plugin" "github.com/containerd/containerd/runtime" "github.com/containerd/containerd/runtime/v1/linux" metrics "github.com/docker/go-metrics" ) -// Config for the cgroups monitor -type Config struct { - NoPrometheus bool `toml:"no_prometheus"` -} - -func init() { - plugin.Register(&plugin.Registration{ - Type: plugin.TaskMonitorPlugin, - ID: "cgroups-v2", - InitFn: New, - Config: &Config{}, - }) -} - -// New returns a new cgroups monitor -func New(ic *plugin.InitContext) (interface{}, error) { - var ns *metrics.Namespace - config := ic.Config.(*Config) - if !config.NoPrometheus { - ns = metrics.NewNamespace("container", "", nil) - } +// NewTaskMonitor returns a new cgroups monitor +func NewTaskMonitor(ctx context.Context, publisher events.Publisher, ns *metrics.Namespace) (runtime.TaskMonitor, error) { collector := newCollector(ns) - if ns != nil { - metrics.Register(ns) - } - ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec()) return &cgroupsMonitor{ collector: collector, - context: ic.Context, - publisher: ic.Events, + context: ctx, + publisher: publisher, }, nil } diff --git a/metrics/cgroups/v2/pids.go b/metrics/cgroups/v2/pids.go index 6b693f65c..f1028b067 100644 --- a/metrics/cgroups/v2/pids.go +++ b/metrics/cgroups/v2/pids.go @@ -26,8 +26,8 @@ import ( var pidMetrics = []*metric{ { - name: "pids_v2", - help: "The limit to the number of pids allowed", + name: "pids", + help: "The limit to the number of pids allowed (cgroup v2)", unit: metrics.Unit("limit"), vt: prometheus.GaugeValue, getValues: func(stats *v2.Metrics) []value { @@ -42,8 +42,8 @@ var pidMetrics = []*metric{ }, }, { - name: "pids_v2", - help: "The current number of pids", + name: "pids", + help: "The current number of pids (cgroup v2)", unit: metrics.Unit("current"), vt: prometheus.GaugeValue, getValues: func(stats *v2.Metrics) []value {