No description
  • Rust 65.1%
  • JavaScript 21%
  • Shell 11%
  • Awk 2.4%
  • Just 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
wuast94 a254ac44f8
Some checks failed
Release / Check if release needed (push) Successful in 4s
Release / Release (push) Failing after 1m41s
feat(ci): separate PR verification from release publication and reuse daemon compiler caches
2026-10-16 20:58:04 +02:00
.cargo perf: buffer Linux links in RAM and reduce test debug data 2026-10-14 22:43:13 +02:00
.ci feat(ci): separate PR verification from release publication and reuse daemon compiler caches 2026-10-16 20:58:04 +02:00
.forgejo/workflows feat(ci): separate PR verification from release publication and reuse daemon compiler caches 2026-10-16 20:58:04 +02:00
.githooks feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
docs feat(ci): separate PR verification from release publication and reuse daemon compiler caches 2026-10-16 20:58:04 +02:00
grafana feat(grafana): add Kubernetes-focused dashboard with templating and per-pod metrics 2026-03-22 07:53:59 +01:00
scripts feat(ci): separate PR verification from release publication and reuse daemon compiler caches 2026-10-16 20:58:04 +02:00
src feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
tests feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
.dockerignore chore: remove obsolete migration leftovers [skip ci] 2026-10-11 21:03:03 +02:00
.gitignore chore: remove obsolete migration leftovers [skip ci] 2026-10-11 21:03:03 +02:00
.updatarr.yaml chore: remove obsolete migration leftovers [skip ci] 2026-10-11 21:03:03 +02:00
AGENTS.md chore: remove obsolete migration leftovers [skip ci] 2026-10-11 21:03:03 +02:00
build.rs feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
Cargo.lock chore: update rust dependencies (1.5.0 → 1.5.1) 2026-10-15 01:11:02 +02:00
Cargo.toml chore: update rust dependencies (1.5.0 → 1.5.1) 2026-10-15 01:11:02 +02:00
CLAUDE.md docs: centralize agent rules and require explicit answers 2026-10-04 08:32:42 +02:00
cliff.toml chore(ci): add tag existence check and configure tag pattern in cliff.toml 2026-03-29 05:13:23 +02:00
deny.toml feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
GEMINI.md feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
Justfile feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
README.md feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00
rust-toolchain.toml chore: update rust toolchain (1.99.0 → 1.99.1) 2026-10-16 14:50:14 +02:00
RUST_REBUILD.md feat: rebuild native Intel GPU exporter in Rust 2026-10-11 17:46:35 +02:00

Intel GPU Exporter

Kleiner nativer Prometheus-Exporter für Intel-GPUs. Rust liest den JSON-Stream des Hostprogramms intel_gpu_top, ergänzt /proc/*/fdinfo und ordnet Kubernetes-Prozesse anhand der kubelet-Dateien zu. Das vorhandene Grafana-Dashboard bleibt verwendbar.

Betrieb

Der bestehende Ansible-/systemd-Weg bleibt erhalten: statisches Linux-amd64-Releasebinary igpu-exporter-linux-amd64 mit SHA256-Datei, installiert als /usr/local/bin/igpu-exporter. Die Ansible-Rolle installiert intel-gpu-tools. Benötigt werden CAP_PERFMON, CAP_SYS_PTRACE, CAP_DAC_READ_SEARCH und Zugriff auf die DRM-Geräte sowie procfs/kubelet-Dateien. Ohne ausführbares intel_gpu_top im PATH scheitert der Start vor dem HTTP-Listener.

intel_gpu_top -J -s1000 läuft als besessener Child. Prozessfehler erhalten den bisherigen Backoff von 1/2/4/…/64 Sekunden; sauberer EOF bleibt down bis zum Service-Neustart. Ein neues Child benötigt ein eigenes gültiges Sample. Veraltete Samples erzeugen wie bisher nach zehn Sekunden eine Warnung und bleiben während laufendem Child verfügbar.

CLI Default
--port 9101
--interval 1000 Millisekunden, positiv
--proc-root /proc
--kubelet-pods-dir /var/lib/kubelet/pods
--debug false

Werte mit Leerzeichen oder Equals sowie die bisherigen Go-Einzeldashflags bleiben unterstützt. --help und --version funktionieren ohne GPU. Port 0 erlaubt einen vom Betriebssystem vergebenen Port. LOG_FORMAT=json|pretty, LOG_LEVEL und RUST_LOG folgen Common; Debug setzt den Level, ein ausdrücklicher RUST_LOG-Filter hat Vorrang. Ohne TTY sind Logs strukturiertes JSON. Positive BLOCKING_CPU_CONCURRENCY und BLOCKING_IO_CONCURRENCY begrenzen CPU- und I/O-Arbeit getrennt gemäß dem veröffentlichten Common-Vertrag.

HTTP und Metriken

  • /metrics: Prometheus-Text 0.0.4 oder ausgehandeltes OpenMetrics 1.0, optional gzip. Der Pfad erhält die bisherige methodenunabhängige Annahme.
  • GET /healthz: Prozessliveness.
  • GET /ready: 200 erst mit gültigem Sample eines laufenden Child, sonst 503; während Shutdown dauerhaft unready.

Alle bisherigen 15 GPU-/Prozessfamilien, Typen und Labels stehen im vollständigen Inventar. Globale Werte kommen aus dem letzten Sample; fdinfo wird wie bisher pro Scrape gelesen, nicht in einen periodischen Hintergrundscan umgewandelt. Prozesslabels bleiben process,pod,namespace,container, ergänzt um engine bei Enginemetriken. Hostprozesse erhalten leere Podlabels. Common ergänzt HTTP-/Jobmetriken ohne Request-IDs als Metriklabels; Scrapes selbst werden nicht als HTTP-Requests beobachtet.

fdinfo-Enginetime wird seit der ersten Baseline akkumuliert. Doppelte DRM-Clients werden einmal gezählt; gleicher Client mit sinkendem Wert behält seinen Highwater. Speicher ist der aktuelle Wert, direkte system0/stolen-system0-Felder haben einschließlich Null Vorrang vor Legacyfeldern. Leere Labelgruppen verschwinden. Podauflösung verwendet cgroups, etc-hosts, projected namespace und vorhandene Downward-API-Metadaten; der lokale Resolvercache hält positive und negative Ergebnisse 30 Sekunden und erkennt PID-Wiederverwendung.

SIGINT/SIGTERM setzen unready, beenden HTTP-/Workerproduzenten und warten auf besessene Blocking-Arbeit und alle Childprozesse. Die veröffentlichte Common-Shutdownfrist verwendet ihren tatsächlichen 15-s-Default; die abschließende native Bereinigung besitzt keine zusätzliche Appfrist. Runtime, Blocking.

Entwicklung und Releases

Rust/Rustup und just gemäß den übernommenen Pins; keine Datenbank oder Redis. just build exportiert mit einem ausschließlich zum Kompilieren verwendeten BuildKit-Container das statische Binary. Dieser Build benötigt Docker und den gemeinsamen Compiler-Cache; es wird kein Runtimeimage veröffentlicht oder deployt.

just setup richtet Tools/Hooks ein. just run --port=9101, just test, just clippy, just fmt und just gate verwenden die tatsächlichen Rust-Prüfungen. Vor funktionalen Themencommits gilt der vollständige Gate. just push [Git-Argumente] veröffentlicht und räumt danach ausschließlich das eigene Cargo-target auf. Cachevertrag, Tests, Agentenregeln.

CI prüft Quality und den nativen statischen Build; Release prüft den gleichen Gate und das Binary vor Tag/Upload. Tags bleiben unpräfixiertes SemVer aus git-cliff; APP_VERSION wird identisch in die Binary eingebettet. Release-Dateien und Downloadpfade bleiben erhalten. Tooldownloads und Actions sind durch Version/Hash gepinnt. Die ausdrücklich genehmigte native Ausnahme umfasst Runtimeimage, Harbor und OCI-SBOM. Es gibt keine UI, Datenbank oder Redis.

Architektur, Migrationsinventar, Abschlussnachweis. Produktionsumstellung erfolgt ausschließlich über den bestehenden Ansible-Weg und wird getrennt von der abgeschlossenen Implementierung dokumentiert.