# JMon Project Guidelines ## Package Management **IMPORTANT**: Always use `dotnet` CLI commands to manage NuGet packages. Do NOT directly edit `.csproj` files for package management. Use these commands: - `dotnet add package ` - Add a package - `dotnet add package --version ` - Add specific version - `dotnet remove package ` - Remove a package - `dotnet nuget add source ` - Add NuGet source - `dotnet nuget remove source ` - Remove NuGet source This ensures: - Package versions are verified to exist before adding - Compatibility checks are performed - Project structure remains clean and consistent ## Architecture - **Agent**: Worker Service collecting metrics via `/proc` (Linux) or platform APIs - **Server**: ASP.NET Core gRPC service receiving delta metrics - **Protocol**: gRPC with Protobuf for binary efficiency - **Communication**: Unary RPC pattern (request-response), agent initiates - **Metrics**: CPU%, memory, swap, disk usage, IP address, HWID with delta encoding (~50% bandwidth reduction) - **Response Commands**: ACK (normal) or SYNC (force full resync) ## Code Style - C# 12+ features (records, nullable references) - `#nullable enable` required - Async/await throughout - ILogger for all logging - Use DateTimeOffset for all timestamps (UTC) ## Testing & Deployment ### Agent Debug Mode To test the agent without sending to a server: ```bash cd JMonAgent && dotnet run -- --DEBUG=true ``` This prints formatted metrics to console every 5 seconds instead of sending them via gRPC. ### Docker/Podman Setup Run the full stack with: ```bash podman compose up --build ``` This starts: - PostgreSQL 16 with TimescaleDB on localhost:5432 - JMonServer gRPC on localhost:5001 - Metrics automatically persisted to DB with 90-day retention - Data compressed after 7 days Connection string: `Host=localhost;Port=5432;Database=jmon;Username=jmon;Password=jmon_dev_password` - Suppress SignalR warnings by removing unused packages from project files - Both projects should build with 0 errors