Ahoi,
ich bin derzeit dabei, den Grafana Agent für die Erfassung von Telemetriedaten zur Analyse und Überwachung über den Grafana-Stack (Grafana, Loki, Mimir, Tempo und Prometheus) zu testen.
Leider wurde der Support für ARMv6 eingestellt,, worunter auch ein Raspberry Pi fällt. Glücklicherweise ist das offizielle Repository gut dokumentiert, sodass es relativ einfach ist, das aktuelle stabile Release auch für meinen Raspberry Pi 4 zu kompilieren.
Den Weg dahin und worauf zu achten ist, möchte ich mit diesem Beitrag dokumentieren.
Go
Die Version aus dem offiziellen Repository ist leider zu alt, deswegen müssen wir Go manuell installieren. Zuallererst entfernen wir Go (falls vorhanden) und installieren uns die zusätzlich benötigten Abhängigkeiten:
# Go entfernen und Abhängigkeiten installieren
sudo apt remove -y golang
sudo apt install -y build-essential npm
sudo npm install -g yarn
Jetzt müssen wir uns die aktuelle Stable-Version für ARMv6l herunterladen : https://go.dev/dl/
wget https://go.dev/dl/go1.21.1.linux-armv6l.tar.gz
Dann wechseln wir in eine Root-Shell und folgen der offiziellen Dokumentation für die Installation:
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.1.linux-armv6l.tar.gz
export PATH=$PATH:/usr/local/go/bin
rm /usr/bin/go
go version
Entsprechend der heruntergelandenen Version, sollte die letzte Ausgabe 1.21.1 entsprechen.
Grafana Agent
Nun holen wir uns den Grafana Agent und wechseln auf den Branch mit dem aktuellsten Stable-Release:
git clone https://github.com/grafana/agent
cd agent
git checkout v0.36.1
Kompilieren
Da es offiziell keine Unterstützung mehr für ARMv6 oder neuere Versionen gibt, müssen wir das Makefile anpassen.
Hierzu ersetze die Datei tools/make/packaging.mk mit folgendem Inhahlt:
# Makefile.packaging adds release-packaging-specific targets.
PARENT_MAKEFILE := $(firstword $(MAKEFILE_LIST))
.PHONY: dist clean-dist
dist: dist-agent-binaries dist-agent-flow-binaries dist-agentctl-binaries dist-agent-packages dist-agent-flow-packages dist-agent-installer dist-agent-flow-installer
clean-dist:
rm -rf dist dist.temp
# Used for passing through environment variables to sub-makes.
#
# NOTE(rfratto): This *must* use `=` instead of `:=` so it's expanded at
# reference time. Earlier iterations of this file had each target explicitly
# list these, but it's too easy to forget to set on so this is used to ensure
# everything needed is always passed through.
PACKAGING_VARS = RELEASE_BUILD=1 GO_TAGS="$(GO_TAGS)" GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) GOEXPERIMENT=$(GOEXPERIMENT)
#
# agent release binaries
#
dist-agent-binaries: dist/grafana-agent-linux-armv7
dist/grafana-agent-linux-armv7: GO_TAGS += netgo builtinassets promtail_journal_enabled
dist/grafana-agent-linux-armv7: GOOS := linux
dist/grafana-agent-linux-armv7: GOARCH := arm
dist/grafana-agent-linux-armv7: GOARM := 7
dist/grafana-agent-linux-armv7: generate-ui
$(PACKAGING_VARS) AGENT_BINARY=$@ $(MAKE) -f $(PARENT_MAKEFILE) agent
#
# agentctl release binaries.
#
dist-agentctl-binaries: dist/grafana-agentctl-linux-armv7
dist/grafana-agentctl-linux-armv7: GO_TAGS += netgo promtail_journal_enabled
dist/grafana-agentctl-linux-armv7: GOOS := linux
dist/grafana-agentctl-linux-armv7: GOARCH := arm
dist/grafana-agentctl-linux-armv7: GOARM := 7
dist/grafana-agentctl-linux-armv7:
$(PACKAGING_VARS) AGENTCTL_BINARY=$@ $(MAKE) -f $(PARENT_MAKEFILE) agentctl
#
# DEB and RPM grafana-agent packages.
#
AGENT_ENVIRONMENT_FILE_rpm := /etc/sysconfig/grafana-agent
AGENT_ENVIRONMENT_FILE_deb := /etc/default/grafana-agent
# generate_agent_fpm(deb|rpm, package arch, agent arch, output file)
define generate_agent_fpm =
fpm -s dir -v $(AGENT_PACKAGE_VERSION) -a $(2) \
-n grafana-agent --iteration $(AGENT_PACKAGE_RELEASE) -f \
--log error \
--license "Apache 2.0" \
--vendor "Grafana Labs" \
--url "https://github.com/grafana/agent" \
--rpm-digest sha256 \
-t $(1) \
--after-install packaging/grafana-agent/$(1)/control/postinst \
--before-remove packaging/grafana-agent/$(1)/control/prerm \
--config-files /etc/grafana-agent.yaml \
--config-files $(AGENT_ENVIRONMENT_FILE_$(1)) \
--rpm-rpmbuild-define "_build_id_links none" \
--package $(4) \
dist/grafana-agent-linux-$(3)=/usr/bin/grafana-agent \
dist/grafana-agentctl-linux-$(3)=/usr/bin/grafana-agentctl \
packaging/grafana-agent/grafana-agent.yaml=/etc/grafana-agent.yaml \
packaging/grafana-agent/environment-file=$(AGENT_ENVIRONMENT_FILE_$(1)) \
packaging/grafana-agent/$(1)/grafana-agent.service=/usr/lib/systemd/system/grafana-agent.service
endef
AGENT_PACKAGE_VERSION := $(patsubst v%,%,$(VERSION))
AGENT_PACKAGE_RELEASE := 1
AGENT_PACKAGE_PREFIX := dist/grafana-agent-$(AGENT_PACKAGE_VERSION)-$(AGENT_PACKAGE_RELEASE)
.PHONY: dist-agent-packages
dist-agent-packages: dist-agent-packages-armv7
.PHONY: dist-agent-packages-armv7
dist-agent-packages-armv7: dist/grafana-agent-linux-armv7 dist/grafana-agentctl-linux-armv7
ifeq ($(USE_CONTAINER),1)
$(RERUN_IN_CONTAINER)
else
$(call generate_agent_fpm,deb,armhf,armv7,$(AGENT_PACKAGE_PREFIX).armv7.deb)
endif
#
# DEB and RPM grafana-agent-flow packages.
#
FLOW_ENVIRONMENT_FILE_rpm := /etc/sysconfig/grafana-agent-flow
FLOW_ENVIRONMENT_FILE_deb := /etc/default/grafana-agent-flow
Spätestens jetzt solltest du dir einen Kaffee holen, denn wir kompilieren die Binaries direkt auf dem RPi
VERSION=0.36.1 GOARCH=arm GOARM=7 CGO_ENABLED=0 RELEASE_BUILD=1 make dist-agent-packages-armv7
Nach ~15 Minuten findest du im Unterordner dist ein fertiges Installationspaket grafana-agent-0.36.1-1.armv7.deb, welches sich wie gewohnt installieren lässt
dpkg -i dist/grafana-agent-0.36.1-1.armv7.deb
Alle weiteren Schritte können direkt der Dokumentation entnommen werden!