apache_exporter on arm64

Im using a cluster of RaspberryPIs to run some experiments, and I have a K3s running there. Using PIs, in my case 3B and 4, running Raspbian OS 64bit, the underline architecture is aarch64, for your docker images this translates into arm64.

Many applications you want to use on this architecture there is no image available, for case I need to build the binary and build the image.

I was trying to use source code from the original repository https://github.com/Lusitaniae/apache_exporter/blob/master/Makefile:

# 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.
GO    := GO111MODULE=on go
PROMU := $(shell $(GO) env GOPATH)/bin/promu
pkgs   = $(shell $(GO) list ./... | grep -v /vendor/)
PREFIX                  ?= $(shell pwd)
BIN_DIR                 ?= $(shell pwd)
DOCKER_IMAGE_NAME       ?= apache-exporter
DOCKER_IMAGE_TAG        ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
all: format build test
test:
	@echo ">> running tests"
	@$(GO) test -short $(pkgs)
style:
	@echo ">> checking code style"
	@! gofmt -d $(shell find . -path ./vendor -prune -o -name '*.go' -print) | grep '^'
format:
	@echo ">> formatting code"
	@$(GO) fmt $(pkgs)
vet:
	@echo ">> vetting code"
	@$(GO) vet $(pkgs)
build: promu
	@echo ">> building binaries"
	@$(PROMU) build --prefix $(PREFIX)
tarball: promu
	@echo ">> building release tarball"
	@$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
docker:
	@echo ">> building docker image"
	@docker build -t "$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" .
promu:
	@GOOS=$(shell uname -s | tr A-Z a-z) \
		GOARCH=$(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) \
		$(GO) get -u github.com/prometheus/promu
.PHONY: all style format build test vet tarball docker promu

The problem on this code is at the end

promu:
	@GOOS=$(shell uname -s | tr A-Z a-z) \
		GOARCH=$(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) \
		$(GO) get -u github.com/prometheus/promu

This code won’t work to compile arm. To fix this, we need to make it work for arm:

promu:
	@echo ">> fetching promu"
	@GOOS= GOARCH= $(GO) get -u github.com/prometheus/promu
	# @GOOS=$(shell uname -s | tr A-Z a-z) \
	# 	GOARCH=$(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) \
	# 	$(GO) get -u github.com/prometheus/promu

I’ve commented some lines and put the right one for multi architecture.

As a final tip, if you want to compile from another machine on a different architecture, osx in my case, you can use:

GOOS=linux GOARCH=arm64 go build apache_exporter.go

You may need to do some work on the Dockerfile as well.