k3s/vendor/github.com/google/cadvisor/info/v1/container.go

1068 lines
34 KiB
Go

// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
"reflect"
"time"
)
type CpuSpec struct {
Limit uint64 `json:"limit"`
MaxLimit uint64 `json:"max_limit"`
Mask string `json:"mask,omitempty"`
Quota uint64 `json:"quota,omitempty"`
Period uint64 `json:"period,omitempty"`
}
type MemorySpec struct {
// The amount of memory requested. Default is unlimited (-1).
// Units: bytes.
Limit uint64 `json:"limit,omitempty"`
// The amount of guaranteed memory. Default is 0.
// Units: bytes.
Reservation uint64 `json:"reservation,omitempty"`
// The amount of swap space requested. Default is unlimited (-1).
// Units: bytes.
SwapLimit uint64 `json:"swap_limit,omitempty"`
}
type ProcessSpec struct {
Limit uint64 `json:"limit,omitempty"`
}
type ContainerSpec struct {
// Time at which the container was created.
CreationTime time.Time `json:"creation_time,omitempty"`
// Metadata labels associated with this container.
Labels map[string]string `json:"labels,omitempty"`
// Metadata envs associated with this container. Only whitelisted envs are added.
Envs map[string]string `json:"envs,omitempty"`
HasCpu bool `json:"has_cpu"`
Cpu CpuSpec `json:"cpu,omitempty"`
HasMemory bool `json:"has_memory"`
Memory MemorySpec `json:"memory,omitempty"`
HasHugetlb bool `json:"has_hugetlb"`
HasNetwork bool `json:"has_network"`
HasProcesses bool `json:"has_processes"`
Processes ProcessSpec `json:"processes,omitempty"`
HasFilesystem bool `json:"has_filesystem"`
// HasDiskIo when true, indicates that DiskIo stats will be available.
HasDiskIo bool `json:"has_diskio"`
HasCustomMetrics bool `json:"has_custom_metrics"`
CustomMetrics []MetricSpec `json:"custom_metrics,omitempty"`
// Image name used for this container.
Image string `json:"image,omitempty"`
}
// Container reference contains enough information to uniquely identify a container
type ContainerReference struct {
// The container id
Id string `json:"id,omitempty"`
// The absolute name of the container. This is unique on the machine.
Name string `json:"name"`
// Other names by which the container is known within a certain namespace.
// This is unique within that namespace.
Aliases []string `json:"aliases,omitempty"`
// Namespace under which the aliases of a container are unique.
// An example of a namespace is "docker" for Docker containers.
Namespace string `json:"namespace,omitempty"`
}
// Sorts by container name.
type ContainerReferenceSlice []ContainerReference
func (s ContainerReferenceSlice) Len() int { return len(s) }
func (s ContainerReferenceSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ContainerReferenceSlice) Less(i, j int) bool { return s[i].Name < s[j].Name }
// ContainerInfoRequest is used when users check a container info from the REST API.
// It specifies how much data users want to get about a container
type ContainerInfoRequest struct {
// Max number of stats to return. Specify -1 for all stats currently available.
// Default: 60
NumStats int `json:"num_stats,omitempty"`
// Start time for which to query information.
// If omitted, the beginning of time is assumed.
Start time.Time `json:"start,omitempty"`
// End time for which to query information.
// If omitted, current time is assumed.
End time.Time `json:"end,omitempty"`
}
// Returns a ContainerInfoRequest with all default values specified.
func DefaultContainerInfoRequest() ContainerInfoRequest {
return ContainerInfoRequest{
NumStats: 60,
}
}
func (r *ContainerInfoRequest) Equals(other ContainerInfoRequest) bool {
return r.NumStats == other.NumStats &&
r.Start.Equal(other.Start) &&
r.End.Equal(other.End)
}
type ContainerInfo struct {
ContainerReference
// The direct subcontainers of the current container.
Subcontainers []ContainerReference `json:"subcontainers,omitempty"`
// The isolation used in the container.
Spec ContainerSpec `json:"spec,omitempty"`
// Historical statistics gathered from the container.
Stats []*ContainerStats `json:"stats,omitempty"`
}
// TODO(vmarmol): Refactor to not need this equality comparison.
// ContainerInfo may be (un)marshaled by json or other en/decoder. In that
// case, the Timestamp field in each stats/sample may not be precisely
// en/decoded. This will lead to small but acceptable differences between a
// ContainerInfo and its encode-then-decode version. Eq() is used to compare
// two ContainerInfo accepting small difference (<10ms) of Time fields.
func (ci *ContainerInfo) Eq(b *ContainerInfo) bool {
// If both ci and b are nil, then Eq() returns true
if ci == nil {
return b == nil
}
if b == nil {
return ci == nil
}
// For fields other than time.Time, we will compare them precisely.
// This would require that any slice should have same order.
if !reflect.DeepEqual(ci.ContainerReference, b.ContainerReference) {
return false
}
if !reflect.DeepEqual(ci.Subcontainers, b.Subcontainers) {
return false
}
if !ci.Spec.Eq(&b.Spec) {
return false
}
for i, expectedStats := range b.Stats {
selfStats := ci.Stats[i]
if !expectedStats.Eq(selfStats) {
return false
}
}
return true
}
func (s *ContainerSpec) Eq(b *ContainerSpec) bool {
// Creation within 1s of each other.
diff := s.CreationTime.Sub(b.CreationTime)
if (diff > time.Second) || (diff < -time.Second) {
return false
}
if s.HasCpu != b.HasCpu {
return false
}
if !reflect.DeepEqual(s.Cpu, b.Cpu) {
return false
}
if s.HasMemory != b.HasMemory {
return false
}
if !reflect.DeepEqual(s.Memory, b.Memory) {
return false
}
if s.HasHugetlb != b.HasHugetlb {
return false
}
if s.HasNetwork != b.HasNetwork {
return false
}
if s.HasProcesses != b.HasProcesses {
return false
}
if s.HasFilesystem != b.HasFilesystem {
return false
}
if s.HasDiskIo != b.HasDiskIo {
return false
}
if s.HasCustomMetrics != b.HasCustomMetrics {
return false
}
if s.Image != b.Image {
return false
}
return true
}
func (ci *ContainerInfo) StatsAfter(ref time.Time) []*ContainerStats {
n := len(ci.Stats) + 1
for i, s := range ci.Stats {
if s.Timestamp.After(ref) {
n = i
break
}
}
if n > len(ci.Stats) {
return nil
}
return ci.Stats[n:]
}
func (ci *ContainerInfo) StatsStartTime() time.Time {
var ret time.Time
for _, s := range ci.Stats {
if s.Timestamp.Before(ret) || ret.IsZero() {
ret = s.Timestamp
}
}
return ret
}
func (ci *ContainerInfo) StatsEndTime() time.Time {
var ret time.Time
for i := len(ci.Stats) - 1; i >= 0; i-- {
s := ci.Stats[i]
if s.Timestamp.After(ret) {
ret = s.Timestamp
}
}
return ret
}
// This mirrors kernel internal structure.
type LoadStats struct {
// Number of sleeping tasks.
NrSleeping uint64 `json:"nr_sleeping"`
// Number of running tasks.
NrRunning uint64 `json:"nr_running"`
// Number of tasks in stopped state
NrStopped uint64 `json:"nr_stopped"`
// Number of tasks in uninterruptible state
NrUninterruptible uint64 `json:"nr_uninterruptible"`
// Number of tasks waiting on IO
NrIoWait uint64 `json:"nr_io_wait"`
}
// CPU usage time statistics.
type CpuUsage struct {
// Total CPU usage.
// Unit: nanoseconds.
Total uint64 `json:"total"`
// Per CPU/core usage of the container.
// Unit: nanoseconds.
PerCpu []uint64 `json:"per_cpu_usage,omitempty"`
// Time spent in user space.
// Unit: nanoseconds.
User uint64 `json:"user"`
// Time spent in kernel space.
// Unit: nanoseconds.
System uint64 `json:"system"`
}
// Cpu Completely Fair Scheduler statistics.
type CpuCFS struct {
// Total number of elapsed enforcement intervals.
Periods uint64 `json:"periods"`
// Total number of times tasks in the cgroup have been throttled.
ThrottledPeriods uint64 `json:"throttled_periods"`
// Total time duration for which tasks in the cgroup have been throttled.
// Unit: nanoseconds.
ThrottledTime uint64 `json:"throttled_time"`
}
// Cpu Aggregated scheduler statistics
type CpuSchedstat struct {
// https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt
// time spent on the cpu
RunTime uint64 `json:"run_time"`
// time spent waiting on a runqueue
RunqueueTime uint64 `json:"runqueue_time"`
// # of timeslices run on this cpu
RunPeriods uint64 `json:"run_periods"`
}
// All CPU usage metrics are cumulative from the creation of the container
type CpuStats struct {
Usage CpuUsage `json:"usage"`
CFS CpuCFS `json:"cfs"`
Schedstat CpuSchedstat `json:"schedstat"`
// Smoothed average of number of runnable threads x 1000.
// We multiply by thousand to avoid using floats, but preserving precision.
// Load is smoothed over the last 10 seconds. Instantaneous value can be read
// from LoadStats.NrRunning.
LoadAverage int32 `json:"load_average"`
}
type PerDiskStats struct {
Device string `json:"device"`
Major uint64 `json:"major"`
Minor uint64 `json:"minor"`
Stats map[string]uint64 `json:"stats"`
}
type DiskIoStats struct {
IoServiceBytes []PerDiskStats `json:"io_service_bytes,omitempty"`
IoServiced []PerDiskStats `json:"io_serviced,omitempty"`
IoQueued []PerDiskStats `json:"io_queued,omitempty"`
Sectors []PerDiskStats `json:"sectors,omitempty"`
IoServiceTime []PerDiskStats `json:"io_service_time,omitempty"`
IoWaitTime []PerDiskStats `json:"io_wait_time,omitempty"`
IoMerged []PerDiskStats `json:"io_merged,omitempty"`
IoTime []PerDiskStats `json:"io_time,omitempty"`
}
type HugetlbStats struct {
// current res_counter usage for hugetlb
Usage uint64 `json:"usage,omitempty"`
// maximum usage ever recorded.
MaxUsage uint64 `json:"max_usage,omitempty"`
// number of times hugetlb usage allocation failure.
Failcnt uint64 `json:"failcnt"`
}
type MemoryStats struct {
// Current memory usage, this includes all memory regardless of when it was
// accessed.
// Units: Bytes.
Usage uint64 `json:"usage"`
// Maximum memory usage recorded.
// Units: Bytes.
MaxUsage uint64 `json:"max_usage"`
// Number of bytes of page cache memory.
// Units: Bytes.
Cache uint64 `json:"cache"`
// The amount of anonymous and swap cache memory (includes transparent
// hugepages).
// Units: Bytes.
RSS uint64 `json:"rss"`
// The amount of swap currently used by the processes in this cgroup
// Units: Bytes.
Swap uint64 `json:"swap"`
// The amount of memory used for mapped files (includes tmpfs/shmem)
MappedFile uint64 `json:"mapped_file"`
// The amount of working set memory, this includes recently accessed memory,
// dirty memory, and kernel memory. Working set is <= "usage".
// Units: Bytes.
WorkingSet uint64 `json:"working_set"`
Failcnt uint64 `json:"failcnt"`
ContainerData MemoryStatsMemoryData `json:"container_data,omitempty"`
HierarchicalData MemoryStatsMemoryData `json:"hierarchical_data,omitempty"`
}
type MemoryStatsMemoryData struct {
Pgfault uint64 `json:"pgfault"`
Pgmajfault uint64 `json:"pgmajfault"`
}
type InterfaceStats struct {
// The name of the interface.
Name string `json:"name"`
// Cumulative count of bytes received.
RxBytes uint64 `json:"rx_bytes"`
// Cumulative count of packets received.
RxPackets uint64 `json:"rx_packets"`
// Cumulative count of receive errors encountered.
RxErrors uint64 `json:"rx_errors"`
// Cumulative count of packets dropped while receiving.
RxDropped uint64 `json:"rx_dropped"`
// Cumulative count of bytes transmitted.
TxBytes uint64 `json:"tx_bytes"`
// Cumulative count of packets transmitted.
TxPackets uint64 `json:"tx_packets"`
// Cumulative count of transmit errors encountered.
TxErrors uint64 `json:"tx_errors"`
// Cumulative count of packets dropped while transmitting.
TxDropped uint64 `json:"tx_dropped"`
}
type NetworkStats struct {
InterfaceStats `json:",inline"`
Interfaces []InterfaceStats `json:"interfaces,omitempty"`
// TCP connection stats (Established, Listen...)
Tcp TcpStat `json:"tcp"`
// TCP6 connection stats (Established, Listen...)
Tcp6 TcpStat `json:"tcp6"`
// UDP connection stats
Udp UdpStat `json:"udp"`
// UDP6 connection stats
Udp6 UdpStat `json:"udp6"`
// TCP advanced stats
TcpAdvanced TcpAdvancedStat `json:"tcp_advanced"`
}
type TcpStat struct {
// Count of TCP connections in state "Established"
Established uint64
// Count of TCP connections in state "Syn_Sent"
SynSent uint64
// Count of TCP connections in state "Syn_Recv"
SynRecv uint64
// Count of TCP connections in state "Fin_Wait1"
FinWait1 uint64
// Count of TCP connections in state "Fin_Wait2"
FinWait2 uint64
// Count of TCP connections in state "Time_Wait
TimeWait uint64
// Count of TCP connections in state "Close"
Close uint64
// Count of TCP connections in state "Close_Wait"
CloseWait uint64
// Count of TCP connections in state "Listen_Ack"
LastAck uint64
// Count of TCP connections in state "Listen"
Listen uint64
// Count of TCP connections in state "Closing"
Closing uint64
}
type TcpAdvancedStat struct {
// The algorithm used to determine the timeout value used for
// retransmitting unacknowledged octets, ref: RFC2698, default 1
RtoAlgorithm uint64
// The minimum value permitted by a TCP implementation for the
// retransmission timeout, measured in milliseconds, default 200ms
RtoMin uint64
// The maximum value permitted by a TCP implementation for the
// retransmission timeout, measured in milliseconds, default 120s
RtoMax uint64
// The limit on the total number of TCP connections the entity
// can support., default -1, i.e. infinity
MaxConn int64
// The number of times TCP connections have made a direct
// transition to the SYN-SENT state from the CLOSED state.
ActiveOpens uint64
// The number of times TCP connections have made a direct
// transition to the SYN-RCVD state from the LISTEN state.
PassiveOpens uint64
// The number of times TCP connections have made a direct
// transition to the CLOSED state from either the SYN-SENT
// state or the SYN-RCVD state, plus the number of times TCP
// connections have made a direct transition to the LISTEN
// state from the SYN-RCVD state.
AttemptFails uint64
// The number of times TCP connections have made a direct
// transition to the CLOSED state from either the ESTABLISHED
// state or the CLOSE-WAIT state.
EstabResets uint64
// The number of TCP connections for which the current state
// is either ESTABLISHED or CLOSE- WAIT.
CurrEstab uint64
// The total number of segments received, including those
// received in error.
InSegs uint64
// The total number of segments sent, including those on
// current connections but excluding those containing only
// retransmitted octets.
OutSegs uint64
// The total number of segments retransmitted - that is, the
// number of TCP segments transmitted containing one or more
// previously transmitted octets.
RetransSegs uint64
// The total number of segments received in error (e.g., bad
// TCP checksums).
InErrs uint64
// The number of TCP segments sent containing the RST flag.
OutRsts uint64
// The number of IP Packets with checksum errors
InCsumErrors uint64
// The number of resets received for embryonic SYN_RECV sockets
EmbryonicRsts uint64
// The number of SYN cookies sent
SyncookiesSent uint64
// The number of SYN cookies received
SyncookiesRecv uint64
// The number of invalid SYN cookies received
SyncookiesFailed uint64
// The number of packets pruned from receive queue because of socket buffer overrun
PruneCalled uint64
// The number of packets pruned from receive queue
RcvPruned uint64
// The number of packets dropped from out-of-order queue because of socket buffer overrun
OfoPruned uint64
// The number of ICMP packets dropped because they were out-of-window
OutOfWindowIcmps uint64
// The number of ICMP packets dropped because socket was locked
LockDroppedIcmps uint64
// The number of TCP sockets finished time wait in fast timer
TW uint64
// The number of time wait sockets recycled by time stamp
TWRecycled uint64
// The number of TCP sockets finished time wait in slow timer
TWKilled uint64
// counter, if no more mem for TIME-WAIT struct, +1
TCPTimeWaitOverflow uint64
// The number of RTO timer first timeout times
TCPTimeouts uint64
// The number of fake timeouts detected by F-RTO
TCPSpuriousRTOs uint64
// The number of send Tail Loss Probe (TLP) times by Probe Timeout(PTO)
TCPLossProbes uint64
// The number of recovery times by TLP
TCPLossProbeRecovery uint64
// The number of RTO failed times when in Recovery state, and remote end has no sack
TCPRenoRecoveryFail uint64
// The number of RTO failed times when in Recovery state, and remote end has sack
TCPSackRecoveryFail uint64
// The number of RTO failed times when in TCP_CA_Disorder state, and remote end has no sack
TCPRenoFailures uint64
// The number of RTO failed times when in TCP_CA_Disorder state, and remote end has sack
TCPSackFailures uint64
// The number of RTO failed times when in TCP_CA_Loss state,
TCPLossFailures uint64
// The number of delayed acks sent
DelayedACKs uint64
// The number of delayed acks further delayed because of locked socket
DelayedACKLocked uint64
// The number of quick ack mode was activated times
DelayedACKLost uint64
// The number of times the listen queue of a socket overflowed
ListenOverflows uint64
// The number of SYNs to LISTEN sockets dropped
ListenDrops uint64
// The number of packet headers predicted
TCPHPHits uint64
// The number of acknowledgments not containing data payload received
TCPPureAcks uint64
// The number of predicted acknowledgments
TCPHPAcks uint64
// The number of times recovered from packet loss due to fast retransmit
TCPRenoRecovery uint64
// The number of SACK retransmits failed
TCPSackRecovery uint64
// The number of bad SACK blocks received
TCPSACKReneging uint64
// The number of detected reordering times using FACK
TCPFACKReorder uint64
// The number of detected reordering times using SACK
TCPSACKReorder uint64
// The number of detected reordering times using Reno
TCPRenoReorder uint64
// The number of detected reordering times using time stamp
TCPTSReorder uint64
// The number of congestion windows fully recovered without slow start
TCPFullUndo uint64
// The number of congestion windows partially recovered using Hoe heuristic
TCPPartialUndo uint64
// The number of congestion windows recovered without slow start by DSACK
TCPDSACKUndo uint64
// The number of congestion windows recovered without slow start after partial ack
TCPLossUndo uint64
// The number of fast retransmits
TCPFastRetrans uint64
// The number of retransmits in slow start
TCPSlowStartRetrans uint64
// The number of retransmits lost
TCPLostRetransmit uint64
// The number of retransmits failed, including FastRetrans, SlowStartRetrans
TCPRetransFail uint64
// he number of packets collapsed in receive queue due to low socket buffer
TCPRcvCollapsed uint64
// The number of DSACKs sent for old packets
TCPDSACKOldSent uint64
// The number of DSACKs sent for out of order packets
TCPDSACKOfoSent uint64
// The number of DSACKs received
TCPDSACKRecv uint64
// The number of DSACKs for out of order packets received
TCPDSACKOfoRecv uint64
// The number of connections reset due to unexpected data
TCPAbortOnData uint64
// The number of connections reset due to early user close
TCPAbortOnClose uint64
// The number of connections aborted due to memory pressure
TCPAbortOnMemory uint64
// The number of connections aborted due to timeout
TCPAbortOnTimeout uint64
// The number of connections aborted after user close in linger timeout
TCPAbortOnLinger uint64
// The number of times unable to send RST due to no memory
TCPAbortFailed uint64
// The number of TCP ran low on memory times
TCPMemoryPressures uint64
// The number of TCP cumulative duration of
// memory pressure events, by ms
TCPMemoryPressuresChrono uint64
// The number of SACKs discard
TCPSACKDiscard uint64
// The number of DSACKs ignore old
TCPDSACKIgnoredOld uint64
// The number of DSACKs ignore no undo
TCPDSACKIgnoredNoUndo uint64
// The number of MD5 not found
TCPMD5NotFound uint64
// The number of MD5 unexpected
TCPMD5Unexpected uint64
// The number of MD5 failed
TCPMD5Failure uint64
// The number of Sack shifted
TCPSackShifted uint64
// The number of Sack merged
TCPSackMerged uint64
// The number of Sack shift fall back
TCPSackShiftFallback uint64
// The number of Backlog drop
TCPBacklogDrop uint64
// The number of PFmemalloc drop
PFMemallocDrop uint64
// The number of memalloc drop
TCPMinTTLDrop uint64
// The number of DeferAccept drop
TCPDeferAcceptDrop uint64
// The number of IP reverse path filter
IPReversePathFilter uint64
// The number of request full do cookies
TCPReqQFullDoCookies uint64
// The number of request full drop
TCPReqQFullDrop uint64
// number of successful outbound TFO connections
TCPFastOpenActive uint64
// number of SYN-ACK packets received that did not acknowledge data
// sent in the SYN packet and caused a retransmissions without SYN data.
TCPFastOpenActiveFail uint64
// number of successful inbound TFO connections
TCPFastOpenPassive uint64
// number of inbound SYN packets with TFO cookie that was invalid
TCPFastOpenPassiveFail uint64
// number of inbound SYN packets that will have TFO disabled because
// the socket has exceeded the max queue length
TCPFastOpenListenOverflow uint64
// number of inbound SYN packets requesting TFO with TFO set but no cookie
TCPFastOpenCookieReqd uint64
// number of SYN and SYN/ACK retransmits to break down retransmissions
// into SYN, fast-retransmits, timeout retransmits, etc.
TCPSynRetrans uint64
// number of outgoing packets with original data
// (excluding retransmission but including data-in-SYN).
TCPOrigDataSent uint64
// The number of active connections rejected because of time stamp
PAWSActive uint64
// The number of packetes rejected in established connections because of timestamp
PAWSEstab uint64
}
type UdpStat struct {
// Count of UDP sockets in state "Listen"
Listen uint64
// Count of UDP packets dropped by the IP stack
Dropped uint64
// Count of packets Queued for Receieve
RxQueued uint64
// Count of packets Queued for Transmit
TxQueued uint64
}
type FsStats struct {
// The block device name associated with the filesystem.
Device string `json:"device,omitempty"`
// Type of the filesytem.
Type string `json:"type"`
// Number of bytes that can be consumed by the container on this filesystem.
Limit uint64 `json:"capacity"`
// Number of bytes that is consumed by the container on this filesystem.
Usage uint64 `json:"usage"`
// Base Usage that is consumed by the container's writable layer.
// This field is only applicable for docker container's as of now.
BaseUsage uint64 `json:"base_usage"`
// Number of bytes available for non-root user.
Available uint64 `json:"available"`
// HasInodes when true, indicates that Inodes info will be available.
HasInodes bool `json:"has_inodes"`
// Number of Inodes
Inodes uint64 `json:"inodes"`
// Number of available Inodes
InodesFree uint64 `json:"inodes_free"`
// Number of reads completed
// This is the total number of reads completed successfully.
ReadsCompleted uint64 `json:"reads_completed"`
// Number of reads merged
// Reads and writes which are adjacent to each other may be merged for
// efficiency. Thus two 4K reads may become one 8K read before it is
// ultimately handed to the disk, and so it will be counted (and queued)
// as only one I/O. This field lets you know how often this was done.
ReadsMerged uint64 `json:"reads_merged"`
// Number of sectors read
// This is the total number of sectors read successfully.
SectorsRead uint64 `json:"sectors_read"`
// Number of milliseconds spent reading
// This is the total number of milliseconds spent by all reads (as
// measured from __make_request() to end_that_request_last()).
ReadTime uint64 `json:"read_time"`
// Number of writes completed
// This is the total number of writes completed successfully.
WritesCompleted uint64 `json:"writes_completed"`
// Number of writes merged
// See the description of reads merged.
WritesMerged uint64 `json:"writes_merged"`
// Number of sectors written
// This is the total number of sectors written successfully.
SectorsWritten uint64 `json:"sectors_written"`
// Number of milliseconds spent writing
// This is the total number of milliseconds spent by all writes (as
// measured from __make_request() to end_that_request_last()).
WriteTime uint64 `json:"write_time"`
// Number of I/Os currently in progress
// The only field that should go to zero. Incremented as requests are
// given to appropriate struct request_queue and decremented as they finish.
IoInProgress uint64 `json:"io_in_progress"`
// Number of milliseconds spent doing I/Os
// This field increases so long as field 9 is nonzero.
IoTime uint64 `json:"io_time"`
// weighted number of milliseconds spent doing I/Os
// This field is incremented at each I/O start, I/O completion, I/O
// merge, or read of these stats by the number of I/Os in progress
// (field 9) times the number of milliseconds spent doing I/O since the
// last update of this field. This can provide an easy measure of both
// I/O completion time and the backlog that may be accumulating.
WeightedIoTime uint64 `json:"weighted_io_time"`
}
type AcceleratorStats struct {
// Make of the accelerator (nvidia, amd, google etc.)
Make string `json:"make"`
// Model of the accelerator (tesla-p100, tesla-k80 etc.)
Model string `json:"model"`
// ID of the accelerator.
ID string `json:"id"`
// Total accelerator memory.
// unit: bytes
MemoryTotal uint64 `json:"memory_total"`
// Total accelerator memory allocated.
// unit: bytes
MemoryUsed uint64 `json:"memory_used"`
// Percent of time over the past sample period during which
// the accelerator was actively processing.
DutyCycle uint64 `json:"duty_cycle"`
}
// PerfStat represents value of a single monitored perf event.
type PerfStat struct {
// Indicates scaling ratio for an event: time_running/time_enabled
// (amount of time that event was being measured divided by
// amount of time that event was enabled for).
// value 1.0 indicates that no multiplexing occurred. Value close
// to 0 indicates that event was measured for short time and event's
// value might be inaccurate.
// See: https://lwn.net/Articles/324756/
ScalingRatio float64 `json:"scaling_ratio"`
// Value represents value of perf event retrieved from OS. It is
// normalized against ScalingRatio and takes multiplexing into
// consideration.
Value uint64 `json:"value"`
// Name is human readable name of an event.
Name string `json:"name"`
// CPU that perf event was measured on.
Cpu int `json:"cpu"`
}
// MemoryBandwidthStats corresponds to MBM (Memory Bandwidth Monitoring).
// See: https://01.org/cache-monitoring-technology
// See: https://www.kernel.org/doc/Documentation/x86/intel_rdt_ui.txt
type MemoryBandwidthStats struct {
// The 'mbm_total_bytes'.
TotalBytes uint64 `json:"mbm_total_bytes,omitempty"`
// The 'mbm_local_bytes'.
LocalBytes uint64 `json:"mbm_local_bytes,omitempty"`
}
// CacheStats corresponds to CMT (Cache Monitoring Technology).
// See: https://01.org/cache-monitoring-technology
// See: https://www.kernel.org/doc/Documentation/x86/intel_rdt_ui.txt
type CacheStats struct {
// The 'llc_occupancy'.
LLCOccupancy uint64 `json:"llc_occupancy,omitempty"`
}
// ResctrlStats corresponds to statistics from Resource Control.
type ResctrlStats struct {
// Each NUMA Node statistics corresponds to one element in the array.
MemoryBandwidth []MemoryBandwidthStats `json:"memory_bandwidth,omitempty"`
Cache []CacheStats `json:"cache,omitempty"`
}
// PerfUncoreStat represents value of a single monitored perf uncore event.
type PerfUncoreStat struct {
// Indicates scaling ratio for an event: time_running/time_enabled
// (amount of time that event was being measured divided by
// amount of time that event was enabled for).
// value 1.0 indicates that no multiplexing occurred. Value close
// to 0 indicates that event was measured for short time and event's
// value might be inaccurate.
// See: https://lwn.net/Articles/324756/
ScalingRatio float64 `json:"scaling_ratio"`
// Value represents value of perf event retrieved from OS. It is
// normalized against ScalingRatio and takes multiplexing into
// consideration.
Value uint64 `json:"value"`
// Name is human readable name of an event.
Name string `json:"name"`
// Socket that perf event was measured on.
Socket int `json:"socket"`
// PMU is Performance Monitoring Unit which collected these stats.
PMU string `json:"pmu"`
}
type UlimitSpec struct {
Name string `json:"name"`
SoftLimit int64 `json:"soft_limit"`
HardLimit int64 `json:"hard_limit"`
}
type ProcessStats struct {
// Number of processes
ProcessCount uint64 `json:"process_count"`
// Number of open file descriptors
FdCount uint64 `json:"fd_count"`
// Number of sockets
SocketCount uint64 `json:"socket_count"`
// Number of threads currently in container
ThreadsCurrent uint64 `json:"threads_current,omitempty"`
// Maxium number of threads allowed in container
ThreadsMax uint64 `json:"threads_max,omitempty"`
// Ulimits for the top-level container process
Ulimits []UlimitSpec `json:"ulimits,omitempty"`
}
type ContainerStats struct {
// The time of this stat point.
Timestamp time.Time `json:"timestamp"`
Cpu CpuStats `json:"cpu,omitempty"`
DiskIo DiskIoStats `json:"diskio,omitempty"`
Memory MemoryStats `json:"memory,omitempty"`
Hugetlb map[string]HugetlbStats `json:"hugetlb,omitempty"`
Network NetworkStats `json:"network,omitempty"`
// Filesystem statistics
Filesystem []FsStats `json:"filesystem,omitempty"`
// Task load stats
TaskStats LoadStats `json:"task_stats,omitempty"`
// Metrics for Accelerators. Each Accelerator corresponds to one element in the array.
Accelerators []AcceleratorStats `json:"accelerators,omitempty"`
// ProcessStats for Containers
Processes ProcessStats `json:"processes,omitempty"`
// Custom metrics from all collectors
CustomMetrics map[string][]MetricVal `json:"custom_metrics,omitempty"`
// Statistics originating from perf events
PerfStats []PerfStat `json:"perf_stats,omitempty"`
// Statistics originating from perf uncore events.
// Applies only for root container.
PerfUncoreStats []PerfUncoreStat `json:"perf_uncore_stats,omitempty"`
// Referenced memory
ReferencedMemory uint64 `json:"referenced_memory,omitempty"`
// Resource Control (resctrl) statistics
Resctrl ResctrlStats `json:"resctrl,omitempty"`
}
func timeEq(t1, t2 time.Time, tolerance time.Duration) bool {
// t1 should not be later than t2
if t1.After(t2) {
t1, t2 = t2, t1
}
diff := t2.Sub(t1)
return diff <= tolerance
}
const (
// 10ms, i.e. 0.01s
timePrecision time.Duration = 10 * time.Millisecond
)
// This function is useful because we do not require precise time
// representation.
func (a *ContainerStats) Eq(b *ContainerStats) bool {
if !timeEq(a.Timestamp, b.Timestamp, timePrecision) {
return false
}
return a.StatsEq(b)
}
// Checks equality of the stats values.
func (a *ContainerStats) StatsEq(b *ContainerStats) bool {
// TODO(vmarmol): Consider using this through reflection.
if !reflect.DeepEqual(a.Cpu, b.Cpu) {
return false
}
if !reflect.DeepEqual(a.Memory, b.Memory) {
return false
}
if !reflect.DeepEqual(a.Hugetlb, b.Hugetlb) {
return false
}
if !reflect.DeepEqual(a.DiskIo, b.DiskIo) {
return false
}
if !reflect.DeepEqual(a.Network, b.Network) {
return false
}
if !reflect.DeepEqual(a.Processes, b.Processes) {
return false
}
if !reflect.DeepEqual(a.Filesystem, b.Filesystem) {
return false
}
if !reflect.DeepEqual(a.TaskStats, b.TaskStats) {
return false
}
if !reflect.DeepEqual(a.Accelerators, b.Accelerators) {
return false
}
if !reflect.DeepEqual(a.CustomMetrics, b.CustomMetrics) {
return false
}
return true
}
// Event contains information general to events such as the time at which they
// occurred, their specific type, and the actual event. Event types are
// differentiated by the EventType field of Event.
type Event struct {
// the absolute container name for which the event occurred
ContainerName string `json:"container_name"`
// the time at which the event occurred
Timestamp time.Time `json:"timestamp"`
// the type of event. EventType is an enumerated type
EventType EventType `json:"event_type"`
// the original event object and all of its extraneous data, ex. an
// OomInstance
EventData EventData `json:"event_data,omitempty"`
}
// EventType is an enumerated type which lists the categories under which
// events may fall. The Event field EventType is populated by this enum.
type EventType string
const (
EventOom EventType = "oom"
EventOomKill EventType = "oomKill"
EventContainerCreation EventType = "containerCreation"
EventContainerDeletion EventType = "containerDeletion"
)
// Extra information about an event. Only one type will be set.
type EventData struct {
// Information about an OOM kill event.
OomKill *OomKillEventData `json:"oom,omitempty"`
}
// Information related to an OOM kill instance
type OomKillEventData struct {
// process id of the killed process
Pid int `json:"pid"`
// The name of the killed process
ProcessName string `json:"process_name"`
}