1// Package types is used for API stability in the types and response to the
2// consumers of the API stats endpoint.
3package types // import "github.com/ory/dockertest/docker/types"
4
5import "time"
6
7// ThrottlingData stores CPU throttling stats of one running container.
8// Not used on Windows.
9type ThrottlingData struct {
10	// Number of periods with throttling active
11	Periods uint64 `json:"periods"`
12	// Number of periods when the container hits its throttling limit.
13	ThrottledPeriods uint64 `json:"throttled_periods"`
14	// Aggregate time the container was throttled for in nanoseconds.
15	ThrottledTime uint64 `json:"throttled_time"`
16}
17
18// CPUUsage stores All CPU stats aggregated since container inception.
19type CPUUsage struct {
20	// Total CPU time consumed.
21	// Units: nanoseconds (Linux)
22	// Units: 100's of nanoseconds (Windows)
23	TotalUsage uint64 `json:"total_usage"`
24
25	// Total CPU time consumed per core (Linux). Not used on Windows.
26	// Units: nanoseconds.
27	PercpuUsage []uint64 `json:"percpu_usage,omitempty"`
28
29	// Time spent by tasks of the cgroup in kernel mode (Linux).
30	// Time spent by all container processes in kernel mode (Windows).
31	// Units: nanoseconds (Linux).
32	// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers.
33	UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
34
35	// Time spent by tasks of the cgroup in user mode (Linux).
36	// Time spent by all container processes in user mode (Windows).
37	// Units: nanoseconds (Linux).
38	// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers
39	UsageInUsermode uint64 `json:"usage_in_usermode"`
40}
41
42// CPUStats aggregates and wraps all CPU related info of container
43type CPUStats struct {
44	// CPU Usage. Linux and Windows.
45	CPUUsage CPUUsage `json:"cpu_usage"`
46
47	// System Usage. Linux only.
48	SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
49
50	// Online CPUs. Linux only.
51	OnlineCPUs uint32 `json:"online_cpus,omitempty"`
52
53	// Throttling Data. Linux only.
54	ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
55}
56
57// MemoryStats aggregates all memory stats since container inception on Linux.
58// Windows returns stats for commit and private working set only.
59type MemoryStats struct {
60	// Linux Memory Stats
61
62	// current res_counter usage for memory
63	Usage uint64 `json:"usage,omitempty"`
64	// maximum usage ever recorded.
65	MaxUsage uint64 `json:"max_usage,omitempty"`
66	// TODO(vishh): Export these as stronger types.
67	// all the stats exported via memory.stat.
68	Stats map[string]uint64 `json:"stats,omitempty"`
69	// number of times memory usage hits limits.
70	Failcnt uint64 `json:"failcnt,omitempty"`
71	Limit   uint64 `json:"limit,omitempty"`
72
73	// Windows Memory Stats
74	// See https://technet.microsoft.com/en-us/magazine/ff382715.aspx
75
76	// committed bytes
77	Commit uint64 `json:"commitbytes,omitempty"`
78	// peak committed bytes
79	CommitPeak uint64 `json:"commitpeakbytes,omitempty"`
80	// private working set
81	PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"`
82}
83
84// BlkioStatEntry is one small entity to store a piece of Blkio stats
85// Not used on Windows.
86type BlkioStatEntry struct {
87	Major uint64 `json:"major"`
88	Minor uint64 `json:"minor"`
89	Op    string `json:"op"`
90	Value uint64 `json:"value"`
91}
92
93// BlkioStats stores All IO service stats for data read and write.
94// This is a Linux specific structure as the differences between expressing
95// block I/O on Windows and Linux are sufficiently significant to make
96// little sense attempting to morph into a combined structure.
97type BlkioStats struct {
98	// number of bytes transferred to and from the block device
99	IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
100	IoServicedRecursive     []BlkioStatEntry `json:"io_serviced_recursive"`
101	IoQueuedRecursive       []BlkioStatEntry `json:"io_queue_recursive"`
102	IoServiceTimeRecursive  []BlkioStatEntry `json:"io_service_time_recursive"`
103	IoWaitTimeRecursive     []BlkioStatEntry `json:"io_wait_time_recursive"`
104	IoMergedRecursive       []BlkioStatEntry `json:"io_merged_recursive"`
105	IoTimeRecursive         []BlkioStatEntry `json:"io_time_recursive"`
106	SectorsRecursive        []BlkioStatEntry `json:"sectors_recursive"`
107}
108
109// StorageStats is the disk I/O stats for read/write on Windows.
110type StorageStats struct {
111	ReadCountNormalized  uint64 `json:"read_count_normalized,omitempty"`
112	ReadSizeBytes        uint64 `json:"read_size_bytes,omitempty"`
113	WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"`
114	WriteSizeBytes       uint64 `json:"write_size_bytes,omitempty"`
115}
116
117// NetworkStats aggregates the network stats of one container
118type NetworkStats struct {
119	// Bytes received. Windows and Linux.
120	RxBytes uint64 `json:"rx_bytes"`
121	// Packets received. Windows and Linux.
122	RxPackets uint64 `json:"rx_packets"`
123	// Received errors. Not used on Windows. Note that we dont `omitempty` this
124	// field as it is expected in the >=v1.21 API stats structure.
125	RxErrors uint64 `json:"rx_errors"`
126	// Incoming packets dropped. Windows and Linux.
127	RxDropped uint64 `json:"rx_dropped"`
128	// Bytes sent. Windows and Linux.
129	TxBytes uint64 `json:"tx_bytes"`
130	// Packets sent. Windows and Linux.
131	TxPackets uint64 `json:"tx_packets"`
132	// Sent errors. Not used on Windows. Note that we dont `omitempty` this
133	// field as it is expected in the >=v1.21 API stats structure.
134	TxErrors uint64 `json:"tx_errors"`
135	// Outgoing packets dropped. Windows and Linux.
136	TxDropped uint64 `json:"tx_dropped"`
137	// Endpoint ID. Not used on Linux.
138	EndpointID string `json:"endpoint_id,omitempty"`
139	// Instance ID. Not used on Linux.
140	InstanceID string `json:"instance_id,omitempty"`
141}
142
143// PidsStats contains the stats of a container's pids
144type PidsStats struct {
145	// Current is the number of pids in the cgroup
146	Current uint64 `json:"current,omitempty"`
147	// Limit is the hard limit on the number of pids in the cgroup.
148	// A "Limit" of 0 means that there is no limit.
149	Limit uint64 `json:"limit,omitempty"`
150}
151
152// Stats is Ultimate struct aggregating all types of stats of one container
153type Stats struct {
154	// Common stats
155	Read    time.Time `json:"read"`
156	PreRead time.Time `json:"preread"`
157
158	// Linux specific stats, not populated on Windows.
159	PidsStats  PidsStats  `json:"pids_stats,omitempty"`
160	BlkioStats BlkioStats `json:"blkio_stats,omitempty"`
161
162	// Windows specific stats, not populated on Linux.
163	NumProcs     uint32       `json:"num_procs"`
164	StorageStats StorageStats `json:"storage_stats,omitempty"`
165
166	// Shared stats
167	CPUStats    CPUStats    `json:"cpu_stats,omitempty"`
168	PreCPUStats CPUStats    `json:"precpu_stats,omitempty"` // "Pre"="Previous"
169	MemoryStats MemoryStats `json:"memory_stats,omitempty"`
170}
171
172// StatsJSON is newly used Networks
173type StatsJSON struct {
174	Stats
175
176	Name string `json:"name,omitempty"`
177	ID   string `json:"id,omitempty"`
178
179	// Networks request version >=1.21
180	Networks map[string]NetworkStats `json:"networks,omitempty"`
181}
182