From 52f79e699df8505612f3d7c1dbeccdf60fb1c7df Mon Sep 17 00:00:00 2001
From: Tobias Schmidt <ts@soundcloud.com>
Date: Sat, 3 Oct 2015 02:22:15 -0400
Subject: [PATCH] Fix uname collector for arm/ppc64/ppc64le architectures

The syscall.Utsname struct under arm/ppc64/ppc64le uses uint8 type
instead of int8.
---
 collector/uname_linux.go       | 28 ++++++++--------------------
 collector/uname_linux_int8.go  | 27 +++++++++++++++++++++++++++
 collector/uname_linux_uint8.go | 27 +++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 20 deletions(-)
 create mode 100644 collector/uname_linux_int8.go
 create mode 100644 collector/uname_linux_uint8.go

diff --git a/collector/uname_linux.go b/collector/uname_linux.go
index 5d730606..8220d77e 100644
--- a/collector/uname_linux.go
+++ b/collector/uname_linux.go
@@ -46,31 +46,19 @@ func newUnameCollector() (Collector, error) {
 	return &unameCollector{}, nil
 }
 
-func intArrayToString(array [65]int8) string {
-	var str string
-	for _, a := range array {
-		if a == 0 {
-			break
-		}
-		str += string(a)
-	}
-	return str
-}
-
 func (c unameCollector) Update(ch chan<- prometheus.Metric) error {
 	var uname syscall.Utsname
 	if err := syscall.Uname(&uname); err != nil {
 		return err
 	}
 
-	labelValues := []string{
-		intArrayToString(uname.Sysname),
-		intArrayToString(uname.Release),
-		intArrayToString(uname.Version),
-		intArrayToString(uname.Machine),
-		intArrayToString(uname.Nodename),
-		intArrayToString(uname.Domainname),
-	}
-	ch <- prometheus.MustNewConstMetric(unameDesc, prometheus.GaugeValue, 1, labelValues...)
+	ch <- prometheus.MustNewConstMetric(unameDesc, prometheus.GaugeValue, 1,
+		unameToString(uname.Sysname),
+		unameToString(uname.Release),
+		unameToString(uname.Version),
+		unameToString(uname.Machine),
+		unameToString(uname.Nodename),
+		unameToString(uname.Domainname),
+	)
 	return nil
 }
diff --git a/collector/uname_linux_int8.go b/collector/uname_linux_int8.go
new file mode 100644
index 00000000..66923630
--- /dev/null
+++ b/collector/uname_linux_int8.go
@@ -0,0 +1,27 @@
+// Copyright 2015 The Prometheus Authors
+// Licensed 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.
+
+// +build !nouname,linux,386 !nouname,linux,amd64
+
+package collector
+
+func unameToString(input [65]int8) string {
+	var str string
+	for _, a := range input {
+		if a == 0 {
+			break
+		}
+		str += string(a)
+	}
+	return str
+}
diff --git a/collector/uname_linux_uint8.go b/collector/uname_linux_uint8.go
new file mode 100644
index 00000000..5d0cc381
--- /dev/null
+++ b/collector/uname_linux_uint8.go
@@ -0,0 +1,27 @@
+// Copyright 2015 The Prometheus Authors
+// Licensed 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.
+
+// +build !nouname,linux,arm !nouname,linux,ppc64 !nouname,linux,ppc64le
+
+package collector
+
+func unameToString(input [65]uint8) string {
+	var str string
+	for _, a := range input {
+		if a == 0 {
+			break
+		}
+		str += string(a)
+	}
+	return str
+}