Skip to content

Commit

Permalink
split advanced tcp metrics from original tcp metrics as advtcp
Browse files Browse the repository at this point in the history
  • Loading branch information
KielChan committed Jan 7, 2020
1 parent 0a9365b commit 43e7824
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 161 deletions.
27 changes: 15 additions & 12 deletions cadvisor.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,22 +77,24 @@ var (
// Metrics to be ignored.
// Tcp metrics are ignored by default.
ignoreMetrics metricSetValue = metricSetValue{container.MetricSet{
container.NetworkTcpUsageMetrics: struct{}{},
container.NetworkUdpUsageMetrics: struct{}{},
container.ProcessSchedulerMetrics: struct{}{},
container.ProcessMetrics: struct{}{},
container.NetworkTcpUsageMetrics: struct{}{},
container.NetworkUdpUsageMetrics: struct{}{},
container.NetworkAdvancedTcpUsageMetrics: struct{}{},
container.ProcessSchedulerMetrics: struct{}{},
container.ProcessMetrics: struct{}{},
}}

// List of metrics that can be ignored.
ignoreWhitelist = container.MetricSet{
container.DiskUsageMetrics: struct{}{},
container.DiskIOMetrics: struct{}{},
container.NetworkUsageMetrics: struct{}{},
container.NetworkTcpUsageMetrics: struct{}{},
container.NetworkUdpUsageMetrics: struct{}{},
container.PerCpuUsageMetrics: struct{}{},
container.ProcessSchedulerMetrics: struct{}{},
container.ProcessMetrics: struct{}{},
container.DiskUsageMetrics: struct{}{},
container.DiskIOMetrics: struct{}{},
container.NetworkUsageMetrics: struct{}{},
container.NetworkTcpUsageMetrics: struct{}{},
container.NetworkAdvancedTcpUsageMetrics: struct{}{},
container.NetworkUdpUsageMetrics: struct{}{},
container.PerCpuUsageMetrics: struct{}{},
container.ProcessSchedulerMetrics: struct{}{},
container.ProcessMetrics: struct{}{},
}
)

Expand Down Expand Up @@ -269,6 +271,7 @@ func toIncludedMetrics(ignoreMetrics container.MetricSet) container.MetricSet {
container.DiskUsageMetrics,
container.NetworkUsageMetrics,
container.NetworkTcpUsageMetrics,
container.NetworkAdvancedTcpUsageMetrics,
container.NetworkUdpUsageMetrics,
container.AcceleratorUsageMetrics,
container.AppMetrics,
Expand Down
6 changes: 6 additions & 0 deletions cadvisor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ func TestTcpMetricsAreDisabledByDefault(t *testing.T) {
assert.True(t, ignoreMetrics.Has(container.NetworkTcpUsageMetrics))
}

func TestAdvancedTcpMetricsAreDisabledByDefault(t *testing.T) {
assert.True(t, ignoreMetrics.Has(container.NetworkAdvancedTcpUsageMetrics))
flag.Parse()
assert.True(t, ignoreMetrics.Has(container.NetworkAdvancedTcpUsageMetrics))
}

func TestUdpMetricsAreDisabledByDefault(t *testing.T) {
assert.True(t, ignoreMetrics.Has(container.NetworkUdpUsageMetrics))
flag.Parse()
Expand Down
27 changes: 14 additions & 13 deletions container/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,20 @@ type ContainerHandlerFactory interface {
type MetricKind string

const (
CpuUsageMetrics MetricKind = "cpu"
ProcessSchedulerMetrics MetricKind = "sched"
PerCpuUsageMetrics MetricKind = "percpu"
MemoryUsageMetrics MetricKind = "memory"
CpuLoadMetrics MetricKind = "cpuLoad"
DiskIOMetrics MetricKind = "diskIO"
DiskUsageMetrics MetricKind = "disk"
NetworkUsageMetrics MetricKind = "network"
NetworkTcpUsageMetrics MetricKind = "tcp"
NetworkUdpUsageMetrics MetricKind = "udp"
AcceleratorUsageMetrics MetricKind = "accelerator"
AppMetrics MetricKind = "app"
ProcessMetrics MetricKind = "process"
CpuUsageMetrics MetricKind = "cpu"
ProcessSchedulerMetrics MetricKind = "sched"
PerCpuUsageMetrics MetricKind = "percpu"
MemoryUsageMetrics MetricKind = "memory"
CpuLoadMetrics MetricKind = "cpuLoad"
DiskIOMetrics MetricKind = "diskIO"
DiskUsageMetrics MetricKind = "disk"
NetworkUsageMetrics MetricKind = "network"
NetworkTcpUsageMetrics MetricKind = "tcp"
NetworkAdvancedTcpUsageMetrics MetricKind = "advtcp"
NetworkUdpUsageMetrics MetricKind = "udp"
AcceleratorUsageMetrics MetricKind = "accelerator"
AppMetrics MetricKind = "app"
ProcessMetrics MetricKind = "process"
)

func (mk MetricKind) String() string {
Expand Down
41 changes: 22 additions & 19 deletions container/libcontainer/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,14 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
} else {
stats.Network.Tcp6 = t6
}
ta, err := advanceTcpStatsFromProc(h.rootFs, h.pid, "net/netstat", "net/snmp")

}
if h.includedMetrics.Has(container.NetworkAdvancedTcpUsageMetrics) {
ta, err := advancedTcpStatsFromProc(h.rootFs, h.pid, "net/netstat", "net/snmp")
if err != nil {
klog.V(4).Infof("Unable to get advance tcp stats from pid %d: %v", h.pid, err)
klog.V(4).Infof("Unable to get advanced tcp stats from pid %d: %v", h.pid, err)
} else {
stats.Network.TcpAdvance = ta
stats.Network.TcpAdvanced = ta
}
}
if h.includedMetrics.Has(container.NetworkUdpUsageMetrics) {
Expand Down Expand Up @@ -415,36 +418,36 @@ func tcpStatsFromProc(rootFs string, pid int, file string) (info.TcpStat, error)
return tcpStats, nil
}

func advanceTcpStatsFromProc(rootFs string, pid int, file1, file2 string) (info.TcpAdvanceStat, error) {
var advanceStats info.TcpAdvanceStat
func advancedTcpStatsFromProc(rootFs string, pid int, file1, file2 string) (info.TcpAdvancedStat, error) {
var advancedStats info.TcpAdvancedStat
var err error

netstatFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file1)
err = scanAdvanceTcpStats(&advanceStats, netstatFile)
err = scanAdvancedTcpStats(&advancedStats, netstatFile)
if err != nil {
return advanceStats, err
return advancedStats, err
}

snmpFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file2)
err = scanAdvanceTcpStats(&advanceStats, snmpFile)
err = scanAdvancedTcpStats(&advancedStats, snmpFile)
if err != nil {
return advanceStats, err
return advancedStats, err
}

return advanceStats, nil
return advancedStats, nil
}

func scanAdvanceTcpStats(advanceStats *info.TcpAdvanceStat, advanceTcpStatsFile string) error {
data, err := ioutil.ReadFile(advanceTcpStatsFile)
func scanAdvancedTcpStats(advancedStats *info.TcpAdvancedStat, advancedTcpStatsFile string) error {
data, err := ioutil.ReadFile(advancedTcpStatsFile)
if err != nil {
return fmt.Errorf("failure opening %s: %v", advanceTcpStatsFile, err)
return fmt.Errorf("failure opening %s: %v", advancedTcpStatsFile, err)
}

reader := strings.NewReader(string(data))
scanner := bufio.NewScanner(reader)
scanner.Split(bufio.ScanLines)

advanceTcpStats := make(map[string]interface{})
advancedTcpStats := make(map[string]interface{})
for scanner.Scan() {
nameParts := strings.Split(scanner.Text(), " ")
scanner.Scan()
Expand All @@ -456,31 +459,31 @@ func scanAdvanceTcpStats(advanceStats *info.TcpAdvanceStat, advanceTcpStatsFile
}
if len(nameParts) != len(valueParts) {
return fmt.Errorf("mismatch field count mismatch in %s: %s",
advanceTcpStatsFile, protocol)
advancedTcpStatsFile, protocol)
}
for i := 1; i < len(nameParts); i++ {
if strings.Contains(valueParts[i], "-") {
vInt64, err := strconv.ParseInt(valueParts[i], 10, 64)
if err != nil {
return fmt.Errorf("decode value: %s to int64 error: %s", valueParts[i], err)
}
advanceTcpStats[nameParts[i]] = vInt64
advancedTcpStats[nameParts[i]] = vInt64
} else {
vUint64, err := strconv.ParseUint(valueParts[i], 10, 64)
if err != nil {
return fmt.Errorf("decode value: %s to uint64 error: %s", valueParts[i], err)
}
advanceTcpStats[nameParts[i]] = vUint64
advancedTcpStats[nameParts[i]] = vUint64
}
}
}

b, err := json.Marshal(advanceTcpStats)
b, err := json.Marshal(advancedTcpStats)
if err != nil {
return err
}

err = json.Unmarshal(b, advanceStats)
err = json.Unmarshal(b, advancedStats)
if err != nil {
return err
}
Expand Down
6 changes: 3 additions & 3 deletions info/v1/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,8 @@ type NetworkStats struct {
Udp UdpStat `json:"udp"`
// UDP6 connection stats
Udp6 UdpStat `json:"udp6"`
// Advance TCP stats
TcpAdvance TcpAdvanceStat `json:"tcp_advance"`
// TCP advanced stats
TcpAdvanced TcpAdvancedStat `json:"tcp_advanced"`
}

type TcpStat struct {
Expand Down Expand Up @@ -445,7 +445,7 @@ type TcpStat struct {
Closing uint64
}

type TcpAdvanceStat struct {
type TcpAdvancedStat struct {
// The algorithm used to determine the timeout value used for
// retransmitting unacknowledged octets, ref: RFC2698, default 1
RtoAlgorithm uint64
Expand Down
4 changes: 2 additions & 2 deletions info/v2/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,8 @@ type NetworkStats struct {
Udp v1.UdpStat `json:"udp"`
// UDP6 connection stats
Udp6 v1.UdpStat `json:"udp6"`
// Advance TCP stats
TcpAdvance v1.TcpAdvanceStat `json:"tcp_advance"`
// TCP advanced stats
TcpAdvanced v1.TcpAdvancedStat `json:"tcp_advanced"`
}

// Instantaneous CPU stats
Expand Down
Loading

0 comments on commit 43e7824

Please sign in to comment.