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
src/
├── Agoda.DevExTelemetry.WebApi/ # ASP.NET Core API (controllers, Program.cs)
├── Agoda.DevExTelemetry.Core/ # Domain layer (entities, DTOs, services, DbContext)
├── Agoda.DevExTelemetry.IntegrationTests/
├── Agoda.DevExTelemetry.UnitTests/
├── Clientside/ # React SPA (Vite + Tailwind + Tremor)
└── Agoda.DevExTelemetry.sln
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 |
| Endpoint | Payload Type |
|---|---|
POST /dotnet |
.NET MSBuild compile, ASP.NET startup, first response |
POST /dotnet/nunit |
NUnit / xUnit test results |
POST /junit |
JUnit test results |
POST /jest |
Jest test results |
POST /vitest |
Vitest test results |
POST /scala/scalatest |
ScalaTest results (gzip supported) |
POST /webpack |
Webpack build metrics |
POST /vite |
Vite build / HMR metrics |
POST /gradletalaiot |
Gradle Talaiot build metrics |
POST /testdata/junit |
JUnit XML multipart upload |
- Test Run Performance — pass rates, durations, per-test-case drill-down
- API Build Performance — compile, startup, and first response times
- Clientside Build Performance — hot reload vs full build metrics
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. - Current PostgreSQL initialization uses
EnsureCreated()as an MVP path. - For long-term schema evolution, move to dedicated PostgreSQL migrations and
db.Database.Migrate().
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.
cd src
dotnet testPushes to main trigger automatic deployment to Azure App Service via GitHub Actions.
| Workflow | Trigger | Purpose |
|---|---|---|
build.yml |
Pull requests to main | Build + test validation |
deploy.yml |
Push to main | Build + deploy to Azure |