-
Notifications
You must be signed in to change notification settings - Fork 180
/
mem_extractor.go
71 lines (56 loc) · 2.89 KB
/
mem_extractor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package extractors
import (
"time"
cinfo "github.com/google/cadvisor/info/v1"
. "github.com/aws/private-amazon-cloudwatch-agent-staging/internal/containerinsightscommon"
"github.com/aws/private-amazon-cloudwatch-agent-staging/internal/mapWithExpiry"
)
type MemMetricExtractor struct {
preInfos *mapWithExpiry.MapWithExpiry
}
func (m *MemMetricExtractor) recordPreviousInfo(info *cinfo.ContainerInfo) {
m.preInfos.Set(info.Name, info)
}
func (m *MemMetricExtractor) HasValue(info *cinfo.ContainerInfo) bool {
return info.Spec.HasMemory
}
func (m *MemMetricExtractor) GetValue(info *cinfo.ContainerInfo, containerType string) []*CAdvisorMetric {
var metrics []*CAdvisorMetric
if containerType == TypeInfraContainer {
return metrics
}
metric := newCadvisorMetric(containerType)
metric.cgroupPath = info.Name
curStats := GetStats(info)
metric.fields[MetricName(containerType, MemUsage)] = curStats.Memory.Usage
metric.fields[MetricName(containerType, MemCache)] = curStats.Memory.Cache
metric.fields[MetricName(containerType, MemRss)] = curStats.Memory.RSS
metric.fields[MetricName(containerType, MemMaxusage)] = curStats.Memory.MaxUsage
metric.fields[MetricName(containerType, MemSwap)] = curStats.Memory.Swap
metric.fields[MetricName(containerType, MemFailcnt)] = curStats.Memory.Failcnt
metric.fields[MetricName(containerType, MemMappedfile)] = curStats.Memory.MappedFile
metric.fields[MetricName(containerType, MemWorkingset)] = curStats.Memory.WorkingSet
if preInfo, ok := m.preInfos.Get(info.Name); ok {
preStats := GetStats(preInfo.(*cinfo.ContainerInfo))
deltaCTimeInNano := curStats.Timestamp.Sub(preStats.Timestamp).Nanoseconds()
if deltaCTimeInNano > MinTimeDiff {
metric.fields[MetricName(containerType, MemPgfault)] = float64(curStats.Memory.ContainerData.Pgfault-preStats.Memory.ContainerData.Pgfault) / float64(deltaCTimeInNano) * float64(time.Second)
metric.fields[MetricName(containerType, MemPgmajfault)] = float64(curStats.Memory.ContainerData.Pgmajfault-preStats.Memory.ContainerData.Pgmajfault) / float64(deltaCTimeInNano) * float64(time.Second)
metric.fields[MetricName(containerType, MemHierarchicalPgfault)] = float64(curStats.Memory.HierarchicalData.Pgfault-preStats.Memory.HierarchicalData.Pgfault) / float64(deltaCTimeInNano) * float64(time.Second)
metric.fields[MetricName(containerType, MemHierarchicalPgmajfault)] = float64(curStats.Memory.HierarchicalData.Pgmajfault-preStats.Memory.HierarchicalData.Pgmajfault) / float64(deltaCTimeInNano) * float64(time.Second)
}
}
m.recordPreviousInfo(info)
metrics = append(metrics, metric)
return metrics
}
func (m *MemMetricExtractor) CleanUp(now time.Time) {
m.preInfos.CleanUp(now)
}
func NewMemMetricExtractor() *MemMetricExtractor {
return &MemMetricExtractor{
preInfos: mapWithExpiry.NewMapWithExpiry(CleanInterval),
}
}