@salesdeskpro/apm-service
v0.2.0
Published
Standalone APM collector — Dynatrace-style logs, metrics, and traces for any Node service
Maintainers
Readme
@salesdeskpro/apm-service
Standalone APM collector — Dynatrace-style central backend for logs, metrics, and distributed traces.
Any Node.js service installs @salesdeskpro/apm-agent and points at this service. No observability code inside your business apps beyond one middleware line.
Architecture
┌─────────────┐ POST /v1/ingest/http ┌──────────────────┐
│ billing-api │ ─────────────────────────►│ │
└─────────────┘ │ apm-service │
┌─────────────┐ X-APM-Key │ (PostgreSQL) │◄── UI / CRM
│ email-api │ ─────────────────────────►│ │
└─────────────┘ └──────────────────┘
┌─────────────┐
│ worker │ ─────────────────────────►
└─────────────┘Quick start
cd apm-service
cp .env.example .env
# edit DATABASE_URL + APM_API_KEYS
npm install
npm startOpen http://localhost:9090 for the built-in console (set API key in the page).
Environment
| Variable | Description |
|----------|-------------|
| PORT | HTTP port (default 9090) |
| DATABASE_URL | PostgreSQL connection string |
| APM_API_KEYS | Comma-separated ingest + read keys |
| APM_SLOW_SPAN_MS | Slow trace threshold (default 500) |
| CORS_ORIGINS | UI origins (* for dev) |
API
Ingest (agent → collector)
POST /v1/ingest/http — header X-APM-Key
{
"serviceName": "billing-api",
"tenantId": "acme",
"traceId": "…",
"spanId": "…",
"routePattern": "GET /api/invoices",
"method": "GET",
"statusCode": 200,
"durationMs": 42,
"level": "INFO"
}POST /v1/ingest/batch — custom logs + spans batch.
Query (UI / tools)
| Endpoint | Description |
|----------|-------------|
| GET /v1/status | Health + schema |
| GET /v1/services?tenantId= | Services reporting for tenant |
| GET /v1/tenants/:tenantId/logs | Log stream |
| GET /v1/tenants/:tenantId/metrics | Aggregated metrics |
| GET /v1/tenants/:tenantId/traces | Distributed traces |
All query routes require X-APM-Key.
Query params: service, days, limit, level, search (logs).
Wire a Node service
See packages/apm-agent/README.md.
APM_SERVER_URL=https://apm.yourcompany.com
APM_API_KEY=your-key
APM_SERVICE_NAME=my-serviceWire SalesDesk CRM
API (email-api/.env):
APM_SERVER_URL=https://apm.yourcompany.com
APM_API_KEY=your-key
APM_SERVICE_NAME=email-apiUI (.env):
VITE_APM_ENABLED=true
VITE_APM_SERVICE_URL=https://apm.yourcompany.com
VITE_APM_READ_KEY=your-keyEmbedded APM_ENABLED plugin is not used when APM_SERVER_URL is set.
Deploy
- Run as its own Cloud Run / container / VM
- Dedicated Postgres (recommended) or separate DB
- Put behind HTTPS; rotate
APM_API_KEYS
Disable
Stop the service — your apps keep running; agent logs warnings only.
