| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071 |
- // 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 CPUSetStats struct {
- MemoryMigrate uint64 `json:"memory_migrate"`
- }
- type MemoryNumaStats struct {
- File map[uint8]uint64 `json:"file,omitempty"`
- Anon map[uint8]uint64 `json:"anon,omitempty"`
- Unevictable map[uint8]uint64 `json:"unevictable,omitempty"`
- }
- type MemoryStatsMemoryData struct {
- Pgfault uint64 `json:"pgfault"`
- Pgmajfault uint64 `json:"pgmajfault"`
- NumaStats MemoryNumaStats `json:"numa_stats,omitempty"`
- }
- 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 {
- PerfValue
- // CPU that perf event was measured on.
- Cpu int `json:"cpu"`
- }
- type PerfValue 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"`
- }
- // 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 {
- PerfValue
- // 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"`
- CpuSet CPUSetStats `json:"cpuset,omitempty"`
- OOMEvents uint64 `json:"oom_events,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"`
- }
|