Merge pull request #3891 from AkihiroSuda/rename-pids-v2

metrics: rename pids_v2 to pids
This commit is contained in:
Phil Estes 2019-12-14 13:16:50 +11:00 committed by GitHub
commit 6c82fe5429
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 121 additions and 102 deletions

View File

@ -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
}

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
"strconv"

View File

@ -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")
}
}

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
"strconv"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
v1 "github.com/containerd/containerd/metrics/types/v1"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
v1 "github.com/containerd/containerd/metrics/types/v1"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
v1 "github.com/containerd/containerd/metrics/types/v1"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
"context"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
"sync"

View File

@ -16,7 +16,7 @@
limitations under the License.
*/
package cgroups
package v1
import (
v1 "github.com/containerd/containerd/metrics/types/v1"

View File

@ -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
}

View File

@ -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 {