1// Copyright 2020 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Note: run 'go generate' (which will run 'go test -generate') to update the "Supported metrics" list.
6//go:generate go test -run=Docs -generate
7
8/*
9Package metrics provides a stable interface to access implementation-defined
10metrics exported by the Go runtime. This package is similar to existing functions
11like [runtime.ReadMemStats] and [runtime/debug.ReadGCStats], but significantly more general.
12
13The set of metrics defined by this package may evolve as the runtime itself
14evolves, and also enables variation across Go implementations, whose relevant
15metric sets may not intersect.
16
17# Interface
18
19Metrics are designated by a string key, rather than, for example, a field name in
20a struct. The full list of supported metrics is always available in the slice of
21Descriptions returned by [All]. Each [Description] also includes useful information
22about the metric.
23
24Thus, users of this API are encouraged to sample supported metrics defined by the
25slice returned by All to remain compatible across Go versions. Of course, situations
26arise where reading specific metrics is critical. For these cases, users are
27encouraged to use build tags, and although metrics may be deprecated and removed,
28users should consider this to be an exceptional and rare event, coinciding with a
29very large change in a particular Go implementation.
30
31Each metric key also has a "kind" (see [ValueKind]) that describes the format of the
32metric's value.
33In the interest of not breaking users of this package, the "kind" for a given metric
34is guaranteed not to change. If it must change, then a new metric will be introduced
35with a new key and a new "kind."
36
37# Metric key format
38
39As mentioned earlier, metric keys are strings. Their format is simple and well-defined,
40designed to be both human and machine readable. It is split into two components,
41separated by a colon: a rooted path and a unit. The choice to include the unit in
42the key is motivated by compatibility: if a metric's unit changes, its semantics likely
43did also, and a new key should be introduced.
44
45For more details on the precise definition of the metric key's path and unit formats, see
46the documentation of the Name field of the Description struct.
47
48# A note about floats
49
50This package supports metrics whose values have a floating-point representation. In
51order to improve ease-of-use, this package promises to never produce the following
52classes of floating-point values: NaN, infinity.
53
54# Supported metrics
55
56Below is the full list of supported metrics, ordered lexicographically.
57
58	/cgo/go-to-c-calls:calls
59		Count of calls made from Go to C by the current process.
60
61	/cpu/classes/gc/mark/assist:cpu-seconds
62		Estimated total CPU time goroutines spent performing GC
63		tasks to assist the GC and prevent it from falling behind the
64		application. This metric is an overestimate, and not directly
65		comparable to system CPU time measurements. Compare only with
66		other /cpu/classes metrics.
67
68	/cpu/classes/gc/mark/dedicated:cpu-seconds
69		Estimated total CPU time spent performing GC tasks on processors
70		(as defined by GOMAXPROCS) dedicated to those tasks. This metric
71		is an overestimate, and not directly comparable to system CPU
72		time measurements. Compare only with other /cpu/classes metrics.
73
74	/cpu/classes/gc/mark/idle:cpu-seconds
75		Estimated total CPU time spent performing GC tasks on spare CPU
76		resources that the Go scheduler could not otherwise find a use
77		for. This should be subtracted from the total GC CPU time to
78		obtain a measure of compulsory GC CPU time. This metric is an
79		overestimate, and not directly comparable to system CPU time
80		measurements. Compare only with other /cpu/classes metrics.
81
82	/cpu/classes/gc/pause:cpu-seconds
83		Estimated total CPU time spent with the application paused by
84		the GC. Even if only one thread is running during the pause,
85		this is computed as GOMAXPROCS times the pause latency because
86		nothing else can be executing. This is the exact sum of samples
87		in /sched/pauses/total/gc:seconds if each sample is multiplied
88		by GOMAXPROCS at the time it is taken. This metric is an
89		overestimate, and not directly comparable to system CPU time
90		measurements. Compare only with other /cpu/classes metrics.
91
92	/cpu/classes/gc/total:cpu-seconds
93		Estimated total CPU time spent performing GC tasks. This metric
94		is an overestimate, and not directly comparable to system CPU
95		time measurements. Compare only with other /cpu/classes metrics.
96		Sum of all metrics in /cpu/classes/gc.
97
98	/cpu/classes/idle:cpu-seconds
99		Estimated total available CPU time not spent executing
100		any Go or Go runtime code. In other words, the part of
101		/cpu/classes/total:cpu-seconds that was unused. This metric is
102		an overestimate, and not directly comparable to system CPU time
103		measurements. Compare only with other /cpu/classes metrics.
104
105	/cpu/classes/scavenge/assist:cpu-seconds
106		Estimated total CPU time spent returning unused memory to the
107		underlying platform in response eagerly in response to memory
108		pressure. This metric is an overestimate, and not directly
109		comparable to system CPU time measurements. Compare only with
110		other /cpu/classes metrics.
111
112	/cpu/classes/scavenge/background:cpu-seconds
113		Estimated total CPU time spent performing background tasks to
114		return unused memory to the underlying platform. This metric is
115		an overestimate, and not directly comparable to system CPU time
116		measurements. Compare only with other /cpu/classes metrics.
117
118	/cpu/classes/scavenge/total:cpu-seconds
119		Estimated total CPU time spent performing tasks that return
120		unused memory to the underlying platform. This metric is an
121		overestimate, and not directly comparable to system CPU time
122		measurements. Compare only with other /cpu/classes metrics.
123		Sum of all metrics in /cpu/classes/scavenge.
124
125	/cpu/classes/total:cpu-seconds
126		Estimated total available CPU time for user Go code or the Go
127		runtime, as defined by GOMAXPROCS. In other words, GOMAXPROCS
128		integrated over the wall-clock duration this process has been
129		executing for. This metric is an overestimate, and not directly
130		comparable to system CPU time measurements. Compare only with
131		other /cpu/classes metrics. Sum of all metrics in /cpu/classes.
132
133	/cpu/classes/user:cpu-seconds
134		Estimated total CPU time spent running user Go code. This may
135		also include some small amount of time spent in the Go runtime.
136		This metric is an overestimate, and not directly comparable
137		to system CPU time measurements. Compare only with other
138		/cpu/classes metrics.
139
140	/gc/cycles/automatic:gc-cycles
141		Count of completed GC cycles generated by the Go runtime.
142
143	/gc/cycles/forced:gc-cycles
144		Count of completed GC cycles forced by the application.
145
146	/gc/cycles/total:gc-cycles
147		Count of all completed GC cycles.
148
149	/gc/gogc:percent
150		Heap size target percentage configured by the user, otherwise
151		100. This value is set by the GOGC environment variable, and the
152		runtime/debug.SetGCPercent function.
153
154	/gc/gomemlimit:bytes
155		Go runtime memory limit configured by the user, otherwise
156		math.MaxInt64. This value is set by the GOMEMLIMIT environment
157		variable, and the runtime/debug.SetMemoryLimit function.
158
159	/gc/heap/allocs-by-size:bytes
160		Distribution of heap allocations by approximate size.
161		Bucket counts increase monotonically. Note that this does not
162		include tiny objects as defined by /gc/heap/tiny/allocs:objects,
163		only tiny blocks.
164
165	/gc/heap/allocs:bytes
166		Cumulative sum of memory allocated to the heap by the
167		application.
168
169	/gc/heap/allocs:objects
170		Cumulative count of heap allocations triggered by the
171		application. Note that this does not include tiny objects as
172		defined by /gc/heap/tiny/allocs:objects, only tiny blocks.
173
174	/gc/heap/frees-by-size:bytes
175		Distribution of freed heap allocations by approximate size.
176		Bucket counts increase monotonically. Note that this does not
177		include tiny objects as defined by /gc/heap/tiny/allocs:objects,
178		only tiny blocks.
179
180	/gc/heap/frees:bytes
181		Cumulative sum of heap memory freed by the garbage collector.
182
183	/gc/heap/frees:objects
184		Cumulative count of heap allocations whose storage was freed
185		by the garbage collector. Note that this does not include tiny
186		objects as defined by /gc/heap/tiny/allocs:objects, only tiny
187		blocks.
188
189	/gc/heap/goal:bytes
190		Heap size target for the end of the GC cycle.
191
192	/gc/heap/live:bytes
193		Heap memory occupied by live objects that were marked by the
194		previous GC.
195
196	/gc/heap/objects:objects
197		Number of objects, live or unswept, occupying heap memory.
198
199	/gc/heap/tiny/allocs:objects
200		Count of small allocations that are packed together into blocks.
201		These allocations are counted separately from other allocations
202		because each individual allocation is not tracked by the
203		runtime, only their block. Each block is already accounted for
204		in allocs-by-size and frees-by-size.
205
206	/gc/limiter/last-enabled:gc-cycle
207		GC cycle the last time the GC CPU limiter was enabled.
208		This metric is useful for diagnosing the root cause of an
209		out-of-memory error, because the limiter trades memory for CPU
210		time when the GC's CPU time gets too high. This is most likely
211		to occur with use of SetMemoryLimit. The first GC cycle is cycle
212		1, so a value of 0 indicates that it was never enabled.
213
214	/gc/pauses:seconds
215		Deprecated. Prefer the identical /sched/pauses/total/gc:seconds.
216
217	/gc/scan/globals:bytes
218		The total amount of global variable space that is scannable.
219
220	/gc/scan/heap:bytes
221		The total amount of heap space that is scannable.
222
223	/gc/scan/stack:bytes
224		The number of bytes of stack that were scanned last GC cycle.
225
226	/gc/scan/total:bytes
227		The total amount space that is scannable. Sum of all metrics in
228		/gc/scan.
229
230	/gc/stack/starting-size:bytes
231		The stack size of new goroutines.
232
233	/godebug/non-default-behavior/asynctimerchan:events
234		The number of non-default behaviors executed by the time package
235		due to a non-default GODEBUG=asynctimerchan=... setting.
236
237	/godebug/non-default-behavior/execerrdot:events
238		The number of non-default behaviors executed by the os/exec
239		package due to a non-default GODEBUG=execerrdot=... setting.
240
241	/godebug/non-default-behavior/gocachehash:events
242		The number of non-default behaviors executed by the cmd/go
243		package due to a non-default GODEBUG=gocachehash=... setting.
244
245	/godebug/non-default-behavior/gocachetest:events
246		The number of non-default behaviors executed by the cmd/go
247		package due to a non-default GODEBUG=gocachetest=... setting.
248
249	/godebug/non-default-behavior/gocacheverify:events
250		The number of non-default behaviors executed by the cmd/go
251		package due to a non-default GODEBUG=gocacheverify=... setting.
252
253	/godebug/non-default-behavior/gotypesalias:events
254		The number of non-default behaviors executed by the go/types
255		package due to a non-default GODEBUG=gotypesalias=... setting.
256
257	/godebug/non-default-behavior/http2client:events
258		The number of non-default behaviors executed by the net/http
259		package due to a non-default GODEBUG=http2client=... setting.
260
261	/godebug/non-default-behavior/http2server:events
262		The number of non-default behaviors executed by the net/http
263		package due to a non-default GODEBUG=http2server=... setting.
264
265	/godebug/non-default-behavior/httplaxcontentlength:events
266		The number of non-default behaviors executed by the net/http
267		package due to a non-default GODEBUG=httplaxcontentlength=...
268		setting.
269
270	/godebug/non-default-behavior/httpmuxgo121:events
271		The number of non-default behaviors executed by the net/http
272		package due to a non-default GODEBUG=httpmuxgo121=... setting.
273
274	/godebug/non-default-behavior/httpservecontentkeepheaders:events
275		The number of non-default behaviors executed
276		by the net/http package due to a non-default
277		GODEBUG=httpservecontentkeepheaders=... setting.
278
279	/godebug/non-default-behavior/installgoroot:events
280		The number of non-default behaviors executed by the go/build
281		package due to a non-default GODEBUG=installgoroot=... setting.
282
283	/godebug/non-default-behavior/multipartmaxheaders:events
284		The number of non-default behaviors executed by
285		the mime/multipart package due to a non-default
286		GODEBUG=multipartmaxheaders=... setting.
287
288	/godebug/non-default-behavior/multipartmaxparts:events
289		The number of non-default behaviors executed by
290		the mime/multipart package due to a non-default
291		GODEBUG=multipartmaxparts=... setting.
292
293	/godebug/non-default-behavior/multipathtcp:events
294		The number of non-default behaviors executed by the net package
295		due to a non-default GODEBUG=multipathtcp=... setting.
296
297	/godebug/non-default-behavior/netedns0:events
298		The number of non-default behaviors executed by the net package
299		due to a non-default GODEBUG=netedns0=... setting.
300
301	/godebug/non-default-behavior/panicnil:events
302		The number of non-default behaviors executed by the runtime
303		package due to a non-default GODEBUG=panicnil=... setting.
304
305	/godebug/non-default-behavior/randautoseed:events
306		The number of non-default behaviors executed by the math/rand
307		package due to a non-default GODEBUG=randautoseed=... setting.
308
309	/godebug/non-default-behavior/tarinsecurepath:events
310		The number of non-default behaviors executed by the archive/tar
311		package due to a non-default GODEBUG=tarinsecurepath=...
312		setting.
313
314	/godebug/non-default-behavior/tls10server:events
315		The number of non-default behaviors executed by the crypto/tls
316		package due to a non-default GODEBUG=tls10server=... setting.
317
318	/godebug/non-default-behavior/tls3des:events
319		The number of non-default behaviors executed by the crypto/tls
320		package due to a non-default GODEBUG=tls3des=... setting.
321
322	/godebug/non-default-behavior/tlsmaxrsasize:events
323		The number of non-default behaviors executed by the crypto/tls
324		package due to a non-default GODEBUG=tlsmaxrsasize=... setting.
325
326	/godebug/non-default-behavior/tlsrsakex:events
327		The number of non-default behaviors executed by the crypto/tls
328		package due to a non-default GODEBUG=tlsrsakex=... setting.
329
330	/godebug/non-default-behavior/tlsunsafeekm:events
331		The number of non-default behaviors executed by the crypto/tls
332		package due to a non-default GODEBUG=tlsunsafeekm=... setting.
333
334	/godebug/non-default-behavior/winreadlinkvolume:events
335		The number of non-default behaviors executed by the os package
336		due to a non-default GODEBUG=winreadlinkvolume=... setting.
337
338	/godebug/non-default-behavior/winsymlink:events
339		The number of non-default behaviors executed by the os package
340		due to a non-default GODEBUG=winsymlink=... setting.
341
342	/godebug/non-default-behavior/x509keypairleaf:events
343		The number of non-default behaviors executed by the crypto/tls
344		package due to a non-default GODEBUG=x509keypairleaf=...
345		setting.
346
347	/godebug/non-default-behavior/x509negativeserial:events
348		The number of non-default behaviors executed by the crypto/x509
349		package due to a non-default GODEBUG=x509negativeserial=...
350		setting.
351
352	/godebug/non-default-behavior/x509sha1:events
353		The number of non-default behaviors executed by the crypto/x509
354		package due to a non-default GODEBUG=x509sha1=... setting.
355
356	/godebug/non-default-behavior/x509usefallbackroots:events
357		The number of non-default behaviors executed by the crypto/x509
358		package due to a non-default GODEBUG=x509usefallbackroots=...
359		setting.
360
361	/godebug/non-default-behavior/x509usepolicies:events
362		The number of non-default behaviors executed by the crypto/x509
363		package due to a non-default GODEBUG=x509usepolicies=...
364		setting.
365
366	/godebug/non-default-behavior/zipinsecurepath:events
367		The number of non-default behaviors executed by the archive/zip
368		package due to a non-default GODEBUG=zipinsecurepath=...
369		setting.
370
371	/memory/classes/heap/free:bytes
372		Memory that is completely free and eligible to be returned to
373		the underlying system, but has not been. This metric is the
374		runtime's estimate of free address space that is backed by
375		physical memory.
376
377	/memory/classes/heap/objects:bytes
378		Memory occupied by live objects and dead objects that have not
379		yet been marked free by the garbage collector.
380
381	/memory/classes/heap/released:bytes
382		Memory that is completely free and has been returned to the
383		underlying system. This metric is the runtime's estimate of free
384		address space that is still mapped into the process, but is not
385		backed by physical memory.
386
387	/memory/classes/heap/stacks:bytes
388		Memory allocated from the heap that is reserved for stack space,
389		whether or not it is currently in-use. Currently, this
390		represents all stack memory for goroutines. It also includes all
391		OS thread stacks in non-cgo programs. Note that stacks may be
392		allocated differently in the future, and this may change.
393
394	/memory/classes/heap/unused:bytes
395		Memory that is reserved for heap objects but is not currently
396		used to hold heap objects.
397
398	/memory/classes/metadata/mcache/free:bytes
399		Memory that is reserved for runtime mcache structures, but not
400		in-use.
401
402	/memory/classes/metadata/mcache/inuse:bytes
403		Memory that is occupied by runtime mcache structures that are
404		currently being used.
405
406	/memory/classes/metadata/mspan/free:bytes
407		Memory that is reserved for runtime mspan structures, but not
408		in-use.
409
410	/memory/classes/metadata/mspan/inuse:bytes
411		Memory that is occupied by runtime mspan structures that are
412		currently being used.
413
414	/memory/classes/metadata/other:bytes
415		Memory that is reserved for or used to hold runtime metadata.
416
417	/memory/classes/os-stacks:bytes
418		Stack memory allocated by the underlying operating system.
419		In non-cgo programs this metric is currently zero. This may
420		change in the future.In cgo programs this metric includes
421		OS thread stacks allocated directly from the OS. Currently,
422		this only accounts for one stack in c-shared and c-archive build
423		modes, and other sources of stacks from the OS are not measured.
424		This too may change in the future.
425
426	/memory/classes/other:bytes
427		Memory used by execution trace buffers, structures for debugging
428		the runtime, finalizer and profiler specials, and more.
429
430	/memory/classes/profiling/buckets:bytes
431		Memory that is used by the stack trace hash map used for
432		profiling.
433
434	/memory/classes/total:bytes
435		All memory mapped by the Go runtime into the current process
436		as read-write. Note that this does not include memory mapped
437		by code called via cgo or via the syscall package. Sum of all
438		metrics in /memory/classes.
439
440	/sched/gomaxprocs:threads
441		The current runtime.GOMAXPROCS setting, or the number of
442		operating system threads that can execute user-level Go code
443		simultaneously.
444
445	/sched/goroutines:goroutines
446		Count of live goroutines.
447
448	/sched/latencies:seconds
449		Distribution of the time goroutines have spent in the scheduler
450		in a runnable state before actually running. Bucket counts
451		increase monotonically.
452
453	/sched/pauses/stopping/gc:seconds
454		Distribution of individual GC-related stop-the-world stopping
455		latencies. This is the time it takes from deciding to stop the
456		world until all Ps are stopped. This is a subset of the total
457		GC-related stop-the-world time (/sched/pauses/total/gc:seconds).
458		During this time, some threads may be executing. Bucket counts
459		increase monotonically.
460
461	/sched/pauses/stopping/other:seconds
462		Distribution of individual non-GC-related stop-the-world
463		stopping latencies. This is the time it takes from deciding
464		to stop the world until all Ps are stopped. This is a
465		subset of the total non-GC-related stop-the-world time
466		(/sched/pauses/total/other:seconds). During this time, some
467		threads may be executing. Bucket counts increase monotonically.
468
469	/sched/pauses/total/gc:seconds
470		Distribution of individual GC-related stop-the-world pause
471		latencies. This is the time from deciding to stop the world
472		until the world is started again. Some of this time is spent
473		getting all threads to stop (this is measured directly in
474		/sched/pauses/stopping/gc:seconds), during which some threads
475		may still be running. Bucket counts increase monotonically.
476
477	/sched/pauses/total/other:seconds
478		Distribution of individual non-GC-related stop-the-world
479		pause latencies. This is the time from deciding to stop the
480		world until the world is started again. Some of this time
481		is spent getting all threads to stop (measured directly in
482		/sched/pauses/stopping/other:seconds). Bucket counts increase
483		monotonically.
484
485	/sync/mutex/wait/total:seconds
486		Approximate cumulative time goroutines have spent blocked on a
487		sync.Mutex, sync.RWMutex, or runtime-internal lock. This metric
488		is useful for identifying global changes in lock contention.
489		Collect a mutex or block profile using the runtime/pprof package
490		for more detailed contention data.
491*/
492package metrics
493