pulse is an early-stage active monitoring system for checking the availability of services and infrastructure resources.
The project is focused on config-driven health checks for things like:
- HTTP APIs
- TCP endpoints
- gRPC health checks
- DNS records
- TLS certificates
In the future, the project is planned to grow toward:
- additional check types for databases, queues, and other infrastructure components
- inbound health/status signals from external systems
- internal and public status pages generated from collected state
This project is still in an early stage of development.
What exists today:
- configuration loading and validation
- typed check configuration models
- periodic check execution with retries and jitter
- HTTP checks
- TCP checks
- DNS checks
- TLS certificate checks
- gRPC health checks via
grpc.health.v1.Health/Check - PostgreSQL-backed raw check execution storage
- persisted current check state
- persisted check state event history
- migration CLI via
cmd/pulse-migrate - early REST API via
cmd/pulse-api
What does not exist yet in a finished form:
- finalized service-level aggregation
- complete query/read API for current and historical state
- public/internal status page generation
- production-ready logging and observability
- stable external interfaces
The application expects configuration to be provided through CONFIG_DIR.
PostgreSQL is also required for execution and state storage.
Expected layout:
services.yamlchecks/*.yaml
Example configuration files are available in:
examples/services.yamlexamples/checks/api-checks.yaml
Validate configuration with:
API_HTTP_AUTH_TOKEN=dev-token API_HTTP_CUSTOM_HEADER=dev-value CONFIG_DIR=./examples go run ./cmd/pulse-validateBefore starting the app, apply migrations:
go run ./cmd/pulse-migrate upRun with:
API_HTTP_AUTH_TOKEN=dev-token API_HTTP_CUSTOM_HEADER=dev-value CONFIG_DIR=./examples go run ./cmd/pulseRun API with:
API_LISTEN_ADDR=:8080 INTERNAL_API_ENABLED=true CONFIG_DIR=./examples go run ./cmd/pulse-apiCheck spec values may reference environment variables with ${VAR_NAME} syntax:
headers:
Authorization: "Bearer ${API_HTTP_AUTH_TOKEN}"Referenced variables must be present when the configuration is loaded. Values are resolved at check execution time and are not written back into the loaded config snapshot.
The API process has separate internal and public route groups. Both are disabled by default and must be enabled explicitly:
INTERNAL_API_ENABLED=trueenables monitoring/admin-oriented endpointsPUBLIC_API_ENABLED=trueenables public status endpoints
Implemented internal API endpoints:
GET /internal/v1/servicesGET /internal/v1/services/{serviceId}/checks/stateGET /internal/v1/services/{serviceId}/checks/{checkId}/executionsGET /internal/v1/services/{serviceId}/checks/{checkId}/timelineGET /internal/v1/services/{serviceId}/checks/{checkId}/buckets
Placeholder public API endpoints:
GET /public/v1/status
A few implementation details are intentionally narrow at this stage:
- gRPC support currently targets only the standard health check API:
grpc.health.v1.Health/Check - raw execution history, current check state, and check state event history are stored in PostgreSQL
- API configuration is read from the latest valid hot-reloaded config snapshot
- internal architecture is still evolving
- timeline and bucket endpoints respect per-check
allowed_buckets
Everything may change.
This includes:
- configuration format
- internal architecture
- runtime behavior
- package layout
- public interfaces
At this stage, the repository should be treated as an evolving prototype rather than a stable production-ready system.