Basic monitoring with curl and jenkins/gitlab
So you just finished your super webapp/api and it’s already going live. I’ll show you a simple way to add a basic monitoring on your server without adding a new dedicated app to do the task, using only your CI/CD
The scripts
Say you want to check if your app responds with an HTTP 200. The following command will exit with error if so:
curl — silent — show-error — fail https://my-webapp.fr/
If you want to verify that a specific endpoint respond with a json object containing a predefined number of elements. We’re using jq:
#/bin/shnbElements=$(curl https://my-webapp.fr/api/endpoint | jq length)echo $nbElementsif [ $nbElements -eq 2 ]; thenecho "No errors, the list of nbElements is 2 as expected"exit 0;elseecho "Oops, something went wrong, nbElements should have 2 elements and only $nbElements were received..."exit 1;fi
Monitor with Jenkins
Using Jenkins you can create a specific job that you will configure to run every (minute/5 minutes.. you decide)
And simply add new build steps with the commands you want to execute:
Specify a way of being notified if one of the scripts fail, email, slack etc.. and you’re done with this simple solution to monitor your service is up and running.
Seeing it fails…
You should never have faith in a test you haven’t seen fail…
So playing with my server I received the following mail when the test began to exit 1
+ curl https://mywebpp.fr/api/endpoint+ jq length% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 568 100 568 0 0 10281 0 --:--:-- --:--:-- --:--:-- 10327+ nbElement=1+ echo 11+ [ 2 -eq 10 ]+ echo Oops, something went wrong, nbElement should have 2 elements and only 1 were received...Oops, something went wrong, urbanAreas should have 2 elements and only 1 were received...+ exit 1Build step 'Exécuter un script shell' marked build as failure
Monitor with Gitlab
You will be using the Scheduled Pipelines of Gitlab:
You need to add a specific stage for your monitoring tasks and exclude the other stages from being executed by the scheduled task
stages:- test- release- monitoringtest:stage: testexcept:- schedulesscript:- mvn testrelease:stage: releaseexcept:- schedulesscript:- docker build --pull -t $PROJECT_RELEASE_IMAGE node/- docker push $PROJECT_RELEASE_IMAGEmonitoring:stage: monitoringonly:- schedulesscript:- curl - silent - show-error - fail https://my-webapp.fr/- chmod +x /root/scripts/monitoring.sh- ./sh /root/scripts/monitoring.sh
The downside of this last solution is that it will pollute your pipelines..
See you on twitter: m4nu56