A full-stack DX telemetry dashboard that collects, stores, and visualizes build and test metrics from development tools.
This is an internal tool designed to be deployed within your organization's infrastructure. It receives telemetry from build plugins and test runners across your engineering teams, providing visibility into compile times, test pass rates, hot reload performance, and other developer productivity signals. It is not intended to be exposed to the public internet.
- Backend: .NET 10, ASP.NET Core (Kestrel), EF Core with SQLite or PostgreSQL
- Frontend: React 19, TypeScript, Vite 8, Tailwind CSS 3, Tremor, Recharts
- Container: Docker image available at
agoda/devex-telemetry
These are the client libraries that instrument developer tooling and send telemetry to this server:
| Client Package | Install | Sends To | Source |
|---|---|---|---|
Agoda.Builds.Metrics |
NuGet | POST /dotnet |
dotnet-build-metrics |
Agoda.DevFeedback.AspNetStartup |
NuGet | POST /dotnet |
dotnet-build-metrics |
Agoda.Tests.Metrics.NUnit |
NuGet | POST /dotnet/nunit |
dotnet-build-metrics |
Agoda.Tests.Metrics.xUnit |
NuGet | POST /dotnet/nunit |
dotnet-build-metrics |
agoda-devfeedback-webpack |
npm | POST /webpack |
devfeedback-js |
agoda-devfeedback-vite2 |
npm | POST /vite |
devfeedback-js |
agoda-devfeedback-rsbuild |
npm | POST /vite |
devfeedback-js |
| JUnit reporter | Maven | POST /junit |
java-local-metrics |
| ScalaTest reporter | sbt | POST /scala/scalatest |
java-local-metrics |
| Talaiot Gradle plugin | Gradle | POST /gradletalaiot |
Talaiot (external) |
| Jest reporter | npm | POST /jest |
testresults-collector |
| Vitest reporter | npm | POST /vitest |
testresults-collector |
The API supports PostgreSQL when POSTGRES_CONNECTION_STRING is provided.
export POSTGRES_CONNECTION_STRING='Host=localhost;Port=5432;Database=devex_telemetry;Username=devex;Password=devex'Notes:
- If
POSTGRES_CONNECTION_STRINGis not set, the app uses SQLite.
docker run --rm -p 8080:8080 \
-e POSTGRES_CONNECTION_STRING='Host=host.docker.internal;Port=5432;Database=devex_telemetry;Username=devex;Password=devex' \
agoda/devex-telemetry:latestdocker compose up -dThis starts:
- API on
http://localhost:8080 - PostgreSQL on
localhost:5432
Two options, depending on how much per-machine configuration you want.
The compilation clients default to http://compilation-metrics.
Create an internal DNS record so compilation-metrics resolves to wherever you host this API. This gives zero per-machine setup: engineers don’t configure anything, telemetry just flows.
Set DEVFEEDBACK_URL on workstations:
export DEVFEEDBACK_URL=https://your-devex-telemetry.example.comThis is useful when DNS changes aren’t available yet. Your IT support team can roll this out centrally via endpoint management.
See docs/deployment-scenarios.md for concrete deployment topologies, client routing examples, and markdown diagrams.
cd src
dotnet restore
dotnet build
dotnet run --project Agoda.DevExTelemetry.WebApiThe API starts at https://localhost:5001 with Swagger UI at the root.
cd src/Clientside
npm install --legacy-peer-deps
npm run devThe dev server starts at http://localhost:5173 and proxies /api requests to the backend.
I wrote more about this exact setup in Bridging Worlds: Making .NET BFF and React/Vite Play Nice in Development.
cd src
dotnet test