123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- // +build cgo,linux
- /*
- Copyright 2015 The Kubernetes 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 cadvisor
- import (
- "flag"
- "fmt"
- "net/http"
- "os"
- "path"
- "time"
- // Register supported container handlers.
- _ "github.com/google/cadvisor/container/containerd/install"
- _ "github.com/google/cadvisor/container/crio/install"
- _ "github.com/google/cadvisor/container/docker/install"
- _ "github.com/google/cadvisor/container/systemd/install"
- // Register cloud info providers.
- // TODO(#76660): Remove this once the cAdvisor endpoints are removed.
- _ "github.com/google/cadvisor/utils/cloudinfo/aws"
- _ "github.com/google/cadvisor/utils/cloudinfo/azure"
- _ "github.com/google/cadvisor/utils/cloudinfo/gce"
- "github.com/google/cadvisor/cache/memory"
- cadvisormetrics "github.com/google/cadvisor/container"
- "github.com/google/cadvisor/events"
- cadvisorapi "github.com/google/cadvisor/info/v1"
- cadvisorapiv2 "github.com/google/cadvisor/info/v2"
- "github.com/google/cadvisor/manager"
- "github.com/google/cadvisor/utils/sysfs"
- "k8s.io/klog"
- )
- type cadvisorClient struct {
- imageFsInfoProvider ImageFsInfoProvider
- rootPath string
- manager.Manager
- }
- var _ Interface = new(cadvisorClient)
- // TODO(vmarmol): Make configurable.
- // The amount of time for which to keep stats in memory.
- const statsCacheDuration = 2 * time.Minute
- const maxHousekeepingInterval = 15 * time.Second
- const defaultHousekeepingInterval = 10 * time.Second
- const allowDynamicHousekeeping = true
- func init() {
- // Override cAdvisor flag defaults.
- flagOverrides := map[string]string{
- // Override the default cAdvisor housekeeping interval.
- "housekeeping_interval": defaultHousekeepingInterval.String(),
- // Disable event storage by default.
- "event_storage_event_limit": "default=0",
- "event_storage_age_limit": "default=0",
- }
- for name, defaultValue := range flagOverrides {
- if f := flag.Lookup(name); f != nil {
- f.DefValue = defaultValue
- f.Value.Set(defaultValue)
- } else {
- klog.Errorf("Expected cAdvisor flag %q not found", name)
- }
- }
- }
- func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, cgroupRoots []string, usingLegacyStats bool) (Interface, error) {
- sysFs := sysfs.NewRealSysFs()
- includedMetrics := cadvisormetrics.MetricSet{
- cadvisormetrics.CpuUsageMetrics: struct{}{},
- cadvisormetrics.MemoryUsageMetrics: struct{}{},
- cadvisormetrics.CpuLoadMetrics: struct{}{},
- cadvisormetrics.DiskIOMetrics: struct{}{},
- cadvisormetrics.NetworkUsageMetrics: struct{}{},
- cadvisormetrics.AcceleratorUsageMetrics: struct{}{},
- cadvisormetrics.AppMetrics: struct{}{},
- }
- if usingLegacyStats {
- includedMetrics[cadvisormetrics.DiskUsageMetrics] = struct{}{}
- }
- // Create and start the cAdvisor container manager.
- m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, maxHousekeepingInterval, allowDynamicHousekeeping, includedMetrics, http.DefaultClient, cgroupRoots)
- if err != nil {
- return nil, err
- }
- if _, err := os.Stat(rootPath); err != nil {
- if os.IsNotExist(err) {
- if err := os.MkdirAll(path.Clean(rootPath), 0750); err != nil {
- return nil, fmt.Errorf("error creating root directory %q: %v", rootPath, err)
- }
- } else {
- return nil, fmt.Errorf("failed to Stat %q: %v", rootPath, err)
- }
- }
- cadvisorClient := &cadvisorClient{
- imageFsInfoProvider: imageFsInfoProvider,
- rootPath: rootPath,
- Manager: m,
- }
- return cadvisorClient, nil
- }
- func (cc *cadvisorClient) Start() error {
- return cc.Manager.Start()
- }
- func (cc *cadvisorClient) ContainerInfo(name string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) {
- return cc.GetContainerInfo(name, req)
- }
- func (cc *cadvisorClient) ContainerInfoV2(name string, options cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) {
- return cc.GetContainerInfoV2(name, options)
- }
- func (cc *cadvisorClient) VersionInfo() (*cadvisorapi.VersionInfo, error) {
- return cc.GetVersionInfo()
- }
- func (cc *cadvisorClient) SubcontainerInfo(name string, req *cadvisorapi.ContainerInfoRequest) (map[string]*cadvisorapi.ContainerInfo, error) {
- infos, err := cc.SubcontainersInfo(name, req)
- if err != nil && len(infos) == 0 {
- return nil, err
- }
- result := make(map[string]*cadvisorapi.ContainerInfo, len(infos))
- for _, info := range infos {
- result[info.Name] = info
- }
- return result, err
- }
- func (cc *cadvisorClient) MachineInfo() (*cadvisorapi.MachineInfo, error) {
- return cc.GetMachineInfo()
- }
- func (cc *cadvisorClient) ImagesFsInfo() (cadvisorapiv2.FsInfo, error) {
- label, err := cc.imageFsInfoProvider.ImageFsInfoLabel()
- if err != nil {
- return cadvisorapiv2.FsInfo{}, err
- }
- return cc.getFsInfo(label)
- }
- func (cc *cadvisorClient) RootFsInfo() (cadvisorapiv2.FsInfo, error) {
- return cc.GetDirFsInfo(cc.rootPath)
- }
- func (cc *cadvisorClient) getFsInfo(label string) (cadvisorapiv2.FsInfo, error) {
- res, err := cc.GetFsInfo(label)
- if err != nil {
- return cadvisorapiv2.FsInfo{}, err
- }
- if len(res) == 0 {
- return cadvisorapiv2.FsInfo{}, fmt.Errorf("failed to find information for the filesystem labeled %q", label)
- }
- // TODO(vmarmol): Handle this better when a label has more than one image filesystem.
- if len(res) > 1 {
- klog.Warningf("More than one filesystem labeled %q: %#v. Only using the first one", label, res)
- }
- return res[0], nil
- }
- func (cc *cadvisorClient) WatchEvents(request *events.Request) (*events.EventChannel, error) {
- return cc.WatchForEvents(request)
- }
|