Skip to content

Commit 5f1986c

Browse files
committed
support disk usage metrics for containerd factory
query rootfs dir from contianerd status and get disk usage stat by rootfs dir `/run/containerd/io.containerd.runtime.v2.task/${contianerid}/rootfs` Signed-off-by: joey <[email protected]>
1 parent 2f31c8b commit 5f1986c

File tree

15 files changed

+667
-144
lines changed

15 files changed

+667
-144
lines changed

build/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fi
6161

6262
# Since github.com/google/cadvisor/cmd is a submodule, we must build from inside that directory
6363
pushd cmd > /dev/null
64-
go build ${GO_FLAGS} -ldflags "${ldflags}" -o "${output_file}" "${repo_path}/cmd"
64+
go mod tidy && go build ${GO_FLAGS} -ldflags "${ldflags}" -o "${output_file}" "${repo_path}/cmd"
6565
popd > /dev/null
6666

6767
exit 0

cmd/go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/onsi/gomega v1.24.1 // indirect
2424
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect
2525
github.com/prometheus/client_golang v1.14.0
26-
github.com/stretchr/testify v1.8.2
26+
github.com/stretchr/testify v1.8.4
2727
golang.org/x/oauth2 v0.10.0
2828
google.golang.org/api v0.126.0
2929
gopkg.in/olivere/elastic.v2 v2.0.61
@@ -59,7 +59,7 @@ require (
5959
github.com/godbus/dbus/v5 v5.0.6 // indirect
6060
github.com/gogo/protobuf v1.3.2 // indirect
6161
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
62-
github.com/golang/protobuf v1.5.3 // indirect
62+
github.com/golang/protobuf v1.5.4 // indirect
6363
github.com/golang/snappy v0.0.4 // indirect
6464
github.com/google/s2a-go v0.1.4 // indirect
6565
github.com/google/uuid v1.3.0 // indirect
@@ -93,7 +93,6 @@ require (
9393
github.com/prometheus/common v0.37.0 // indirect
9494
github.com/prometheus/procfs v0.8.0 // indirect
9595
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
96-
github.com/rogpeppe/go-internal v1.6.1 // indirect
9796
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 // indirect
9897
github.com/sirupsen/logrus v1.8.1 // indirect
9998
github.com/stretchr/objx v0.5.0 // indirect
@@ -109,8 +108,9 @@ require (
109108
google.golang.org/appengine v1.6.7 // indirect
110109
google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 // indirect
111110
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
112-
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 // indirect
111+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
113112
google.golang.org/grpc v1.58.3 // indirect
114113
google.golang.org/protobuf v1.33.0 // indirect
115114
gopkg.in/yaml.v3 v3.0.1 // indirect
115+
k8s.io/cri-api v0.29.3 // indirect
116116
)

cmd/go.sum

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
176176
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
177177
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
178178
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
179-
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
180-
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
179+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
180+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
181181
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
182182
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
183183
github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
@@ -194,7 +194,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
194194
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
195195
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
196196
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
197-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
197+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
198198
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
199199
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
200200
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -269,7 +269,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv
269269
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
270270
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
271271
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
272-
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
272+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
273273
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
274274
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
275275
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -355,8 +355,7 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X
355355
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
356356
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
357357
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
358-
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
359-
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
358+
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
360359
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds=
361360
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
362361
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -378,8 +377,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
378377
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
379378
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
380379
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
381-
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
382-
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
380+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
381+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
383382
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
384383
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
385384
github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
@@ -683,8 +682,8 @@ google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 h1:Tyk/35yqszRCvar
683682
google.golang.org/genproto v0.0.0-20230807174057-1744710a1577/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
684683
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44=
685684
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q=
686-
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 h1:eSaPbMR4T7WfH9FvABk36NBMacoTUKdWCvV0dx+KfOg=
687-
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I=
685+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
686+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
688687
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
689688
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
690689
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -749,6 +748,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
749748
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
750749
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
751750
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
751+
k8s.io/cri-api v0.29.3 h1:ppKSui+hhTJW774Mou6x+/ealmzt2jmTM0vsEQVWrjI=
752+
k8s.io/cri-api v0.29.3/go.mod h1:3X7EnhsNaQnCweGhQCJwKNHlH7wHEYuKQ19bRvXMoJY=
752753
k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
753754
k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
754755
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk=

container/containerd/client.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@ package containerd
1616

1717
import (
1818
"context"
19+
"encoding/json"
1920
"errors"
2021
"fmt"
2122
"net"
23+
"path"
24+
"strings"
2225
"sync"
2326
"time"
2427

@@ -27,31 +30,40 @@ import (
2730
"google.golang.org/grpc/backoff"
2831
"google.golang.org/grpc/credentials/insecure"
2932

33+
"github.com/google/cadvisor/container/containerd/config"
3034
"github.com/google/cadvisor/container/containerd/containers"
3135
"github.com/google/cadvisor/container/containerd/errdefs"
3236
"github.com/google/cadvisor/container/containerd/pkg/dialer"
3337
containersapi "github.com/google/cadvisor/third_party/containerd/api/services/containers/v1"
3438
tasksapi "github.com/google/cadvisor/third_party/containerd/api/services/tasks/v1"
3539
versionapi "github.com/google/cadvisor/third_party/containerd/api/services/version/v1"
3640
tasktypes "github.com/google/cadvisor/third_party/containerd/api/types/task"
41+
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
3742
)
3843

3944
type client struct {
4045
containerService containersapi.ContainersClient
4146
taskService tasksapi.TasksClient
4247
versionService versionapi.VersionClient
48+
runtimeService runtimeapi.RuntimeServiceClient
4349
}
4450

4551
type ContainerdClient interface {
4652
LoadContainer(ctx context.Context, id string) (*containers.Container, error)
4753
TaskPid(ctx context.Context, id string) (uint32, error)
4854
Version(ctx context.Context) (string, error)
55+
RootfsDir(ctx context.Context) (string, error)
4956
}
5057

5158
var (
5259
ErrTaskIsInUnknownState = errors.New("containerd task is in unknown state") // used when process reported in containerd task is in Unknown State
5360
)
5461

62+
var (
63+
statePlugin = "io.containerd.grpc.v1.cri"
64+
taskRuntimePlugin = "io.containerd.runtime.v2.task"
65+
)
66+
5567
var once sync.Once
5668
var ctrdClient ContainerdClient = nil
5769

@@ -102,6 +114,7 @@ func Client(address, namespace string) (ContainerdClient, error) {
102114
containerService: containersapi.NewContainersClient(conn),
103115
taskService: tasksapi.NewTasksClient(conn),
104116
versionService: versionapi.NewVersionClient(conn),
117+
runtimeService: runtimeapi.NewRuntimeServiceClient(conn),
105118
}
106119
})
107120
return ctrdClient, retErr
@@ -130,6 +143,19 @@ func (c *client) TaskPid(ctx context.Context, id string) (uint32, error) {
130143
return response.Process.Pid, nil
131144
}
132145

146+
func (c *client) RootfsDir(ctx context.Context) (string, error) {
147+
r, err := c.runtimeService.Status(ctx, &runtimeapi.StatusRequest{Verbose: true})
148+
if err != nil {
149+
return "", err
150+
}
151+
configStr := r.Info["config"]
152+
config := config.Config{}
153+
if err := json.Unmarshal([]byte(configStr), &config); err != nil {
154+
return "", err
155+
}
156+
return path.Join(strings.TrimSuffix(config.StateDir, statePlugin), taskRuntimePlugin), nil
157+
}
158+
133159
func (c *client) Version(ctx context.Context) (string, error) {
134160
response, err := c.versionService.Version(ctx, &ptypes.Empty{})
135161
if err != nil {

container/containerd/client_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ func (c *containerdClientMock) TaskPid(ctx context.Context, id string) (uint32,
4545
return 2389, nil
4646
}
4747

48+
func (c *containerdClientMock) RootfsDir(ctx context.Context) (string, error) {
49+
return "/run/containerd/io.containerd.runtime.v2.task", nil
50+
}
51+
4852
func mockcontainerdClient(cntrs map[string]*containers.Container, returnErr error) ContainerdClient {
4953
return &containerdClientMock{
5054
cntrs: cntrs,

0 commit comments

Comments
 (0)