From d01934a3e409b2fde078a62ee317c3b8b3250d25 Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Wed, 20 Apr 2016 23:47:15 -0400 Subject: [PATCH] on systemd, we should ignore .mount cgroups --- container/systemd/factory.go | 57 ++++++++++++++++++++++++++++++++++++ manager/manager.go | 6 ++++ 2 files changed, 63 insertions(+) create mode 100644 container/systemd/factory.go diff --git a/container/systemd/factory.go b/container/systemd/factory.go new file mode 100644 index 00000000..635c9c78 --- /dev/null +++ b/container/systemd/factory.go @@ -0,0 +1,57 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// 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 systemd + +import ( + "fmt" + "strings" + + "github.com/google/cadvisor/container" + "github.com/google/cadvisor/fs" + info "github.com/google/cadvisor/info/v1" + + "github.com/golang/glog" +) + +type systemdFactory struct{} + +func (f *systemdFactory) String() string { + return "systemd" +} + +func (f *systemdFactory) NewContainerHandler(name string, inHostNamespace bool) (container.ContainerHandler, error) { + return nil, fmt.Errorf("Not yet supported") +} + +func (f *systemdFactory) CanHandleAndAccept(name string) (bool, bool, error) { + // on systemd using devicemapper each mount into the container has an associated cgroup that we ignore. + // for details on .mount units: http://man7.org/linux/man-pages/man5/systemd.mount.5.html + if strings.HasSuffix(name, ".mount") { + return true, false, nil + } + return false, false, fmt.Errorf("%s not handled by systemd handler", name) +} + +func (f *systemdFactory) DebugInfo() map[string][]string { + return map[string][]string{} +} + +// Register registers the systemd container factory. +func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { + glog.Infof("Registering systemd factory") + factory := &systemdFactory{} + container.RegisterContainerHandlerFactory(factory) + return nil +} diff --git a/manager/manager.go b/manager/manager.go index 693bba2f..1179303a 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -31,6 +31,7 @@ import ( "github.com/google/cadvisor/container/docker" "github.com/google/cadvisor/container/raw" "github.com/google/cadvisor/container/rkt" + "github.com/google/cadvisor/container/systemd" "github.com/google/cadvisor/events" "github.com/google/cadvisor/fs" info "github.com/google/cadvisor/info/v1" @@ -228,6 +229,11 @@ func (self *manager) Start() error { glog.Errorf("Registration of the rkt container factory failed: %v", err) } + err = systemd.Register(self, self.fsInfo, self.ignoreMetrics) + if err != nil { + glog.Errorf("Registration of the systemd container factory failed: %v", err) + } + err = raw.Register(self, self.fsInfo, self.ignoreMetrics) if err != nil { glog.Errorf("Registration of the raw container factory failed: %v", err)