- Rust 65.1%
- JavaScript 21%
- Shell 11%
- Awk 2.4%
- Just 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .cargo | ||
| .ci | ||
| .forgejo/workflows | ||
| .githooks | ||
| docs | ||
| grafana | ||
| scripts | ||
| src | ||
| tests | ||
| .dockerignore | ||
| .gitignore | ||
| .updatarr.yaml | ||
| AGENTS.md | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| cliff.toml | ||
| deny.toml | ||
| GEMINI.md | ||
| Justfile | ||
| README.md | ||
| rust-toolchain.toml | ||
| RUST_REBUILD.md | ||
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.