Update Watcher-Agent

2025-10-09 22:55:17 +02:00
parent c11e1b9c67
commit b46f3ddd57

@@ -1,229 +1,99 @@
# 🧭 Schnittstellen Docker Service Broadcasting Agent # Schnittstellen
## Übersicht ## Server Registrierung
Der Agent ist ein autonomer Client, der auf einem Host läuft, Docker-Container verwaltet, Metriken sammelt und mit einem zentralen Watcher-Server kommuniziert. Endpoint: /monitoring/register
Der Agent arbeitet zyklisch und nutzt dabei mehrere Subsysteme:
1. **Registrierung & Hardware-Erkennung** Beim Start des Agent, überprüft dieser, ob er bereits eine ID vom Watcher-Server zugewiesen bekommen hat.
2. **Service Discovery (Containerliste)**
3. **Metrik-Übertragung (alle 30s)**
4. **ServerListener (Befehlsabruf und Ausführung)**
--- ---
## 1⃣ Server Registrierung ## Hardware Info
**Endpoint:** Endpoint: /monitoring/hardware-info
`POST /monitoring/register`
**Beschreibung:** Ist der Agent erfolgreich registriert, schickt er einmalig beim starten seine Hardwareinformationen an den Server.
Beim Start überprüft der Agent, ob ihm bereits eine eindeutige ID vom Watcher-Server zugewiesen wurde.
Fehlt diese, registriert sich der Agent neu.
**Beispiel Request:** | eingehender Wert | | Einheit |
```json
{
"hostname": "docker-node-01",
"ip": "192.168.1.10",
"version": "1.0.3"
}
```
**Response:**
```json
{
"server_id": "srv-4fd923a1",
"registered_at": "2025-10-09T10:15:00Z"
}
```
---
## 2⃣ Hardware Info
**Endpoint:**
`POST /monitoring/hardware-info`
**Beschreibung:**
Nach erfolgreicher Registrierung übermittelt der Agent einmalig beim Start seine Hardwareinformationen an den Server.
| Attribut | Beschreibung | Einheit |
| --- | --- | --- | | --- | --- | --- |
| CpuType | Typ-Bezeichnung der eingebauten CPU | Text | | CpuType| Typ-Bezeichnung des eingebauten CPU | |
| CpuCores | Anzahl an CPU-Kernen | Anzahl | | CpuCores | Anzahl an CPU-Kernen | |
| GpuType | Typ-Bezeichnung der Grafikkarte | Text | | GpuType| Typ-Bezeichnung der eingebauten Grafikkarte | |
| RamSize | Größe des verfügbaren Arbeitsspeichers | GB | | RamSize | Größe des verfügbaren Arbeitsspeichers | |
**Beispiel Request:**
```json
{
"server_id": "srv-4fd923a1",
"cpu_type": "AMD Ryzen 7 5800X",
"cpu_cores": 8,
"gpu_type": "NVIDIA RTX 3070",
"ram_size": 32
}
```
--- ---
## 3 Server Metrics ## Server Metrics
**Endpoint:** Endpoint: /monitoring/metric
`POST /monitoring/metric`
**Beschreibung:** Im Serverweiten Tick-Rythmus von 30 Sekunden schickt der Agent einen Metric-Payload an den Server. Dieser Payload beinhaltet die folgenden Werte:
Im 30-Sekunden-Rhythmus sendet der Agent aktuelle Systemmetriken an den Server.
| Metric | eingehender Wert | umgerechneter Wert | | Metric | eingehender Wert | umgerechneter Wert |
| --- | --- | --- | | --- | --- | --- |
| CPU_LOAD | % | | | CPU_LOAD | prozentual | keine Umrechnung |
| CPU_TEMP | °C | | | CPU_TEMP | °C | keine Umrechnung |
| RAM_LOAD | % | | | RAM_LOAD | prozentual | keine Umrechnung |
| RAM_SIZE | Byte | Gigabyte | | RAM_SIZE | Byte | GigaByte |
| GPU_LOAD | % | | | GPU_LOAD | prozentual | keine Umrechnung |
| GPU_TEMP | °C | | | GPU_TEMP | °C | keine Umrechnung |
| GPU_VRAM_LOAD | % | | | GPU_VRAM_LOAD | prozentual | keine Umrechnung |
| GPU_VRAM_SIZE | Bytes | Gigabyte | | GPU_VRAM_SIZE | Bytes | GigaByte |
| NET_RX | Bytes/s | Megabit/s | | NET_RX | Bytes/s | Megabit/s |
| NET_TX | Bytes/s | Megabit/s | | NET_TX | Bytes/s | Megabit/s |
| DISK_USAGE | Bytes | Gigabyte | | DISK_USAGE | Bytes | Gigabyte |
| DISK_SIZE | Bytes | Gigabyte | | DISK_SIZE | Bytes | Gigabyte |
| DISK_TEMP | °C | | | DISK_TEMP | °C | keine Umrechnung |
**Beispiel Request:**
```json
{
"server_id": "srv-4fd923a1",
"metrics": {
"CPU_LOAD": 12.4,
"CPU_TEMP": 53.0,
"RAM_LOAD": 64.8,
"RAM_SIZE": 32,
"GPU_LOAD": 27.3,
"GPU_TEMP": 48.0,
"GPU_VRAM_LOAD": 21.1,
"GPU_VRAM_SIZE": 8,
"NET_RX": 3.2,
"NET_TX": 1.1,
"DISK_USAGE": 125.6,
"DISK_SIZE": 500,
"DISK_TEMP": 39.0
}
}
```
--- ---
## 4 Service Discovery ## Service Discovery
**Endpoint:** Endpoint: /monitoring/service-discovery
`POST /monitoring/service-discovery`
**Beschreibung:** Beim Start schickt der Agent eine Liste aller auf seinem Host laufenden Container:
Beim Start übermittelt der Agent eine Liste aller auf dem Host laufenden Docker-Container.
| Attribut | Beschreibung | Docker Variable | | Attribut | Beschreibung | Docker Variable |
| --- | --- | --- | | --- | --- | --- |
| ServerId | ID des Hosts auf dem der Container läuft | | | ServerId | ID des Hosts auf dem der Container läuft | # |
| ContainerId | Container-ID | `.Id` | | ContainerId | ID des Containers auf dem Host | ? |
| Image | Verwendetes Image | `.Image` | | Image | Image, das der Container verwendet | image |
| Name | Name des Containers | `.Names[0]` | | Name | Name den der Container auf dem Host hat| container_name |
**Beispiel Request:** Diese Daten werden einmalig gesendet und können über einen manuellen refresh aktualisert werden (kommt irgendwann).
```json ContainerId / Image / Name werden in Form eines Container Objektes in json-Format übergeben.
{
"server_id": "srv-4fd923a1",
"containers": [
{
"container_id": "b3f9d12a9f01",
"image": "nginx:latest",
"name": "web_service"
},
{
"container_id": "6e2b11a8c909",
"image": "mysql:8.0",
"name": "db_service"
}
]
}
```
Diese Daten werden einmalig beim Start gesendet und können optional durch einen manuellen Refresh aktualisiert werden.
--- ---
## 5 Service Metrics *(noch nicht implementiert)* ## Service Metrics
**Geplant:** noch nicht implementiert
Erweiterung um container-spezifische Metriken (CPU, RAM, I/O, Netz, Uptime) pro Docker-Container.
--- ---
## 6 ServerListener ## ServerListener
**Funktion:** Frägt beim Server an ob eine neue (aktive) Message für den Client existiert.
Der Agent fragt periodisch beim Server nach, ob neue Befehle für ihn vorliegen. Wenn eine existiert, dann kann der Client diese Anfragen und in nutzbare Daten umwandeln.
Falls eine Nachricht vorhanden ist, wird sie abgerufen, verarbeitet und anschließend deaktiviert. (Im Zuge der Überreichung muss die Nachricht deaktiviert werden - am besten mit einem boolean; wenn die Nachricht stets verfügbar bleibt wird sie immer wieder vom Client abgefragt)
### **Server Endpoint** Die ServerListenerDto sieht wie folgt aus:
`GET /monitoring/messages/{serverId}`
**Response:**
```json
{
"message_type": "restart_container",
"data": { "container_id": "b3f9d12a9f01" },
"message_id": "msg-82d9b3f"
}
```
### **Message Structure**
```rust ```rust
/// Command message received from the backend server.
///
/// ## Fields
/// - `message_type`: Type of command (e.g., "update_image", "restart_container", "stop_agent")
/// - `data`: Command payload (arbitrary JSON)
/// - `message_id`: Unique identifier for acknowledgment
#[derive(Debug, Deserialize, Clone)] #[derive(Debug, Deserialize, Clone)]
pub struct ServerMessage { pub struct ServerMessage {
/// Type of command (e.g., "update_image", "restart_container", "stop_agent")
pub message_type: String, pub message_type: String,
/// Command payload (arbitrary JSON)
pub data: serde_json::Value, pub data: serde_json::Value,
/// Unique identifier for acknowledgment
pub message_id: String, pub message_id: String,
} }
``` ```
--- ---
## 7 Message Acknowledgment ## Message Acknowledgment
**Endpoint:**
`POST /monitoring/messages/{messageId}/ack`
**Beschreibung:**
Nach erfolgreicher Ausführung der Nachricht deaktiviert der Agent die Nachricht auf dem Server.
Dies verhindert, dass der gleiche Befehl mehrfach ausgeführt wird.
**Beispiel Request:**
```json
{
"server_id": "srv-4fd923a1",
"acknowledged_at": "2025-10-09T10:22:14Z"
}
```
**Server-Action:**
- Setze `is_active = false` für die Nachricht
- Protokolliere den Zeitpunkt der Acknowledgment
---
## 8⃣ Message Types (Beispiele)
| Message Type | Beschreibung | Beispiel Payload |
| --- | --- | --- |
| `restart_container` | Startet einen angegebenen Container neu | `{ "container_id": "b3f9d12a9f01" }` |
| `update_image` | Aktualisiert ein Docker-Image | `{ "image": "nginx:latest" }` |
| `stop_agent` | Stoppt den Agent-Prozess | `{}` |
| `refresh_services` | Erzwingt ein erneutes Senden der Containerliste | `{}` |