Welcome! This guide will walk you through setting up and running the Distributed Task Observatory from scratch. Follow each step in order.
📌 Platform Note: This guide is written for Windows users. The Distributed Task Observatory supports all platforms (Windows, macOS, Linux). For macOS/Linux users:
- Install Docker Desktop for your platform
- Install PowerShell Core:
brew install powershell(macOS) or Linux instructions- Install kind and kubectl via Homebrew or your package manager
- Run scripts with:
pwsh ./scripts/start-all.ps1
- Press the Windows key on your keyboard
- Type
PowerShell - Right-click on Windows PowerShell
- Click Run as administrator
- Click Yes when prompted
Copy and paste this entire command into PowerShell, then press Enter:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))Wait for it to complete. You should see "Chocolatey is ready."
choco install docker-desktop -yImportant: After this completes, restart your computer.
- After restarting, find Docker Desktop in your Start menu
- Open it and wait for it to finish starting
- Look for a whale icon in your system tray (bottom-right of screen)
- The whale should be stable (not animating) when Docker is ready
Open PowerShell as Administrator again and run:
choco install kubernetes-cli -ychoco install kind -ychoco install git -ychoco install rustup.install -yClose PowerShell completely and open a new PowerShell window (doesn't need to be Administrator anymore).
Run these commands one at a time:
docker --version
kubectl version --client
kind --version
git --version
rustc --versionEach should show a version number. If any show an error, go back and redo that installation step.
Navigate to a folder where you want the project. For example:
cd C:\Users\YourName\Documents(Replace YourName with your actual Windows username)
git clone https://github.com/YOUR_USERNAME/odd-demonstration.git(Replace YOUR_USERNAME with the actual GitHub username)
cd odd-demonstration.\scripts\setup-cluster.ps1This takes 1-3 minutes. Wait until you see "Cluster is ready!"
kubectl get nodesYou should see a line containing task-observatory-control-plane with Ready status.
docker build -t gateway:latest -f src/services/gateway/Dockerfile .Wait for "Successfully tagged gateway:latest"
docker build -t processor:latest -f src/services/processor/Dockerfile .Wait for "Successfully tagged processor:latest"
docker build -t metrics-engine:latest -f src/services/metrics-engine/Dockerfile src/services/metrics-enginedocker build -t read-model:latest -f src/services/read-model/Dockerfile src/services/read-modeldocker build -t web-ui:latest -f src/interfaces/web/Dockerfile src/interfaces/webRun each command one at a time:
kind load docker-image gateway:latest --name task-observatory
kind load docker-image processor:latest --name task-observatory
kind load docker-image metrics-engine:latest --name task-observatory
kind load docker-image read-model:latest --name task-observatory
kind load docker-image web-ui:latest --name task-observatorykubectl apply -f .\infra\k8s\kubectl get pods --watchWait until ALL pods show 1/1 under READY and Running under STATUS.
Press Ctrl+C to stop watching once everything is running.
This typically takes 2-3 minutes.
You need to run the following commands, each in a separate PowerShell window. Keep all windows open while using the system.
Open 6 new PowerShell windows. In each one, navigate to the project:
cd C:\Users\YourName\Documents\odd-demonstrationkubectl port-forward svc/gateway 3000:3000Leave this running.
kubectl port-forward svc/read-model 8080:8080Leave this running.
kubectl port-forward svc/web-ui 8081:80Leave this running.
kubectl port-forward svc/rabbitmq 15672:15672Leave this running.
kubectl port-forward svc/grafana 3002:3000Leave this running.
kubectl port-forward svc/prometheus 9090:9090Leave this running.
Open your web browser and go to:
http://localhost:8081
You should see a dark themed dashboard with "Distributed Task Observatory" at the top.
Go to:
http://localhost:15672
Login with:
- Username: guest
- Password: guest
Go to:
http://localhost:3002
Login with:
- Username: admin
- Password: admin
If asked to change password, click "Skip" or set a new one.
- Click the hamburger menu (☰) on the left
- Click Dashboards
- Click Distributed Task Observatory
Go to:
http://localhost:9090
No login required.
Navigate to the TUI folder:
cd C:\Users\YourName\Documents\odd-demonstration\src\interfaces\tuicargo build --releaseThis takes 2-5 minutes the first time.
$env:READ_MODEL_URL="http://localhost:8080"; cargo run --releaseYou should see a terminal-based dashboard with job statistics.
TUI Controls:
- Press
qto quit - Press
rto refresh
Now let's see the system in action by submitting three test jobs!
Navigate to the project:
cd C:\Users\YourName\Documents\odd-demonstrationCopy and paste this entire block:
$job1 = @{
id = [guid]::NewGuid().ToString()
type = "data-processing"
status = "PENDING"
createdAt = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
payload = @{ task = "Process customer data"; priority = "high" }
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:3000/jobs" -Method Post -Body $job1 -ContentType "application/json"You should see a response with jobId and status: accepted.
$job2 = @{
id = [guid]::NewGuid().ToString()
type = "report-generation"
status = "PENDING"
createdAt = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
payload = @{ report = "Monthly sales summary"; format = "PDF" }
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:3000/jobs" -Method Post -Body $job2 -ContentType "application/json"$job3 = @{
id = [guid]::NewGuid().ToString()
type = "notification"
status = "PENDING"
createdAt = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
payload = @{ recipient = "team@example.com"; message = "Weekly update" }
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:3000/jobs" -Method Post -Body $job3 -ContentType "application/json"Go to http://localhost:8081
- The counters should now show 3 jobs
- The table should show all three jobs with status COMPLETED
Go to http://localhost:3002 → Dashboards → Distributed Task Observatory
- The "Jobs Submitted" panel should show 3
- The "Jobs Completed" panel should show 3
If the TUI is still running, press r to refresh.
You should see the updated statistics.
Go to http://localhost:15672 → Queues You can see the message flow through the queues.
Go to each PowerShell window running a port-forward and press Ctrl+C.
In any PowerShell window:
kind delete cluster --name task-observatoryThe software wasn't installed correctly. Close PowerShell, reopen it, and try the command again. If it still doesn't work, reinstall that software.
The service restarted. Just run the port-forward command again.
Make sure virtualization is enabled in your BIOS. Search online for "enable virtualization [your computer model]".
Make sure the corresponding port-forward is running in a PowerShell window.
Wait a few more minutes. If still stuck after 5 minutes, run:
kubectl describe pod NAME_OF_POD(Replace NAME_OF_POD with the actual pod name from kubectl get pods)
| Service | URL | Login |
|---|---|---|
| Web Dashboard | http://localhost:8081 | None |
| RabbitMQ | http://localhost:15672 | guest / guest |
| Grafana | http://localhost:3002 | admin / admin |
| Prometheus | http://localhost:9090 | None |
| Gateway API | http://localhost:3000 | None |
| Read Model API | http://localhost:8080/stats | None |
Congratulations! You've successfully set up and run the Distributed Task Observatory! 🎉