(ms *runtime.MemStats, rm map[string]*metrics.Sample)
| 412 | } |
| 413 | |
| 414 | func memStatsFromRM(ms *runtime.MemStats, rm map[string]*metrics.Sample) { |
| 415 | lookupOrZero := func(name string) uint64 { |
| 416 | if s, ok := rm[name]; ok { |
| 417 | return s.Value.Uint64() |
| 418 | } |
| 419 | return 0 |
| 420 | } |
| 421 | |
| 422 | // Currently, MemStats adds tiny alloc count to both Mallocs AND Frees. |
| 423 | // The reason for this is because MemStats couldn't be extended at the time |
| 424 | // but there was a desire to have Mallocs at least be a little more representative, |
| 425 | // while having Mallocs - Frees still represent a live object count. |
| 426 | // Unfortunately, MemStats doesn't actually export a large allocation count, |
| 427 | // so it's impossible to pull this number out directly. |
| 428 | tinyAllocs := lookupOrZero(goGCHeapTinyAllocsObjects) |
| 429 | ms.Mallocs = lookupOrZero(goGCHeapAllocsObjects) + tinyAllocs |
| 430 | ms.Frees = lookupOrZero(goGCHeapFreesObjects) + tinyAllocs |
| 431 | |
| 432 | ms.TotalAlloc = lookupOrZero(goGCHeapAllocsBytes) |
| 433 | ms.Sys = lookupOrZero(goMemoryClassesTotalBytes) |
| 434 | ms.Lookups = 0 // Already always zero. |
| 435 | ms.HeapAlloc = lookupOrZero(goMemoryClassesHeapObjectsBytes) |
| 436 | ms.Alloc = ms.HeapAlloc |
| 437 | ms.HeapInuse = ms.HeapAlloc + lookupOrZero(goMemoryClassesHeapUnusedBytes) |
| 438 | ms.HeapReleased = lookupOrZero(goMemoryClassesHeapReleasedBytes) |
| 439 | ms.HeapIdle = ms.HeapReleased + lookupOrZero(goMemoryClassesHeapFreeBytes) |
| 440 | ms.HeapSys = ms.HeapInuse + ms.HeapIdle |
| 441 | ms.HeapObjects = lookupOrZero(goGCHeapObjects) |
| 442 | ms.StackInuse = lookupOrZero(goMemoryClassesHeapStacksBytes) |
| 443 | ms.StackSys = ms.StackInuse + lookupOrZero(goMemoryClassesOSStacksBytes) |
| 444 | ms.MSpanInuse = lookupOrZero(goMemoryClassesMetadataMSpanInuseBytes) |
| 445 | ms.MSpanSys = ms.MSpanInuse + lookupOrZero(goMemoryClassesMetadataMSPanFreeBytes) |
| 446 | ms.MCacheInuse = lookupOrZero(goMemoryClassesMetadataMCacheInuseBytes) |
| 447 | ms.MCacheSys = ms.MCacheInuse + lookupOrZero(goMemoryClassesMetadataMCacheFreeBytes) |
| 448 | ms.BuckHashSys = lookupOrZero(goMemoryClassesProfilingBucketsBytes) |
| 449 | ms.GCSys = lookupOrZero(goMemoryClassesMetadataOtherBytes) |
| 450 | ms.OtherSys = lookupOrZero(goMemoryClassesOtherBytes) |
| 451 | ms.NextGC = lookupOrZero(goGCHeapGoalBytes) |
| 452 | |
| 453 | // N.B. GCCPUFraction is intentionally omitted. This metric is not useful, |
| 454 | // and often misleading due to the fact that it's an average over the lifetime |
| 455 | // of the process. |
| 456 | // See https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 |
| 457 | // for more details. |
| 458 | ms.GCCPUFraction = 0 |
| 459 | } |
| 460 | |
| 461 | // batchHistogram is a mutable histogram that is updated |
| 462 | // in batches. |
no outgoing calls