Add initial implementation of stats

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
This commit is contained in:
Alexander Morozov 2015-12-14 14:43:00 -08:00
parent ce387dc505
commit 4bc322397f
9 changed files with 518 additions and 97 deletions

View file

@ -233,3 +233,39 @@ func (s *apiServer) Events(r *types.EventsRequest, stream types.API_EventsServer
}
return nil
}
func (s *apiServer) GetStats(r *types.StatsRequest, stream types.API_GetStatsServer) error {
e := containerd.NewEvent(containerd.StatsEventType)
e.ID = r.Id
s.sv.SendEvent(e)
if err := <-e.Err; err != nil {
if err == containerd.ErrContainerNotFound {
return grpc.Errorf(codes.NotFound, err.Error())
}
return err
}
defer func() {
ue := containerd.NewEvent(containerd.UnsubscribeStatsEventType)
ue.ID = e.ID
ue.Stats = e.Stats
s.sv.SendEvent(ue)
if err := <-ue.Err; err != nil {
logrus.Errorf("Error unsubscribing %s: %v", r.Id, err)
}
}()
for {
select {
case st := <-e.Stats:
pbSt, ok := st.(*types.Stats)
if !ok {
panic("invalid stats type from collector")
}
if err := stream.Send(pbSt); err != nil {
return err
}
case <-stream.Context().Done():
return nil
}
}
return nil
}

View file

@ -44,6 +44,7 @@ It has these top-level messages:
HugetlbStats
CgroupStats
Stats
StatsRequest
*/
package types
@ -638,6 +639,7 @@ func (m *CgroupStats) GetHugetlbStats() map[string]*HugetlbStats {
type Stats struct {
NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats" json:"network_stats,omitempty"`
CgroupStats *CgroupStats `protobuf:"bytes,2,opt,name=cgroup_stats" json:"cgroup_stats,omitempty"`
Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
}
func (m *Stats) Reset() { *m = Stats{} }
@ -659,6 +661,15 @@ func (m *Stats) GetCgroupStats() *CgroupStats {
return nil
}
type StatsRequest struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
}
func (m *StatsRequest) Reset() { *m = StatsRequest{} }
func (m *StatsRequest) String() string { return proto.CompactTextString(m) }
func (*StatsRequest) ProtoMessage() {}
func (*StatsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func init() {
proto.RegisterType((*CreateContainerRequest)(nil), "types.CreateContainerRequest")
proto.RegisterType((*CreateContainerResponse)(nil), "types.CreateContainerResponse")
@ -695,6 +706,7 @@ func init() {
proto.RegisterType((*HugetlbStats)(nil), "types.HugetlbStats")
proto.RegisterType((*CgroupStats)(nil), "types.CgroupStats")
proto.RegisterType((*Stats)(nil), "types.Stats")
proto.RegisterType((*StatsRequest)(nil), "types.StatsRequest")
}
// Reference imports to suppress errors if they are not otherwise used.
@ -713,6 +725,7 @@ type APIClient interface {
ListCheckpoint(ctx context.Context, in *ListCheckpointRequest, opts ...grpc.CallOption) (*ListCheckpointResponse, error)
State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error)
Events(ctx context.Context, in *EventsRequest, opts ...grpc.CallOption) (API_EventsClient, error)
GetStats(ctx context.Context, in *StatsRequest, opts ...grpc.CallOption) (API_GetStatsClient, error)
}
type aPIClient struct {
@ -827,6 +840,38 @@ func (x *aPIEventsClient) Recv() (*Event, error) {
return m, nil
}
func (c *aPIClient) GetStats(ctx context.Context, in *StatsRequest, opts ...grpc.CallOption) (API_GetStatsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_API_serviceDesc.Streams[1], c.cc, "/types.API/GetStats", opts...)
if err != nil {
return nil, err
}
x := &aPIGetStatsClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type API_GetStatsClient interface {
Recv() (*Stats, error)
grpc.ClientStream
}
type aPIGetStatsClient struct {
grpc.ClientStream
}
func (x *aPIGetStatsClient) Recv() (*Stats, error) {
m := new(Stats)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for API service
type APIServer interface {
@ -839,6 +884,7 @@ type APIServer interface {
ListCheckpoint(context.Context, *ListCheckpointRequest) (*ListCheckpointResponse, error)
State(context.Context, *StateRequest) (*StateResponse, error)
Events(*EventsRequest, API_EventsServer) error
GetStats(*StatsRequest, API_GetStatsServer) error
}
func RegisterAPIServer(s *grpc.Server, srv APIServer) {
@ -962,6 +1008,27 @@ func (x *aPIEventsServer) Send(m *Event) error {
return x.ServerStream.SendMsg(m)
}
func _API_GetStats_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(StatsRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(APIServer).GetStats(m, &aPIGetStatsServer{stream})
}
type API_GetStatsServer interface {
Send(*Stats) error
grpc.ServerStream
}
type aPIGetStatsServer struct {
grpc.ServerStream
}
func (x *aPIGetStatsServer) Send(m *Stats) error {
return x.ServerStream.SendMsg(m)
}
var _API_serviceDesc = grpc.ServiceDesc{
ServiceName: "types.API",
HandlerType: (*APIServer)(nil),
@ -1005,97 +1072,104 @@ var _API_serviceDesc = grpc.ServiceDesc{
Handler: _API_Events_Handler,
ServerStreams: true,
},
{
StreamName: "GetStats",
Handler: _API_GetStats_Handler,
ServerStreams: true,
},
},
}
var fileDescriptor0 = []byte{
// 1396 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x57, 0xd9, 0x92, 0xdb, 0x44,
0x17, 0x1e, 0xdb, 0xf2, 0x76, 0xbc, 0x8d, 0x35, 0x19, 0xc7, 0xe3, 0xff, 0x0f, 0x49, 0x44, 0x80,
0x14, 0x95, 0x72, 0x85, 0x09, 0x4b, 0x08, 0x17, 0x10, 0x66, 0x52, 0x04, 0x2a, 0x81, 0xa9, 0x59,
0xa8, 0xe2, 0x02, 0x5c, 0x1a, 0xa9, 0xb1, 0x1b, 0xcb, 0x92, 0x90, 0x5a, 0xb3, 0x14, 0x6f, 0xc0,
0x25, 0x0f, 0xc3, 0x03, 0xf0, 0x04, 0x3c, 0x07, 0x4f, 0xc1, 0x51, 0x77, 0xab, 0xb5, 0x78, 0x19,
0xb8, 0xe0, 0x46, 0x55, 0xdd, 0x7d, 0xce, 0x77, 0xbe, 0xb3, 0xaa, 0x1b, 0x9a, 0xa6, 0x4f, 0xc7,
0x7e, 0xe0, 0x31, 0x4f, 0xaf, 0xb2, 0x6b, 0x9f, 0x84, 0xc6, 0x2f, 0x30, 0x38, 0x08, 0x88, 0xc9,
0xc8, 0x81, 0xe7, 0x32, 0x93, 0xba, 0x24, 0x38, 0x26, 0x3f, 0x47, 0x24, 0x64, 0x3a, 0x40, 0x99,
0xda, 0xc3, 0xd2, 0xbd, 0xd2, 0xc3, 0xa6, 0x8e, 0x8b, 0xf3, 0xc8, 0xb5, 0x1d, 0x72, 0x64, 0xb2,
0xd9, 0xb0, 0xcc, 0xf7, 0x3a, 0x50, 0x0d, 0x99, 0x4d, 0xdd, 0x61, 0x85, 0x2f, 0xbb, 0x50, 0xc3,
0xa5, 0x17, 0xb1, 0xa1, 0x96, 0x59, 0x93, 0x20, 0x18, 0x56, 0x13, 0x08, 0x6b, 0x46, 0xac, 0xb9,
0xef, 0x51, 0x97, 0x0d, 0xeb, 0xf1, 0x9e, 0xb1, 0x07, 0xb7, 0x97, 0x8c, 0x87, 0xbe, 0xe7, 0x86,
0xc4, 0x78, 0x0a, 0x9d, 0x13, 0x3a, 0x75, 0x4d, 0x67, 0x15, 0x9d, 0x16, 0x54, 0x7c, 0x5c, 0xc4,
0x3c, 0x3a, 0xdc, 0x10, 0x97, 0xe4, 0x44, 0x3a, 0xc6, 0x36, 0x74, 0x13, 0x4d, 0x89, 0xc5, 0xa0,
0xff, 0xdc, 0xb6, 0x8f, 0x02, 0xcf, 0x22, 0x61, 0xb8, 0x0a, 0x6f, 0x1b, 0x1a, 0x8c, 0x04, 0x0b,
0x1a, 0x83, 0xc4, 0xa0, 0x0d, 0x7d, 0x0f, 0xb4, 0x28, 0x24, 0x01, 0x87, 0x6c, 0xed, 0xb7, 0xc6,
0x3c, 0x58, 0xe3, 0x33, 0xdc, 0xd2, 0xdb, 0xa0, 0x99, 0xc1, 0x34, 0x44, 0x37, 0x2b, 0x82, 0x0a,
0x71, 0x2f, 0xd0, 0x47, 0xb9, 0xb0, 0x2e, 0xed, 0x61, 0x8d, 0x3b, 0xf7, 0x14, 0x34, 0x2e, 0x8f,
0x9b, 0x91, 0xb4, 0xd4, 0x89, 0x17, 0x53, 0xc5, 0x7c, 0x00, 0x5d, 0xd3, 0xb6, 0x29, 0xa3, 0x1e,
0x1a, 0xfe, 0x82, 0xda, 0x21, 0x9a, 0xab, 0xa0, 0x07, 0xf7, 0x41, 0xcf, 0xf2, 0x15, 0x5e, 0x24,
0x4e, 0x73, 0x1c, 0xe3, 0x95, 0x8a, 0x9c, 0x8a, 0xe9, 0x2a, 0xc7, 0xde, 0xca, 0x05, 0xbd, 0xcc,
0x9d, 0xe9, 0x4b, 0x67, 0x52, 0x4d, 0x63, 0x04, 0xc3, 0x65, 0x34, 0x19, 0xbc, 0x27, 0x70, 0xfb,
0x90, 0x38, 0xe4, 0x26, 0x4b, 0x18, 0x15, 0xd7, 0x5c, 0x10, 0x51, 0x1b, 0x31, 0xe0, 0xb2, 0x92,
0x04, 0x7c, 0x13, 0x76, 0x5f, 0xd1, 0x90, 0x6d, 0x84, 0x33, 0xbe, 0x03, 0x48, 0x05, 0x14, 0xb8,
0x32, 0x45, 0xae, 0x28, 0x93, 0x99, 0xc2, 0xb0, 0x30, 0xcb, 0xe7, 0x89, 0x6a, 0xe8, 0x3b, 0xd0,
0x8a, 0x5c, 0x7a, 0x75, 0xe2, 0x59, 0x73, 0xc2, 0x42, 0x5e, 0x89, 0x0d, 0x5e, 0xa8, 0x33, 0xe2,
0x38, 0xbc, 0x10, 0x1b, 0xc6, 0x67, 0x30, 0x28, 0xda, 0x97, 0x11, 0x7e, 0x1b, 0x5a, 0x69, 0xb4,
0x42, 0xb4, 0x56, 0x59, 0x1d, 0xae, 0x2e, 0xb4, 0x4f, 0x18, 0x46, 0x4b, 0x12, 0x37, 0xee, 0x41,
0x57, 0x15, 0x30, 0x3f, 0x10, 0xc5, 0x6f, 0xb2, 0x28, 0x94, 0xee, 0xcc, 0xa1, 0x2e, 0xd3, 0x99,
0x4b, 0xe3, 0x7f, 0x53, 0x78, 0x0e, 0x34, 0x15, 0x9d, 0xf5, 0x39, 0x2a, 0xf4, 0xb4, 0x68, 0xe2,
0xfb, 0xd0, 0xf4, 0x05, 0x4f, 0x22, 0xec, 0xb4, 0xf6, 0xbb, 0x92, 0x42, 0xc2, 0x3f, 0x75, 0x8d,
0xf7, 0x35, 0xd6, 0x47, 0xfd, 0xb5, 0x69, 0xcd, 0xd0, 0x58, 0xd1, 0x96, 0xe5, 0xa3, 0x90, 0xea,
0xd1, 0x05, 0x59, 0x78, 0xc1, 0x35, 0xb7, 0xa3, 0x19, 0xdf, 0x62, 0x77, 0x8b, 0x08, 0xca, 0xd0,
0x3f, 0xc0, 0x42, 0x4d, 0x38, 0x27, 0x91, 0xdf, 0x4e, 0x22, 0xaf, 0x9c, 0xb9, 0x0b, 0xf5, 0x85,
0xb0, 0x25, 0x6b, 0x39, 0x21, 0x27, 0x19, 0x18, 0x87, 0x30, 0x38, 0xf3, 0xed, 0x9b, 0xa6, 0x59,
0x3a, 0x31, 0xd2, 0x09, 0x22, 0x5c, 0xaa, 0x24, 0x63, 0x69, 0x09, 0x45, 0x16, 0x6f, 0x0f, 0x3a,
0x2f, 0x2e, 0x08, 0x56, 0x47, 0x92, 0xfb, 0x3f, 0x4b, 0x50, 0xe5, 0x3b, 0xb1, 0xc7, 0x31, 0x19,
0x69, 0x43, 0xd8, 0x2b, 0xa7, 0xa3, 0x50, 0xe1, 0x77, 0x0a, 0x91, 0xd7, 0xb2, 0x23, 0xad, 0x5a,
0x18, 0x69, 0x75, 0xbe, 0x46, 0xbf, 0x65, 0x5a, 0x86, 0x8d, 0x9c, 0xdf, 0x49, 0x52, 0xf2, 0xe1,
0x6b, 0xae, 0x09, 0x5f, 0x7e, 0x1a, 0xc0, 0xba, 0x69, 0xf0, 0x7b, 0x09, 0xda, 0x5f, 0x13, 0x76,
0xe9, 0x05, 0xf3, 0x38, 0x49, 0x61, 0xa1, 0xfd, 0xb0, 0x66, 0x83, 0xab, 0xc9, 0xf9, 0x35, 0x23,
0x22, 0xbb, 0x5a, 0xec, 0x0f, 0xee, 0x1c, 0x99, 0xa2, 0xe9, 0x78, 0x86, 0xf5, 0x3e, 0x34, 0x8f,
0xaf, 0x26, 0x38, 0xfe, 0xbd, 0x40, 0xf4, 0x21, 0x17, 0xc3, 0x2d, 0x3b, 0xf0, 0x7c, 0x9f, 0x08,
0x4f, 0xb5, 0x18, 0xec, 0x34, 0x01, 0xab, 0x25, 0x52, 0xb8, 0xe3, 0x4b, 0xb0, 0x7a, 0x02, 0x76,
0xaa, 0xc0, 0x1a, 0x19, 0xb1, 0x04, 0xac, 0xc9, 0xab, 0x6a, 0x01, 0x8d, 0x03, 0x3f, 0x3a, 0x0b,
0xcd, 0x29, 0x89, 0x27, 0x01, 0xf3, 0x98, 0xe9, 0x4c, 0xa2, 0x78, 0xc9, 0xa9, 0x6b, 0xfa, 0x2d,
0x68, 0xfb, 0x24, 0xc0, 0xba, 0x94, 0xbb, 0x65, 0x0c, 0x94, 0xa6, 0xff, 0x0f, 0x76, 0xf8, 0x72,
0x42, 0xdd, 0xc9, 0x9c, 0x04, 0x2e, 0x71, 0x16, 0x9e, 0x4d, 0xa4, 0x1f, 0x7b, 0xd0, 0x57, 0x87,
0x71, 0x63, 0xf2, 0x23, 0xee, 0x8f, 0x71, 0x0a, 0xdd, 0xd3, 0x19, 0xfe, 0x4b, 0x99, 0x43, 0xdd,
0xe9, 0xa1, 0xc9, 0x4c, 0xbd, 0x87, 0x79, 0x22, 0x01, 0xf5, 0xec, 0x50, 0x1a, 0x44, 0x6d, 0x26,
0x44, 0x88, 0x3d, 0x49, 0x8e, 0x44, 0xd0, 0x70, 0xf8, 0xa7, 0x47, 0x8c, 0x2e, 0xa4, 0x41, 0xe3,
0x07, 0xee, 0x84, 0x08, 0xbc, 0x01, 0xcd, 0x94, 0x6c, 0x89, 0xe7, 0xab, 0x97, 0xe4, 0x2b, 0x71,
0x74, 0x0c, 0x3d, 0xa6, 0x58, 0x4c, 0xb0, 0x6a, 0x4d, 0xd9, 0x1b, 0xbb, 0x52, 0x32, 0xcf, 0xd1,
0xf8, 0x14, 0xe0, 0x35, 0x6f, 0x45, 0xce, 0x18, 0x67, 0x63, 0x36, 0x40, 0x18, 0xe8, 0x85, 0x79,
0xa5, 0xa2, 0x13, 0x6f, 0xa1, 0x4f, 0x3f, 0x9a, 0xd4, 0xb1, 0xb0, 0x62, 0x04, 0xc1, 0xbf, 0x4a,
0xd0, 0x12, 0x08, 0x82, 0x24, 0x42, 0x58, 0xd8, 0x7e, 0x09, 0xc4, 0xbd, 0x04, 0x31, 0xff, 0xb7,
0xc9, 0xd8, 0xc4, 0x32, 0x0c, 0x2f, 0x4d, 0x5f, 0x5a, 0xa9, 0xac, 0x13, 0x7b, 0x07, 0xda, 0x22,
0x1b, 0x52, 0x50, 0x5b, 0x27, 0xf8, 0x28, 0xbe, 0x88, 0x20, 0x13, 0x3e, 0x0b, 0x5b, 0xfb, 0x77,
0x72, 0x12, 0x9c, 0xe3, 0x98, 0x7f, 0x5f, 0xb8, 0x2c, 0xb8, 0x1e, 0x3d, 0x02, 0x48, 0x57, 0x71,
0xdb, 0xcd, 0xc9, 0xb5, 0xac, 0x6c, 0xf4, 0xe4, 0xc2, 0x74, 0x22, 0xe9, 0xf9, 0xb3, 0xf2, 0xd3,
0x92, 0xf1, 0x15, 0xf4, 0x3e, 0x77, 0xe6, 0xd4, 0xcb, 0xa8, 0xa0, 0xd4, 0xc2, 0xfc, 0xc9, 0x0b,
0xa4, 0xbf, 0xf1, 0x92, 0xba, 0xb8, 0x14, 0xe1, 0xc2, 0xbe, 0xf7, 0x7c, 0x39, 0x4d, 0x15, 0x9e,
0xa8, 0x97, 0x3f, 0x2a, 0x00, 0x29, 0x98, 0xfe, 0x0c, 0x46, 0xd4, 0x9b, 0x60, 0x49, 0x5d, 0x50,
0x8b, 0x88, 0x16, 0x98, 0x04, 0xc4, 0x8a, 0x82, 0x90, 0x5e, 0x10, 0x39, 0x02, 0x07, 0xd2, 0x97,
0x22, 0x87, 0x0f, 0x60, 0x37, 0xd5, 0xb5, 0x33, 0x6a, 0xe5, 0x8d, 0x6a, 0x4f, 0x60, 0x07, 0xd5,
0x70, 0x70, 0x45, 0x39, 0xa5, 0xca, 0x46, 0xa5, 0x8f, 0x61, 0x2f, 0xc3, 0x33, 0xae, 0xd4, 0x8c,
0xaa, 0xb6, 0x51, 0xf5, 0x43, 0x18, 0xa0, 0xea, 0xa5, 0x49, 0x59, 0x51, 0xaf, 0xfa, 0x0f, 0x78,
0x2e, 0x48, 0x30, 0xcd, 0xf1, 0xac, 0x6d, 0x54, 0x7a, 0x0f, 0xfa, 0xa8, 0x54, 0xb0, 0x53, 0xbf,
0x49, 0x25, 0x24, 0x16, 0xc3, 0xa9, 0x92, 0x51, 0x69, 0x6c, 0x52, 0x31, 0x9e, 0x43, 0xfb, 0x65,
0x34, 0x25, 0xcc, 0x39, 0x57, 0xd5, 0xff, 0x6f, 0x1b, 0xe8, 0xd7, 0x32, 0xb4, 0x0e, 0xa6, 0x81,
0x17, 0xf9, 0xb9, 0x2e, 0x17, 0x35, 0xbc, 0xd4, 0xe5, 0x42, 0xe6, 0x21, 0xb4, 0xc5, 0x0f, 0x54,
0x8a, 0x89, 0xe6, 0xd2, 0x97, 0x4b, 0x3d, 0xbe, 0xc4, 0x9c, 0xc7, 0x9c, 0xa5, 0x60, 0xbe, 0xbd,
0x32, 0xe5, 0xf7, 0x09, 0x74, 0x66, 0xc2, 0x11, 0x29, 0x29, 0x52, 0xf9, 0x20, 0xb1, 0x9c, 0x12,
0x1c, 0x67, 0x1d, 0x16, 0x4d, 0xf4, 0x12, 0xfa, 0x4b, 0x9b, 0xf9, 0x5e, 0x32, 0xb2, 0xbd, 0xd4,
0xda, 0xdf, 0x91, 0xb0, 0x59, 0x2d, 0xde, 0x60, 0xdf, 0x43, 0x55, 0xf0, 0x79, 0x17, 0x3a, 0xae,
0xf8, 0xe9, 0xa8, 0x48, 0x54, 0x32, 0x8a, 0xb9, 0x1f, 0x12, 0x46, 0xc3, 0xe2, 0xfc, 0x56, 0x46,
0x23, 0x43, 0x7d, 0xff, 0xb7, 0x2a, 0x54, 0x9e, 0x1f, 0x7d, 0xa9, 0x1f, 0x43, 0xaf, 0xf0, 0xd2,
0xd0, 0x93, 0x39, 0xb1, 0xfa, 0xf9, 0x33, 0x7a, 0x63, 0xdd, 0xb1, 0xbc, 0x09, 0x6c, 0xc5, 0x98,
0x85, 0x6b, 0x82, 0xc2, 0x5c, 0x7d, 0x09, 0x51, 0x98, 0xeb, 0x6e, 0x17, 0x5b, 0xfa, 0x47, 0x50,
0x13, 0x8f, 0x17, 0xfd, 0x96, 0x94, 0xcd, 0xbd, 0x82, 0x46, 0xbb, 0x85, 0x5d, 0xa5, 0x78, 0x00,
0x90, 0xbe, 0x19, 0xf4, 0xa1, 0x14, 0x5b, 0x7a, 0xf6, 0x8c, 0xf6, 0x56, 0x9c, 0x28, 0x90, 0x33,
0xd8, 0x2e, 0xbe, 0x03, 0xf4, 0x42, 0x1c, 0x8a, 0xb7, 0xf6, 0xd1, 0xdd, 0xb5, 0xe7, 0x59, 0xd8,
0xe2, 0x6b, 0x40, 0xc1, 0xae, 0x79, 0x5b, 0x28, 0xd8, 0xb5, 0xcf, 0x88, 0x2d, 0xfd, 0x1b, 0xe8,
0xe6, 0x2f, 0xf2, 0xfa, 0xff, 0xa5, 0xd2, 0xca, 0xf7, 0xc5, 0xe8, 0xce, 0x9a, 0x53, 0x05, 0xf8,
0xbe, 0xa8, 0x45, 0xbc, 0x3c, 0x24, 0x51, 0xce, 0xdc, 0xf2, 0x47, 0xb7, 0xf2, 0x9b, 0x4a, 0xeb,
0x31, 0xd4, 0xc4, 0x95, 0x50, 0xa5, 0x2c, 0x77, 0x43, 0x1c, 0xb5, 0xb3, 0xbb, 0xc6, 0xd6, 0xe3,
0xd2, 0x79, 0x8d, 0xbf, 0xc0, 0x9f, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x45, 0x12, 0x50, 0x50,
0x8e, 0x0f, 0x00, 0x00,
// 1426 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x57, 0xd9, 0x6e, 0x1c, 0x55,
0x13, 0xf6, 0xcc, 0xf4, 0x6c, 0x35, 0x8b, 0xed, 0x76, 0xec, 0x8c, 0xe7, 0xff, 0x43, 0x92, 0x26,
0x40, 0x84, 0x22, 0x2b, 0x38, 0x2c, 0x21, 0x5c, 0x40, 0x70, 0xa2, 0x04, 0x94, 0x80, 0x95, 0xd8,
0x48, 0xdc, 0x30, 0x6a, 0x77, 0x1f, 0x66, 0x0e, 0xd3, 0x1b, 0xdd, 0xa7, 0xbd, 0x88, 0x37, 0xe0,
0x81, 0x78, 0x00, 0x24, 0xee, 0x79, 0x0e, 0x9e, 0x82, 0x3a, 0x4b, 0x9f, 0x5e, 0x66, 0x09, 0x5c,
0x70, 0x33, 0xd2, 0xa9, 0xae, 0xfa, 0xaa, 0xea, 0xab, 0x65, 0xce, 0x81, 0xae, 0x1d, 0xd1, 0x83,
0x28, 0x0e, 0x59, 0x68, 0x36, 0xd9, 0x55, 0x44, 0x12, 0xeb, 0x17, 0xd8, 0x3b, 0x8a, 0x89, 0xcd,
0xc8, 0x51, 0x18, 0x30, 0x9b, 0x06, 0x24, 0x7e, 0x45, 0x7e, 0x4e, 0x49, 0xc2, 0x4c, 0x80, 0x3a,
0x75, 0x47, 0xb5, 0x5b, 0xb5, 0xbb, 0x5d, 0x13, 0x0f, 0x67, 0x69, 0xe0, 0x7a, 0xe4, 0xd8, 0x66,
0xb3, 0x51, 0x5d, 0xc8, 0x06, 0xd0, 0x4c, 0x98, 0x4b, 0x83, 0x51, 0x43, 0x1c, 0x87, 0xd0, 0xc2,
0x63, 0x98, 0xb2, 0x91, 0x51, 0x38, 0x93, 0x38, 0x1e, 0x35, 0x33, 0x08, 0x67, 0x46, 0x9c, 0x79,
0x14, 0xd2, 0x80, 0x8d, 0xda, 0x5c, 0x66, 0xed, 0xc3, 0xf5, 0x05, 0xe7, 0x49, 0x14, 0x06, 0x09,
0xb1, 0x1e, 0xc2, 0xe0, 0x35, 0x9d, 0x06, 0xb6, 0xb7, 0x2c, 0x9c, 0x1e, 0x34, 0x22, 0x3c, 0xf0,
0x38, 0x06, 0xc2, 0x91, 0xd0, 0x14, 0x81, 0x0c, 0xac, 0x2d, 0x18, 0x66, 0x96, 0x0a, 0x8b, 0xc1,
0xf6, 0x63, 0xd7, 0x3d, 0x8e, 0x43, 0x87, 0x24, 0xc9, 0x32, 0xbc, 0x2d, 0xe8, 0x30, 0x12, 0xfb,
0x94, 0x83, 0x70, 0xd0, 0x8e, 0xb9, 0x0f, 0x46, 0x9a, 0x90, 0x58, 0x40, 0xf6, 0x0e, 0x7b, 0x07,
0x82, 0xac, 0x83, 0x53, 0x14, 0x99, 0x7d, 0x30, 0xec, 0x78, 0x9a, 0x60, 0x9a, 0x0d, 0x19, 0x0a,
0x09, 0xce, 0x31, 0x47, 0x75, 0x70, 0x2e, 0xdc, 0x51, 0x4b, 0x24, 0xf7, 0x10, 0x0c, 0xa1, 0x8f,
0xc2, 0x54, 0x79, 0x1a, 0xf0, 0xc3, 0x54, 0x47, 0xbe, 0x07, 0x43, 0xdb, 0x75, 0x29, 0xa3, 0x21,
0x3a, 0x7e, 0x46, 0xdd, 0x04, 0xdd, 0x35, 0x30, 0x83, 0xdb, 0x60, 0x16, 0xe3, 0x95, 0x59, 0x64,
0x49, 0x0b, 0x1c, 0xeb, 0x85, 0x66, 0x4e, 0x73, 0xba, 0x2c, 0xb1, 0x77, 0x4a, 0xa4, 0xd7, 0x45,
0x32, 0xdb, 0x2a, 0x99, 0xdc, 0xd2, 0x1a, 0xc3, 0x68, 0x11, 0x4d, 0x91, 0xf7, 0x00, 0xae, 0x3f,
0x21, 0x1e, 0x79, 0x93, 0x27, 0x64, 0x25, 0xb0, 0x7d, 0x22, 0x7b, 0x83, 0x03, 0x2e, 0x1a, 0x29,
0xc0, 0xb7, 0x61, 0xf7, 0x05, 0x4d, 0xd8, 0x5a, 0x38, 0xeb, 0x7b, 0x80, 0x5c, 0x41, 0x83, 0x6b,
0x57, 0xe4, 0x92, 0x32, 0x55, 0x29, 0xa4, 0x85, 0x39, 0x91, 0x28, 0x54, 0xc7, 0xdc, 0x81, 0x5e,
0x1a, 0xd0, 0xcb, 0xd7, 0xa1, 0x33, 0x27, 0x2c, 0x11, 0x9d, 0xd8, 0x11, 0x8d, 0x3a, 0x23, 0x9e,
0x27, 0x1a, 0xb1, 0x63, 0x7d, 0x01, 0x7b, 0x55, 0xff, 0x8a, 0xe1, 0x77, 0xa1, 0x97, 0xb3, 0x95,
0xa0, 0xb7, 0xc6, 0x72, 0xba, 0x86, 0xd0, 0x7f, 0xcd, 0x90, 0x2d, 0x15, 0xb8, 0x75, 0x0b, 0x86,
0xba, 0x81, 0xc5, 0x07, 0xd9, 0xfc, 0x36, 0x4b, 0x13, 0x95, 0xce, 0x1c, 0xda, 0xaa, 0x9c, 0xa5,
0x32, 0xfe, 0x37, 0x8d, 0xe7, 0x41, 0x57, 0x87, 0xb3, 0xba, 0x46, 0x95, 0x99, 0x96, 0x43, 0x7c,
0x1b, 0xba, 0x91, 0x8c, 0x93, 0x48, 0x3f, 0xbd, 0xc3, 0xa1, 0x0a, 0x21, 0x8b, 0x3f, 0x4f, 0x4d,
0xcc, 0x35, 0xf6, 0x47, 0xfb, 0xa5, 0xed, 0xcc, 0xd0, 0x59, 0xd5, 0x97, 0x13, 0xa1, 0x92, 0x9e,
0x51, 0x9f, 0xf8, 0x61, 0x7c, 0x25, 0xfc, 0x18, 0xd6, 0x77, 0x38, 0xdd, 0x92, 0x41, 0x45, 0xfd,
0x1d, 0x6c, 0xd4, 0x2c, 0xe6, 0x8c, 0xf9, 0xad, 0x8c, 0x79, 0x9d, 0xcc, 0x4d, 0x68, 0xfb, 0xd2,
0x97, 0xea, 0xe5, 0x2c, 0x38, 0x15, 0x81, 0xf5, 0x04, 0xf6, 0x4e, 0x23, 0xf7, 0x4d, 0xdb, 0x2c,
0xdf, 0x18, 0xf9, 0x06, 0x91, 0x29, 0x35, 0xb2, 0xb5, 0xb4, 0x80, 0xa2, 0x9a, 0x77, 0x13, 0x06,
0x4f, 0xcf, 0x09, 0x76, 0x47, 0x56, 0xfb, 0x3f, 0x6b, 0xd0, 0x14, 0x12, 0x9e, 0x31, 0x0f, 0x46,
0xf9, 0x90, 0xfe, 0xea, 0xf9, 0x2a, 0xd4, 0xf8, 0x83, 0x0a, 0xf3, 0x46, 0x71, 0xa5, 0x35, 0x2b,
0x2b, 0xad, 0x2d, 0xce, 0x98, 0xb7, 0x2a, 0xcb, 0xa8, 0x53, 0xca, 0x3b, 0x2b, 0x4a, 0x99, 0xbe,
0xee, 0x0a, 0xfa, 0xca, 0xdb, 0x00, 0x56, 0x6d, 0x83, 0xdf, 0x6a, 0xd0, 0xff, 0x86, 0xb0, 0x8b,
0x30, 0x9e, 0xf3, 0x22, 0x25, 0x95, 0xf1, 0xc3, 0x9e, 0x8d, 0x2f, 0x27, 0x67, 0x57, 0x8c, 0xc8,
0xea, 0x1a, 0x3c, 0x1f, 0x94, 0x1c, 0xdb, 0x72, 0xe8, 0x44, 0x85, 0xcd, 0x6d, 0xe8, 0xbe, 0xba,
0x9c, 0xe0, 0xfa, 0x0f, 0x63, 0x39, 0x87, 0x42, 0x0d, 0x45, 0x6e, 0x1c, 0x46, 0x11, 0x91, 0x99,
0x1a, 0x1c, 0xec, 0x24, 0x03, 0x6b, 0x65, 0x5a, 0x28, 0x89, 0x14, 0x58, 0x3b, 0x03, 0x3b, 0xd1,
0x60, 0x9d, 0x82, 0x5a, 0x06, 0xd6, 0x15, 0x5d, 0xe5, 0x43, 0xe7, 0x28, 0x4a, 0x4f, 0x13, 0x7b,
0x4a, 0xf8, 0x26, 0x60, 0x21, 0xb3, 0xbd, 0x49, 0xca, 0x8f, 0x22, 0x74, 0xc3, 0xbc, 0x06, 0xfd,
0x88, 0xc4, 0xd8, 0x97, 0x4a, 0x5a, 0x47, 0xa2, 0x0c, 0xf3, 0x7f, 0xb0, 0x23, 0x8e, 0x13, 0x1a,
0x4c, 0xe6, 0x24, 0x0e, 0x88, 0xe7, 0x87, 0x2e, 0x51, 0x79, 0xec, 0xc3, 0xb6, 0xfe, 0xc8, 0x07,
0x53, 0x7c, 0x12, 0xf9, 0x58, 0x27, 0x30, 0x3c, 0x99, 0xe1, 0x7f, 0x29, 0xf3, 0x68, 0x30, 0x7d,
0x62, 0x33, 0xdb, 0xdc, 0xc4, 0x3a, 0x91, 0x98, 0x86, 0x6e, 0xa2, 0x1c, 0xa2, 0x35, 0x93, 0x2a,
0xc4, 0x9d, 0x64, 0x9f, 0x24, 0x69, 0xb8, 0xfc, 0xf3, 0x4f, 0x8c, 0xfa, 0xca, 0xa1, 0xf5, 0x83,
0x48, 0x42, 0x12, 0x6f, 0x41, 0x37, 0x0f, 0xb6, 0x26, 0xea, 0xb5, 0x99, 0xd5, 0x2b, 0x4b, 0xf4,
0x00, 0x36, 0x99, 0x8e, 0x62, 0x82, 0x5d, 0x6b, 0xab, 0xd9, 0xd8, 0x55, 0x9a, 0xe5, 0x18, 0xad,
0xcf, 0x01, 0x5e, 0x8a, 0x51, 0x14, 0x11, 0xe3, 0x6e, 0x2c, 0x12, 0x84, 0x44, 0xfb, 0xf6, 0xa5,
0x66, 0x87, 0x8b, 0x30, 0xa7, 0x1f, 0x6d, 0xea, 0x39, 0xd8, 0x31, 0x32, 0xc0, 0xbf, 0x6a, 0xd0,
0x93, 0x08, 0x32, 0x48, 0x84, 0x70, 0x70, 0xfc, 0x32, 0x88, 0x5b, 0x19, 0x62, 0xf9, 0xdf, 0xa6,
0xe0, 0x13, 0xdb, 0x30, 0xb9, 0xb0, 0x23, 0xe5, 0xa5, 0xb1, 0x4a, 0xed, 0x3d, 0xe8, 0xcb, 0x6a,
0x28, 0x45, 0x63, 0x95, 0xe2, 0x3d, 0x7e, 0x11, 0xc1, 0x48, 0xc4, 0x2e, 0xec, 0x1d, 0xde, 0x28,
0x69, 0x88, 0x18, 0x0f, 0xc4, 0xef, 0xd3, 0x80, 0xc5, 0x57, 0xe3, 0x7b, 0x00, 0xf9, 0x89, 0x8f,
0xdd, 0x9c, 0x5c, 0xa9, 0xce, 0xc6, 0x4c, 0xce, 0x6d, 0x2f, 0x55, 0x99, 0x3f, 0xaa, 0x3f, 0xac,
0x59, 0x5f, 0xc3, 0xe6, 0x97, 0xde, 0x9c, 0x86, 0x05, 0x13, 0xd4, 0xf2, 0xed, 0x9f, 0xc2, 0x58,
0xe5, 0xcb, 0x8f, 0x34, 0xc0, 0xa3, 0xa4, 0x0b, 0xe7, 0x3e, 0x8c, 0xd4, 0x36, 0xd5, 0x78, 0xb2,
0x5f, 0x7e, 0x6f, 0x00, 0xe4, 0x60, 0xe6, 0x23, 0x18, 0xd3, 0x70, 0x82, 0x2d, 0x75, 0x4e, 0x1d,
0x22, 0x47, 0x60, 0x12, 0x13, 0x27, 0x8d, 0x13, 0x7a, 0x4e, 0xd4, 0x0a, 0xdc, 0x53, 0xb9, 0x54,
0x63, 0xf8, 0x08, 0x76, 0x73, 0x5b, 0xb7, 0x60, 0x56, 0x5f, 0x6b, 0xf6, 0x00, 0x76, 0xd0, 0x0c,
0x17, 0x57, 0x5a, 0x32, 0x6a, 0xac, 0x35, 0xfa, 0x14, 0xf6, 0x0b, 0x71, 0xf2, 0x4e, 0x2d, 0x98,
0x1a, 0x6b, 0x4d, 0x3f, 0x86, 0x3d, 0x34, 0xbd, 0xb0, 0x29, 0xab, 0xda, 0x35, 0xff, 0x41, 0x9c,
0x3e, 0x89, 0xa7, 0xa5, 0x38, 0x5b, 0x6b, 0x8d, 0x3e, 0x80, 0x6d, 0x34, 0xaa, 0xf8, 0x69, 0xbf,
0xc9, 0x24, 0x21, 0x0e, 0xc3, 0xad, 0x52, 0x30, 0xe9, 0xac, 0x33, 0xb1, 0x1e, 0x43, 0xff, 0x79,
0x3a, 0x25, 0xcc, 0x3b, 0xd3, 0xdd, 0xff, 0x6f, 0x07, 0xe8, 0xd7, 0x3a, 0xf4, 0x8e, 0xa6, 0x71,
0x98, 0x46, 0xa5, 0x29, 0x97, 0x3d, 0xbc, 0x30, 0xe5, 0x52, 0xe7, 0x2e, 0xf4, 0xe5, 0x1f, 0xa8,
0x52, 0x93, 0xc3, 0x65, 0x2e, 0xb6, 0x3a, 0xbf, 0xc4, 0x9c, 0xf1, 0x98, 0x95, 0x62, 0x79, 0xbc,
0x0a, 0xed, 0xf7, 0x19, 0x0c, 0x66, 0x32, 0x11, 0xa5, 0x29, 0x4b, 0x79, 0x27, 0xf3, 0x9c, 0x07,
0x78, 0x50, 0x4c, 0x58, 0x0e, 0xd1, 0x73, 0xd8, 0x5e, 0x10, 0x96, 0x67, 0xc9, 0x2a, 0xce, 0x52,
0xef, 0x70, 0x47, 0xc1, 0x16, 0xad, 0xc4, 0x80, 0x45, 0xd0, 0x94, 0xf1, 0xbc, 0x0f, 0x83, 0x40,
0xfe, 0xe9, 0x68, 0x26, 0x1a, 0x05, 0xc3, 0xd2, 0x1f, 0x12, 0xb2, 0xe1, 0x88, 0xf8, 0x96, 0xb2,
0x51, 0xe4, 0x16, 0xeb, 0xc1, 0x3b, 0x02, 0xd5, 0xfc, 0x48, 0xd1, 0x3f, 0x96, 0xb7, 0xb7, 0x65,
0x0f, 0x81, 0xc3, 0x3f, 0x9a, 0xd0, 0x78, 0x7c, 0xfc, 0x95, 0xf9, 0x0a, 0x36, 0x2b, 0x0f, 0x13,
0x33, 0x5b, 0x2b, 0xcb, 0x5f, 0x4b, 0xe3, 0xb7, 0x56, 0x7d, 0x56, 0x17, 0x87, 0x0d, 0x8e, 0x59,
0xb9, 0x55, 0x68, 0xcc, 0xe5, 0x77, 0x16, 0x8d, 0xb9, 0xea, 0x32, 0xb2, 0x61, 0x7e, 0x02, 0x2d,
0xf9, 0xd6, 0x31, 0xaf, 0x29, 0xdd, 0xd2, 0xa3, 0x69, 0xbc, 0x5b, 0x91, 0x6a, 0xc3, 0x23, 0x80,
0xfc, 0x89, 0x61, 0x8e, 0x94, 0xda, 0xc2, 0x2b, 0x69, 0xbc, 0xbf, 0xe4, 0x8b, 0x06, 0x39, 0x85,
0xad, 0xea, 0xb3, 0xc1, 0xac, 0xf0, 0x50, 0xbd, 0xe4, 0x8f, 0x6f, 0xae, 0xfc, 0x5e, 0x84, 0xad,
0x3e, 0x1e, 0x34, 0xec, 0x8a, 0xa7, 0x88, 0x86, 0x5d, 0xf9, 0xea, 0xd8, 0x30, 0xbf, 0x85, 0x61,
0xf9, 0xde, 0x6f, 0xfe, 0x5f, 0x19, 0x2d, 0x7d, 0x8e, 0x8c, 0x6f, 0xac, 0xf8, 0xaa, 0x01, 0x3f,
0x94, 0xad, 0x8b, 0x77, 0x8d, 0x8c, 0xe5, 0xc2, 0xa3, 0x60, 0x7c, 0xad, 0x2c, 0xd4, 0x56, 0xf7,
0xa1, 0x25, 0x6f, 0x90, 0xba, 0x64, 0xa5, 0x0b, 0xe5, 0xb8, 0x5f, 0x94, 0x5a, 0x1b, 0xf7, 0x6b,
0xb8, 0xa5, 0x3a, 0xcf, 0x08, 0x93, 0xfd, 0x5c, 0x74, 0xb5, 0x60, 0x22, 0x84, 0xdc, 0xe4, 0xac,
0x25, 0xde, 0xf8, 0x0f, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xef, 0x98, 0x5d, 0x0a, 0xf0, 0x0f,
0x00, 0x00,
}

View file

@ -12,6 +12,7 @@ service API {
rpc ListCheckpoint(ListCheckpointRequest) returns (ListCheckpointResponse) {}
rpc State(StateRequest) returns (StateResponse) {}
rpc Events(EventsRequest) returns (stream Event) {}
rpc GetStats(StatsRequest) returns (stream Stats) {}
}
message CreateContainerRequest {
@ -225,4 +226,9 @@ message CgroupStats {
message Stats {
repeated NetworkStats network_stats = 1;
CgroupStats cgroup_stats = 2;
uint64 timestamp = 3;
};
message StatsRequest {
string id = 1;
}

View file

@ -230,3 +230,31 @@ var ExecCommand = cli.Command{
}
},
}
var StatsCommand = cli.Command{
Name: "stats",
Usage: "get stats for running container",
Flags: []cli.Flag{
cli.StringFlag{
Name: "id",
Usage: "container id",
},
},
Action: func(context *cli.Context) {
req := &types.StatsRequest{
Id: context.String("id"),
}
c := getClient()
stream, err := c.GetStats(netcontext.Background(), req)
if err != nil {
fatal(err.Error(), 1)
}
for {
stats, err := stream.Recv()
if err != nil {
fatal(err.Error(), 1)
}
fmt.Println(stats)
}
},
}

View file

@ -37,6 +37,7 @@ func main() {
CheckpointCommand,
ContainersCommand,
EventsCommand,
StatsCommand,
}
app.Before = func(context *cli.Context) error {
if context.GlobalBool("debug") {

View file

@ -21,6 +21,8 @@ const (
UpdateContainerEventType EventType = "updateContainer"
CreateCheckpointEventType EventType = "createCheckpoint"
DeleteCheckpointEventType EventType = "deleteCheckpoint"
StatsEventType EventType = "events"
UnsubscribeStatsEventType EventType = "unsubscribeEvents"
)
func NewEvent(t EventType) *Event {
@ -47,6 +49,7 @@ type Event struct {
Containers []runtime.Container
Checkpoint *runtime.Checkpoint
Err chan error
Stats chan interface{}
}
type Handler interface {

View file

@ -17,3 +17,29 @@ func Metrics() map[string]interface{} {
"events-subscribers": EventSubscriberCounter,
}
}
type StatsEvent struct {
s *Supervisor
}
type UnsubscribeStatsEvent struct {
s *Supervisor
}
func (h *StatsEvent) Handle(e *Event) error {
i, ok := h.s.containers[e.ID]
if !ok {
return ErrContainerNotFound
}
e.Stats = h.s.statsCollector.collect(i.container)
return nil
}
func (h *UnsubscribeStatsEvent) Handle(e *Event) error {
i, ok := h.s.containers[e.ID]
if !ok {
return ErrContainerNotFound
}
h.s.statsCollector.unsubscribe(i.container, e.Stats)
return nil
}

240
stats_collector.go Normal file
View file

@ -0,0 +1,240 @@
package containerd
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"sync"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/containerd/api/grpc/types"
"github.com/docker/containerd/runtime"
"github.com/docker/docker/pkg/pubsub"
"github.com/opencontainers/runc/libcontainer"
"github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/system"
)
func convertBlkioEntryToPb(b []cgroups.BlkioStatEntry) []*types.BlkioStatsEntry {
var pbEs []*types.BlkioStatsEntry
for _, e := range b {
pbEs = append(pbEs, &types.BlkioStatsEntry{
Major: e.Major,
Minor: e.Minor,
Op: e.Op,
Value: e.Value,
})
}
return pbEs
}
func convertToPb(st *runtime.Stat) *types.Stats {
pbSt := &types.Stats{
Timestamp: uint64(st.Timestamp.Unix()),
CgroupStats: &types.CgroupStats{},
}
lcSt, ok := st.Data.(*libcontainer.Stats)
if !ok {
return pbSt
}
cpuSt := lcSt.CgroupStats.CpuStats
pbSt.CgroupStats.CpuStats = &types.CpuStats{
CpuUsage: &types.CpuUsage{
TotalUsage: cpuSt.CpuUsage.TotalUsage,
PercpuUsage: cpuSt.CpuUsage.PercpuUsage,
UsageInKernelmode: cpuSt.CpuUsage.UsageInKernelmode,
UsageInUsermode: cpuSt.CpuUsage.UsageInUsermode,
},
ThrottlingData: &types.ThrottlingData{
Periods: cpuSt.ThrottlingData.Periods,
ThrottledPeriods: cpuSt.ThrottlingData.ThrottledPeriods,
ThrottledTime: cpuSt.ThrottlingData.ThrottledTime,
},
}
memSt := lcSt.CgroupStats.MemoryStats
pbSt.CgroupStats.MemoryStats = &types.MemoryStats{
Cache: memSt.Cache,
Usage: &types.MemoryData{
Usage: memSt.Usage.Usage,
MaxUsage: memSt.Usage.MaxUsage,
Failcnt: memSt.Usage.Failcnt,
},
SwapUsage: &types.MemoryData{
Usage: memSt.SwapUsage.Usage,
MaxUsage: memSt.SwapUsage.MaxUsage,
Failcnt: memSt.SwapUsage.Failcnt,
},
}
blkSt := lcSt.CgroupStats.BlkioStats
pbSt.CgroupStats.BlkioStats = &types.BlkioStats{
IoServiceBytesRecursive: convertBlkioEntryToPb(blkSt.IoServiceBytesRecursive),
IoServicedRecursive: convertBlkioEntryToPb(blkSt.IoServicedRecursive),
IoQueuedRecursive: convertBlkioEntryToPb(blkSt.IoQueuedRecursive),
IoServiceTimeRecursive: convertBlkioEntryToPb(blkSt.IoServiceTimeRecursive),
IoWaitTimeRecursive: convertBlkioEntryToPb(blkSt.IoWaitTimeRecursive),
IoMergedRecursive: convertBlkioEntryToPb(blkSt.IoMergedRecursive),
IoTimeRecursive: convertBlkioEntryToPb(blkSt.IoTimeRecursive),
SectorsRecursive: convertBlkioEntryToPb(blkSt.SectorsRecursive),
}
pbSt.CgroupStats.HugetlbStats = make(map[string]*types.HugetlbStats)
for k, st := range lcSt.CgroupStats.HugetlbStats {
pbSt.CgroupStats.HugetlbStats[k] = &types.HugetlbStats{
Usage: st.Usage,
MaxUsage: st.MaxUsage,
Failcnt: st.Failcnt,
}
}
return pbSt
}
type statsPair struct {
ct runtime.Container
pub *pubsub.Publisher
}
func newStatsCollector(interval time.Duration) *statsCollector {
s := &statsCollector{
interval: interval,
clockTicksPerSecond: uint64(system.GetClockTicks()),
bufReader: bufio.NewReaderSize(nil, 128),
publishers: make(map[string]*statsPair),
}
go s.run()
return s
}
// statsCollector manages and provides container resource stats
type statsCollector struct {
m sync.Mutex
supervisor *Supervisor
interval time.Duration
clockTicksPerSecond uint64
publishers map[string]*statsPair
bufReader *bufio.Reader
}
// collect registers the container with the collector and adds it to
// the event loop for collection on the specified interval returning
// a channel for the subscriber to receive on.
func (s *statsCollector) collect(c runtime.Container) chan interface{} {
s.m.Lock()
defer s.m.Unlock()
publisher, exists := s.publishers[c.ID()]
if !exists {
pub := pubsub.NewPublisher(100*time.Millisecond, 1024)
publisher = &statsPair{ct: c, pub: pub}
s.publishers[c.ID()] = publisher
}
return publisher.pub.Subscribe()
}
// stopCollection closes the channels for all subscribers and removes
// the container from metrics collection.
func (s *statsCollector) stopCollection(c runtime.Container) {
s.m.Lock()
if publisher, exists := s.publishers[c.ID()]; exists {
publisher.pub.Close()
delete(s.publishers, c.ID())
}
s.m.Unlock()
}
// unsubscribe removes a specific subscriber from receiving updates for a container's stats.
func (s *statsCollector) unsubscribe(c runtime.Container, ch chan interface{}) {
s.m.Lock()
publisher := s.publishers[c.ID()]
if publisher != nil {
publisher.pub.Evict(ch)
if publisher.pub.Len() == 0 {
delete(s.publishers, c.ID())
}
}
s.m.Unlock()
}
func (s *statsCollector) run() {
type publishersPair struct {
container runtime.Container
publisher *pubsub.Publisher
}
// we cannot determine the capacity here.
// it will grow enough in first iteration
var pairs []*statsPair
for range time.Tick(s.interval) {
// it does not make sense in the first iteration,
// but saves allocations in further iterations
pairs = pairs[:0]
s.m.Lock()
for _, publisher := range s.publishers {
// copy pointers here to release the lock ASAP
pairs = append(pairs, publisher)
}
s.m.Unlock()
if len(pairs) == 0 {
continue
}
for _, pair := range pairs {
stats, err := pair.ct.Stats()
if err != nil {
logrus.Errorf("Error getting stats for container ID %s", pair.ct.ID())
continue
}
pair.pub.Publish(convertToPb(stats))
}
}
}
const nanoSecondsPerSecond = 1e9
// getSystemCPUUsage returns the host system's cpu usage in
// nanoseconds. An error is returned if the format of the underlying
// file does not match.
//
// Uses /proc/stat defined by POSIX. Looks for the cpu
// statistics line and then sums up the first seven fields
// provided. See `man 5 proc` for details on specific field
// information.
func (s *statsCollector) getSystemCPUUsage() (uint64, error) {
var line string
f, err := os.Open("/proc/stat")
if err != nil {
return 0, err
}
defer func() {
s.bufReader.Reset(nil)
f.Close()
}()
s.bufReader.Reset(f)
err = nil
for err == nil {
line, err = s.bufReader.ReadString('\n')
if err != nil {
break
}
parts := strings.Fields(line)
switch parts[0] {
case "cpu":
if len(parts) < 8 {
return 0, fmt.Errorf("bad format of cpu stats")
}
var totalClockTicks uint64
for _, i := range parts[1:8] {
v, err := strconv.ParseUint(i, 10, 64)
if err != nil {
return 0, fmt.Errorf("error parsing cpu stats")
}
totalClockTicks += v
}
return (totalClockTicks * nanoSecondsPerSecond) /
s.clockTicksPerSecond, nil
}
}
return 0, fmt.Errorf("bad stats format")
}

View file

@ -7,12 +7,15 @@ import (
goruntime "runtime"
"sync"
"syscall"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/containerd/runtime"
"github.com/opencontainers/runc/libcontainer"
)
const statsInterval = 1 * time.Second
// NewSupervisor returns an initialized Process supervisor.
func NewSupervisor(id, stateDir string, tasks chan *StartTask) (*Supervisor, error) {
if err := os.MkdirAll(stateDir, 0755); err != nil {
@ -28,14 +31,15 @@ func NewSupervisor(id, stateDir string, tasks chan *StartTask) (*Supervisor, err
return nil, err
}
s := &Supervisor{
stateDir: stateDir,
containers: make(map[string]*containerInfo),
processes: make(map[int]*containerInfo),
runtime: r,
tasks: tasks,
events: make(chan *Event, DefaultBufferSize),
machine: machine,
subscribers: make(map[chan *Event]struct{}),
stateDir: stateDir,
containers: make(map[string]*containerInfo),
processes: make(map[int]*containerInfo),
runtime: r,
tasks: tasks,
events: make(chan *Event, DefaultBufferSize),
machine: machine,
subscribers: make(map[chan *Event]struct{}),
statsCollector: newStatsCollector(statsInterval),
}
// register default event handlers
s.handlers = map[EventType]Handler{
@ -49,6 +53,8 @@ func NewSupervisor(id, stateDir string, tasks chan *StartTask) (*Supervisor, err
UpdateContainerEventType: &UpdateEvent{s},
CreateCheckpointEventType: &CreateCheckpointEvent{s},
DeleteCheckpointEventType: &DeleteCheckpointEvent{s},
StatsEventType: &StatsEvent{s},
UnsubscribeStatsEventType: &UnsubscribeStatsEvent{s},
}
// start the container workers for concurrent container starts
return s, nil
@ -74,6 +80,7 @@ type Supervisor struct {
subscribers map[chan *Event]struct{}
machine Machine
containerGroup sync.WaitGroup
statsCollector *statsCollector
}
// Stop closes all tasks and sends a SIGTERM to each container's pid1 then waits for they to