diff --git a/README.md b/README.md index 795ab609..5a9bd550 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ stat | Exposes various statistics from `/proc/stat`. This includes boot time, fo textfile | Exposes statistics read from local disk. The `--collector.textfile.directory` flag must be set. | _any_ time | Exposes the current system time. | _any_ timex | Exposes selected adjtimex(2) system call stats. | Linux -uname | Exposes system information as provided by the uname system call. | FreeBSD, Linux +uname | Exposes system information as provided by the uname system call. | Darwin, FreeBSD, Linux, OpenBSD vmstat | Exposes statistics from `/proc/vmstat`. | Linux xfs | Exposes XFS runtime statistics. | Linux (kernel 4.4+) zfs | Exposes [ZFS](http://open-zfs.org/) performance statistics. | [Linux](http://zfsonlinux.org/), Solaris diff --git a/collector/uname.go b/collector/uname.go index 8e91e5f8..381c0ae9 100644 --- a/collector/uname.go +++ b/collector/uname.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build freebsd linux +// +build darwin freebsd openbsd linux // +build !nouname package collector diff --git a/collector/uname_freebsd.go b/collector/uname_bsd.go similarity index 76% rename from collector/uname_freebsd.go rename to collector/uname_bsd.go index 9e4a8ba4..fd8db9b4 100644 --- a/collector/uname_freebsd.go +++ b/collector/uname_bsd.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// +build darwin freebsd openbsd // +build !nouname package collector @@ -28,30 +29,35 @@ func getUname() (uname, error) { return uname{}, err } - // We do a little bit of work here to emulate what happens in the Linux - // uname calls since FreeBSD uname doesn't have a Domainname. - nodename := string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)]) - split := strings.SplitN(nodename, ".", 2) - - // We'll always have at least a single element in the array. We assume this - // is the hostname. - hostname := split[0] - - // If we have more than one element, we assume this is the domainname. - // Otherwise leave it to "(none)" like Linux. - domainname := "(none)" - if len(split) > 1 { - domainname = split[1] - } + nodeName, domainName := parseHostNameAndDomainName(utsname) output := uname{ SysName: string(utsname.Sysname[:bytes.IndexByte(utsname.Sysname[:], 0)]), Release: string(utsname.Release[:bytes.IndexByte(utsname.Release[:], 0)]), Version: string(utsname.Version[:bytes.IndexByte(utsname.Version[:], 0)]), Machine: string(utsname.Machine[:bytes.IndexByte(utsname.Machine[:], 0)]), - NodeName: hostname, - DomainName: domainname, + NodeName: nodeName, + DomainName: domainName, } return output, nil } + +// parseHostNameAndDomainName for FreeBSD,OpenBSD,Darwin. +// Attempts to emulate what happens in the Linux uname calls since these OS doesn't have a Domainname. +func parseHostNameAndDomainName(utsname unix.Utsname) (hostname string, domainname string) { + nodename := string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)]) + split := strings.SplitN(nodename, ".", 2) + + // We'll always have at least a single element in the array. We assume this + // is the hostname. + hostname = split[0] + + // If we have more than one element, we assume this is the domainname. + // Otherwise leave it to "(none)" like Linux. + domainname = "(none)" + if len(split) > 1 { + domainname = split[1] + } + return hostname, domainname +}