BlueWave Uptime
An open source server monitoring application
(yes, we have a light theme as well, but this looks better on readme.md)
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.
Demo
See BlueWave Uptime in action. The username is uptimedemo@demo.com and the password is Demouser1!
Features
- Completely open source, deployable on your servers
- Website monitoring
- Port monitoring
- Ping monitoring
- Incidents at a glance
- Page speed monitoring
- E-mail notifications
- Scheduled maintenance (in the works)
Roadmap (short term):
- Memory, disk and CPU monitoring
- 3rd party integrations
- DNS monitoring
- SSL monitoring
Roadmap (long term):
- Status pages
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.
Also check other developer and contributor-friendly projects of BlueWave:
Getting Started
- Clone this repository to your local machine
- Quickstart for Users
- Quickstart for Developers
- Docker Compose
- 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
Quickstart for Users
- Download our Docker Compose File
- Download our Quickstart script
- Place these files in a directory of your choice
- Run
quickstart.sh
and generate config files - Run
docker compose up
to start the application - Application is running at
http://localhost
Quickstart for Developers
MAKE SURE YOU CD TO THE SPECIFIED DIRECTORIES AS PATHS IN COMMANDS ARE RELATIVE
Cloning and Initial Setup
- Clone this repository
- Checkout the
develop
branchgit checkout develop
Docker Images Setup
- CD to the
Docker
directory - Run
docker run -d -p 6379:6379 -v $(pwd)/redis/data:/data --name uptime_redis uptime_redis
- Run
docker run -d -p 27017:27017 -v $(pwd)/mongo/data:/data/db --name uptime_database_mongo uptime_database_mongo
Server Setup
- CD to
Server
directory, runnpm install
- While in
Server
directory, create a.env
file with the required environmental variables - While in the
Server
directory, runnpm run dev
Client Setup
- CD to
Client
directoryrun npm install
- While in the
Client
directory, create a.env
file with the required environmental variables - While in the
Client
cirectory runnpm run dev
Access Application
- Client is running at
localhost:5173
- Server is running at
localhost:5000
Docker Compose
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
Docker
directory run the build scriptbuild_images.sh
to build docker images for the client, server, Redis database, and MongoDB database. -
In the
Dokcer
directory create amongo.env
file with a username and password:
USERNAME_ENV_VAR=user
PASSWORD_ENV_VAR=password
- In the
Docker
directory, create aserver.env
file 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://<username>:<password>@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
Client
directory, create aclient.env
file with the required environtmental variables for the client. Sample file:
VITE_APP_API_BASE_URL="http://localhost:5000/api/v1"
VITE_APP_API_LOG_LEVEL="debug"
- In the
Docker
directory rundocker compose up
to run thedocker-compose.yaml
file and start all four images.
That's it, the application is ready to use on port 80.
Client
Installation
- Change directory to the
Client
directory - 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 |
VITE_APP_LOG_LEVEL | Optional | string |
Log level | "none" |"error" | "warn" | |
VITE_APP_DEMO | Optional | boolean |
Demo server or not | true |false | |
Starting Development Server
- Run
npm run dev
to start the development server.
Getting Started (Server)
Manual Install
Install Server
- Change directory to the
Server
directory - 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 dev
to start the development server
OR
- run
node index.js
to 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 string
lastName string
string
Valid email address password string
Min 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 string
Valid 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 string
Optional lastName string
Optional profileIame file
Optional password string
Required to change password newPassword string
Required to change password
Response Payload
Type Notes User
Returns 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 string
User's email
Response Payload
Type Notes RecoveryToken
Returns 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 string
Token issued in /recovery/request
Response Payload
Type Notes RecoveryToken
Returns 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 string
Token issued returned by /recovery/validate
password string
User's new password`
Response Payload
Type Notes User
Returns 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 boolean
Optional Check status limit number
Optional Number of checks to return sortOrder string
Optional desc
:Newest -> Oldest,asc
: Oldest -> Newest
Response Payload
Type Notes Monitor
Single 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 boolean
Optional Check status type string
Optional Multiple allowed: http
|ping
|pagespeed
limit number
Optional Monitor status sortOrder string
Optional 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 string
UserId of current user name string
Monitor name description string
Monitor Description type string
Valid email address "ping"
|"http"
|pagespeed
url string
URL of service or IP isActive boolean
interval number
In ms
Response Payload
Type Notes Monitor
Returns 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 string
Monitor name description string
Monitor Description interval number
In ms
Response Payload
Type Notes Monitor
Returns 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 Check
Returns newly created check
Body
Name Type Notes monitorId string
Monitor associated with Check status boolean
true
for up andfalse
for downresponseTime number
How long it took the server to respond statusCode number
HTTP 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 Check
objects
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 Alert
Returns 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 string
Id of Check
associated withAlert
monitorId string
Id of Monitor
associated withAlert
userId string
Id of User
associated withAlert
status boolean
Status of Alert
message string
Alert
messagenotifiedStatus boolean
acknowledgeStatus 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 Alert
created 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 Alert
belonging 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 Alert
Returns 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 Alert
Returns edited Alert
Body
Name Type Notes checkId string
ID of Check
associated withAlert
monitorId string
ID of Monitor
id associated withAlert
userId string
ID of User
associated withAlert
status boolean
Alert status message string
Alert message notifiedStatus boolean
acknowledgeStatus 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 Alert
Returns 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 Check
Returns newly created check
Body
Name Type Notes monitorId string
Monitor associated with Check status boolean
true
for up andfalse
for downresponseTime number
How long it took the server to respond statusCode number
HTTP 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 Check
objects
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 Alert
Returns 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 string
Id of Check
associated withAlert
monitorId string
Id of Monitor
associated withAlert
userId string
Id of User
associated withAlert
status boolean
Status of Alert
message string
Alert
messagenotifiedStatus boolean
acknowledgeStatus 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 Alert
created 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 Alert
belonging 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 Alert
Returns 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 Alert
Returns edited Alert
Body
Name Type Notes checkId string
ID of Check
associated withAlert
monitorId string
ID of Monitor
id associated withAlert
userId string
ID of User
associated withAlert
status boolean
Alert status message string
Alert message notifiedStatus boolean
acknowledgeStatus 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 Alert
Returns 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.