This repository contains demo configuration for monitoring a typical web service and a standalone script with the Elastic Stack.
Generate certificates for the services using elasticsearch-certutil
:
docker compose --file certificates-create.yml up
NOTE: On Linux, change the permissions with
sudo chown -R $USER certificates
.
Verify that the certificates have been succesfully created:
ls -la ./certificates
Launch the services with Docker Compose:
docker compose up --remove-orphans --detach
NOTE: To bind Nginx on standard ports, export the corresponding environment variables:
NGINX_HTTP_PORT=80 NGINX_HTTPS_PORT=443 docker compose up --remove-orphans --detach
.
NOTE: When you change the source in
app.py
(orscript.py
), rebuild it withdocker compose up app --build --force-recreate --detach app
.
Wait until Elasticsearch is running, and set the password for Kibana:
until docker inspect demo-elasticsearch-1 > /dev/null 2>&1 && [[ $(docker inspect -f '{{ .State.Health.Status }}' demo-elasticsearch-1) == "healthy" ]]; do echo -n '.'; sleep 1; done; source .env
docker exec -it demo-elasticsearch-1 curl -s -X POST --cacert /usr/share/elasticsearch/config/certificates/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://localhost:9200/_security/user/kibana_system/_password -d "{\"password\":\"${ELASTIC_PASSWORD}\"}"
Navigate to the "APM" Kibana page at https://localhost:5601/app/apm/services, logging in as elastic:elastic
.
Drive some traffic to the application (it will randomly fail 5% requests and simulate latency for 10% of requests):
for i in `seq 1 100`; do curl -k -s 'https://localhost:4430'; echo; done
Alternatively, use a tool like siege
, wrk
or hey
:
siege --time=15s --verbose https://localhost:4430
wrk --duration 15s --latency https://localhost:4430
hey -z 15s https://localhost:4430
To access the services locally, pass the certificate authority to your client:
curl -i --cacert certificates/ca/ca.crt https://localhost:4430
import requests
r = requests.get('https://localhost:4430', verify='certificates/ca/ca.crt')
print(r.text)
NOTE: On Mac OS X, you may need to add the certificate to the Keychain with
security add-trusted-cert -p ssl certificates/ca/ca.crt
. To remove it, runsecurity remove-trusted-cert certificates/ca/ca.crt
.
NOTE: To allow accessing the services in Google Chrome, enable the
chrome://flags/#allow-insecure-localhost
setting.
To inspect the status of the services:
docker compose ps
To inspect the log output of the services, eg. Elasticsearch:
docker compose logs -f elasticsearch
To remove the containers, run:
docker compose down --volumes --remove-orphans