S7IE03
First final project of Internet Engineering Course.
Building a Http Endpoint Monitoring service with Golang and Mongodb.
Implementing a Restful API to monitor users endpoints.
Run application
The application is build with Golang Cobra library. In order to run the application
you need to build it first with the following command.
go build -o main
Output of the above command is a main
file which is executable.
Execute the file with following commands:
chmod +x ./main
./main
Configs
Configs will be read from config.yml
file by Golang Koanf library.
To set your configs, copy the example file, cp config.example.yml config.yml
.
# http service port
http_port: 8080
# failed requests' threshold for each endpoint
threshold: 20
# maximum endpoints that each user can create
user_endpoints: 20
# jwt authentication configs
jwt:
private_key: "mysupersecretkey"
expire_time: 30
# mongodb cluster configs
mongodb:
database: "policeman"
host: "localhost"
port: 27017
# worker options
worker:
timeout: 2 # seconds
workers: 5
HTTP
To run the HTTP server (which is implemented by Golang Fiber framework), use the
following command:
./main http
This command will start http server on localhost:[http_port]
.
Worker
Inorder to run the worker that monitors the endpoints, use the following command:
./main worker
Database
This application uses MongoDB for its database.
Models
User
type User struct {
Username string `bson:"username"`
Password string `bson:"password"`
}
Endpoint
type Endpoint struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
Username string `bson:"username"`
Url string `bson:"url"`
Threshold int `bson:"threshold"`
FailedTimes int `bson:"failedTimes"`
CreateTime time.Time `json:"create_time"`
}
Request
type Request struct {
EndpointId string `bson:"endpoint_id"`
Code int `bson:"result"`
CreateTime time.Time `bson:"create_time"`
}
HTTP requests
User
Register
curl --request POST \
--url http://localhost:8080/api/register \
--header 'Content-Type: application/json' \
--data '{
"username": "amirhossein",
"password": "amirhossein"
}'
OK
Login
curl --request POST \
--url http://localhost:8080/api/login \
--header 'Content-Type: application/json' \
--data '{
"username": "amirhossein",
"password": "amirhossein"
}'
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjY5NDEsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.12pVs9ncLM4EfaHH4GkEoi44Zz4x6aqTc0T17XBFBiE",
"expires": "2022-12-29T02:05:41.848018+03:30"
}
Endpoint
Register
curl --request POST \
--url http://localhost:8080/api/endpoints \
--header 'Content-Type: application/json' \
--header 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjUwODMsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.VS3XydzeLovP7DLfVrn9B4fkDv0PnZuuzPlY2JNFOVc' \
--data '{
"address": "https://bale.ai"
}'
63acbac72a7a235b16a5e228
Get endpoints
curl --request GET \
--url http://localhost:8080/api/endpoints \
--header 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjY5NDEsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.12pVs9ncLM4EfaHH4GkEoi44Zz4x6aqTc0T17XBFBiE'
[
{
"id": "63acbac72a7a235b16a5e228",
"address": "https://bale.ai",
"created_at": "2022-12-28T21:53:11.199Z"
}
]
Get requests of endpoint
curl --request GET \
--url http://localhost:8080/api/endpoint/63acbac72a7a235b16a5e228 \
--header 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjY5NDEsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.12pVs9ncLM4EfaHH4GkEoi44Zz4x6aqTc0T17XBFBiE'
[
{
"status": 504,
"time": "2022-12-28T22:14:33.035Z"
},
{
"status": 200,
"time": "2022-12-28T22:14:33.035Z"
}
]
Get endpoint alerts
curl --request GET \
--url http://localhost:8080/api/endpoint/63acba882a7a235b16a5e227/alerts \
--header 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjY5NDEsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.12pVs9ncLM4EfaHH4GkEoi44Zz4x6aqTc0T17XBFBiE'
{
"address": "http://snapp.ir",
"message": "this endpoint is fine."
}
Remove endpoint
curl --request DELETE \
--url http://localhost:8080/api/endpoint/000000000000000000000000 \
--header 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzIyNjY5NDEsInBhc3N3b3JkIjoiJDJhJDEwJHlIQ3cueDQvU0M0N3BOTjhIY3VmS084M3A4eWpiNXhqVkJyZnYzVldDMm9hV0NmQjdVZXZ1IiwidXNlcm5hbWUiOiJhbWlyaG9zc2VpbiJ9.12pVs9ncLM4EfaHH4GkEoi44Zz4x6aqTc0T17XBFBiE'
Docker
Use docker-compose to run everything on docker.
docker compose up -d