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.
- 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
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:
- Clone this repository to your local machine
- Quickstart for Developers
- Docker Compose
- Installation (Client)
- Configuration(Client)
- Getting Started (Server)
- Endpoints
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
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
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}
- Error Handling
- Contributors
MAKE SURE YOU CD TO THE SPECIFIED DIRECTORIES AS PATHS IN COMMANDS ARE RELATIVE
- Clone this repository
- Checkout the
develop
branchgit checkout develop
- 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
- 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
- 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
- Client is running at
localhost:5173
- Server is running at
localhost:5000
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
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://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.
- Change directory to the
Client
directory - Install all dependencies by running
npm install
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" | |
- Run
npm run dev
to start the development server.
- Change directory to the
Server
directory - Install all dependencies by running
npm install
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 |
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.
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
- run
npm run dev
to start the development server
OR
- run
node index.js
to start server
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}}
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 |
POST
/api/v1/auth/register
Method/Headers Value Method POST content-type multipart/form-data
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
Type Notes User User data JWT JSON web token
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 protected] \
--form 'password=Testtest1!' \
--form 'role[]=admin'
{
"success": true,
"msg": "User created successfully",
"data": {
"user": {
"_id": "66a1425b873da2207443f192",
"firstName": "First Name",
"lastName": "Last Name",
"email": "[email protected]",
"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 Value Method POST content-type application/json
Name Type Notes string
Valid email address password string
Type Notes User User data JWT JSON web token
curl --request POST \
--url http://localhost:5000/api/v1/auth/login \
--header 'Authorization: Bearer undefined' \
--header 'Content-Type: application/json' \
--data '{
"email" : "[email protected]",
"password": "Testtest1!"
}'
{
{
"success": true,
"msg": "User logged in successfully",
"data": {
"user": {
"_id": "66a1425b873da2207443f192",
"firstName": "First Name",
"lastName": "Last Name",
"email": "[email protected]",
"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 Value Method POST content-type multipart/form-data
Name Type Notes firstName string
Optional lastName string
Optional profileIame file
Optional password string
Required to change password newPassword string
Required to change password
Type Notes User
Returns the updated user
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!'
{
"success": true,
"msg": "User updated successfully",
"data": {
"_id": "66a1425b873da2207443f192",
"firstName": "First name",
"lastName": "Last name",
"email": "[email protected]",
"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 Value Method GET content-type application/json
Type Notes Array<User>
Returns an array containing all users
curl --request GET \
--url http://localhost:5000/api/v1/auth/users \
--header 'Authorization: <bearer_token>\
{
"success": true,
"msg": "Got all users",
"data": [
{
"_id": "669e90072d5663d25808bc7b",
"firstName": "First name",
"lastName": "Last name",
"email": "[email protected]",
"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 Value Method POST content-type application/json
Name Type Notes string
User's email
Type Notes RecoveryToken
Returns a recovery token if email found
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/request \
--header 'Content-Type: application/json' \
--data '{
"email" : "[email protected]"
}'
{
"success": true,
"msg": "Created recovery token",
"data": {
"email": "[email protected]",
"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 Value Method POST content-type application/json
Name Type Notes recoveryToken string
Token issued in /recovery/request
Type Notes RecoveryToken
Returns the recovery token
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/validate \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193"
}'
{
"success": true,
"msg": "Token is valid",
"data": {
"_id": "6668894263587f30748e969a",
"email": "[email protected]",
"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 Value Method POST content-type application/json
Name Type Notes recoveryToken string
Token issued returned by /recovery/validate
password string
User's new password`
Type Notes User
Returns the updated user
curl --request POST \
--url http://localhost:5000/api/v1/auth/recovery/reset \
--header 'Content-Type: application/json' \
--data '{
"recoveryToken" : "f519da5e4a9be40cfc3c0fde97e60c0e6d17bdaa613f5ba537a45073f3865193",
"password": "testtest"
}'
{
"success": true,
"msg": "Password reset",
"data": {
"_id": "66675891cb17336d84c25d9f",
"firstname": "First Name",
"lastname": "Last Name",
"email": "[email protected]",
"isActive": true,
"isVerified": false,
"createdAt": "2024-06-10T19:48:33.863Z",
"updatedAt": "2024-06-11T17:21:22.289Z",
"__v": 0
}
}
GET
/api/v1/monitors
Method/Headers Value Method GET content-type application/json
Type Notes Array<Monitor>
Array of all monitors
curl --request GET \
--url http://localhost:5000/api/v1/monitors \
--header '<bearer_token>' \
{
"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 Value Method GET content-type application/json
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
Type Notes Monitor
Single monitor with the id in the request parameter
curl --request GET \
--url http://localhost:5000/api/v1/monitors/664d070786e62625ac612ca1?status=true?limit=0 \
--header '<bearer_token>' \
{
"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 Value Method GET content-type application/json
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
Type Notes Array<Monitor>
Array of monitors created by user with specified UserID
curl --request GET \
--url http://localhost:5000/api/v1/monitors/user/6645079aae0b439371913972?limit=25 \
--header '<bearer_token>' \
{
"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 Value Method POST content-type application/json
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
Type Notes Monitor
Returns newly created Monitor
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}'
{
"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 Value Method POST content-type application/json
Type Notes None No payload returned
curl --request POST \
--url http://localhost:5000/api/v1/monitors/delete/664e632a7a3ee9d620761938 \
--header '<bearer_token>' \
--header 'Content-Type: application/json' \
{
"success": true,
"msg": "Monitor deleted"
}
POST
/api/v1/monitors/edit/{monitorId}
Method/Headers Value Method POST content-type application/json
Name Type Notes Accepted Values name string
Monitor name description string
Monitor Description interval number
In ms
Type Notes Monitor
Returns the updated monitor
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
}'
{
"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
}
}
POST
/api/v1/checks/{monitorId}
Method/Headers Value Method POST
Type Notes Check
Returns newly created check
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
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"
}'
{
"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 Value Method GET
Type Notes Array<Checks>
Array of Check
objects
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method POST
Type Notes Object
{deletedCount: n}
Returns an object showing how many items deleted
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
POST
/api/v1/alerts/{monitorId}
Method/Headers Value Method POST
Type Notes Alert
Returns newly created Alert
"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
GET
/api/v1/alerts/user/{userId}
Method/Headers Value Method GET
Type Notes Array<Alert>
Returns all Alert
created by aUser
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
{
"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 Value Method GET
Type Notes Array<Alert>
Returns an array of Alert
belonging to a specifiedMonitor
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method GET
Type Notes Alert
Returns specified Alert
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method POST
Type Notes Alert
Returns edited Alert
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
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
{
"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 Value Method POST
Type Notes Alert
Returns the deleted Alert
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
{
"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
}
}
POST
/api/v1/checks/{monitorId}
Method/Headers Value Method POST
Type Notes Check
Returns newly created check
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
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"
}'
{
"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 Value Method GET
Type Notes Array<Checks>
Array of Check
objects
curl --request GET \
--url http://localhost:5000/api/v1/checks/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method POST
Type Notes Object
{deletedCount: n}
Returns an object showing how many items deleted
curl --request POST \
--url http://localhost:5000/api/v1/checks/delete/66562414035c4ce6a8a610ac \
--header 'Authorization: <bearer_token>' \
{
"success": true,
"msg": "Checks deleted",
"data": {
"deletedCount": 3
}
}
POST
/api/v1/alerts/{monitorId}
Method/Headers Value Method POST
Type Notes Alert
Returns newly created Alert
"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
GET
/api/v1/alerts/user/{userId}
Method/Headers Value Method GET
Type Notes Array<Alert>
Returns all Alert
created by aUser
curl --request GET \
--url http://localhost:5000/api/v1/alerts/user/6654d1a2634754f789e1f115 \
--header 'Authorization: <bearer_token>'
{
"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 Value Method GET
Type Notes Array<Alert>
Returns an array of Alert
belonging to a specifiedMonitor
curl --request GET \
--url http://localhost:5000/api/v1/alerts/monitor/6657789ebf6766ee8e2d2edb \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method GET
Type Notes Alert
Returns specified Alert
curl --request GET \
--url http://localhost:5000/api/v1/alerts/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
{
"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 Value Method POST
Type Notes Alert
Returns edited Alert
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
curl --request POST \
--url http://localhost:5000/api/v1/alerts/edit/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
--header 'Content-Type: application/json' \
--data '{
"acknowledgeStatus": true
}'
{
"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 Value Method POST
Type Notes Alert
Returns the deleted Alert
curl --request POST \
--url http://localhost:5000/api/v1/alerts/delete/66577ddae5ff3c91437d0887 \
--header 'Authorization: <bearer_token>' \
{
"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
}
}
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.