Skip to content
Yasir Uslu
All work

Distributed telemetry platform (EdgePulse)

CorePulse

EdgePulse is a distributed telemetry platform that collects CPU, memory and uptime from machines and raises alerts the moment a threshold is crossed. CorePulse is its live web demo in this portfolio, showing the server’s and the visitor’s own hardware in real time.

Status
Live
Tools
.NET 8 · ASP.NET Core · RabbitMQ · SignalR · PostgreSQL · Angular 17 · Docker · Next.js
CorePulse screenshot

The problem

Collecting telemetry is easy; the hard part is moving readings without loss, evaluating alerts without slowing ingestion and pushing results to the UI instantly. The aim was to build these as decoupled services.

My role

Sole developer: service architecture, .NET services, the collector agent, the Angular UI and the portfolio web demo.

Approach

  1. 01

    Event pipeline

    Collector agent → YARP gateway (.NET 8) → Telemetry.API (ASP.NET Core 8) → RabbitMQ → Alert.Worker → SignalR → Angular. The queue decouples ingestion from alert evaluation, so one slowing down doesn’t stall the other.

  2. 02

    Rule-based alerting

    A .NET 8 Worker Service evaluates configurable per-metric thresholds and pushes alerts to open dashboards over a SignalR hub; data lives in PostgreSQL 16.

  3. 03

    Offline-tolerant agent

    The Node.js collector queues readings locally when the gateway is unreachable and flushes them once it’s back. The whole stack starts with a single Docker Compose command.

  4. 04

    The live portfolio demo

    So it runs with zero setup, the CorePulse page is built on Next.js: a route handler reads CPU and memory from Node’s os module, the visitor’s GPU is detected via WebGL, charts are SVG, and a server-side stress test runs on demand.

The hard part

One reading says nothing

The OS reports CPU times cumulatively since boot, so a single reading can’t show current load. The previous reading is kept in memory and load is computed from the idle/total delta between consecutive readings; the first reading only records a baseline.