types/host.go (253 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you 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 types import ( "context" "time" ) // Host is the interface that wraps methods for returning Host stats // It may return partial information if the provider // implementation is unable to collect all of the necessary data. type Host interface { CPUTimer Info() HostInfo Memory() (*HostMemoryInfo, error) // FQDNWithContext returns the fully-qualified domain name of the host. FQDNWithContext(ctx context.Context) (string, error) // FQDN calls FQDNWithContext with a background context. // Deprecated: Use FQDNWithContext instead. FQDN() (string, error) } // NetworkCounters represents network stats from /proc/net type NetworkCounters interface { NetworkCounters() (*NetworkCountersInfo, error) } // SNMP represents the data from /proc/net/snmp // Note that according to RFC 2012,TCP.MaxConn, if present, is a signed value and should be cast to int64 type SNMP struct { IP map[string]uint64 `json:"ip" netstat:"Ip"` ICMP map[string]uint64 `json:"icmp" netstat:"Icmp"` ICMPMsg map[string]uint64 `json:"icmp_msg" netstat:"IcmpMsg"` TCP map[string]uint64 `json:"tcp" netstat:"Tcp"` UDP map[string]uint64 `json:"udp" netstat:"Udp"` UDPLite map[string]uint64 `json:"udp_lite" netstat:"UdpLite"` } // Netstat represents the data from /proc/net/netstat type Netstat struct { TCPExt map[string]uint64 `json:"tcp_ext" netstat:"TcpExt"` IPExt map[string]uint64 `json:"ip_ext" netstat:"IpExt"` } // NetworkCountersInfo represents available network counters from /proc/net type NetworkCountersInfo struct { SNMP SNMP `json:"snmp"` Netstat Netstat `json:"netstat"` } // VMStat is the interface wrapper for platforms that support /proc/vmstat. type VMStat interface { VMStat() (*VMStatInfo, error) } // HostInfo contains basic host information. type HostInfo struct { Architecture string `json:"architecture"` // Process hardware architecture (e.g. x86_64, arm, ppc, mips). NativeArchitecture string `json:"native_architecture"` // Native OS hardware architecture (e.g. x86_64, arm, ppc, mips). BootTime time.Time `json:"boot_time"` // Host boot time. Containerized *bool `json:"containerized,omitempty"` // Is the process containerized. Hostname string `json:"name"` // Hostname. IPs []string `json:"ip,omitempty"` // List of all IPs. KernelVersion string `json:"kernel_version"` // Kernel version. MACs []string `json:"mac"` // List of MAC addresses. OS *OSInfo `json:"os"` // OS information. Timezone string `json:"timezone"` // System timezone. TimezoneOffsetSec int `json:"timezone_offset_sec"` // Timezone offset (seconds from UTC). UniqueID string `json:"id,omitempty"` // Unique ID of the host (optional). } // Uptime returns the system uptime func (host HostInfo) Uptime() time.Duration { return time.Since(host.BootTime) } // OSInfo contains basic OS information type OSInfo struct { Type string `json:"type"` // OS Type (one of linux, macos, unix, windows). Family string `json:"family"` // OS Family (e.g. redhat, debian, freebsd, windows). Platform string `json:"platform"` // OS platform (e.g. centos, ubuntu, windows). Name string `json:"name"` // OS Name (e.g. Mac OS X, CentOS). Version string `json:"version"` // OS version (e.g. 10.12.6). Major int `json:"major"` // Major release version. Minor int `json:"minor"` // Minor release version. Patch int `json:"patch"` // Patch release version. Build string `json:"build,omitempty"` // Build (e.g. 16G1114). Codename string `json:"codename,omitempty"` // OS codename (e.g. jessie). } // LoadAverage is the interface that wraps the LoadAverage method. // LoadAverage returns load info on the host type LoadAverage interface { LoadAverage() (*LoadAverageInfo, error) } // LoadAverageInfo contains load statistics type LoadAverageInfo struct { One float64 `json:"one_min"` Five float64 `json:"five_min"` Fifteen float64 `json:"fifteen_min"` } // HostMemoryInfo (all values are specified in bytes). type HostMemoryInfo struct { Total uint64 `json:"total_bytes"` // Total physical memory. Used uint64 `json:"used_bytes"` // Total - Free Available uint64 `json:"available_bytes"` // Amount of memory available without swapping. Free uint64 `json:"free_bytes"` // Amount of memory not used by the system. VirtualTotal uint64 `json:"virtual_total_bytes"` // Total virtual memory. VirtualUsed uint64 `json:"virtual_used_bytes"` // VirtualTotal - VirtualFree VirtualFree uint64 `json:"virtual_free_bytes"` // Virtual memory that is not used. Metrics map[string]uint64 `json:"raw,omitempty"` // Other memory related metrics. } // VMStatInfo contains parsed info from /proc/vmstat. // This procfs file has expanded much over the years // with different kernel versions. If we don't have a field in vmstat, // the field in the struct will just be blank. The comments represent kernel versions. type VMStatInfo struct { NrFreePages uint64 `json:"nr_free_pages"` // (since Linux 2.6.31) NrAllocBatch uint64 `json:"nr_alloc_batch"` // (since Linux 3.12) NrInactiveAnon uint64 `json:"nr_inactive_anon"` // (since Linux 2.6.28) NrActiveAnon uint64 `json:"nr_active_anon"` // (since Linux 2.6.28) NrInactiveFile uint64 `json:"nr_inactive_file"` // (since Linux 2.6.28) NrActiveFile uint64 `json:"nr_active_file"` // (since Linux 2.6.28) NrUnevictable uint64 `json:"nr_unevictable"` // (since Linux 2.6.28) NrMlock uint64 `json:"nr_mlock"` // (since Linux 2.6.28) NrAnonPages uint64 `json:"nr_anon_pages"` // (since Linux 2.6.18) NrMapped uint64 `json:"nr_mapped"` // (since Linux 2.6.0) NrFilePages uint64 `json:"nr_file_pages"` // (since Linux 2.6.18) NrDirty uint64 `json:"nr_dirty"` // (since Linux 2.6.0) NrWriteback uint64 `json:"nr_writeback"` // (since Linux 2.6.0) NrSlabReclaimable uint64 `json:"nr_slab_reclaimable"` // (since Linux 2.6.19) NrSlabUnreclaimable uint64 `json:"nr_slab_unreclaimable"` // (since Linux 2.6.19) NrPageTablePages uint64 `json:"nr_page_table_pages"` // (since Linux 2.6.0) NrKernelStack uint64 `json:"nr_kernel_stack"` // (since Linux 2.6.32) Amount of memory allocated to kernel stacks. NrUnstable uint64 `json:"nr_unstable"` // (since Linux 2.6.0) NrBounce uint64 `json:"nr_bounce"` // (since Linux 2.6.12) NrVmscanWrite uint64 `json:"nr_vmscan_write"` // (since Linux 2.6.19) NrVmscanImmediateReclaim uint64 `json:"nr_vmscan_immediate_reclaim"` // (since Linux 3.2) NrWritebackTemp uint64 `json:"nr_writeback_temp"` // (since Linux 2.6.26) NrIsolatedAnon uint64 `json:"nr_isolated_anon"` // (since Linux 2.6.32) NrIsolatedFile uint64 `json:"nr_isolated_file"` // (since Linux 2.6.32) NrShmem uint64 `json:"nr_shmem"` // (since Linux 2.6.32) Pages used by shmem and tmpfs(5). NrDirtied uint64 `json:"nr_dirtied"` // (since Linux 2.6.37) NrWritten uint64 `json:"nr_written"` // (since Linux 2.6.37) NrPagesScanned uint64 `json:"nr_pages_scanned"` // (since Linux 3.17) NumaHit uint64 `json:"numa_hit"` // (since Linux 2.6.18) NumaMiss uint64 `json:"numa_miss"` // (since Linux 2.6.18) NumaForeign uint64 `json:"numa_foreign"` // (since Linux 2.6.18) NumaInterleave uint64 `json:"numa_interleave"` // (since Linux 2.6.18) NumaLocal uint64 `json:"numa_local"` // (since Linux 2.6.18) NumaOther uint64 `json:"numa_other"` // (since Linux 2.6.18) WorkingsetRefault uint64 `json:"workingset_refault"` // (since Linux 3.15) WorkingsetActivate uint64 `json:"workingset_activate"` // (since Linux 3.15) WorkingsetNodereclaim uint64 `json:"workingset_nodereclaim"` // (since Linux 3.15) NrAnonTransparentHugepages uint64 `json:"nr_anon_transparent_hugepages"` // (since Linux 2.6.38) NrFreeCma uint64 `json:"nr_free_cma"` // (since Linux 3.7) Number of free CMA (Contiguous Memory Allocator) pages. NrDirtyThreshold uint64 `json:"nr_dirty_threshold"` // (since Linux 2.6.37) NrDirtyBackgroundThreshold uint64 `json:"nr_dirty_background_threshold"` // (since Linux 2.6.37) Pgpgin uint64 `json:"pgpgin"` // (since Linux 2.6.0) Pgpgout uint64 `json:"pgpgout"` // (since Linux 2.6.0) Pswpin uint64 `json:"pswpin"` // (since Linux 2.6.0) Pswpout uint64 `json:"pswpout"` // (since Linux 2.6.0) PgallocDma uint64 `json:"pgalloc_dma"` // (since Linux 2.6.5) PgallocDma32 uint64 `json:"pgalloc_dma32"` // (since Linux 2.6.16) PgallocNormal uint64 `json:"pgalloc_normal"` // (since Linux 2.6.5) PgallocHigh uint64 `json:"pgalloc_high"` // (since Linux 2.6.5) PgallocMovable uint64 `json:"pgalloc_movable"` // (since Linux 2.6.23) Pgfree uint64 `json:"pgfree"` // (since Linux 2.6.0) Pgactivate uint64 `json:"pgactivate"` // (since Linux 2.6.0) Pgdeactivate uint64 `json:"pgdeactivate"` // (since Linux 2.6.0) Pgfault uint64 `json:"pgfault"` // (since Linux 2.6.0) Pgmajfault uint64 `json:"pgmajfault"` // (since Linux 2.6.0) PgrefillDma uint64 `json:"pgrefill_dma"` // (since Linux 2.6.5) PgrefillDma32 uint64 `json:"pgrefill_dma32"` // (since Linux 2.6.16) PgrefillNormal uint64 `json:"pgrefill_normal"` // (since Linux 2.6.5) PgrefillHigh uint64 `json:"pgrefill_high"` // (since Linux 2.6.5) PgrefillMovable uint64 `json:"pgrefill_movable"` // (since Linux 2.6.23) PgstealKswapdDma uint64 `json:"pgsteal_kswapd_dma"` // (since Linux 3.4) PgstealKswapdDma32 uint64 `json:"pgsteal_kswapd_dma32"` // (since Linux 3.4) PgstealKswapdNormal uint64 `json:"pgsteal_kswapd_normal"` // (since Linux 3.4) PgstealKswapdHigh uint64 `json:"pgsteal_kswapd_high"` // (since Linux 3.4) PgstealKswapdMovable uint64 `json:"pgsteal_kswapd_movable"` // (since Linux 3.4) PgstealDirectDma uint64 `json:"pgsteal_direct_dma"` PgstealDirectDma32 uint64 `json:"pgsteal_direct_dma32"` // (since Linux 3.4) PgstealDirectNormal uint64 `json:"pgsteal_direct_normal"` // (since Linux 3.4) PgstealDirectHigh uint64 `json:"pgsteal_direct_high"` // (since Linux 3.4) PgstealDirectMovable uint64 `json:"pgsteal_direct_movable"` // (since Linux 2.6.23) PgscanKswapdDma uint64 `json:"pgscan_kswapd_dma"` PgscanKswapdDma32 uint64 `json:"pgscan_kswapd_dma32"` // (since Linux 2.6.16) PgscanKswapdNormal uint64 `json:"pgscan_kswapd_normal"` // (since Linux 2.6.5) PgscanKswapdHigh uint64 `json:"pgscan_kswapd_high"` PgscanKswapdMovable uint64 `json:"pgscan_kswapd_movable"` // (since Linux 2.6.23) PgscanDirectDma uint64 `json:"pgscan_direct_dma"` // PgscanDirectDma32 uint64 `json:"pgscan_direct_dma32"` // (since Linux 2.6.16) PgscanDirectNormal uint64 `json:"pgscan_direct_normal"` PgscanDirectHigh uint64 `json:"pgscan_direct_high"` PgscanDirectMovable uint64 `json:"pgscan_direct_movable"` // (since Linux 2.6.23) PgscanDirectThrottle uint64 `json:"pgscan_direct_throttle"` // (since Linux 3.6) ZoneReclaimFailed uint64 `json:"zone_reclaim_failed"` // (since linux 2.6.31) Pginodesteal uint64 `json:"pginodesteal"` // (since linux 2.6.0) SlabsScanned uint64 `json:"slabs_scanned"` // (since linux 2.6.5) KswapdInodesteal uint64 `json:"kswapd_inodesteal"` // (since linux 2.6.0) KswapdLowWmarkHitQuickly uint64 `json:"kswapd_low_wmark_hit_quickly"` // (since 2.6.33) KswapdHighWmarkHitQuickly uint64 `json:"kswapd_high_wmark_hit_quickly"` // (since 2.6.33) Pageoutrun uint64 `json:"pageoutrun"` // (since Linux 2.6.0) Allocstall uint64 `json:"allocstall"` // (since Linux 2.6.0) Pgrotated uint64 `json:"pgrotated"` // (since Linux 2.6.0) DropPagecache uint64 `json:"drop_pagecache"` // (since Linux 3.15) DropSlab uint64 `json:"drop_slab"` // (since Linux 3.15) NumaPteUpdates uint64 `json:"numa_pte_updates"` // (since Linux 3.8) NumaHugePteUpdates uint64 `json:"numa_huge_pte_updates"` // (since Linux 3.13) NumaHintFaults uint64 `json:"numa_hint_faults"` // (since Linux 3.8) NumaHintFaultsLocal uint64 `json:"numa_hint_faults_local"` // (since Linux 3.8) NumaPagesMigrated uint64 `json:"numa_pages_migrated"` // (since Linux 3.8) PgmigrateSuccess uint64 `json:"pgmigrate_success"` // (since Linux 3.8) PgmigrateFail uint64 `json:"pgmigrate_fail"` // (since Linux 3.8) CompactMigrateScanned uint64 `json:"compact_migrate_scanned"` // (since Linux 3.8) CompactFreeScanned uint64 `json:"compact_free_scanned"` // (since Linux 3.8) CompactIsolated uint64 `json:"compact_isolated"` // (since Linux 3.8) CompactStall uint64 `json:"compact_stall"` // (since Linux 2.6.35) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. CompactFail uint64 `json:"compact_fail"` // (since Linux 2.6.35) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. CompactSuccess uint64 `json:"compact_success"` // (since Linux 2.6.35) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. HtlbBuddyAllocSuccess uint64 `json:"htlb_buddy_alloc_success"` // (since Linux 2.6.26) HtlbBuddyAllocFail uint64 `json:"htlb_buddy_alloc_fail"` // (since Linux 2.6.26) UnevictablePgsCulled uint64 `json:"unevictable_pgs_culled"` // (since Linux 2.6.28) UnevictablePgsScanned uint64 `json:"unevictable_pgs_scanned"` // (since Linux 2.6.28) UnevictablePgsRescued uint64 `json:"unevictable_pgs_rescued"` // (since Linux 2.6.28) UnevictablePgsMlocked uint64 `json:"unevictable_pgs_mlocked"` // (since Linux 2.6.28) UnevictablePgsMunlocked uint64 `json:"unevictable_pgs_munlocked"` // (since Linux 2.6.28) UnevictablePgsCleared uint64 `json:"unevictable_pgs_cleared"` // (since Linux 2.6.28) UnevictablePgsStranded uint64 `json:"unevictable_pgs_stranded"` // (since Linux 2.6.28) ThpFaultAlloc uint64 `json:"thp_fault_alloc"` // (since Linux 2.6.39) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpFaultFallback uint64 `json:"thp_fault_fallback"` // (since Linux 2.6.39) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpCollapseAlloc uint64 `json:"thp_collapse_alloc"` // (since Linux 2.6.39) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpCollapseAllocFailed uint64 `json:"thp_collapse_alloc_failed"` // (since Linux 2.6.39) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpSplit uint64 `json:"thp_split"` // (since Linux 2.6.39) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpZeroPageAlloc uint64 `json:"thp_zero_page_alloc"` // (since Linux 3.8) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. ThpZeroPageAllocFailed uint64 `json:"thp_zero_page_alloc_failed"` // (since Linux 3.8) See the kernel source file Documentation/admin-guide/mm/transhuge.rst. BalloonInflate uint64 `json:"balloon_inflate"` // (since Linux 3.18) BalloonDeflate uint64 `json:"balloon_deflate"` // (since Linux 3.18) BalloonMigrate uint64 `json:"balloon_migrate"` // (since Linux 3.18) NrTlbRemoteFlush uint64 `json:"nr_tlb_remote_flush"` // (since Linux 3.12) NrTlbRemoteFlushReceived uint64 `json:"nr_tlb_remote_flush_received"` // (since Linux 3.12) NrTlbLocalFlushAll uint64 `json:"nr_tlb_local_flush_all"` // (since Linux 3.12) NrTlbLocalFlushOne uint64 `json:"nr_tlb_local_flush_one"` // (since Linux 3.12) VmacacheFindCalls uint64 `json:"vmacache_find_calls"` // (since Linux 3.16) VmacacheFindHits uint64 `json:"vmacache_find_hits"` // (since Linux 3.16) VmacacheFullFlushes uint64 `json:"vmacache_full_flushes"` // (since Linux 3.19) // the following fields are not documented in `man 5 proc` as of 4.15 NrZoneInactiveAnon uint64 `json:"nr_zone_inactive_anon"` NrZoneActiveAnon uint64 `json:"nr_zone_active_anon"` NrZoneInactiveFile uint64 `json:"nr_zone_inactive_file"` NrZoneActiveFile uint64 `json:"nr_zone_active_file"` NrZoneUnevictable uint64 `json:"nr_zone_unevictable"` NrZoneWritePending uint64 `json:"nr_zone_write_pending"` NrZspages uint64 `json:"nr_zspages"` NrShmemHugepages uint64 `json:"nr_shmem_hugepages"` NrShmemPmdmapped uint64 `json:"nr_shmem_pmdmapped"` AllocstallDma uint64 `json:"allocstall_dma"` AllocstallDma32 uint64 `json:"allocstall_dma32"` AllocstallNormal uint64 `json:"allocstall_normal"` AllocstallMovable uint64 `json:"allocstall_movable"` PgskipDma uint64 `json:"pgskip_dma"` PgskipDma32 uint64 `json:"pgskip_dma32"` PgskipNormal uint64 `json:"pgskip_normal"` PgskipMovable uint64 `json:"pgskip_movable"` Pglazyfree uint64 `json:"pglazyfree"` Pglazyfreed uint64 `json:"pglazyfreed"` Pgrefill uint64 `json:"pgrefill"` PgstealKswapd uint64 `json:"pgsteal_kswapd"` PgstealDirect uint64 `json:"pgsteal_direct"` PgscanKswapd uint64 `json:"pgscan_kswapd"` PgscanDirect uint64 `json:"pgscan_direct"` OomKill uint64 `json:"oom_kill"` CompactDaemonWake uint64 `json:"compact_daemon_wake"` CompactDaemonMigrateScanned uint64 `json:"compact_daemon_migrate_scanned"` CompactDaemonFreeScanned uint64 `json:"compact_daemon_free_scanned"` ThpFileAlloc uint64 `json:"thp_file_alloc"` ThpFileMapped uint64 `json:"thp_file_mapped"` ThpSplitPage uint64 `json:"thp_split_page"` ThpSplitPageFailed uint64 `json:"thp_split_page_failed"` ThpDeferredSplitPage uint64 `json:"thp_deferred_split_page"` ThpSplitPmd uint64 `json:"thp_split_pmd"` ThpSplitPud uint64 `json:"thp_split_pud"` ThpSwpout uint64 `json:"thp_swpout"` ThpSwpoutFallback uint64 `json:"thp_swpout_fallback"` SwapRa uint64 `json:"swap_ra"` SwapRaHit uint64 `json:"swap_ra_hit"` }