Add derived stats tracking to containers.
This commit is contained in:
parent
48c41ba273
commit
2406b6c55b
@ -52,7 +52,9 @@ func GenerateRandomStats(numStats, numCores int, duration time.Duration) []*info
|
||||
func GenerateRandomContainerSpec(numCores int) info.ContainerSpec {
|
||||
ret := info.ContainerSpec{
|
||||
CreationTime: time.Now(),
|
||||
HasCpu: true,
|
||||
Cpu: info.CpuSpec{},
|
||||
HasMemory: true,
|
||||
Memory: info.MemorySpec{},
|
||||
}
|
||||
ret.Cpu.Limit = uint64(1000 + rand.Int63n(2000))
|
||||
|
@ -26,6 +26,7 @@ import (
|
||||
"github.com/google/cadvisor/container"
|
||||
"github.com/google/cadvisor/info"
|
||||
"github.com/google/cadvisor/storage"
|
||||
"github.com/google/cadvisor/summary"
|
||||
"github.com/google/cadvisor/utils/cpuload"
|
||||
)
|
||||
|
||||
@ -49,6 +50,7 @@ type containerData struct {
|
||||
storageDriver storage.StorageDriver
|
||||
lock sync.Mutex
|
||||
loadReader cpuload.CpuLoadReader
|
||||
summaryReader *summary.StatsSummary
|
||||
loadAvg float64 // smoothed load average seen so far.
|
||||
housekeepingInterval time.Duration
|
||||
lastUpdatedTime time.Time
|
||||
@ -121,6 +123,15 @@ func newContainerData(containerName string, driver storage.StorageDriver, handle
|
||||
}
|
||||
cont.info.ContainerReference = ref
|
||||
|
||||
err = cont.updateSpec()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cont.summaryReader, err = summary.New(cont.info.Spec)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create summary reader: %v", err)
|
||||
}
|
||||
|
||||
return cont, nil
|
||||
}
|
||||
|
||||
@ -278,6 +289,13 @@ func (c *containerData) updateStats() error {
|
||||
stats.Cpu.LoadAverage = int32(c.loadAvg * 1000)
|
||||
}
|
||||
}
|
||||
if c.summaryReader != nil {
|
||||
err := c.summaryReader.AddSample(*stats)
|
||||
if err != nil {
|
||||
// Ignore summary errors for now.
|
||||
glog.V(2).Infof("failed to add summary stats for %q: %v", c.info.Name, err)
|
||||
}
|
||||
}
|
||||
ref, err := c.handler.ContainerReference()
|
||||
if err != nil {
|
||||
// Ignore errors if the container is dead.
|
||||
|
@ -31,9 +31,13 @@ import (
|
||||
|
||||
const containerName = "/container"
|
||||
|
||||
// Create a containerData instance for a test. Optionsl storage driver may be specified (one is made otherwise).
|
||||
func newTestContainerData(t *testing.T) (*containerData, *container.MockContainerHandler, *stest.MockStorageDriver) {
|
||||
// Create a containerData instance for a test.
|
||||
func setupContainerData(t *testing.T, spec info.ContainerSpec) (*containerData, *container.MockContainerHandler, *stest.MockStorageDriver) {
|
||||
mockHandler := container.NewMockContainerHandler(containerName)
|
||||
mockHandler.On("GetSpec").Return(
|
||||
spec,
|
||||
nil,
|
||||
)
|
||||
mockDriver := &stest.MockStorageDriver{}
|
||||
ret, err := newContainerData(containerName, mockDriver, mockHandler, nil, false)
|
||||
if err != nil {
|
||||
@ -42,6 +46,13 @@ func newTestContainerData(t *testing.T) (*containerData, *container.MockContaine
|
||||
return ret, mockHandler, mockDriver
|
||||
}
|
||||
|
||||
// Create a containerData instance for a test and add a default GetSpec mock.
|
||||
func newTestContainerData(t *testing.T) (*containerData, *container.MockContainerHandler, *stest.MockStorageDriver) {
|
||||
spec := itest.GenerateRandomContainerSpec(4)
|
||||
ret, mockHandler, mockDriver := setupContainerData(t, spec)
|
||||
return ret, mockHandler, mockDriver
|
||||
}
|
||||
|
||||
func TestUpdateSubcontainers(t *testing.T) {
|
||||
subcontainers := []info.ContainerReference{
|
||||
{Name: "/container/ee0103"},
|
||||
@ -146,11 +157,7 @@ func TestGetInfo(t *testing.T) {
|
||||
{Name: "/container/abcd"},
|
||||
{Name: "/container/something"},
|
||||
}
|
||||
cd, mockHandler, _ := newTestContainerData(t)
|
||||
mockHandler.On("GetSpec").Return(
|
||||
spec,
|
||||
nil,
|
||||
)
|
||||
cd, mockHandler, _ := setupContainerData(t, spec)
|
||||
mockHandler.On("ListContainers", container.ListSelf).Return(
|
||||
subcontainers,
|
||||
nil,
|
||||
|
@ -50,6 +50,11 @@ func createManagerAndAddContainers(
|
||||
if ret, ok := mif.(*manager); ok {
|
||||
for _, name := range containers {
|
||||
mockHandler := container.NewMockContainerHandler(name)
|
||||
spec := itest.GenerateRandomContainerSpec(4)
|
||||
mockHandler.On("GetSpec").Return(
|
||||
spec,
|
||||
nil,
|
||||
).Once()
|
||||
cont, err := newContainerData(name, driver, mockHandler, nil, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
@ -45,7 +45,7 @@ func (self uint64Slice) Get90Percentile() uint64 {
|
||||
idx, frac := math.Modf(n)
|
||||
index := int(idx)
|
||||
percentile := float64(self[index-1])
|
||||
if index > 1 || index < count {
|
||||
if index > 1 && index < count {
|
||||
percentile += frac * float64(self[index]-self[index-1])
|
||||
}
|
||||
return uint64(percentile)
|
||||
|
Loading…
Reference in New Issue
Block a user