diff --git a/.zuul.yaml b/.zuul.yaml index 3c8a682..a39514d 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -26,6 +26,7 @@ devstack_services: prometheus: true node_exporter: true + podman_exporter: true zuul_copy_output: /etc/prometheus/prometheus.yml: logs diff --git a/devstack/files/prometheus.yml b/devstack/files/prometheus.yml index d4d5252..ad516d3 100644 --- a/devstack/files/prometheus.yml +++ b/devstack/files/prometheus.yml @@ -4,6 +4,7 @@ global: scrape_configs: - job_name: "node" static_configs: + - targets: ["localhost:9882"] - targets: ["localhost:9100"] # node_exporter target # labels: # fqdn: "controller" # node_exporter fqdn diff --git a/devstack/lib/podman_exporter b/devstack/lib/podman_exporter new file mode 100644 index 0000000..d9e5700 --- /dev/null +++ b/devstack/lib/podman_exporter @@ -0,0 +1,82 @@ +# lib/podman_exporter +# Functions to control the installation and configuration of podman_exporter + +# Save trace setting +_XTRACE_PODMAN_EXPORTER=$(set +o | grep xtrace) +set +o xtrace + +PODMAN_EXPORTER_BINARY="/usr/local/bin/prometheus-podman-exporter" +PODMAN_EXPORTER_SYSTEMD_SERVICE="devstack@podman-exporter.service" +PODMAN_EXPORTER_PORT=${PODMAN_EXPORTER_PORT:-9882} +PE_REPO=${PE_REPO:-https://github.com/containers/prometheus-podman-exporter.git} +PE_REPO_NAME=${PE_REPO_NAME:-prometheus-podman-exporter} + +function pre_install_podman_exporter { + # Install OS packages + install_package libgpgme-dev libassuan-dev libbtrfs-dev libdevmapper-dev pkg-config build-essential golang podman uidmap netavark +} + +function install_podman_exporter { + + # Clone prometheus-podman-exporter + PE_DIR=$DEST/$PE_REPO_NAME + git_timed clone $PE_REPO $PE_DIR + + # Generate Binary + cd $PE_DIR + make binary + + # Move binaries to /usr/local/bin + sudo mv $PE_DIR/bin/prometheus-podman-exporter /usr/local/bin/ + + # Set ownership + sudo chown $(whoami):$(whoami) ${NODE_EXPORTER_BINARY} +} + +function init_podman_exporter { + + podman_exporter_cmd=${PODMAN_EXPORTER_BINARY} + podman_exporter_cmd+=" --collector.enable-all" + + write_user_unit_file $PODMAN_EXPORTER_SYSTEMD_SERVICE "$podman_exporter_cmd" "" "$STACK_USER" + + enable_service $PODMAN_EXPORTER_SYSTEMD_SERVICE +} + +function start_podman_exporter { + start_service $PODMAN_EXPORTER_SYSTEMD_SERVICE +} + +function stop_podman_exporter { + stop_service $PODMAN_EXPORTER_SYSTEMD_SERVICE +} + +function cleanup_podman_exporter { + stop_podman_exporter + disable_service $PODMAN_EXPORTER_SYSTEMD_SERVICE + + # Remove systemd unit files + local unitfile="$SYSTEMD_DIR/$PODMAN_EXPORTER_SYSTEMD_SERVICE" + sudo rm -f $unitfile + $SYSTEMCTL daemon-reload + + # Remove Node Exporter binaries + sudo rm -rf $PODMAN_EXPORTER_BINARY +} + +function wait_for_podman_data { + # Adding sleep time so that metrics is pushed by podman exporter + sleep 60 +} + +function check_data_podman_exporter { + if curl -s --head --request GET "http://$HOST_IP:$PODMAN_EXPORTER_PORT/metrics" | grep "200 OK" > /dev/null; then + echo "#### Metrics data ####" + curl "http://$HOST_IP:$PODMAN_EXPORTER_PORT/metrics" + else + die $LINENO "Couldn't get data from podman_exporter" + fi +} + +# Restore xtrace +$_XTRACE_PODMAN_EXPORTER diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 5377c50..4fba25c 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -7,6 +7,7 @@ set -o xtrace echo_summary "devstack-plugin-prometheus's plugin.sh was called..." . $DEST/devstack-plugin-prometheus/devstack/lib/prometheus . $DEST/devstack-plugin-prometheus/devstack/lib/node_exporter +. $DEST/devstack-plugin-prometheus/devstack/lib/podman_exporter # Show all of defined environment variables (set -o posix; set) @@ -98,3 +99,48 @@ if is_service_enabled node_exporter; then cleanup_node_exporter fi fi + +## Podman Exporter +if is_service_enabled podman_exporter; then + if [[ "$1" == "source" ]]; then + # Initial source of lib script + source $(dirname "$0")/lib/podman_exporter + fi + + if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then + # Set up system services + echo_summary "Configuring system services podman exporter" + pre_install_podman_exporter + + elif [[ "$1" == "stack" && "$2" == "install" ]]; then + # Perform installation of service source + echo_summary "Installing podman exporter" + install_podman_exporter + + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + # Configure after the other layer 1 and 2 services have been configured + echo_summary "Configuring podman_exporter" + init_podman_exporter + echo_summary "Starting podman exporter service" + start_podman_exporter + echo_summary "Give time to podman_exporter to push metrics" + wait_for_podman_data + check_data_podman_exporter + fi + + if [[ "$1" == "unstack" ]]; then + # Shut down podman exporter services + # no-op + echo_summary "Stoping podman_exporter service" + stop_podman_exporter + + fi + + if [[ "$1" == "clean" ]]; then + # Remove state and transient data + # Remember clean.sh first calls unstack.sh + # no-op + echo_summary "Cleaning podman exporter service" + cleanup_podman_exporter + fi +fi diff --git a/devstack/settings b/devstack/settings index 766dcc0..ef702b2 100644 --- a/devstack/settings +++ b/devstack/settings @@ -1,5 +1,5 @@ # DevStack settings -define_plugin prometheus node_exporter +define_plugin prometheus node_exporter podman_exporter enable_service prometheus enable_service node_exporter