diff --git a/.zuul.yaml b/.zuul.yaml index 0046dac..0928dfb 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -5,10 +5,12 @@ - watcher-prometheus-integration - devstack-prometheus - devstack-prometheus-custom-target + - devstack-prometheus-openstack-exporter gate: jobs: - openstack-tox-linters - devstack-prometheus + - devstack-prometheus-openstack-exporter - job: name: devstack-prometheus-base @@ -28,6 +30,7 @@ prometheus: true node_exporter: true podman_exporter: true + openstack_exporter: false zuul_copy_output: /etc/prometheus/prometheus.yml: logs @@ -52,6 +55,33 @@ devstack_services: prometheus: true node_exporter: true + openstack_exporter: false devstack_localrc: # custom target PROMETHEUS_CUSTOM_SCRAPE_TARGETS: "localhost:9090,localhost:9100" + +- job: + #NOTE(mattcrees): Maintained for the CloudKitty project. + # #cloudkitty on IRC. + name: devstack-prometheus-openstack-exporter + nodeset: openstack-single-node-noble + parent: devstack + description: | + A DevStack job to install and configure prometheus, openstack services and + openstack exporter service. + required-projects: + - opendev.org/openstack/devstack-plugin-prometheus + - opendev.org/openstack/requirements + vars: + devstack_plugins: + devstack-plugin-prometheus: https://opendev.org/openstack/devstack-plugin-prometheus + devstack_services: + prometheus: true + node_exporter: false + podman_exporter: false + openstack_exporter: true + zuul_copy_output: + /etc/prometheus/prometheus.yml: logs + devstack_localrc: + # custom target + PROMETHEUS_CUSTOM_SCRAPE_TARGETS: "localhost:9090,localhost:9180" diff --git a/devstack/files/prometheus.yml b/devstack/files/prometheus.yml index c124ae0..b66646e 100644 --- a/devstack/files/prometheus.yml +++ b/devstack/files/prometheus.yml @@ -7,5 +7,6 @@ scrape_configs: - targets: ["localhost:9882"] - targets: ["localhost:9090"] # prometheus target - targets: ["localhost:9100"] # node_exporter target + - targets: ["localhost:9180"] # openstack-exporter target # labels: # fqdn: "controller" # node_exporter fqdn diff --git a/devstack/lib/openstack_exporter b/devstack/lib/openstack_exporter new file mode 100644 index 0000000..eea7909 --- /dev/null +++ b/devstack/lib/openstack_exporter @@ -0,0 +1,86 @@ +# lib/openstack_exporter +# Functions to control the installation and configuration of openstack_exporter + +# Save trace setting +_XTRACE_OPENSTACK_EXPORTER=$(set +o | grep xtrace) +set +o xtrace + +OPENSTACK_EXPORTER_BINARY="/usr/local/bin/openstack_exporter" +OPENSTACK_EXPORTER_SYSTEMD_SERVICE="devstack@openstack-exporter.service" +OPENSTACK_EXPORTER_PORT=${OPENSTACK_EXPORTER_PORT:-9180} + +function pre_install_openstack_exporter { + # Install OS packages + install_package wget tar +} + +function install_openstack_exporter { + + local oe_tarball=openstack-exporter_${OPENSTACK_EXPORTER_VERSION}_linux_amd64.tar.gz + local oe_url=https://github.com/openstack-exporter/openstack-exporter/releases/download/v${OPENSTACK_EXPORTER_VERSION}/${oe_tarball} + + # Download openstack_exporter + local oe_dest + oe_dest=`get_extra_file ${oe_url}` + + # Extract the tarball + tar xzf ${oe_dest} -C $DEST + + # Move binaries to /usr/local/bin + sudo mv $DEST/openstack-exporter ${OPENSTACK_EXPORTER_BINARY} + + # Set ownership + sudo chown $(whoami):$(whoami) ${OPENSTACK_EXPORTER_BINARY} +} + +function init_openstack_exporter { + export OS_COMPUTE_API_VERSION=2.87 + + + openstack_exporter_cmd=${OPENSTACK_EXPORTER_BINARY} + openstack_exporter_cmd+=" --os-client-config /etc/openstack/clouds.yaml devstack-admin" + + write_user_unit_file $OPENSTACK_EXPORTER_SYSTEMD_SERVICE "$openstack_exporter_cmd" "" "$STACK_USER" "OS_COMPUTE_API_VERSION=2.1" + + enable_service $OPENSTACK_EXPORTER_SYSTEMD_SERVICE +} + +function start_openstack_exporter { + start_service $OPENSTACK_EXPORTER_SYSTEMD_SERVICE +} +function stop_openstack_exporter { + stop_service $OPENSTACK_EXPORTER_SYSTEMD_SERVICE +} + +function cleanup_openstack_exporter { + stop_openstack_exporter + disable_service $OPENSTACK_EXPORTER_SYSTEMD_SERVICE + + # Remove systemd unit files + local unitfile="$SYSTEMD_DIR/$OPENSTACK_EXPORTER_SYSTEMD_SERVICE" + sudo rm -f $unitfile + $SYSTEMCTL daemon-reload + + # Remove OpenStack Exporter binaries + sudo rm -rf $OPENSTACK_EXPORTER_BINARY + + # Remove untar location + sudo rm -rf $DEST/openstack-exporter +} + +function wait_for_data { + # Adding sleep time so that metrics is pushed by openstack exporter + sleep 60 +} + +function check_data_openstack_exporter { + if curl -s --head --request GET "http://$HOST_IP:$OPENSTACK_EXPORTER_PORT/metrics" | grep "200 OK" > /dev/null; then + echo "#### Metrics data ####" + curl "http://$HOST_IP:$OPENSTACK_EXPORTER_PORT/metrics" + else + die $LINENO "Couldn't get data from openstack_exporter" + fi +} + +# Restore xtrace +$_XTRACE_OPENSTACK_EXPORTER \ No newline at end of file diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 923316e..933e93b 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/openstack_exporter . $DEST/devstack-plugin-prometheus/devstack/lib/podman_exporter . $DEST/devstack-plugin-prometheus/devstack/lib/observabilityclient @@ -107,6 +108,52 @@ if is_service_enabled node_exporter; then fi fi +## Openstack Exporter +if is_service_enabled openstack_exporter; then + if [[ "$1" == "source" ]]; then + # Initial source of lib script + source $(dirname "$0")/lib/openstack_exporter + fi + + if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then + # Set up system services + echo_summary "Configuring system services openstack exporter" + pre_install_openstack_exporter + + elif [[ "$1" == "stack" && "$2" == "install" ]]; then + # Perform installation of service source + echo_summary "Installing openstack exporter" + install_openstack_exporter + + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + # Configure after the other layer 1 and 2 services have been configured + echo_summary "Configuring openstack_exporter" + init_openstack_exporter + echo_summary "Starting openstack exporter service" + start_openstack_exporter + echo_summary "Give time to openstack_exporter to push metrics" + wait_for_data + check_data_openstack_exporter + fi + + if [[ "$1" == "unstack" ]]; then + # Shut down openstack exporter services + # no-op + echo_summary "Stopping openstack_exporter service" + stop_openstack_exporter + echo_summary "Cleaning openstack exporter service" + cleanup_open_exporter + fi + + if [[ "$1" == "clean" ]]; then + # Remove state and transient data + # Remember clean.sh first calls unstack.sh + # no-op + echo_summary "Cleaning openstack exporter service" + cleanup_openstack_exporter + fi +fi + ## Podman Exporter if is_service_enabled podman_exporter; then if [[ "$1" == "source" ]]; then diff --git a/devstack/settings b/devstack/settings index 8bfa075..841f6c1 100644 --- a/devstack/settings +++ b/devstack/settings @@ -1,7 +1,8 @@ # DevStack settings -define_plugin prometheus node_exporter podman_exporter +define_plugin prometheus node_exporter openstack_exporter podman_exporter enable_service prometheus enable_service node_exporter +enable_service openstack_exporter ## Variables related to prometheus PROMETHEUS_VERSION=3.1.0 @@ -18,6 +19,9 @@ NODE_EXPORTER_VERSION=1.8.2 # List of "," excluded collector names NODE_EXPORTER_COLLECTOR_EXCLUDE=${NODE_EXPORTER_COLLECTOR_EXCLUDE:-""} +## Variables related to openstack exporter +OPENSTACK_EXPORTER_VERSION=1.7.0 + ## Variables related to the observabilityclient GITREPO["python-observabilityclient"]=${OBSERVABILITYCLIENT_REPO:-${GIT_BASE}/openstack/python-observabilityclient.git} GITBRANCH["python-observabilityclient"]=${OBSERVABILITYCLIENT_BRANCH:-$TARGET_BRANCH}