BlueWave Uptime
An open source server monitoring application
BlueWave Uptime is an open source server monitoring application used to track the operational status and performance of servers and websites. It regularly checks whether a server/website is accessible and performs optimally, providing real-time alerts and reports on the monitored services' availability, downtime, and response time.
Features
- Completely open source, deployable on your servers
- Website monitoring
- Port monitoring
- Ping monitoring
- Incidents at a glance
- Page speed monitoring
- Scheduled maintenance (in the works)
- Status pages (in the works)
Roadmap (short term):
- 3rd party integrations
- DNS monitoring
- SSL monitoring
Roadmap (long term):
- Memory, disk and CPU monitoring using OpenTelemetry
Tech stack
Contributing
We love contributors. Here's how you can contribute:
- Check Contributor's guideline.
- Have a look at our Figma designs here. We encourage you to copy to your own Figma page, then work on it as it is read-only.
- Open an issue if you believe you've encountered a bug
- Make a pull request to add new features/make quality-of-life improvements/fix bugs.
Made with contrib.rocks.
Getting Started
- Clone this repository to your local machine
- Docker Quickstart
- Installation (Client)
- Configuration(Client)
- Getting Started (Server)
- Endpoints
Auth
POST/api/v1/auth/registerPOST/api/v1/auth/loginPUT/api/v1/auth/user/{userId}GET/api/v1/auth/usersGET/api/v1/auth/users/adminPOST/api/v1/auth/invitePOST/api/v1/auth/invite/verify/POST/api/v1/auth/recovery/requestPOST/api/v1/auth/recovery/validatePOST/api/v1/auth/recovery/reset
Monitors
GET/api/v1/monitorsGET/api/v1/monitors/{monitorId}GET/api/v1/monitors/user/{userId}?limitPOST/api/v1/monitorsPUT/api/v1/monitors/{monitorId}DELETE/api/v1/monitors/{monitorId}DELETE/api/v1/monitors/all
Checks
Alerts
POST/api/v1/alerts/{monitorId}GET/api/v1/alerts/user/{userId}GET/api/v1/alerts/monitor/{monitorId}GET/api/v1/alerts/{alertId}PUT/api/v1/alerts/{alertId}DELETE/api/v1/alerts/{alertId}
Page Speed
POST/api/v1/pagespeed/:monitorIdGET/api/v1/pagespeed/:monitorIdDELETE/api/v1/pagespeed/:monitorId
Maintenance Window
- Error Handling
- Contributors
Docker Quick Start
Docker Quickstart
The fastest way to start the application is to use our Dockerfiles and Docker Compose.
To get the application up and running you need to:
- In the
Dockerdirectory run the build scriptbuild_images.shto build docker images for the client, server, Redis database, and MongoDB database. - In the
Dockerdirectory, create aserver.envfile with the requried environtmental variables for the server. Sample file:
CLIENT_HOST="http://localhost:5173"
JWT_SECRET=<jwt_secret>
DB_TYPE="MongoDB"
DB_CONNECTION_STRING="mongodb://mongodb:27017/uptime_db"
REDIS_HOST="redis"
REDIS_PORT=6379
TOKEN_TTL="99d"
PAGESPEED_API_KEY=<api_key>
SYSTEM_EMAIL_HOST="smtp.gmail.com"
SYSTEM_EMAIL_PORT=465
SYSTEM_EMAIL_ADDRESS=<system_email>
SYSTEM_EMAIL_PASSWORD=<system_email_password>
- In the
Dockerdirectory, create aclient.envfile with the required environtmental variables for the client. Sample file:
VITE_APP_API_BASE_URL="http://localhost:5000/api/v1"
- In the
Dockerdirectory rundocker compose upto run thedocker-compose.yamlfile and start all four images.
That's it, the application is ready to use on port 5173.
Client
Installation
- Change directory to the
Clientdirectory - Install all dependencies by running
npm install
Configuration
Environmental Variables
| ENV Variable Name | Required/Optional | Type | Description | Accepted Values |
|---|---|---|---|---|
| VITE_APP_API_BASE_URL | Required | string |
Base URL of server | {host}/api/v1 |
Starting Development Server
- Run
npm run devto start the development server.
Getting Started (Server)
Manual Install
Install Server
- Change directory to the
Serverdirectory - Install all dependencies by running
npm install
Environmental Variables
Configure the server with the following environmental variables:
| ENV Variable Name | Required/Optional | Type | Description | Accepted Values |
|---|---|---|---|---|
| CLIENT_HOST | Required | string |
Frontend Host | |
| JWT_SECRET | Required | string |
JWT secret | |
| DB_TYPE | Optional | string |
Specify DB to use | MongoDB | FakeDB |
| DB_CONNECTION_STRING | Required | string |
Specifies URL for MongoDB Database | |
| PORT | Optional | integer |
Specifies Port for Server | |
| LOGIN_PAGE_URL | Required | string |
Login url to be used in emailing service | |
| REDIS_HOST | Required | string |
Host address for Redis database | |
| REDIS_PORT | Required | integer |
Port for Redis database | |
| TOKEN_TTL | Optional | string |
Time for token to live | In vercel/ms format https://github.com/vercel/ms |
| PAGESPEED_API_KEY | Optional | string |
API Key for PageSpeed requests | |
| SYSTEM_EMAIL_HOST | Required | string |
Host to send System Emails From | |
| SYSTEM_EMAIL_PORT | Required | number |
Port for System Email Host | |
| SYSTEM_EMAIL_ADDRESS | Required | string |
System Email Address | |
| SYSTEM_EMAIL_PASSWORD | Required | string |
System Email Password |
Databases
This project requires a number of databases to run:
- Main database for the application. This project includes an implementation for a MongoDB database as well as a MongoDB Docker image.
- A Redis database is required for the Queue implementation in the PingService. This project includes a Redis docker image.
You may use the included Dockerfiles to spin up databases quickly if you wish.
(Optional) Dockerised Databases
Dockerfiles for the server and databases are located in the Docker directory
MongoDB Image
Location: Docker/mongoDB.Dockerfile
The Docker/mongo/data directory should be mounted to the MongoDB container in order to persist data.
From the Docker directory run
- Build the image:
docker build -f mongoDB.Dockerfile -t uptime_database_mongo . - Run the docker image:
docker run -d -p 27017:27017 -v $(pwd)/mongo/data:/data/db --name uptime_database_mongo uptime_database_mongo
Redis Image
Location Docker/redis.Dockerfile
the Docker/redis/data directory should be mounted to the Redis container in order to persist data.
From the Docker directory run
- Build the image:
docker build -f redis.Dockerfile -t uptime_redis . - Run the image:
docker run -d -p 6379:6379 -v $(pwd)/redis/data:/data --name uptime_redis uptime_redis
Starting the Development Server
- run
npm run devto start the development server
OR
- run
node index.jsto start server
Endpoints
All endpoints return a response in this format:
| Name | Type | Notes |
|---|---|---|
| success | boolean |
Success or failure of request |
| msg | string |
Message describing response |
| data | Object |
Arbitrary Payload |
Example:
{success: true, msg: "Successful Request", data: {test: testData}}
Data Types
User
| Name | Type | Notes |
|---|---|---|
| firstname | string |
First name |
| lastname | string |
Last name |
string |
User's email | |
| profilePicUrl | string |
URL to User's picture |
| isActive | boolean |
Default to true |
| isVerified | boolean |
Default to false |
| updated_at | Date |
Last update time |
| created_at | Date |
Time created at |
Monitor
| Name | Type | Notes |
|---|---|---|
| userId | string |
Unique ID identifying monitor creator |
| name | string |
Name of the monitor |
| description | string |
Description of the monitor |
| url | string |
Url the monitor will ping |
| isActive | boolean |
Whether or not the monitor is active |
| interval | integer |
Interval with which to ping monitor (ms) |
| updatedAt | Date |
Last time the monitor was updated |
| CreatedAt | Date |
When the monitor was updated |
Check
| Name | Type | Notes |
|---|---|---|
| monitorId | string |
Unique ID for the monitor |
| status | boolean |
Indicates the service is Up or Down |
| responseTime | integer |
Indicates the response time of the service (ms) |
| statusCode | integer |
Status Code returned from the service |
| message | string |
Message returned from the service |
| updatedAt | Date |
Last time the check was updated |
| CreatedAt | Date |
When the check was created |
Alert
| Name | Type | Notes |
|---|---|---|
| checkId | string |
Unique ID for the associated check |
| monitorId | string |
Unique ID for the associated monitor |
| userId | string |
Unique ID for the associated user |
| status | boolean |
Indicates the service is Up or Down |
| message | string |
Message for the user about the down service |
| notifiedStatus | boolean |
Indicates whether the user is notified |
| acknowledgeStatus | boolean |
Indicates whether the user acknowledged the alert |
| updatedAt | Date |
Last time the alert was updated |
| CreatedAt | Date |
When the alert was created |
Auth
POST /api/v1/auth/register
Method/Headers
Method/Headers Value Method POST content-type multipart/form-data
Form
Name Type Notes firstName stringlastName stringstringValid email address password stringMin 8 chars, One Upper, one number, one special role Array<string>Array of user roles
Response Payload
Type Notes User User data JWT JSON web token
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/register \
--header 'Content-Type: multipart/form-data' \
--form firstName=Alex \
--form lastName=Hollidaty \
--form email=ajhollid@gmail.com \
--form 'password=Testtest1!' \
--form 'role[]=admin'
Sample Response
{
"success": true,
"msg": "User created successfully",
"data": {
"user": {
"_id": "66a1425b873da2207443f192",
"firstName": "First Name",
"lastName": "Last Name",
"email": "name@gmail.com",
"isActive": true,
"isVerified": false,
"role": ["admin"],
"createdAt": "2024-07-24T18:05:15.852Z",
"updatedAt": "2024-07-24T18:05:15.852Z",
"__v": 0
},
"token": "<token>"
}
}
POST /api/v1/auth/login
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes stringValid email address password string
Response Payload
Type Notes User User data JWT JSON web token
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/login \
--header 'Authorization: Bearer undefined' \
--header 'Content-Type: application/json' \
--data '{
"email" : "name@gmail.com",
"password": "Testtest1!"
}'
Sample response
{
{
"success": true,
"msg": "User logged in successfully",
"data": {
"user": {
"_id": "66a1425b873da2207443f192",
"firstName": "First Name",
"lastName": "Last Name",
"email": "name@gmail.com",
"isActive": true,
"isVerified": false,
"role": ["admin"],
"createdAt": "2024-07-24T18:05:15.852Z",
"updatedAt": "2024-07-24T18:05:15.852Z",
"__v": 0
},
"token": "<token>"
}
}
}
POST/api/v1/auth/user/{userId}
Method/Headers
Method/Headers Value Method POST content-type multipart/form-data
Form
Name Type Notes firstName stringOptional lastName stringOptional profileIame fileOptional password stringRequired to change password newPassword stringRequired to change password
Response Payload
Type Notes UserReturns the updated user
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/user/66a1425b873da2207443f192 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: multipart/form-data' \
--form firstName=Test \
--form lastName=Test \
--form profileImage=@/home/user/Desktop/cat.jpg \
--form 'newPassword=Testtest1!' \
--form 'password=Testtest2!'
Sample Response
{
"success": true,
"msg": "User updated successfully",
"data": {
"_id": "66a1425b873da2207443f192",
"firstName": "First name",
"lastName": "Last name",
"email": "name@gmail.com",
"isActive": true,
"isVerified": false,
"role": ["admin"],
"createdAt": "2024-07-24T18:05:15.852Z",
"updatedAt": "2024-07-24T18:31:32.314Z",
"__v": 0,
"avatarImage": "<Base64 Image>"
}
}
GET/api/v1/auth/users
Method/Headers
Method/Headers Value Method GET content-type application/json
Response Payload
Type Notes Array<User>Returns an array containing all users
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/auth/users \
--header 'Authorization: <bearer_token>\
Sample Resonse
{
"success": true,
"msg": "Got all users",
"data": [
{
"_id": "669e90072d5663d25808bc7b",
"firstName": "First name",
"lastName": "Last name",
"email": "name@gmail.com",
"isActive": true,
"isVerified": false,
"role": ["admin"],
"createdAt": "2024-07-22T16:59:51.695Z",
"updatedAt": "2024-07-22T16:59:51.695Z",
"__v": 0
}
]
}
POST/api/v1/auth/recovery/request
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes stringUser's email
Response Payload
Type Notes RecoveryTokenReturns a recovery token if email found
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/request \
--header 'Content-Type: application/json' \
--data '{
"email" : "name@gmail.com"
}'
Sample Response
{
"success": true,
"msg": "Created recovery token",
"data": {
"email": "name@gmail.com",
"token": "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193",
"_id": "6668878263587f30748e968e",
"expiry": "2024-06-11T17:21:06.984Z",
"createdAt": "2024-06-11T17:21:06.985Z",
"updatedAt": "2024-06-11T17:21:06.985Z",
"__v": 0
}
}
POST/api/v1/auth/recovery/validate
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes recoveryToken stringToken issued in /recovery/request
Response Payload
Type Notes RecoveryTokenReturns the recovery token
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/validate \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193"
}'
Sample Response
{
"success": true,
"msg": "Token is valid",
"data": {
"_id": "6668894263587f30748e969a",
"email": "name@gmail.com",
"token": "457d9926b24dedf613f120eeb524ef00ac45b3f0fc5c70bd25b1cc8aa83a64a0",
"expiry": "2024-06-11T17:28:34.349Z",
"createdAt": "2024-06-11T17:28:34.349Z",
"updatedAt": "2024-06-11T17:28:34.349Z",
"__v": 0
}
}
POST/api/v1/auth/recovery/reset
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes recoveryToken stringToken issued returned by /recovery/validatepassword stringUser's new password`
Response Payload
Type Notes UserReturns the updated user
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/reset \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193",
"password": "testtest"
}'
Sample Response
{
"success": true,
"msg": "Password reset",
"data": {
"_id": "66675891cb17336d84c25d9f",
"firstname": "First Name",
"lastname": "Last Name",
"email": "name@gmail.com",
"isActive": true,
"isVerified": false,
"createdAt": "2024-06-10T19:48:33.863Z",
"updatedAt": "2024-06-11T17:21:22.289Z",
"__v": 0
}
}
Monitors
GET /api/v1/monitors
Method/Headers
Method/Headers Value Method GET content-type application/json
Response Payload
Type Notes Array<Monitor>Array of all monitors
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Monitors found",
"data": [
{
"_id": "664d070786e62625ac612ca1",
"userId": "6645079aae0b439371913972",
"name": "Wha3",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-21T20:41:43.051Z",
"updatedAt": "2024-05-21T20:45:10.496Z",
"__v": 0
},
{
"_id": "664e5ccf189c864800debc16",
"userId": "6645079aae0b439371913972",
"name": "Inserting a new Monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T20:59:59.295Z",
"__v": 0
}
]
}
GET /api/v1/monitor/{id}?status
Method/Headers
Method/Headers Value Method GET content-type application/json
Query Params
Name Type Required Notes status booleanOptional Check status limit numberOptional Number of checks to return sortOrder stringOptional desc:Newest -> Oldest,asc: Oldest -> Newest
Response Payload
Type Notes MonitorSingle monitor with the id in the request parameter
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors/664d070786e62625ac612ca1?status=true?limit=0 \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got monitor by Id successfully",
"data": {
"_id": "6671eb54f7040ece47892f53",
"userId": "666c9146c9bfa20db790b1df",
"name": "Google Monitor",
"description": "Google",
"type": "http",
"url": "https://www.google.com/404",
"isActive": true,
"interval": 10000,
"createdAt": "2024-06-18T20:17:24.112Z",
"updatedAt": "2024-06-18T20:17:24.112Z",
"__v": 0,
"checks": [
{
"_id": "6671eb5af7040ece47892f61",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 145,
"expiry": "2024-06-18T20:17:30.246Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:30.246Z",
"updatedAt": "2024-06-18T20:17:30.246Z",
"__v": 0
},
{
"_id": "6671eb64f7040ece47892f6b",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 170,
"expiry": "2024-06-18T20:17:40.209Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:40.210Z",
"updatedAt": "2024-06-18T20:17:40.210Z",
"__v": 0
}
]
}
}
GET /api/v1/monitors/user/{userId}?limit
Method/Headers
Method/Headers Value Method GET content-type application/json
Query Params
Name Type Required Notes status booleanOptional Check status type stringOptional Multiple allowed: http|ping|pagespeedlimit numberOptional Monitor status sortOrder stringOptional desc:Newest -> Oldest,asc: Oldest -> Newest
Response Payload
Type Notes Array<Monitor>Array of monitors created by user with specified UserID
Sample cURL Request
curl --request GET \
--url http://localhost:5000/api/v1/monitors/user/6645079aae0b439371913972?limit=25 \
--header '<bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got monitor for 666c9146c9bfa20db790b1df successfully\"",
"data": [
{
"_id": "6671eb54f7040ece47892f53",
"userId": "666c9146c9bfa20db790b1df",
"name": "Google Monitor",
"description": "Google",
"type": "http",
"url": "https://www.google.com/404",
"isActive": true,
"interval": 10000,
"createdAt": "2024-06-18T20:17:24.112Z",
"updatedAt": "2024-06-18T20:17:24.112Z",
"__v": 0,
"checks": [
{
"_id": "6671eb5af7040ece47892f61",
"monitorId": "6671eb54f7040ece47892f53",
"status": false,
"responseTime": 145,
"expiry": "2024-06-18T20:17:30.246Z",
"statusCode": 404,
"createdAt": "2024-06-18T20:17:30.246Z",
"updatedAt": "2024-06-18T20:17:30.246Z",
"__v": 0
}
]
}
]
}
POST/api/v1/monitors
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes Accepted Values userId stringUserId of current user name stringMonitor name description stringMonitor Description type stringValid email address "ping"|"http"|pagespeedurl stringURL of service or IP isActive booleaninterval numberIn ms
Response Payload
Type Notes MonitorReturns newly created Monitor
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors \
--header <bearer_token> \
--header 'Content-Type: application/json' \
--data '{
"userId": "66675891cb17336d84c25d9f",
"name": "Ping Google",
"description": "Google",
"type": "ping",
"url": "8.8.8.8",
"isActive": true,
"interval": 5000}'
Sample Response
{
"success": true,
"msg": "Monitor created",
"data": {
"userId": "6645079aae0b439371913972",
"name": "Inserting a new Monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"_id": "664e5ccf189c864800debc16",
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T20:59:59.295Z",
"__v": 0
}
}
POST/api/v1/monitors/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST content-type application/json
Response Payload
Type Notes None No payload returned
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors/delete/664e632a7a3ee9d620761938 \
--header '<bearer_token>' \
--header 'Content-Type: application/json' \
Sample Response
{
"success": true,
"msg": "Monitor deleted"
}
POST/api/v1/monitors/edit/{monitorId}
Method/Headers
Method/Headers Value Method POST content-type application/json
Body
Name Type Notes Accepted Values name stringMonitor name description stringMonitor Description interval numberIn ms
Response Payload
Type Notes MonitorReturns the updated monitor
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/monitors/edit/664e5ccf189c864800debc16 \
--header '<bearer_token' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Edited monitor",
"description": "Description",
"interval": 60000
}'
Sample Response
{
"success": true,
"msg": "Monitor edited",
"data": {
"_id": "664e5ccf189c864800debc16",
"userId": "6645079aae0b439371913972",
"name": "Edited monitor",
"description": "Description",
"url": "https://monitor0.com",
"isActive": true,
"interval": 60000,
"createdAt": "2024-05-22T20:59:59.295Z",
"updatedAt": "2024-05-22T21:34:33.893Z",
"__v": 0
}
}
Checks
POST/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes CheckReturns newly created check
Body
Name Type Notes monitorId stringMonitor associated with Check status booleantruefor up andfalsefor downresponseTime numberHow long it took the server to respond statusCode numberHTTP Status code of response message string
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good"
}'
Sample Response
{
"success": true,
"msg": "Check created",
"data": {
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"_id": "66576decba9f70148ea1f354",
"createdAt": "2024-05-29T18:03:24.445Z",
"updatedAt": "2024-05-29T18:03:24.445Z",
"__v": 0
}
}
GET/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Checks>Array of Checkobjects
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks retrieved",
"data": [
{
"_id": "66576c0194e11c0d4409d3c1",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:13.581Z",
"updatedAt": "2024-05-29T17:55:13.581Z",
"__v": 0
},
{
"_id": "66576c0994e11c0d4409d3c5",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 2,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:21.127Z",
"updatedAt": "2024-05-29T17:55:21.127Z",
"__v": 0
}
]
}
POST/api/v1/checks/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes Object{deletedCount: n}Returns an object showing how many items deleted
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
Alerts
POST/api/v1/alerts/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns newly created Alert
Body
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": "false",
"acknowledgeStatus": false
Name Type Notes checkId stringId of Checkassociated withAlertmonitorId stringId of Monitorassociated withAlertuserId stringId of Userassociated withAlertstatus booleanStatus of Alertmessage stringAlertmessagenotifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
Sample Response
GET/api/v1/alerts/user/{userId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns all Alertcreated by aUser
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
Sample Response
{
"success": true,
"msg": "Got alerts",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/monitor/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns an array of Alertbelonging to a specifiedMonitor
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got alerts by Monitor",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/{alertId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes AlertReturns specified Alert
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got Alert By alertID",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:11:22.205Z",
"__v": 0
}
}
POST/api/v1/alerts/edit/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns edited Alert
Body
Name Type Notes checkId stringID of Checkassociated withAlertmonitorId stringID of Monitorid associated withAlertuserId stringID of Userassociated withAlertstatus booleanAlert status message stringAlert message notifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
Sample Response
{
"success": true,
"msg": "Edited alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
POST/api/v1/alerts/delete/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns the deleted Alert
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Deleted alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
Checks
POST/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes CheckReturns newly created check
Body
Name Type Notes monitorId stringMonitor associated with Check status booleantruefor up andfalsefor downresponseTime numberHow long it took the server to respond statusCode numberHTTP Status code of response message string
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good"
}'
Sample Response
{
"success": true,
"msg": "Check created",
"data": {
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"_id": "66576decba9f70148ea1f354",
"createdAt": "2024-05-29T18:03:24.445Z",
"updatedAt": "2024-05-29T18:03:24.445Z",
"__v": 0
}
}
GET/api/v1/checks/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Checks>Array of Checkobjects
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks retrieved",
"data": [
{
"_id": "66576c0194e11c0d4409d3c1",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 1,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:13.581Z",
"updatedAt": "2024-05-29T17:55:13.581Z",
"__v": 0
},
{
"_id": "66576c0994e11c0d4409d3c5",
"monitorId": "66562414035c4ce6a8a610ac",
"status": true,
"responseTime": 2,
"statusCode": 200,
"message": "good",
"createdAt": "2024-05-29T17:55:21.127Z",
"updatedAt": "2024-05-29T17:55:21.127Z",
"__v": 0
}
]
}
POST/api/v1/checks/delete/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes Object{deletedCount: n}Returns an object showing how many items deleted
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
Alerts
POST/api/v1/alerts/{monitorId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns newly created Alert
Body
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": "false",
"acknowledgeStatus": false
Name Type Notes checkId stringId of Checkassociated withAlertmonitorId stringId of Monitorassociated withAlertuserId stringId of Userassociated withAlertstatus booleanStatus of Alertmessage stringAlertmessagenotifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
Sample Response
GET/api/v1/alerts/user/{userId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns all Alertcreated by aUser
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
Sample Response
{
"success": true,
"msg": "Got alerts",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/monitor/{monitorId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes Array<Alert>Returns an array of Alertbelonging to a specifiedMonitor
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got alerts by Monitor",
"data": [
{
"_id": "6657813d809adfded891a6b7",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:25:49.317Z",
"updatedAt": "2024-05-29T19:25:49.317Z",
"__v": 0
}
]
}
GET/api/v1/alerts/{alertId}
Method/Headers
Method/Headers Value Method GET
Response Payload
Type Notes AlertReturns specified Alert
Sample CURL request
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Got Alert By alertID",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": false,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:11:22.205Z",
"__v": 0
}
}
POST/api/v1/alerts/edit/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns edited Alert
Body
Name Type Notes checkId stringID of Checkassociated withAlertmonitorId stringID of Monitorid associated withAlertuserId stringID of Userassociated withAlertstatus booleanAlert status message stringAlert message notifiedStatus booleanacknowledgeStatus boolean
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
Sample Response
{
"success": true,
"msg": "Edited alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
POST/api/v1/alerts/delete/{alertId}
Method/Headers
Method/Headers Value Method POST
Response Payload
Type Notes AlertReturns the deleted Alert
Sample CURL request
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
Sample Response
{
"success": true,
"msg": "Deleted alert",
"data": {
"_id": "66577ddae5ff3c91437d0887",
"checkId": "66577a3fd16dcf7c1ce35148",
"monitorId": "6657789ebf6766ee8e2d2edb",
"userId": "6654d1a2634754f789e1f115",
"status": false,
"message": "This is a test alert",
"notifiedStatus": false,
"acknowledgeStatus": true,
"createdAt": "2024-05-29T19:11:22.205Z",
"updatedAt": "2024-05-29T19:12:23.951Z",
"__v": 0
}
}
Error handling
Errors are returned in a standard format:
{"success": false, "msg": "No token provided"}
Errors are handled by error handling middleware and should be thrown with the following parameters
| Name | Type | Default | Notes |
|---|---|---|---|
| status | integer |
500 | Standard HTTP codes |
| message | string |
"Something went wrong" | An error message |
| service | string |
"Unknown Service" | Name of service that threw the error |
Example:
const myRoute = async(req, res, next) => {
try{
const result = myRiskyOperationHere();
}
catch(error){
error.status = 404
error.message = "Resource not found"
error.service = service name
next(error)
return;
}
}
Errors should not be handled at the controller level and should be left to the middleware to handle.