diff --git a/api-ref/source/parameters.yaml b/api-ref/source/parameters.yaml index 00d33e04ab..e2b743b26a 100644 --- a/api-ref/source/parameters.yaml +++ b/api-ref/source/parameters.yaml @@ -1245,7 +1245,7 @@ project_id-optional-deprecated: protocol: description: | The protocol for the resource. One of ``HTTP``, ``HTTPS``, ``SCTP``, - ``TCP``, ``TERMINATED_HTTPS``, or ``UDP``. + ``PROMETHEUS``, ``TCP``, ``TERMINATED_HTTPS``, or ``UDP``. in: body required: true type: string diff --git a/doc/source/user/feature-classification/feature-matrix-listener.ini b/doc/source/user/feature-classification/feature-matrix-listener.ini index 94ce0c96b3..53fe80885a 100644 --- a/doc/source/user/feature-classification/feature-matrix-listener.ini +++ b/doc/source/user/feature-classification/feature-matrix-listener.ini @@ -238,6 +238,14 @@ cli=openstack loadbalancer listener create --protocol SCTP driver.amphora=complete driver.ovn=missing +[operation.protocol.PROMETHEUS] +title=protocol - PROMETHEUS +status=optional +notes=Prometheus exporter support for the listener. +cli=openstack loadbalancer listener create --protocol PROMETHEUS +driver.amphora=complete +driver.ovn=missing + [operation.protocol_port] title=protocol_port status=mandatory diff --git a/doc/source/user/guides/monitoring.rst b/doc/source/user/guides/monitoring.rst new file mode 100644 index 0000000000..cff2513e4e --- /dev/null +++ b/doc/source/user/guides/monitoring.rst @@ -0,0 +1,153 @@ +.. + Copyright 2021 Red Hat, Inc. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +========================= +Monitoring Load Balancers +========================= + +Introduction +============ + +Octavia provides multiple ways to monitor your load balancers. You can query +statistics via the Octavia API or directly from your load balancer. + +This guide will discuss the various options available to monitor your Octavia +load balancer. + +Monitoring Using the Octavia API +================================ + +Octavia collects key metrics from all load balancers, including load balancers +built with third party provider drivers that support collecting statistics. +Octavia aggregates these statistics and makes them available via the Octavia +API. Load balancer statistics are available at the load balancer or listener +level. + +.. _OpenStack Client: https://docs.openstack.org/python-openstackclient/latest/ + +Load balancer statistics can be queried using the `OpenStack Client`_. + +.. code-block:: bash + + $ openstack loadbalancer stats show + + +--------------------+-----------+ + | Field | Value | + +--------------------+-----------+ + | active_connections | 0 | + | bytes_in | 2236722 | + | bytes_out | 100973832 | + | request_errors | 0 | + | total_connections | 3606 | + +--------------------+-----------+ + +Individual listener statistics can also be queried using the +`OpenStack Client`_. + +.. code-block:: bash + + $ openstack loadbalancer listener stats show + + +--------------------+-------+ + | Field | Value | + +--------------------+-------+ + | active_connections | 0 | + | bytes_in | 89 | + | bytes_out | 237 | + | request_errors | 0 | + | total_connections | 1 | + +--------------------+-------+ + +Load balancer statistics queried via the Octavia API include metrics for all +listener protocols. + +Monitoring with Prometheus +========================== + +Some provider drivers, such as the Octavia amphora driver, provide a prometheus +endpoint. This allows you to configure your Prometheus infrastruture to collect +metrics from Octavia load balancers. + +To add a Prometheus endpoint on an Octavia load balancer, create a listener +with a special protocol ``PROMETHEUS``. This will enable the endpoint as +``/metrics`` on the listener. The listener supports all of the features of an +Octavia load balancer, such as allowed_cidrs, but does not support attaching +pools or L7 policies. All metrics will be identified by the Octavia object +ID (UUID) of the resources. + +.. note:: Currectly UDP and SCTP metrics are not reported via Prometheus + endpoints when using the amphora provider. + +To create a Prometheus endpoint on port 8088 for load balancer lb1, you would +run the following command. + +.. code-block:: bash + + $ openstack loadbalancer listener create --name stats-listener --protocol PROMETHEUS --protocol-port 8088 lb1 + +-----------------------------+--------------------------------------+ + | Field | Value | + +-----------------------------+--------------------------------------+ + | admin_state_up | True | + | connection_limit | -1 | + | created_at | 2021-10-03T01:44:25 | + | default_pool_id | None | + | default_tls_container_ref | None | + | description | | + | id | fb57d764-470a-4b6b-8820-627452f55b96 | + | insert_headers | None | + | l7policies | | + | loadbalancers | b081ed89-f6f8-48cb-a498-5e12705e2cf9 | + | name | stats-listener | + | operating_status | OFFLINE | + | project_id | 4c1caeee063747f8878f007d1a323b2f | + | protocol | PROMETHEUS | + | protocol_port | 8088 | + | provisioning_status | PENDING_CREATE | + | sni_container_refs | [] | + | timeout_client_data | 50000 | + | timeout_member_connect | 5000 | + | timeout_member_data | 50000 | + | timeout_tcp_inspect | 0 | + | updated_at | None | + | client_ca_tls_container_ref | None | + | client_authentication | NONE | + | client_crl_container_ref | None | + | allowed_cidrs | None | + | tls_ciphers | None | + | tls_versions | None | + | alpn_protocols | None | + | tags | | + +-----------------------------+--------------------------------------+ + +Once the ``PROMETHEUS`` listener is ``ACTIVE``, you can configure Prometheus to +collect metrics from the load balancer by updating the prometheus.yml file. + +.. code-block:: yaml + + [scrape_configs] + - job_name: 'Octavia LB1' + static_configs: + - targets: ['192.0.2.10:8088'] + +For more information on setting up Prometheus, see the +`Prometheus project web site `_. + +.. note:: The metrics exposed via the ``/metrics`` endpoint will use a + custom Octavia namespace. + +You can connect `Grafana `_ to the +`Prometheus `_ instance to provide additional graphing +and dashboard capabilities. There are multiple `community built dashboards `_ available +that can be adapted to the Octavia metrics. diff --git a/doc/source/user/index.rst b/doc/source/user/index.rst index 9c12b65894..ae00ce8cfb 100644 --- a/doc/source/user/index.rst +++ b/doc/source/user/index.rst @@ -19,6 +19,7 @@ Guides guides/l7 feature-classification/index + guides/monitoring References ========== diff --git a/elements/amphora-agent/install.d/amphora-agent-source-install/75-amphora-agent-install b/elements/amphora-agent/install.d/amphora-agent-source-install/75-amphora-agent-install index df0eb86e22..2bee343ef0 100755 --- a/elements/amphora-agent/install.d/amphora-agent-source-install/75-amphora-agent-install +++ b/elements/amphora-agent/install.d/amphora-agent-source-install/75-amphora-agent-install @@ -30,6 +30,9 @@ ln -s $AMP_VENV/bin/amphora-health-checker /usr/local/bin/amphora-health-checker # Link amphora interface script ln -s $AMP_VENV/bin/amphora-interface /usr/local/bin/amphora-interface || true +# Link the prometheus proxy +ln -s $AMP_VENV/bin/prometheus-proxy /usr/local/bin/prometheus-proxy || true + mkdir /etc/octavia # we assume certs, etc will come in through the config drive mkdir /etc/octavia/certs @@ -40,12 +43,15 @@ install -D -g root -o root -m 0644 ${SCRIPTDIR}/amphora-agent.logrotate /etc/log case "$DIB_INIT_SYSTEM" in upstart) install -D -g root -o root -m 0644 ${SCRIPTDIR}/amphora-agent.conf /etc/init/amphora-agent.conf + install -D -g root -o root -m 0644 ${SCRIPTDIR}/prometheus-proxy.conf /etc/init/prometheus-proxy.conf ;; systemd) install -D -g root -o root -m 0644 ${SCRIPTDIR}/amphora-agent.service /usr/lib/systemd/system/amphora-agent.service + install -D -g root -o root -m 0644 ${SCRIPTDIR}/prometheus-proxy.service /usr/lib/systemd/system/prometheus-proxy.service ;; sysv) install -D -g root -o root -m 0644 ${SCRIPTDIR}/amphora-agent.init /etc/init.d/amphora-agent.init + install -D -g root -o root -m 0644 ${SCRIPTDIR}/prometheus-proxy.init /etc/init.d/prometheus-proxy.init ;; *) echo "Unsupported init system" diff --git a/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.conf b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.conf new file mode 100644 index 0000000000..d78f537ec3 --- /dev/null +++ b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.conf @@ -0,0 +1,19 @@ +description "Start up the Octavia Prometheus Proxy" + +start on started amphora-agent +stop on runlevel [!2345] + +respawn +# Handle the race condition with the netns being created +respawn limit unlimited + +exec /usr/local/bin/prometheus-proxy + +post-start script + PID=`status prometheus-proxy | egrep -oi '([0-9]+)$' | head -n1` + echo $PID > /var/run/prometheus-proxy.pid +end script + +post-stop script + rm -f /var/run/prometheus-proxy.pid +end script diff --git a/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.init b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.init new file mode 100644 index 0000000000..9278328623 --- /dev/null +++ b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.init @@ -0,0 +1,65 @@ +### BEGIN INIT INFO +# Provides: prometheus-proxy +# Required-Start: $remote_fs $syslog $network certs-ramfs +# Required-Stop: $remote_fs $syslog $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Runs the Prometheus Proxy processes +# Description: This script runs Octavia Prometheus Proxy processes. +### END INIT INFO + +# Using the lsb functions to perform the operations. +. /lib/lsb/init-functions +# Process name ( For display ) +NAME=prometheus-proxy +# Daemon name, where is the actual executable +DAEMON=/usr/local/bin/prometheus-proxy +# pid file for the daemon +PIDFILE=/var/run/prometheus-proxy.pid + +# If the daemon is not there, then exit. +test -x $DAEMON || exit 5 + +case $1 in + start) + # Checked the PID file exists and check the actual status of process + if [ -e $PIDFILE ]; then + status_of_proc -p $PIDFILE $DAEMON "$NAME process" && status="0" || status="$?" + # If the status is SUCCESS then don't need to start again. + if [ $status = "0" ]; then + exit # Exit + fi + fi + # Start the daemon. + log_daemon_msg "Starting the process" "$NAME" + # Start the daemon with the help of start-stop-daemon + # Log the message appropriately + if start-stop-daemon --start -m --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON; then + log_end_msg 0 + else + log_end_msg 1 + fi + ;; + stop) + # Stop the daemon. + if [ -e $PIDFILE ]; then + status_of_proc -p $PIDFILE $DAEMON "Stopping the $NAME process" && status="0" || status="$?" + if [ "$status" = 0 ]; then + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + /bin/rm -rf $PIDFILE + fi + else + log_daemon_msg "$NAME process is not running" + log_end_msg 0 + fi + ;; + restart) + # Restart the daemon. + $0 stop && sleep 2 && $0 start + ;; + *) + # For invalid arguments, print the usage message. + echo "Usage: $0 {start|stop|restart|reload|status}" + exit 2 + ;; +esac diff --git a/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.service b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.service new file mode 100644 index 0000000000..8ea11de75b --- /dev/null +++ b/elements/amphora-agent/install.d/amphora-agent-source-install/prometheus-proxy.service @@ -0,0 +1,14 @@ +[Unit] +Description=OpenStack Octavia Prometheus Proxy +After=network.target syslog.service amphora-agent.service +Requires=amphora-agent.service + +[Service] +ExecStart=/usr/local/bin/prometheus-proxy +KillMode=mixed +Restart=always +ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/prometheus-proxy.pid" +PIDFile=/var/run/prometheus-proxy.pid + +[Install] +WantedBy=multi-user.target diff --git a/elements/amphora-agent/post-install.d/12-enable-prometheus-proxy-systemd b/elements/amphora-agent/post-install.d/12-enable-prometheus-proxy-systemd new file mode 100755 index 0000000000..a207349b44 --- /dev/null +++ b/elements/amphora-agent/post-install.d/12-enable-prometheus-proxy-systemd @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then + set -x +fi + +set -eu +set -o pipefail + +if [ "$DIB_INIT_SYSTEM" == "systemd" ]; then + systemctl enable prometheus-proxy +fi diff --git a/etc/octavia.conf b/etc/octavia.conf index 6145d2524c..411baef4ca 100644 --- a/etc/octavia.conf +++ b/etc/octavia.conf @@ -41,6 +41,9 @@ # Enable/disable ability for users to create PING type Health Monitors # allow_ping_health_monitors = True +# Enable/disable PROMETHEUS listeners +# allow_prometheus_listeners = True + # Dictionary of enabled provider driver names and descriptions # A comma separated list of dictionaries of the enabled provider driver names # and descriptions. diff --git a/lower-constraints.txt b/lower-constraints.txt index 5d08eff724..7d269c52c5 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -72,7 +72,7 @@ munch==2.2.0 netaddr==0.7.19 netifaces==0.10.4 networkx==2.1.0 -octavia-lib==2.3.0 +octavia-lib==2.5.0 openstacksdk==0.12.0 os-client-config==1.29.0 os-service-types==1.2.0 @@ -103,7 +103,7 @@ pep8==1.7.1 pika==0.10.0 pika-pool==0.1.3 prettytable==0.7.2 -psutil==5.4.3 +psutil==5.7.1 pyasn1==0.1.8 pyasn1-modules==0.0.6 pycadf==2.7.0 diff --git a/octavia/amphorae/backends/utils/haproxy_query.py b/octavia/amphorae/backends/utils/haproxy_query.py index 94bfb879b1..0456492553 100644 --- a/octavia/amphorae/backends/utils/haproxy_query.py +++ b/octavia/amphorae/backends/utils/haproxy_query.py @@ -97,7 +97,11 @@ class HAProxyQuery(object): server_id=server_id)) list_results = results[2:].split('\n') csv_reader = csv.DictReader(list_results) - return list(csv_reader) + stats_list = list(csv_reader) + # We don't want to report the internal prometheus proxy stats + # up to the control plane as it shouldn't be billed traffic + return [stat for stat in stats_list + if "prometheus" not in stat['pxname']] def get_pool_status(self): """Get status for each server and the pool as a whole. @@ -115,6 +119,11 @@ class HAProxyQuery(object): for line in results: # pxname: pool, svname: server_name, status: status + # We don't want to report the internal prometheus proxy stats + # up to health manager as it shouldn't be billed traffic + if 'prometheus' in line['pxname']: + continue + if line['pxname'] not in final_results: final_results[line['pxname']] = dict(members={}) diff --git a/octavia/api/drivers/amphora_driver/v1/driver.py b/octavia/api/drivers/amphora_driver/v1/driver.py index 8485cc4cae..a0b1884408 100644 --- a/octavia/api/drivers/amphora_driver/v1/driver.py +++ b/octavia/api/drivers/amphora_driver/v1/driver.py @@ -53,6 +53,7 @@ AMPHORA_SUPPORTED_PROTOCOLS = [ lib_consts.PROTOCOL_PROXYV2, lib_consts.PROTOCOL_UDP, lib_consts.PROTOCOL_SCTP, + lib_consts.PROTOCOL_PROMETHEUS, ] diff --git a/octavia/api/drivers/amphora_driver/v2/driver.py b/octavia/api/drivers/amphora_driver/v2/driver.py index 666a05ba18..e1c142f562 100644 --- a/octavia/api/drivers/amphora_driver/v2/driver.py +++ b/octavia/api/drivers/amphora_driver/v2/driver.py @@ -54,6 +54,7 @@ AMPHORA_SUPPORTED_PROTOCOLS = [ lib_consts.PROTOCOL_PROXYV2, lib_consts.PROTOCOL_UDP, lib_consts.PROTOCOL_SCTP, + lib_consts.PROTOCOL_PROMETHEUS, ] diff --git a/octavia/api/root_controller.py b/octavia/api/root_controller.py index 88e18f8d81..02f3c65093 100644 --- a/octavia/api/root_controller.py +++ b/octavia/api/root_controller.py @@ -137,6 +137,9 @@ class RootController(object): self._add_a_version(versions, 'v2.23', 'v2', 'SUPPORTED', '2020-09-07T00:00:00Z', host_url) # ALPN protocols (pool) - self._add_a_version(versions, 'v2.24', 'v2', 'CURRENT', + self._add_a_version(versions, 'v2.24', 'v2', 'SUPPORTED', '2020-10-15T00:00:00Z', host_url) + # PROMETHEUS listeners + self._add_a_version(versions, 'v2.25', 'v2', 'CURRENT', + '2021-10-02T00:00:00Z', host_url) return {'versions': versions} diff --git a/octavia/api/v2/controllers/l7policy.py b/octavia/api/v2/controllers/l7policy.py index 478622dc07..8af280fd04 100644 --- a/octavia/api/v2/controllers/l7policy.py +++ b/octavia/api/v2/controllers/l7policy.py @@ -13,6 +13,7 @@ # under the License. from octavia_lib.api.drivers import data_models as driver_dm +from octavia_lib.common import constants as lib_consts from oslo_config import cfg from oslo_db import exception as odb_exceptions from oslo_log import log as logging @@ -129,6 +130,11 @@ class L7PolicyController(base.BaseController): self._auth_validate_action(context, l7policy.project_id, constants.RBAC_POST) + # PROMETHEUS listeners cannot have l7policies attached + if listener.protocol == lib_consts.PROTOCOL_PROMETHEUS: + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) + # Make sure any pool specified by redirect_pool_id exists if l7policy.redirect_pool_id: db_pool = self._get_db_pool( diff --git a/octavia/api/v2/controllers/listener.py b/octavia/api/v2/controllers/listener.py index f7a2ec7dfd..d0216a707b 100644 --- a/octavia/api/v2/controllers/listener.py +++ b/octavia/api/v2/controllers/listener.py @@ -172,6 +172,11 @@ class ListenersController(base.BaseController): """ listener_protocol = listener_dict.get('protocol') + _can_tls_offload = ( + listener_protocol == constants.PROTOCOL_TERMINATED_HTTPS or + (listener_protocol == constants.PROTOCOL_PROMETHEUS and + self._has_tls_container_refs(listener_dict))) + if listener_dict and listener_dict.get('insert_headers'): self._validate_insert_headers( listener_dict['insert_headers'].keys(), listener_protocol) @@ -186,17 +191,25 @@ class ListenersController(base.BaseController): # Check for TLS disabled if (not CONF.api_settings.allow_tls_terminated_listeners and - listener_protocol == constants.PROTOCOL_TERMINATED_HTTPS): - raise exceptions.DisabledOption( - value=constants.PROTOCOL_TERMINATED_HTTPS, option='protocol') + _can_tls_offload): + if listener_protocol == constants.PROTOCOL_PROMETHEUS: + msg = f"{listener_protocol} with TLS" + else: + msg = listener_protocol + raise exceptions.DisabledOption(value=msg, option='protocol') - # Check for certs when not TERMINATED_HTTPS - if (listener_protocol != constants.PROTOCOL_TERMINATED_HTTPS and + # Check for PROMETHEUS listeners disabled + if (not CONF.api_settings.allow_prometheus_listeners and + listener_protocol == lib_consts.PROTOCOL_PROMETHEUS): + raise exceptions.DisabledOption( + value=lib_consts.PROTOCOL_PROMETHEUS, option='protocol') + + # Check for certs when not TLS offload capable + if (not _can_tls_offload and self._has_tls_container_refs(listener_dict)): raise exceptions.ValidationException(detail=_( - "Certificate container references are only allowed on " - "%s protocol listeners.") % - constants.PROTOCOL_TERMINATED_HTTPS) + "Certificate container references are not allowed on " + "%s protocol listeners.") % listener_protocol) # Make sure a base certificate exists if specifying a client ca if (listener_dict.get('client_ca_tls_certificate_id') and @@ -206,14 +219,17 @@ class ListenersController(base.BaseController): "An SNI or default certificate container reference must " "be provided with a client CA container reference.")) - # Make sure a certificate container is specified for TERMINATED_HTTPS - if (listener_protocol == constants.PROTOCOL_TERMINATED_HTTPS and + # Make sure a certificate container is specified for TLS protocols + if (_can_tls_offload and not (listener_dict.get('tls_certificate_id') or listener_dict.get('sni_containers'))): + if listener_protocol == constants.PROTOCOL_PROMETHEUS: + msg = f"{listener_protocol} with TLS" + else: + msg = listener_protocol raise exceptions.ValidationException(detail=_( "An SNI or default certificate container reference must " - "be provided for %s protocol listeners.") % - constants.PROTOCOL_TERMINATED_HTTPS) + "be provided for %s protocol listeners.") % msg) # Make sure we have a client CA cert if they enable client auth if (listener_dict.get('client_authentication') != @@ -295,7 +311,7 @@ class ListenersController(base.BaseController): vip_address = vip_db.ip_address self._validate_cidr_compatible_with_vip(vip_address, allowed_cidrs) - if listener_protocol == constants.PROTOCOL_TERMINATED_HTTPS: + if _can_tls_offload: # Validate TLS version list validate.check_tls_version_list(listener_dict['tls_versions']) # Validate TLS versions against minimum @@ -363,6 +379,10 @@ class ListenersController(base.BaseController): listener.to_dict(render_unsets=True), None) if listener_dict['default_pool_id']: + if (listener_dict.get('protocol') == + lib_consts.PROTOCOL_PROMETHEUS): + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) self._validate_pool(context.session, load_balancer_id, listener_dict['default_pool_id'], listener.protocol) @@ -406,6 +426,9 @@ class ListenersController(base.BaseController): listener_dict, load_balancer_id) l7policies = listener_dict.pop('l7policies', l7policies) if listener_dict.get('default_pool_id'): + if listener_dict.get('protocol') == lib_consts.PROTOCOL_PROMETHEUS: + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) self._validate_pool(lock_session, load_balancer_id, listener_dict['default_pool_id'], listener_dict['protocol']) @@ -414,6 +437,12 @@ class ListenersController(base.BaseController): # Now create l7policies new_l7ps = [] + + if (listener_dict.get('protocol') == lib_consts.PROTOCOL_PROMETHEUS and + l7policies): + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) + for l7p in l7policies: l7p['project_id'] = db_listener.project_id l7p['load_balancer_id'] = load_balancer_id @@ -432,6 +461,11 @@ class ListenersController(base.BaseController): return db_listener def _validate_listener_PUT(self, listener, db_listener): + _can_tls_offload = ( + db_listener.protocol == constants.PROTOCOL_TERMINATED_HTTPS or + (db_listener.protocol == constants.PROTOCOL_PROMETHEUS and + self._has_tls_container_refs(listener.to_dict()))) + # TODO(rm_work): Do we need something like this? What do we do on an # empty body for a PUT? if not listener: @@ -446,13 +480,12 @@ class ListenersController(base.BaseController): "%s protocol listener does not support TLS or header " "insertion.") % db_listener.protocol) - # Check for certs when not TERMINATED_HTTPS - if (db_listener.protocol != constants.PROTOCOL_TERMINATED_HTTPS and + # Check for certs when not TLS offload capable + if (not _can_tls_offload and self._has_tls_container_refs(listener.to_dict())): raise exceptions.ValidationException(detail=_( - "Certificate container references are only allowed on " - "%s protocol listeners.") % - constants.PROTOCOL_TERMINATED_HTTPS) + "Certificate container references are not allowed on " + "%s protocol listeners.") % db_listener.protocol) # Make sure we have a client CA cert if they enable client auth if (listener.client_authentication not in @@ -577,6 +610,9 @@ class ListenersController(base.BaseController): self._set_default_on_none(listener) if listener.default_pool_id: + if db_listener.protocol == lib_consts.PROTOCOL_PROMETHEUS: + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) self._validate_pool(context.session, load_balancer_id, listener.default_pool_id, db_listener.protocol) diff --git a/octavia/api/v2/controllers/pool.py b/octavia/api/v2/controllers/pool.py index db8d2d0e00..1e38bb4f88 100644 --- a/octavia/api/v2/controllers/pool.py +++ b/octavia/api/v2/controllers/pool.py @@ -229,6 +229,9 @@ class PoolsController(base.BaseController): constants.RBAC_POST) if pool.listener_id and listener: + if listener.protocol == lib_consts.PROTOCOL_PROMETHEUS: + raise exceptions.ListenerNoChildren( + protocol=lib_consts.PROTOCOL_PROMETHEUS) self._validate_protocol(listener.protocol, pool.protocol) if pool.protocol in (constants.PROTOCOL_UDP, diff --git a/octavia/cmd/prometheus_proxy.py b/octavia/cmd/prometheus_proxy.py new file mode 100644 index 0000000000..1737915f0e --- /dev/null +++ b/octavia/cmd/prometheus_proxy.py @@ -0,0 +1,825 @@ +#!/usr/bin/python3 +# Copyright 2022 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# This prometheus-proxy is intended to abstract the prometheus metrics +# exported from the reference provider driver load balancing engines (haproxy +# and lvs) such that all of the provider drivers can expose a consistent set +# of metrics. It also aligns the terms to be consistent with Octavia +# terminology. + +from http.server import HTTPServer +from http.server import SimpleHTTPRequestHandler +import os +import signal +import socketserver +import sys +import threading +import time +import traceback +import urllib.request + +import psutil + +from octavia.amphorae.backends.utils import network_namespace +from octavia.common import constants as consts + +METRICS_URL = "http://127.0.0.1:9101/metrics" +PRINT_REJECTED = False +EXIT_EVENT = threading.Event() + +# A dictionary of prometheus metrics mappings. +# Key: The metric string to match +# Value: A tuple of replacement data. +# tuple[0]: The string to replace the key with. +# tuple[1]: If not None, the replacement HELP line for the metric. +# If tuple[1] is None, the key will be replaced in the HELP string. +# tuple[2]: If not None, includes a dictionary of additional substitutions. +# tuple[2] substitutions happen prior to the key replacement in tuple[0]. +METRIC_MAP = { + # Load balancer metrics + "haproxy_process_pool_allocated_bytes ": + ("octavia_memory_pool_allocated_bytes ", + "# HELP octavia_memory_pool_allocated_bytes Total amount of memory " + "allocated in the memory pools (in bytes).\n", None), + "haproxy_process_pool_used_bytes ": + ("octavia_memory_pool_used_bytes ", + "# HELP octavia_memory_pool_used_bytes Total amount of memory used " + "in the memory pools (in bytes).\n", None), + "haproxy_process_pool_failures_total ": + ("octavia_memory_pool_failures_total ", + "# HELP octavia_memory_pool_failures_total Total number of failed " + "memory pool allocations.\n", None), + "haproxy_process_max_connections ": + ("octavia_loadbalancer_max_connections ", None, None), + "haproxy_process_current_connections ": + ("octavia_loadbalancer_current_connections ", None, None), + # TODO(johnsom) consider adding in UDP + "haproxy_process_connections_total ": + ("octavia_loadbalancer_connections_total ", None, None), + # TODO(johnsom) consider adding in UDP (and update help string) + "haproxy_process_requests_total ": + ("octavia_loadbalancer_requests_total ", None, None), + "haproxy_process_max_ssl_connections ": + ("octavia_loadbalancer_max_ssl_connections ", None, None), + "haproxy_process_current_ssl_connections ": + ("octavia_loadbalancer_current_ssl_connections ", + "# HELP octavia_loadbalancer_current_ssl_connections Number of " + "active SSL connections.\n", None), + "haproxy_process_ssl_connections_total ": + ("octavia_loadbalancer_ssl_connections_total ", None, None), + "haproxy_process_current_connection_rate ": + ("octavia_loadbalancer_current_connection_rate ", None, None), + "haproxy_process_limit_connection_rate ": + ("octavia_loadbalancer_limit_connection_rate ", None, None), + "haproxy_process_max_connection_rate ": + ("octavia_loadbalancer_max_connection_rate ", None, None), + "haproxy_process_current_session_rate ": + ("octavia_loadbalancer_current_session_rate ", None, None), + "haproxy_process_limit_session_rate ": + ("octavia_loadbalancer_limit_session_rate ", None, None), + "haproxy_process_max_session_rate ": + ("octavia_loadbalancer_max_session_rate ", None, None), + "haproxy_process_current_ssl_rate ": + ("octavia_loadbalancer_current_ssl_rate ", None, None), + "haproxy_process_limit_ssl_rate ": + ("octavia_loadbalancer_limit_ssl_rate ", None, None), + "haproxy_process_max_ssl_rate ": + ("octavia_loadbalancer_max_ssl_rate ", None, None), + "haproxy_process_current_frontend_ssl_key_rate ": + ("octavia_loadbalancer_current_frontend_ssl_key_rate ", None, None), + "haproxy_process_max_frontend_ssl_key_rate ": + ("octavia_loadbalancer_max_frontend_ssl_key_rate ", None, None), + "haproxy_process_frontent_ssl_reuse ": + ("octavia_loadbalancer_frontent_ssl_reuse ", None, None), + "haproxy_process_current_backend_ssl_key_rate ": + ("octavia_loadbalancer_current_backend_ssl_key_rate ", None, None), + "haproxy_process_max_backend_ssl_key_rate ": + ("octavia_loadbalancer_max_backend_ssl_key_rate ", None, None), + "haproxy_process_ssl_cache_lookups_total ": + ("octavia_loadbalancer_ssl_cache_lookups_total ", None, None), + "haproxy_process_ssl_cache_misses_total ": + ("octavia_loadbalancer_ssl_cache_misses_total ", None, None), + "haproxy_process_http_comp_bytes_in_total ": + ("octavia_loadbalancer_http_comp_bytes_in_total ", None, None), + "haproxy_process_http_comp_bytes_out_total ": + ("octavia_loadbalancer_http_comp_bytes_out_total ", None, None), + "haproxy_process_limit_http_comp ": + ("octavia_loadbalancer_limit_http_comp ", None, None), + "haproxy_process_listeners ": + ("octavia_loadbalancer_listeners ", None, None), + "haproxy_process_dropped_logs_total ": + ("octavia_loadbalancer_dropped_logs_total ", None, None), + + # Listener metrics + "haproxy_frontend_status ": + ("octavia_listener_status ", + "# HELP octavia_listener_status Current status of the listener. " + "0=OFFLINE, 1=ONLINE, 2=DEGRADED.\n", None), + "haproxy_frontend_status{": + ("octavia_listener_status{", None, {"proxy=": "listener="}), + "haproxy_frontend_current_sessions ": + ("octavia_listener_current_sessions ", None, None), + "haproxy_frontend_current_sessions{": + ("octavia_listener_current_sessions{", None, + {"proxy=": "listener="}), + "haproxy_frontend_max_sessions ": + ("octavia_listener_max_sessions ", None, None), + "haproxy_frontend_max_sessions{": + ("octavia_listener_max_sessions{", None, {"proxy=": "listener="}), + "haproxy_frontend_limit_sessions ": + ("octavia_listener_limit_sessions ", None, None), + "haproxy_frontend_limit_sessions{": + ("octavia_listener_limit_sessions{", None, {"proxy=": "listener="}), + "haproxy_frontend_sessions_total ": + ("octavia_listener_sessions_total ", None, None), + "haproxy_frontend_sessions_total{": + ("octavia_listener_sessions_total{", None, {"proxy=": "listener="}), + "haproxy_frontend_limit_session_rate ": + ("octavia_listener_limit_session_rate ", None, None), + "haproxy_frontend_limit_session_rate{": + ("octavia_listener_limit_session_rate{", None, + {"proxy=": "listener="}), + "haproxy_frontend_max_session_rate ": + ("octavia_listener_max_session_rate ", None, None), + "haproxy_frontend_max_session_rate{": + ("octavia_listener_max_session_rate{", None, + {"proxy=": "listener="}), + "haproxy_frontend_connections_rate_max ": + ("octavia_listener_connections_rate_max ", None, None), + "haproxy_frontend_connections_rate_max{": + ("octavia_listener_connections_rate_max{", None, + {"proxy=": "listener="}), + "haproxy_frontend_connections_total ": + ("octavia_listener_connections_total ", None, None), + "haproxy_frontend_connections_total{": + ("octavia_listener_connections_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_bytes_in_total ": + ("octavia_listener_bytes_in_total ", None, None), + "haproxy_frontend_bytes_in_total{": + ("octavia_listener_bytes_in_total{", None, {"proxy=": "listener="}), + "haproxy_frontend_bytes_out_total ": + ("octavia_listener_bytes_out_total ", None, None), + "haproxy_frontend_bytes_out_total{": + ("octavia_listener_bytes_out_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_requests_denied_total ": + ("octavia_listener_requests_denied_total ", None, None), + "haproxy_frontend_requests_denied_total{": + ("octavia_listener_requests_denied_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_responses_denied_total ": + ("octavia_listener_responses_denied_total ", None, None), + "haproxy_frontend_responses_denied_total{": + ("octavia_listener_responses_denied_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_request_errors_total ": + ("octavia_listener_request_errors_total ", None, None), + "haproxy_frontend_request_errors_total{": + ("octavia_listener_request_errors_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_denied_connections_total ": + ("octavia_listener_denied_connections_total ", + "# HELP octavia_listener_denied_connections_total Total number of " + "requests denied by connection rules.\n", None), + "haproxy_frontend_denied_connections_total{": + ("octavia_listener_denied_connections_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_denied_sessions_total ": + ("octavia_listener_denied_sessions_total ", + "# HELP octavia_listener_denied_sessions_total Total number of " + "requests denied by session rules.\n", None), + "haproxy_frontend_denied_sessions_total{": + ("octavia_listener_denied_sessions_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_failed_header_rewriting_total ": + ("octavia_listener_failed_header_rewriting_total ", + "# HELP octavia_listener_failed_header_rewriting_total Total number " + "of failed header rewriting rules.\n", None), + "haproxy_frontend_failed_header_rewriting_total{": + ("octavia_listener_failed_header_rewriting_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_requests_rate_max ": + ("octavia_listener_http_requests_rate_max ", None, None), + "haproxy_frontend_http_requests_rate_max{": + ("octavia_listener_http_requests_rate_max{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_requests_total ": + ("octavia_listener_http_requests_total ", None, None), + "haproxy_frontend_http_requests_total{": + ("octavia_listener_http_requests_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_responses_total ": + ("octavia_listener_http_responses_total ", None, None), + "haproxy_frontend_http_responses_total{": + ("octavia_listener_http_responses_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_intercepted_requests_total ": + ("octavia_listener_intercepted_requests_total ", None, None), + "haproxy_frontend_intercepted_requests_total{": + ("octavia_listener_intercepted_requests_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_cache_lookups_total ": + ("octavia_listener_http_cache_lookups_total ", None, None), + "haproxy_frontend_http_cache_lookups_total{": + ("octavia_listener_http_cache_lookups_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_cache_hits_total ": + ("octavia_listener_http_cache_hits_total ", None, None), + "haproxy_frontend_http_cache_hits_total{": + ("octavia_listener_http_cache_hits_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_comp_bytes_in_total ": + ("octavia_listener_http_comp_bytes_in_total ", None, None), + "haproxy_frontend_http_comp_bytes_in_total{": + ("octavia_listener_http_comp_bytes_in_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_comp_bytes_out_total ": + ("octavia_listener_http_comp_bytes_out_total ", None, None), + "haproxy_frontend_http_comp_bytes_out_total{": + ("octavia_listener_http_comp_bytes_out_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_comp_bytes_bypassed_total ": + ("octavia_listener_http_comp_bytes_bypassed_total ", None, None), + "haproxy_frontend_http_comp_bytes_bypassed_total{": + ("octavia_listener_http_comp_bytes_bypassed_total{", None, + {"proxy=": "listener="}), + "haproxy_frontend_http_comp_responses_total ": + ("octavia_listener_http_comp_responses_total ", None, None), + "haproxy_frontend_http_comp_responses_total{": + ("octavia_listener_http_comp_responses_total{", None, + {"proxy=": "listener="}), + + # Pool Metrics + "haproxy_backend_status ": + ("octavia_pool_status ", + "# HELP octavia_pool_status Current status of the pool. 0=OFFLINE, " + "1=ONLINE.\n", None), + "haproxy_backend_status{": + ("octavia_pool_status{", None, {"proxy=": "pool="}), + "haproxy_backend_current_sessions ": + ("octavia_pool_current_sessions ", None, None), + "haproxy_backend_current_sessions{": + ("octavia_pool_current_sessions{", None, {"proxy=": "pool="}), + "haproxy_backend_max_sessions ": + ("octavia_pool_max_sessions ", None, None), + "haproxy_backend_max_sessions{": + ("octavia_pool_max_sessions{", None, {"proxy=": "pool="}), + "haproxy_backend_limit_sessions ": + ("octavia_pool_limit_sessions ", None, None), + "haproxy_backend_limit_sessions{": + ("octavia_pool_limit_sessions{", None, {"proxy=": "pool="}), + "haproxy_backend_sessions_total ": + ("octavia_pool_sessions_total ", None, None), + "haproxy_backend_sessions_total{": + ("octavia_pool_sessions_total{", None, {"proxy=": "pool="}), + "haproxy_backend_max_session_rate ": + ("octavia_pool_max_session_rate ", None, None), + "haproxy_backend_max_session_rate{": + ("octavia_pool_max_session_rate{", None, {"proxy=": "pool="}), + "haproxy_backend_last_session_seconds ": + ("octavia_pool_last_session_seconds ", + "# HELP octavia_pool_last_session_seconds Number of seconds since " + "last session assigned to a member.\n", None, None), + "haproxy_backend_last_session_seconds{": + ("octavia_pool_last_session_seconds{", None, {"proxy=": "pool="}), + "haproxy_backend_current_queue ": + ("octavia_pool_current_queue ", None, None), + "haproxy_backend_current_queue{": + ("octavia_pool_current_queue{", None, {"proxy=": "pool="}), + "haproxy_backend_max_queue ": + ("octavia_pool_max_queue ", None, None), + "haproxy_backend_max_queue{": + ("octavia_pool_max_queue{", None, {"proxy=": "pool="}), + "haproxy_backend_connection_attempts_total ": + ("octavia_pool_connection_attempts_total ", None, None), + "haproxy_backend_connection_attempts_total{": + ("octavia_pool_connection_attempts_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_connection_reuses_total ": + ("octavia_pool_connection_reuses_total ", None, None), + "haproxy_backend_connection_reuses_total{": + ("octavia_pool_connection_reuses_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_bytes_in_total ": + ("octavia_pool_bytes_in_total ", None, None), + "haproxy_backend_bytes_in_total{": + ("octavia_pool_bytes_in_total{", None, {"proxy=": "pool="}), + "haproxy_backend_bytes_out_total ": + ("octavia_pool_bytes_out_total ", None, None), + "haproxy_backend_bytes_out_total{": + ("octavia_pool_bytes_out_total{", None, {"proxy=": "pool="}), + "haproxy_backend_queue_time_average_seconds ": + ("octavia_pool_queue_time_average_seconds ", None, None), + "haproxy_backend_queue_time_average_seconds{": + ("octavia_pool_queue_time_average_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_connect_time_average_seconds ": + ("octavia_pool_connect_time_average_seconds ", None, None), + "haproxy_backend_connect_time_average_seconds{": + ("octavia_pool_connect_time_average_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_response_time_average_seconds ": + ("octavia_pool_response_time_average_seconds ", None, None), + "haproxy_backend_response_time_average_seconds{": + ("octavia_pool_response_time_average_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_total_time_average_seconds ": + ("octavia_pool_total_time_average_seconds ", None, None), + "haproxy_backend_total_time_average_seconds{": + ("octavia_pool_total_time_average_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_max_queue_time_seconds ": + ("octavia_pool_max_queue_time_seconds ", None, None), + "haproxy_backend_max_queue_time_seconds{": + ("octavia_pool_max_queue_time_seconds{", None, {"proxy=": "pool="}), + "haproxy_backend_max_connect_time_seconds ": + ("octavia_pool_max_connect_time_seconds ", None, None), + "haproxy_backend_max_connect_time_seconds{": + ("octavia_pool_max_connect_time_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_max_response_time_seconds ": + ("octavia_pool_max_response_time_seconds ", + "# HELP octavia_pool_max_response_time_seconds Maximum observed " + "time spent waiting for a member response.\n", None), + "haproxy_backend_max_response_time_seconds{": + ("octavia_pool_max_response_time_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_max_total_time_seconds ": + ("octavia_pool_max_total_time_seconds ", None, None), + "haproxy_backend_max_total_time_seconds{": + ("octavia_pool_max_total_time_seconds{", None, {"proxy=": "pool="}), + "haproxy_backend_requests_denied_total ": + ("octavia_pool_requests_denied_total ", None, None), + "haproxy_backend_requests_denied_total{": + ("octavia_pool_requests_denied_total{", None, {"proxy=": "pool="}), + "haproxy_backend_responses_denied_total ": + ("octavia_pool_responses_denied_total ", None, None), + "haproxy_backend_responses_denied_total{": + ("octavia_pool_responses_denied_total{", None, {"proxy=": "pool="}), + "haproxy_backend_connection_errors_total ": + ("octavia_pool_connection_errors_total ", None, None), + "haproxy_backend_connection_errors_total{": + ("octavia_pool_connection_errors_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_response_errors_total ": + ("octavia_pool_response_errors_total ", None, None), + "haproxy_backend_response_errors_total{": + ("octavia_pool_response_errors_total{", None, {"proxy=": "pool="}), + "haproxy_backend_retry_warnings_total ": + ("octavia_pool_retry_warnings_total ", None, None), + "haproxy_backend_retry_warnings_total{": + ("octavia_pool_retry_warnings_total{", None, {"proxy=": "pool="}), + "haproxy_backend_redispatch_warnings_total ": + ("octavia_pool_redispatch_warnings_total ", None, None), + "haproxy_backend_redispatch_warnings_total{": + ("octavia_pool_redispatch_warnings_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_failed_header_rewriting_total ": + ("octavia_pool_failed_header_rewriting_total ", None, None), + "haproxy_backend_failed_header_rewriting_total{": + ("octavia_pool_failed_header_rewriting_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_client_aborts_total ": + ("octavia_pool_client_aborts_total ", None, None), + "haproxy_backend_client_aborts_total{": + ("octavia_pool_client_aborts_total{", None, {"proxy=": "pool="}), + "haproxy_backend_server_aborts_total ": + ("octavia_pool_member_aborts_total ", + "# HELP octavia_pool_server_aborts_total Total number of data " + "transfers aborted by the server.\n", None), + "haproxy_backend_server_aborts_total{": + ("octavia_pool_member_aborts_total{", None, {"proxy=": "pool="}), + "haproxy_backend_active_servers ": + ("octavia_pool_active_members ", + "# HELP octavia_pool_active_members Current number of active " + "members.\n", None), + "haproxy_backend_active_servers{": + ("octavia_pool_active_members{", None, {"proxy=": "pool="}), + "haproxy_backend_backup_servers ": + ("octavia_pool_backup_members ", + "# HELP octavia_pool_backup_members Current number of backup " + "members.\n", None), + "haproxy_backend_backup_servers{": + ("octavia_pool_backup_members{", None, {"proxy=": "pool="}), + "haproxy_backend_check_up_down_total ": + ("octavia_pool_check_up_down_total ", None, None), + "haproxy_backend_check_up_down_total{": + ("octavia_pool_check_up_down_total{", None, {"proxy=": "pool="}), + "haproxy_backend_check_last_change_seconds ": + ("octavia_pool_check_last_change_seconds ", None, None), + "haproxy_backend_check_last_change_seconds{": + ("octavia_pool_check_last_change_seconds{", None, + {"proxy=": "pool="}), + "haproxy_backend_downtime_seconds_total ": + ("octavia_pool_downtime_seconds_total ", + "# HELP octavia_pool_downtime_seconds_total Total downtime " + "(in seconds) for the pool.\n", None), + "haproxy_backend_downtime_seconds_total{": + ("octavia_pool_downtime_seconds_total{", None, {"proxy=": "pool="}), + "haproxy_backend_loadbalanced_total ": + ("octavia_pool_loadbalanced_total ", + "# HELP octavia_pool_loadbalanced_total Total number of times a " + "pool was selected, either for new sessions, or when " + "redispatching.\n", None), + "haproxy_backend_loadbalanced_total{": + ("octavia_pool_loadbalanced_total{", None, {"proxy=": "pool="}), + "haproxy_backend_http_requests_total ": + ("octavia_pool_http_requests_total ", None, None), + "haproxy_backend_http_requests_total{": + ("octavia_pool_http_requests_total{", None, {"proxy=": "pool="}), + "haproxy_backend_http_responses_total ": + ("octavia_pool_http_responses_total ", None, None), + "haproxy_backend_http_responses_total{": + ("octavia_pool_http_responses_total{", None, {"proxy=": "pool="}), + "haproxy_backend_http_cache_lookups_total ": + ("octavia_pool_http_cache_lookups_total ", None, None), + "haproxy_backend_http_cache_lookups_total{": + ("octavia_pool_http_cache_lookups_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_http_cache_hits_total ": + ("octavia_pool_http_cache_hits_total ", None, None), + "haproxy_backend_http_cache_hits_total{": + ("octavia_pool_http_cache_hits_total{", None, {"proxy=": "pool="}), + "haproxy_backend_http_comp_bytes_in_total ": + ("octavia_pool_http_comp_bytes_in_total ", None, None), + "haproxy_backend_http_comp_bytes_in_total{": + ("octavia_pool_http_comp_bytes_in_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_http_comp_bytes_out_total ": + ("octavia_pool_http_comp_bytes_out_total ", None, None), + "haproxy_backend_http_comp_bytes_out_total{": + ("octavia_pool_http_comp_bytes_out_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_http_comp_bytes_bypassed_total ": + ("octavia_pool_http_comp_bytes_bypassed_total ", None, None), + "haproxy_backend_http_comp_bytes_bypassed_total{": + ("octavia_pool_http_comp_bytes_bypassed_total{", None, + {"proxy=": "pool="}), + "haproxy_backend_http_comp_responses_total ": + ("octavia_pool_http_comp_responses_total ", None, None), + "haproxy_backend_http_comp_responses_total{": + ("octavia_pool_http_comp_responses_total{", None, + {"proxy=": "pool="}), + + # Member Metrics + "haproxy_server_status ": + ("octavia_member_status ", + "# HELP octavia_member_status Current status of the member. " + "0=ERROR, 1=ONLINE, 2=OFFLINE, 3=DRAIN.\n", None), + "haproxy_server_status{": + ("octavia_member_status{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_current_sessions ": + ("octavia_member_current_sessions ", None, None), + "haproxy_server_current_sessions{": + ("octavia_member_current_sessions{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_sessions ": + ("octavia_member_max_sessions ", None, None), + "haproxy_server_max_sessions{": + ("octavia_member_max_sessions{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_limit_sessions ": + ("octavia_member_limit_sessions ", None, None), + "haproxy_server_limit_sessions{": + ("octavia_member_limit_sessions{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_sessions_total ": + ("octavia_member_sessions_total ", None, None), + "haproxy_server_sessions_total{": + ("octavia_member_sessions_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_session_rate ": + ("octavia_member_max_session_rate ", None, None), + "haproxy_server_max_session_rate{": + ("octavia_member_max_session_rate{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_last_session_seconds ": + ("octavia_member_last_session_seconds ", + "# HELP octavia_member_last_session_seconds Number of seconds since " + "last session assigned to the member.\n", None), + "haproxy_server_last_session_seconds{": + ("octavia_member_last_session_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_current_queue ": + ("octavia_member_current_queue ", None, None), + "haproxy_server_current_queue{": + ("octavia_member_current_queue{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_queue ": + ("octavia_member_max_queue ", None, None), + "haproxy_server_max_queue{": + ("octavia_member_max_queue{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_queue_limit ": + ("octavia_member_queue_limit ", + "# HELP octavia_member_queue_limit Configured maxqueue for the " + "member (0 meaning no limit).\n", None), + "haproxy_server_queue_limit{": + ("octavia_member_queue_limit{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_bytes_in_total ": + ("octavia_member_bytes_in_total ", None, None), + "haproxy_server_bytes_in_total{": + ("octavia_member_bytes_in_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_bytes_out_total ": + ("octavia_member_bytes_out_total ", None, None), + "haproxy_server_bytes_out_total{": + ("octavia_member_bytes_out_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_queue_time_average_seconds ": + ("octavia_member_queue_time_average_seconds ", None, None), + "haproxy_server_queue_time_average_seconds{": + ("octavia_member_queue_time_average_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_connect_time_average_seconds ": + ("octavia_member_connect_time_average_seconds ", None, None), + "haproxy_server_connect_time_average_seconds{": + ("octavia_member_connect_time_average_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_response_time_average_seconds ": + ("octavia_member_response_time_average_seconds ", None, None), + "haproxy_server_response_time_average_seconds{": + ("octavia_member_response_time_average_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_total_time_average_seconds ": + ("octavia_member_total_time_average_seconds ", None, None), + "haproxy_server_total_time_average_seconds{": + ("octavia_member_total_time_average_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_queue_time_seconds ": + ("octavia_member_max_queue_time_seconds ", None, None), + "haproxy_server_max_queue_time_seconds{": + ("octavia_member_max_queue_time_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_connect_time_seconds ": + ("octavia_member_max_connect_time_seconds ", None, None), + "haproxy_server_max_connect_time_seconds{": + ("octavia_member_max_connect_time_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_response_time_seconds ": + ("octavia_member_max_response_time_seconds ", + "# HELP octavia_member_max_response_time_seconds Maximum observed " + "time spent waiting for a member response.\n", None), + "haproxy_server_max_response_time_seconds{": + ("octavia_member_max_response_time_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_max_total_time_seconds ": + ("octavia_member_max_total_time_seconds ", None, None), + "haproxy_server_max_total_time_seconds{": + ("octavia_member_max_total_time_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_connection_attempts_total ": + ("octavia_member_connection_attempts_total ", None, None), + "haproxy_server_connection_attempts_total{": + ("octavia_member_connection_attempts_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_connection_reuses_total ": + ("octavia_member_connection_reuses_total ", None, None), + "haproxy_server_connection_reuses_total{": + ("octavia_member_connection_reuses_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_responses_denied_total ": + ("octavia_member_responses_denied_total ", None, None), + "haproxy_server_responses_denied_total{": + ("octavia_member_responses_denied_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_connection_errors_total ": + ("octavia_member_connection_errors_total ", None, None), + "haproxy_server_connection_errors_total{": + ("octavia_member_connection_errors_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_response_errors_total ": + ("octavia_member_response_errors_total ", None, None), + "haproxy_server_response_errors_total{": + ("octavia_member_response_errors_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_retry_warnings_total ": + ("octavia_member_retry_warnings_total ", None, None), + "haproxy_server_retry_warnings_total{": + ("octavia_member_retry_warnings_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_redispatch_warnings_total ": + ("octavia_member_redispatch_warnings_total ", None, None), + "haproxy_server_redispatch_warnings_total{": + ("octavia_member_redispatch_warnings_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_failed_header_rewriting_total ": + ("octavia_member_failed_header_rewriting_total ", None, None), + "haproxy_server_failed_header_rewriting_total{": + ("octavia_member_failed_header_rewriting_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_client_aborts_total ": + ("octavia_member_client_aborts_total ", None, None), + "haproxy_server_client_aborts_total{": + ("octavia_member_client_aborts_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_server_aborts_total ": + ("octavia_member_server_aborts_total ", None, None), + "haproxy_server_server_aborts_total{": + ("octavia_member_server_aborts_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_weight ": + ("octavia_member_weight ", + "# HELP octavia_member_weight Member weight.\n", None), + "haproxy_server_weight{": + ("octavia_member_weight{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_check_failures_total ": + ("octavia_member_check_failures_total ", + "# HELP octavia_member_check_failures_total Total number of failed " + "check (Only counts checks failed when the member is up).\n", None), + "haproxy_server_check_failures_total{": + ("octavia_member_check_failures_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_check_up_down_total ": + ("octavia_member_check_up_down_total ", None, None), + "haproxy_server_check_up_down_total{": + ("octavia_member_check_up_down_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_downtime_seconds_total ": + ("octavia_member_downtime_seconds_total ", + "# HELP octavia_member_downtime_seconds_total Total downtime (in " + "seconds) for the member.\n", None), + "haproxy_server_downtime_seconds_total{": + ("octavia_member_downtime_seconds_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_check_last_change_seconds ": + ("octavia_member_check_last_change_seconds ", None, None), + "haproxy_server_check_last_change_seconds{": + ("octavia_member_check_last_change_seconds{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_current_throttle ": + ("octavia_member_current_throttle ", + "# HELP octavia_member_current_throttle Current throttle percentage " + "for the member, when slowstart is active, or no value if not in " + "slowstart.\n", None), + "haproxy_server_current_throttle{": + ("octavia_member_current_throttle{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_loadbalanced_total ": + ("octavia_member_loadbalanced_total ", + "# HELP octavia_member_loadbalanced_total Total number of times a " + "member was selected, either for new sessions, or when " + "redispatching.\n", None), + "haproxy_server_loadbalanced_total{": + ("octavia_member_loadbalanced_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_http_responses_total ": + ("octavia_member_http_responses_total ", None, None), + "haproxy_server_http_responses_total{": + ("octavia_member_http_responses_total{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_server_idle_connections_current ": + ("octavia_member_idle_connections_current ", None, None), + "haproxy_server_server_idle_connections_current{": + ("octavia_member_idle_connections_current{", None, + {"proxy=": "pool=", "server=": "member="}), + "haproxy_server_server_idle_connections_limit ": + ("octavia_member_idle_connections_limit ", None, None), + "haproxy_server_server_idle_connections_limit{": + ("octavia_member_idle_connections_limit{", None, + {"proxy=": "pool=", "server=": "member="}), +} +METRIC_KEYS = METRIC_MAP.keys() + + +class PrometheusProxy(SimpleHTTPRequestHandler): + + protocol_version = 'HTTP/1.1' + + # No need to log every request through the proxy + def log_request(self, *args, **kwargs): + pass + + def _add_cpu_utilization(self, metrics_buffer): + cpu_pcnt = (psutil.getloadavg()[0] / os.cpu_count()) * 100 + metrics_buffer += ("# HELP octavia_loadbalancer_cpu Load balancer " + "CPU utilization (percentage).\n") + metrics_buffer += "# TYPE octavia_loadbalancer_cpu gauge\n" + cpu_metric_string = f"octavia_loadbalancer_cpu {cpu_pcnt:.1f}\n" + metrics_buffer += cpu_metric_string + return metrics_buffer + + def _add_memory_utilization(self, metrics_buffer): + mem_pcnt = psutil.virtual_memory()[2] + metrics_buffer += ("# HELP octavia_loadbalancer_memory Load balancer " + "memory utilization (percentage).\n") + metrics_buffer += "# TYPE octavia_loadbalancer_memory gauge\n" + mem_metric_string = f"octavia_loadbalancer_memory {mem_pcnt:.1f}\n" + metrics_buffer += mem_metric_string + return metrics_buffer + + def do_GET(self): + metrics_buffer = "" + + metrics_buffer = self._add_cpu_utilization(metrics_buffer) + metrics_buffer = self._add_memory_utilization(metrics_buffer) + + try: + with urllib.request.urlopen(METRICS_URL) as source: # nosec + lines = source.readlines() + for line in lines: + line = line.decode("utf-8") + # Don't report metrics for the internal prometheus + # proxy loop. The user facing listener will still be + # reported. + if "prometheus-exporter" in line: + continue + match = next((x for x in METRIC_KEYS if x in line), False) + if match: + map_tuple = METRIC_MAP[match] + if map_tuple[1] and "HELP" in line: + metrics_buffer += map_tuple[1] + else: + if map_tuple[2] and not line.startswith("#"): + for key in map_tuple[2].keys(): + line = line.replace(key, + map_tuple[2][key]) + metrics_buffer += line.replace(match, + map_tuple[0]) + elif PRINT_REJECTED: + print("REJECTED: %s" % line) + except Exception as e: + print(str(e), flush=True) + traceback.print_tb(e.__traceback__) + self.send_response(502) + self.send_header("connection", "close") + self.end_headers() + return + + self.send_response(200) + self.send_header("cache-control", "no-cache") + self.send_header("content-type", "text/plain; version=0.0.4") + self.send_header("connection", "close") + self.end_headers() + self.wfile.write(metrics_buffer.encode("utf-8")) + + +class SignalHandler: + + def __init__(self): + signal.signal(signal.SIGINT, self.shutdown) + signal.signal(signal.SIGTERM, self.shutdown) + + def shutdown(self, *args): + EXIT_EVENT.set() + + +def shutdown_thread(http): + EXIT_EVENT.wait() + http.shutdown() + + +# TODO(johnsom) Remove and switch to ThreadingHTTPServer once python3.7 is +# the minimum version supported. +class ThreadedHTTPServer(socketserver.ThreadingMixIn, HTTPServer): + daemon_threads = True + + +def main(): + global PRINT_REJECTED + try: + if sys.argv[1] == "--rejected": + PRINT_REJECTED = True + except Exception: + pass + + SignalHandler() + + while not EXIT_EVENT.is_set(): + # The amphora-haproxy network namespace may not be present, so handle + # it gracefully. + try: + with network_namespace.NetworkNamespace(consts.AMPHORA_NAMESPACE): + httpd = ThreadedHTTPServer(('127.0.0.1', 9102), + PrometheusProxy) + shutdownthread = threading.Thread(target=shutdown_thread, + args=(httpd,)) + shutdownthread.start() + + # TODO(johnsom) Uncomment this when we move to + # ThreadingHTTPServer + # httpd.daemon_threads = True + print("Now serving on port 9102") + httpd.serve_forever() + except Exception: + time.sleep(1) + + +if __name__ == "__main__": + main() diff --git a/octavia/common/config.py b/octavia/common/config.py index b27fccbc86..86bd179a13 100644 --- a/octavia/common/config.py +++ b/octavia/common/config.py @@ -84,6 +84,8 @@ api_opts = [ help=_("Allow users to create TLS Terminated listeners?")), cfg.BoolOpt('allow_ping_health_monitors', default=True, help=_("Allow users to create PING type Health Monitors?")), + cfg.BoolOpt('allow_prometheus_listeners', default=True, + help=_("Allow users to create PROMETHEUS type listeners?")), cfg.DictOpt('enabled_provider_drivers', help=_('A comma separated list of dictionaries of the ' 'enabled provider driver names and descriptions. ' diff --git a/octavia/common/constants.py b/octavia/common/constants.py index 6240b5718e..9c3d4721ec 100644 --- a/octavia/common/constants.py +++ b/octavia/common/constants.py @@ -150,6 +150,8 @@ PROTOCOL_TERMINATED_HTTPS = lib_consts.PROTOCOL_TERMINATED_HTTPS # 'PROXY' PROTOCOL_PROXY = lib_consts.PROTOCOL_PROXY SUPPORTED_PROTOCOLS = lib_consts.SUPPORTED_PROTOCOLS +# 'PROMETHEUS' +PROTOCOL_PROMETHEUS = lib_consts.PROTOCOL_PROMETHEUS # 'provisioning_status' PROVISIONING_STATUS = lib_consts.PROVISIONING_STATUS @@ -215,7 +217,8 @@ VALID_LISTENER_POOL_PROTOCOL_MAP = { PROTOCOL_TERMINATED_HTTPS: [PROTOCOL_HTTP, PROTOCOL_PROXY, lib_consts.PROTOCOL_PROXYV2], PROTOCOL_UDP: [PROTOCOL_UDP], - lib_consts.PROTOCOL_SCTP: [lib_consts.PROTOCOL_SCTP]} + lib_consts.PROTOCOL_SCTP: [lib_consts.PROTOCOL_SCTP], + lib_consts.PROTOCOL_PROMETHEUS: []} # API Integer Ranges MIN_PORT_NUMBER = 1 @@ -835,6 +838,7 @@ L4_PROTOCOL_MAP = { lib_consts.PROTOCOL_PROXYV2: PROTOCOL_TCP, PROTOCOL_UDP: PROTOCOL_UDP, lib_consts.PROTOCOL_SCTP: lib_consts.PROTOCOL_SCTP, + lib_consts.PROTOCOL_PROMETHEUS: lib_consts.PROTOCOL_TCP, } # Image drivers diff --git a/octavia/common/exceptions.py b/octavia/common/exceptions.py index 43f68df053..6f0994d394 100644 --- a/octavia/common/exceptions.py +++ b/octavia/common/exceptions.py @@ -419,3 +419,8 @@ class InvalidIPAddress(APIException): class AmphoraNetworkConfigException(OctaviaException): message = _('Cannot configure network resource in the amphora: ' '%(detail)s') + + +class ListenerNoChildren(APIException): + msg = _('Protocol %(protocol)s listeners cannot have child objects.') + code = 400 diff --git a/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py b/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py index f746fc67ef..73013bb756 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +++ b/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py @@ -28,7 +28,8 @@ PROTOCOL_MAP = { constants.PROTOCOL_HTTPS: 'tcp', constants.PROTOCOL_PROXY: 'proxy', lib_consts.PROTOCOL_PROXYV2: 'proxy', - constants.PROTOCOL_TERMINATED_HTTPS: 'http' + constants.PROTOCOL_TERMINATED_HTTPS: 'http', + lib_consts.PROTOCOL_PROMETHEUS: 'http' } BALANCE_MAP = { @@ -102,6 +103,8 @@ class JinjaTemplater(object): feature_compatibility[constants.HTTP_REUSE] = True if not (int(haproxy_versions[0]) < 2 and int(haproxy_versions[1]) < 9): feature_compatibility[constants.POOL_ALPN] = True + if int(haproxy_versions[0]) >= 2: + feature_compatibility[lib_consts.PROTOCOL_PROMETHEUS] = True return self.render_loadbalancer_obj( host_amphora, listeners, tls_certs=tls_certs, @@ -165,6 +168,13 @@ class JinjaTemplater(object): state_file_path = '%s/%s/servers-state' % ( self.base_amp_path, listeners[0].load_balancer.id) + prometheus_listener = False + for listener in listeners: + if listener.protocol == lib_consts.PROTOCOL_PROMETHEUS: + prometheus_listener = True + break + enable_prometheus = prometheus_listener and feature_compatibility.get( + lib_consts.PROTOCOL_PROMETHEUS, False) return self._get_template().render( {'loadbalancer': loadbalancer, 'stats_sock': socket_path, @@ -174,7 +184,8 @@ class JinjaTemplater(object): 'administrative_log_facility': CONF.amphora_agent.administrative_log_facility, 'user_log_facility': CONF.amphora_agent.user_log_facility, - 'connection_logging': self.connection_logging}, + 'connection_logging': self.connection_logging, + 'enable_prometheus': enable_prometheus}, constants=constants, lib_consts=lib_consts) def _transform_loadbalancer(self, host_amphora, loadbalancer, listeners, @@ -262,6 +273,8 @@ class JinjaTemplater(object): CONF.haproxy_amphora.timeout_member_data), 'timeout_tcp_inspect': (listener.timeout_tcp_inspect or CONF.haproxy_amphora.timeout_tcp_inspect), + lib_consts.PROTOCOL_PROMETHEUS: feature_compatibility.get( + lib_consts.PROTOCOL_PROMETHEUS, False) } if self.connection_logging: ret_value['user_log_format'] = ( @@ -292,7 +305,8 @@ class JinjaTemplater(object): tls_certs[listener.client_crl_container_id])) tls_enabled = False - if listener.protocol == constants.PROTOCOL_TERMINATED_HTTPS: + if listener.protocol in (constants.PROTOCOL_TERMINATED_HTTPS, + constants.PROTOCOL_PROMETHEUS): tls_enabled = True if listener.tls_ciphers is not None: ret_value['tls_ciphers'] = listener.tls_ciphers diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 index 41f812a3c0..b2a6dc1ad1 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 @@ -50,4 +50,6 @@ defaults {% block peers %}{% endblock peers %} +{% block prometheus %}{% endblock prometheus %} + {% block proxies %}{% endblock proxies %} diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 index c6cba438b2..37a506b41a 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 @@ -28,6 +28,27 @@ {{ peers_macro(constants, loadbalancer) }} {% endblock peers %} +{% block prometheus %} +{% if enable_prometheus %} +frontend prometheus-exporter-internal-endpoint + bind 127.0.0.1:9101 + mode http + no log + option http-use-htx + http-request use-service prometheus-exporter if { path /metrics } + http-request reject + timeout http-request 5s + timeout client 5s +backend prometheus-exporter-internal + mode http + no log + balance first + timeout connect 5s + timeout server 5s + server prometheus-internal 127.0.0.1:9102 +{% endif %} +{% endblock prometheus %} + {% block proxies %} {% if loadbalancer.enabled %} {% for listener in loadbalancer.listeners if listener.enabled %} diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 index 2778d34e63..705dfee9c3 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 @@ -177,12 +177,16 @@ frontend {{ listener.id }} default_backend {{ listener.default_pool.id }}:{{ listener.id }} {% endif %} timeout client {{ listener.timeout_client_data }} - {% if listener.user_log_format is defined %} - log-format {{ listener.user_log_format }} - {% endif %} {% if listener.timeout_tcp_inspect %} tcp-request inspect-delay {{ listener.timeout_tcp_inspect }} {% endif %} + {% if listener.protocol == lib_consts.PROTOCOL_PROMETHEUS and + listener.get(lib_consts.PROTOCOL_PROMETHEUS, False) %} + default_backend prometheus-exporter-internal + {% endif %} + {% if listener.user_log_format is defined %} + log-format {{ listener.user_log_format }} + {% endif %} {% endmacro %} diff --git a/octavia/db/migration/alembic_migrations/versions/6ac558d7fc21_add_prometheus_listener_protocol.py b/octavia/db/migration/alembic_migrations/versions/6ac558d7fc21_add_prometheus_listener_protocol.py new file mode 100644 index 0000000000..906d9322e5 --- /dev/null +++ b/octavia/db/migration/alembic_migrations/versions/6ac558d7fc21_add_prometheus_listener_protocol.py @@ -0,0 +1,45 @@ +# Copyright 2021 Red Hat, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Add prometheus listener protocol + +Revision ID: 6ac558d7fc21 +Revises: b8bd389cbae7 +Create Date: 2021-10-01 20:06:46.813842 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy import sql + +# revision identifiers, used by Alembic. +revision = '6ac558d7fc21' +down_revision = 'b8bd389cbae7' + +new_protocol = 'PROMETHEUS' + + +def upgrade(): + insert_table = sql.table( + u'protocol', + sql.column(u'name', sa.String), + sql.column(u'description', sa.String) + ) + + op.bulk_insert( + insert_table, + [ + {'name': new_protocol} + ] + ) diff --git a/octavia/tests/common/sample_haproxy_prometheus b/octavia/tests/common/sample_haproxy_prometheus new file mode 100644 index 0000000000..a6ec9da3f8 --- /dev/null +++ b/octavia/tests/common/sample_haproxy_prometheus @@ -0,0 +1,886 @@ +# HELP haproxy_process_nbthread Configured number of threads. +# TYPE haproxy_process_nbthread gauge +haproxy_process_nbthread 1 +# HELP haproxy_process_nbproc Configured number of processes. +# TYPE haproxy_process_nbproc gauge +haproxy_process_nbproc 1 +# HELP haproxy_process_relative_process_id Relative process id, starting at 1. +# TYPE haproxy_process_relative_process_id gauge +haproxy_process_relative_process_id 1 +# HELP haproxy_process_start_time_seconds Start time in seconds. +# TYPE haproxy_process_start_time_seconds gauge +haproxy_process_start_time_seconds 1644875239 +# HELP haproxy_process_max_memory_bytes Per-process memory limit (in bytes); 0=unset. +# TYPE haproxy_process_max_memory_bytes gauge +haproxy_process_max_memory_bytes 0 +# HELP haproxy_process_pool_allocated_bytes Total amount of memory allocated in pools (in bytes). +# TYPE haproxy_process_pool_allocated_bytes gauge +haproxy_process_pool_allocated_bytes 111616 +# HELP haproxy_process_pool_used_bytes Total amount of memory used in pools (in bytes). +# TYPE haproxy_process_pool_used_bytes gauge +haproxy_process_pool_used_bytes 78848 +# HELP haproxy_process_pool_failures_total Total number of failed pool allocations. +# TYPE haproxy_process_pool_failures_total counter +haproxy_process_pool_failures_total 0 +# HELP haproxy_process_max_fds Maximum number of open file descriptors; 0=unset. +# TYPE haproxy_process_max_fds gauge +haproxy_process_max_fds 375033 +# HELP haproxy_process_max_sockets Maximum numer of open sockets. +# TYPE haproxy_process_max_sockets gauge +haproxy_process_max_sockets 375033 +# HELP haproxy_process_max_connections Maximum number of concurrent connections. +# TYPE haproxy_process_max_connections gauge +haproxy_process_max_connections 150000 +# HELP haproxy_process_hard_max_connections Initial Maximum number of concurrent connections. +# TYPE haproxy_process_hard_max_connections gauge +haproxy_process_hard_max_connections 150000 +# HELP haproxy_process_current_connections Number of active sessions. +# TYPE haproxy_process_current_connections gauge +haproxy_process_current_connections 1 +# HELP haproxy_process_connections_total Total number of created sessions. +# TYPE haproxy_process_connections_total counter +haproxy_process_connections_total 680 +# HELP haproxy_process_requests_total Total number of requests (TCP or HTTP). +# TYPE haproxy_process_requests_total counter +haproxy_process_requests_total 680 +# HELP haproxy_process_max_ssl_connections Configured maximum number of concurrent SSL connections. +# TYPE haproxy_process_max_ssl_connections gauge +haproxy_process_max_ssl_connections 0 +# HELP haproxy_process_current_ssl_connections Number of opened SSL connections. +# TYPE haproxy_process_current_ssl_connections gauge +haproxy_process_current_ssl_connections 0 +# HELP haproxy_process_ssl_connections_total Total number of opened SSL connections. +# TYPE haproxy_process_ssl_connections_total counter +haproxy_process_ssl_connections_total 0 +# HELP haproxy_process_max_pipes Configured maximum number of pipes. +# TYPE haproxy_process_max_pipes gauge +haproxy_process_max_pipes 37500 +# HELP haproxy_process_pipes_used_total Number of pipes in used. +# TYPE haproxy_process_pipes_used_total counter +haproxy_process_pipes_used_total 0 +# HELP haproxy_process_pipes_free_total Number of pipes unused. +# TYPE haproxy_process_pipes_free_total counter +haproxy_process_pipes_free_total 0 +# HELP haproxy_process_current_connection_rate Current number of connections per second over last elapsed second. +# TYPE haproxy_process_current_connection_rate gauge +haproxy_process_current_connection_rate 1 +# HELP haproxy_process_limit_connection_rate Configured maximum number of connections per second. +# TYPE haproxy_process_limit_connection_rate gauge +haproxy_process_limit_connection_rate 0 +# HELP haproxy_process_max_connection_rate Maximum observed number of connections per second. +# TYPE haproxy_process_max_connection_rate gauge +haproxy_process_max_connection_rate 2 +# HELP haproxy_process_current_session_rate Current number of sessions per second over last elapsed second. +# TYPE haproxy_process_current_session_rate gauge +haproxy_process_current_session_rate 1 +# HELP haproxy_process_limit_session_rate Configured maximum number of sessions per second. +# TYPE haproxy_process_limit_session_rate gauge +haproxy_process_limit_session_rate 0 +# HELP haproxy_process_max_session_rate Maximum observed number of sessions per second. +# TYPE haproxy_process_max_session_rate gauge +haproxy_process_max_session_rate 2 +# HELP haproxy_process_current_ssl_rate Current number of SSL sessions per second over last elapsed second. +# TYPE haproxy_process_current_ssl_rate gauge +haproxy_process_current_ssl_rate 0 +# HELP haproxy_process_limit_ssl_rate Configured maximum number of SSL sessions per second. +# TYPE haproxy_process_limit_ssl_rate gauge +haproxy_process_limit_ssl_rate 0 +# HELP haproxy_process_max_ssl_rate Maximum observed number of SSL sessions per second. +# TYPE haproxy_process_max_ssl_rate gauge +haproxy_process_max_ssl_rate 0 +# HELP haproxy_process_current_frontend_ssl_key_rate Current frontend SSL Key computation per second over last elapsed second. +# TYPE haproxy_process_current_frontend_ssl_key_rate gauge +haproxy_process_current_frontend_ssl_key_rate 0 +# HELP haproxy_process_max_frontend_ssl_key_rate Maximum observed frontend SSL Key computation per second. +# TYPE haproxy_process_max_frontend_ssl_key_rate gauge +haproxy_process_max_frontend_ssl_key_rate 0 +# HELP haproxy_process_frontent_ssl_reuse SSL session reuse ratio (percent). +# TYPE haproxy_process_frontent_ssl_reuse gauge +haproxy_process_frontent_ssl_reuse 0 +# HELP haproxy_process_current_backend_ssl_key_rate Current backend SSL Key computation per second over last elapsed second. +# TYPE haproxy_process_current_backend_ssl_key_rate gauge +haproxy_process_current_backend_ssl_key_rate 0 +# HELP haproxy_process_max_backend_ssl_key_rate Maximum observed backend SSL Key computation per second. +# TYPE haproxy_process_max_backend_ssl_key_rate gauge +haproxy_process_max_backend_ssl_key_rate 0 +# HELP haproxy_process_ssl_cache_lookups_total Total number of SSL session cache lookups. +# TYPE haproxy_process_ssl_cache_lookups_total counter +haproxy_process_ssl_cache_lookups_total 0 +# HELP haproxy_process_ssl_cache_misses_total Total number of SSL session cache misses. +# TYPE haproxy_process_ssl_cache_misses_total counter +haproxy_process_ssl_cache_misses_total 0 +# HELP haproxy_process_http_comp_bytes_in_total Number of bytes per second over last elapsed second, before http compression. +# TYPE haproxy_process_http_comp_bytes_in_total counter +haproxy_process_http_comp_bytes_in_total 0 +# HELP haproxy_process_http_comp_bytes_out_total Number of bytes per second over last elapsed second, after http compression. +# TYPE haproxy_process_http_comp_bytes_out_total counter +haproxy_process_http_comp_bytes_out_total 0 +# HELP haproxy_process_limit_http_comp Configured maximum input compression rate in bytes. +# TYPE haproxy_process_limit_http_comp gauge +haproxy_process_limit_http_comp 0 +# HELP haproxy_process_current_zlib_memory Current memory used for zlib in bytes. +# TYPE haproxy_process_current_zlib_memory gauge +haproxy_process_current_zlib_memory 0 +# HELP haproxy_process_max_zlib_memory Configured maximum amount of memory for zlib in bytes. +# TYPE haproxy_process_max_zlib_memory gauge +haproxy_process_max_zlib_memory 0 +# HELP haproxy_process_current_tasks Current number of tasks. +# TYPE haproxy_process_current_tasks gauge +haproxy_process_current_tasks 20 +# HELP haproxy_process_current_run_queue Current number of tasks in the run-queue. +# TYPE haproxy_process_current_run_queue gauge +haproxy_process_current_run_queue 1 +# HELP haproxy_process_idle_time_percent Idle to total ratio over last sample (percent). +# TYPE haproxy_process_idle_time_percent gauge +haproxy_process_idle_time_percent 100 +# HELP haproxy_process_stopping Non zero means stopping in progress. +# TYPE haproxy_process_stopping gauge +haproxy_process_stopping 0 +# HELP haproxy_process_jobs Current number of active jobs (listeners, sessions, open devices). +# TYPE haproxy_process_jobs gauge +haproxy_process_jobs 7 +# HELP haproxy_process_unstoppable_jobs Current number of active jobs that can''t be stopped during a soft stop. +# TYPE haproxy_process_unstoppable_jobs gauge +haproxy_process_unstoppable_jobs 0 +# HELP haproxy_process_listeners Current number of active listeners. +# TYPE haproxy_process_listeners gauge +haproxy_process_listeners 6 +# HELP haproxy_process_active_peers Current number of active peers. +# TYPE haproxy_process_active_peers gauge +haproxy_process_active_peers 0 +# HELP haproxy_process_connected_peers Current number of connected peers. +# TYPE haproxy_process_connected_peers gauge +haproxy_process_connected_peers 0 +# HELP haproxy_process_dropped_logs_total Total number of dropped logs. +# TYPE haproxy_process_dropped_logs_total counter +haproxy_process_dropped_logs_total 0 +# HELP haproxy_process_busy_polling_enabled Non zero if the busy polling is enabled. +# TYPE haproxy_process_busy_polling_enabled gauge +haproxy_process_busy_polling_enabled 0 +# HELP haproxy_frontend_status Current status of the service (frontend: 0=STOP, 1=UP, 2=FULL - backend: 0=DOWN, 1=UP - server: 0=DOWN, 1=UP, 2=MAINT, 3=DRAIN, 4=NOLB). +# TYPE haproxy_frontend_status gauge +haproxy_frontend_status{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_status{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 1 +haproxy_frontend_status{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +haproxy_frontend_status{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 1 +# HELP haproxy_frontend_current_sessions Current number of active sessions. +# TYPE haproxy_frontend_current_sessions gauge +haproxy_frontend_current_sessions{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_current_sessions{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_current_sessions{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_current_sessions{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_max_sessions Maximum observed number of active sessions. +# TYPE haproxy_frontend_max_sessions gauge +haproxy_frontend_max_sessions{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_max_sessions{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_max_sessions{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +haproxy_frontend_max_sessions{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_limit_sessions Configured session limit. +# TYPE haproxy_frontend_limit_sessions gauge +haproxy_frontend_limit_sessions{proxy="prometheus-exporter-internal-endpoint"} 150000 +haproxy_frontend_limit_sessions{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 50000 +haproxy_frontend_limit_sessions{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 50000 +haproxy_frontend_limit_sessions{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 50000 +# HELP haproxy_frontend_sessions_total Total number of sessions. +# TYPE haproxy_frontend_sessions_total counter +haproxy_frontend_sessions_total{proxy="prometheus-exporter-internal-endpoint"} 4 +haproxy_frontend_sessions_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_sessions_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +haproxy_frontend_sessions_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_limit_session_rate Configured limit on new sessions per second. +# TYPE haproxy_frontend_limit_session_rate gauge +haproxy_frontend_limit_session_rate{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_limit_session_rate{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_limit_session_rate{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_limit_session_rate{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_max_session_rate Maximum observed number of sessions per second. +# TYPE haproxy_frontend_max_session_rate gauge +haproxy_frontend_max_session_rate{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_max_session_rate{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_max_session_rate{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +haproxy_frontend_max_session_rate{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_connections_rate_max Maximum observed number of connections per second. +# TYPE haproxy_frontend_connections_rate_max gauge +haproxy_frontend_connections_rate_max{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_connections_rate_max{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_connections_rate_max{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +haproxy_frontend_connections_rate_max{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_connections_total Total number of connections. +# TYPE haproxy_frontend_connections_total counter +haproxy_frontend_connections_total{proxy="prometheus-exporter-internal-endpoint"} 4 +haproxy_frontend_connections_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_connections_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +haproxy_frontend_connections_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_bytes_in_total Current total of incoming bytes. +# TYPE haproxy_frontend_bytes_in_total counter +haproxy_frontend_bytes_in_total{proxy="prometheus-exporter-internal-endpoint"} 312 +haproxy_frontend_bytes_in_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_bytes_in_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 176 +haproxy_frontend_bytes_in_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_bytes_out_total Current total of outgoing bytes. +# TYPE haproxy_frontend_bytes_out_total counter +haproxy_frontend_bytes_out_total{proxy="prometheus-exporter-internal-endpoint"} 177027 +haproxy_frontend_bytes_out_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_bytes_out_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 145918 +haproxy_frontend_bytes_out_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_requests_denied_total Total number of denied requests. +# TYPE haproxy_frontend_requests_denied_total counter +haproxy_frontend_requests_denied_total{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_requests_denied_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_requests_denied_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_requests_denied_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_responses_denied_total Total number of denied responses. +# TYPE haproxy_frontend_responses_denied_total counter +haproxy_frontend_responses_denied_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_responses_denied_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_responses_denied_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_responses_denied_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_request_errors_total Total number of request errors. +# TYPE haproxy_frontend_request_errors_total counter +haproxy_frontend_request_errors_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_request_errors_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_request_errors_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_request_errors_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_denied_connections_total Total number of requests denied by "tcp-request connection" rules. +# TYPE haproxy_frontend_denied_connections_total counter +haproxy_frontend_denied_connections_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_denied_connections_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_denied_connections_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_denied_connections_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_denied_sessions_total Total number of requests denied by "tcp-request session" rules. +# TYPE haproxy_frontend_denied_sessions_total counter +haproxy_frontend_denied_sessions_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_denied_sessions_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_denied_sessions_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_denied_sessions_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_failed_header_rewriting_total Total number of failed header rewriting warnings. +# TYPE haproxy_frontend_failed_header_rewriting_total counter +haproxy_frontend_failed_header_rewriting_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_failed_header_rewriting_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_failed_header_rewriting_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_failed_header_rewriting_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_requests_rate_max Maximum observed number of HTTP requests per second. +# TYPE haproxy_frontend_http_requests_rate_max gauge +haproxy_frontend_http_requests_rate_max{proxy="prometheus-exporter-internal-endpoint"} 1 +haproxy_frontend_http_requests_rate_max{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_requests_rate_max{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +haproxy_frontend_http_requests_rate_max{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_requests_total Total number of HTTP requests received. +# TYPE haproxy_frontend_http_requests_total counter +haproxy_frontend_http_requests_total{proxy="prometheus-exporter-internal-endpoint"} 4 +haproxy_frontend_http_requests_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_requests_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +haproxy_frontend_http_requests_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_responses_total Total number of HTTP responses. +# TYPE haproxy_frontend_http_responses_total counter +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="1xx"} 0 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="1xx"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="1xx"} 0 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="1xx"} 0 +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="2xx"} 2 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="2xx"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="2xx"} 2 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="2xx"} 0 +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="3xx"} 0 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="3xx"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="3xx"} 0 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="3xx"} 0 +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="4xx"} 0 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="4xx"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="4xx"} 0 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="4xx"} 0 +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="5xx"} 0 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="5xx"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="5xx"} 0 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="5xx"} 0 +haproxy_frontend_http_responses_total{proxy="prometheus-exporter-internal-endpoint",code="other"} 1 +haproxy_frontend_http_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="other"} 0 +haproxy_frontend_http_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="other"} 0 +haproxy_frontend_http_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db",code="other"} 0 +# HELP haproxy_frontend_intercepted_requests_total Total number of intercepted HTTP requests. +# TYPE haproxy_frontend_intercepted_requests_total counter +haproxy_frontend_intercepted_requests_total{proxy="prometheus-exporter-internal-endpoint"} 3 +haproxy_frontend_intercepted_requests_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_intercepted_requests_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_intercepted_requests_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_cache_lookups_total Total number of HTTP cache lookups. +# TYPE haproxy_frontend_http_cache_lookups_total counter +haproxy_frontend_http_cache_lookups_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_cache_lookups_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_cache_lookups_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_cache_lookups_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_cache_hits_total Total number of HTTP cache hits. +# TYPE haproxy_frontend_http_cache_hits_total counter +haproxy_frontend_http_cache_hits_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_cache_hits_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_cache_hits_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_cache_hits_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_comp_bytes_in_total Total number of HTTP response bytes fed to the compressor. +# TYPE haproxy_frontend_http_comp_bytes_in_total counter +haproxy_frontend_http_comp_bytes_in_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_comp_bytes_in_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_comp_bytes_in_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_comp_bytes_in_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_comp_bytes_out_total Total number of HTTP response bytes emitted by the compressor. +# TYPE haproxy_frontend_http_comp_bytes_out_total counter +haproxy_frontend_http_comp_bytes_out_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_comp_bytes_out_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_comp_bytes_out_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_comp_bytes_out_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_comp_bytes_bypassed_total Total number of bytes that bypassed the HTTP compressor (CPU/BW limit). +# TYPE haproxy_frontend_http_comp_bytes_bypassed_total counter +haproxy_frontend_http_comp_bytes_bypassed_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_comp_bytes_bypassed_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_comp_bytes_bypassed_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_comp_bytes_bypassed_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_frontend_http_comp_responses_total Total number of HTTP responses that were compressed. +# TYPE haproxy_frontend_http_comp_responses_total counter +haproxy_frontend_http_comp_responses_total{proxy="prometheus-exporter-internal-endpoint"} 0 +haproxy_frontend_http_comp_responses_total{proxy="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_frontend_http_comp_responses_total{proxy="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +haproxy_frontend_http_comp_responses_total{proxy="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_status Current status of the service (frontend: 0=STOP, 1=UP, 2=FULL - backend: 0=DOWN, 1=UP - server: 0=DOWN, 1=UP, 2=MAINT, 3=DRAIN, 4=NOLB). +# TYPE haproxy_backend_status gauge +haproxy_backend_status{proxy="prometheus-exporter-internal"} 1 +haproxy_backend_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_current_sessions Current number of active sessions. +# TYPE haproxy_backend_current_sessions gauge +haproxy_backend_current_sessions{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_max_sessions Maximum observed number of active sessions. +# TYPE haproxy_backend_max_sessions gauge +haproxy_backend_max_sessions{proxy="prometheus-exporter-internal"} 1 +haproxy_backend_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_limit_sessions Configured session limit. +# TYPE haproxy_backend_limit_sessions gauge +haproxy_backend_limit_sessions{proxy="prometheus-exporter-internal"} 5000 +haproxy_backend_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 50000 +haproxy_backend_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 50000 +# HELP haproxy_backend_sessions_total Total number of sessions. +# TYPE haproxy_backend_sessions_total counter +haproxy_backend_sessions_total{proxy="prometheus-exporter-internal"} 2 +haproxy_backend_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_max_session_rate Maximum observed number of sessions per second. +# TYPE haproxy_backend_max_session_rate gauge +haproxy_backend_max_session_rate{proxy="prometheus-exporter-internal"} 1 +haproxy_backend_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_last_session_seconds Number of seconds since last session assigned to server/backend. +# TYPE haproxy_backend_last_session_seconds gauge +haproxy_backend_last_session_seconds{proxy="prometheus-exporter-internal"} 1829 +haproxy_backend_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} -1 +haproxy_backend_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} -1 +# HELP haproxy_backend_current_queue Current number of queued requests. +# TYPE haproxy_backend_current_queue gauge +haproxy_backend_current_queue{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_max_queue Maximum observed number of queued requests. +# TYPE haproxy_backend_max_queue gauge +haproxy_backend_max_queue{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_connection_attempts_total Total number of connection establishment attempts. +# TYPE haproxy_backend_connection_attempts_total counter +haproxy_backend_connection_attempts_total{proxy="prometheus-exporter-internal"} 2 +haproxy_backend_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_connection_reuses_total Total number of connection reuses. +# TYPE haproxy_backend_connection_reuses_total counter +haproxy_backend_connection_reuses_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_bytes_in_total Current total of incoming bytes. +# TYPE haproxy_backend_bytes_in_total counter +haproxy_backend_bytes_in_total{proxy="prometheus-exporter-internal"} 176 +haproxy_backend_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_bytes_out_total Current total of outgoing bytes. +# TYPE haproxy_backend_bytes_out_total counter +haproxy_backend_bytes_out_total{proxy="prometheus-exporter-internal"} 145918 +haproxy_backend_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_queue_time_average_seconds Avg. queue time for last 1024 successful connections. +# TYPE haproxy_backend_queue_time_average_seconds gauge +haproxy_backend_queue_time_average_seconds{proxy="prometheus-exporter-internal"} 0.000000 +haproxy_backend_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_connect_time_average_seconds Avg. connect time for last 1024 successful connections. +# TYPE haproxy_backend_connect_time_average_seconds gauge +haproxy_backend_connect_time_average_seconds{proxy="prometheus-exporter-internal"} 0.000000 +haproxy_backend_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_response_time_average_seconds Avg. response time for last 1024 successful connections. +# TYPE haproxy_backend_response_time_average_seconds gauge +haproxy_backend_response_time_average_seconds{proxy="prometheus-exporter-internal"} 0.001000 +haproxy_backend_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_total_time_average_seconds Avg. total time for last 1024 successful connections. +# TYPE haproxy_backend_total_time_average_seconds gauge +haproxy_backend_total_time_average_seconds{proxy="prometheus-exporter-internal"} 0.001000 +haproxy_backend_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_max_queue_time_seconds Maximum observed time spent in the queue +# TYPE haproxy_backend_max_queue_time_seconds gauge +haproxy_backend_max_queue_time_seconds{proxy="prometheus-exporter-internal"} 0.000000 +haproxy_backend_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_max_connect_time_seconds Maximum observed time spent waiting for a connection to complete +# TYPE haproxy_backend_max_connect_time_seconds gauge +haproxy_backend_max_connect_time_seconds{proxy="prometheus-exporter-internal"} 0.001000 +haproxy_backend_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_max_response_time_seconds Maximum observed time spent waiting for a server response +# TYPE haproxy_backend_max_response_time_seconds gauge +haproxy_backend_max_response_time_seconds{proxy="prometheus-exporter-internal"} 0.038000 +haproxy_backend_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_max_total_time_seconds Maximum observed total request+response time (request+queue+connect+response+processing) +# TYPE haproxy_backend_max_total_time_seconds gauge +haproxy_backend_max_total_time_seconds{proxy="prometheus-exporter-internal"} 0.038000 +haproxy_backend_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +haproxy_backend_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP haproxy_backend_requests_denied_total Total number of denied requests. +# TYPE haproxy_backend_requests_denied_total counter +haproxy_backend_requests_denied_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_requests_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_requests_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_responses_denied_total Total number of denied responses. +# TYPE haproxy_backend_responses_denied_total counter +haproxy_backend_responses_denied_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_connection_errors_total Total number of connection errors. +# TYPE haproxy_backend_connection_errors_total counter +haproxy_backend_connection_errors_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_response_errors_total Total number of response errors. +# TYPE haproxy_backend_response_errors_total counter +haproxy_backend_response_errors_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_retry_warnings_total Total number of retry warnings. +# TYPE haproxy_backend_retry_warnings_total counter +haproxy_backend_retry_warnings_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_redispatch_warnings_total Total number of redispatch warnings. +# TYPE haproxy_backend_redispatch_warnings_total counter +haproxy_backend_redispatch_warnings_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_failed_header_rewriting_total Total number of failed header rewriting warnings. +# TYPE haproxy_backend_failed_header_rewriting_total counter +haproxy_backend_failed_header_rewriting_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_client_aborts_total Total number of data transfers aborted by the client. +# TYPE haproxy_backend_client_aborts_total counter +haproxy_backend_client_aborts_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_server_aborts_total Total number of data transfers aborted by the server. +# TYPE haproxy_backend_server_aborts_total counter +haproxy_backend_server_aborts_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_weight Service weight. +# TYPE haproxy_backend_weight gauge +haproxy_backend_weight{proxy="prometheus-exporter-internal"} 1 +haproxy_backend_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_active_servers Current number of active servers. +# TYPE haproxy_backend_active_servers gauge +haproxy_backend_active_servers{proxy="prometheus-exporter-internal"} 1 +haproxy_backend_active_servers{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_active_servers{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_backup_servers Current number of backup servers. +# TYPE haproxy_backend_backup_servers gauge +haproxy_backend_backup_servers{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_backup_servers{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_backup_servers{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_check_up_down_total Total number of UP->DOWN transitions. +# TYPE haproxy_backend_check_up_down_total counter +haproxy_backend_check_up_down_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 1 +haproxy_backend_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 1 +# HELP haproxy_backend_check_last_change_seconds Number of seconds since the last UP<->DOWN transition. +# TYPE haproxy_backend_check_last_change_seconds gauge +haproxy_backend_check_last_change_seconds{proxy="prometheus-exporter-internal"} 3378 +haproxy_backend_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 3352 +haproxy_backend_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 3349 +# HELP haproxy_backend_downtime_seconds_total Total downtime (in seconds) for the service. +# TYPE haproxy_backend_downtime_seconds_total counter +haproxy_backend_downtime_seconds_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 3352 +haproxy_backend_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 3349 +# HELP haproxy_backend_loadbalanced_total Total number of times a service was selected, either for new sessions, or when redispatching. +# TYPE haproxy_backend_loadbalanced_total counter +haproxy_backend_loadbalanced_total{proxy="prometheus-exporter-internal"} 2 +haproxy_backend_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_requests_total Total number of HTTP requests received. +# TYPE haproxy_backend_http_requests_total counter +haproxy_backend_http_requests_total{proxy="prometheus-exporter-internal"} 2 +haproxy_backend_http_requests_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_requests_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_responses_total Total number of HTTP responses. +# TYPE haproxy_backend_http_responses_total counter +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="1xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="1xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="1xx"} 0 +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="2xx"} 2 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="2xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="2xx"} 0 +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="3xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="3xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="3xx"} 0 +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="4xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="4xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="4xx"} 0 +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="5xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="5xx"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="5xx"} 0 +haproxy_backend_http_responses_total{proxy="prometheus-exporter-internal",code="other"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="other"} 0 +haproxy_backend_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="other"} 0 +# HELP haproxy_backend_http_cache_lookups_total Total number of HTTP cache lookups. +# TYPE haproxy_backend_http_cache_lookups_total counter +haproxy_backend_http_cache_lookups_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_cache_lookups_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_cache_lookups_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_cache_hits_total Total number of HTTP cache hits. +# TYPE haproxy_backend_http_cache_hits_total counter +haproxy_backend_http_cache_hits_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_cache_hits_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_cache_hits_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_comp_bytes_in_total Total number of HTTP response bytes fed to the compressor. +# TYPE haproxy_backend_http_comp_bytes_in_total counter +haproxy_backend_http_comp_bytes_in_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_comp_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_comp_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_comp_bytes_out_total Total number of HTTP response bytes emitted by the compressor. +# TYPE haproxy_backend_http_comp_bytes_out_total counter +haproxy_backend_http_comp_bytes_out_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_comp_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_comp_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_comp_bytes_bypassed_total Total number of bytes that bypassed the HTTP compressor (CPU/BW limit). +# TYPE haproxy_backend_http_comp_bytes_bypassed_total counter +haproxy_backend_http_comp_bytes_bypassed_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_comp_bytes_bypassed_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_comp_bytes_bypassed_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_backend_http_comp_responses_total Total number of HTTP responses that were compressed. +# TYPE haproxy_backend_http_comp_responses_total counter +haproxy_backend_http_comp_responses_total{proxy="prometheus-exporter-internal"} 0 +haproxy_backend_http_comp_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +haproxy_backend_http_comp_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP haproxy_server_status Current status of the service (frontend: 0=STOP, 1=UP, 2=FULL - backend: 0=DOWN, 1=UP - server: 0=DOWN, 1=UP, 2=MAINT, 3=DRAIN, 4=NOLB). +# TYPE haproxy_server_status gauge +haproxy_server_status{proxy="prometheus-exporter-internal",server="prometheus-internal"} 1 +haproxy_server_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_status{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_current_sessions Current number of active sessions. +# TYPE haproxy_server_current_sessions gauge +haproxy_server_current_sessions{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_current_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_max_sessions Maximum observed number of active sessions. +# TYPE haproxy_server_max_sessions gauge +haproxy_server_max_sessions{proxy="prometheus-exporter-internal",server="prometheus-internal"} 1 +haproxy_server_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_limit_sessions Configured session limit. +# TYPE haproxy_server_limit_sessions gauge +haproxy_server_limit_sessions{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_limit_sessions{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_sessions_total Total number of sessions. +# TYPE haproxy_server_sessions_total counter +haproxy_server_sessions_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 2 +haproxy_server_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_sessions_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_max_session_rate Maximum observed number of sessions per second. +# TYPE haproxy_server_max_session_rate gauge +haproxy_server_max_session_rate{proxy="prometheus-exporter-internal",server="prometheus-internal"} 1 +haproxy_server_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_session_rate{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_last_session_seconds Number of seconds since last session assigned to server/backend. +# TYPE haproxy_server_last_session_seconds gauge +haproxy_server_last_session_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 1829 +haproxy_server_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} -1 +haproxy_server_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} -1 +haproxy_server_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} -1 +haproxy_server_last_session_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} -1 +# HELP haproxy_server_current_queue Current number of queued requests. +# TYPE haproxy_server_current_queue gauge +haproxy_server_current_queue{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_current_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_max_queue Maximum observed number of queued requests. +# TYPE haproxy_server_max_queue gauge +haproxy_server_max_queue{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_max_queue{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_queue_limit Configured maxqueue for the server (0 meaning no limit). +# TYPE haproxy_server_queue_limit gauge +haproxy_server_queue_limit{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_queue_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_queue_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_queue_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_queue_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_bytes_in_total Current total of incoming bytes. +# TYPE haproxy_server_bytes_in_total counter +haproxy_server_bytes_in_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 176 +haproxy_server_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_bytes_in_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_bytes_out_total Current total of outgoing bytes. +# TYPE haproxy_server_bytes_out_total counter +haproxy_server_bytes_out_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 145918 +haproxy_server_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_bytes_out_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_queue_time_average_seconds Avg. queue time for last 1024 successful connections. +# TYPE haproxy_server_queue_time_average_seconds gauge +haproxy_server_queue_time_average_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.000000 +haproxy_server_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_queue_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_connect_time_average_seconds Avg. connect time for last 1024 successful connections. +# TYPE haproxy_server_connect_time_average_seconds gauge +haproxy_server_connect_time_average_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.000000 +haproxy_server_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_connect_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_response_time_average_seconds Avg. response time for last 1024 successful connections. +# TYPE haproxy_server_response_time_average_seconds gauge +haproxy_server_response_time_average_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.001000 +haproxy_server_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_response_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_total_time_average_seconds Avg. total time for last 1024 successful connections. +# TYPE haproxy_server_total_time_average_seconds gauge +haproxy_server_total_time_average_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.001000 +haproxy_server_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_total_time_average_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_max_queue_time_seconds Maximum observed time spent in the queue +# TYPE haproxy_server_max_queue_time_seconds gauge +haproxy_server_max_queue_time_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.000000 +haproxy_server_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_queue_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_max_connect_time_seconds Maximum observed time spent waiting for a connection to complete +# TYPE haproxy_server_max_connect_time_seconds gauge +haproxy_server_max_connect_time_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.001000 +haproxy_server_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_connect_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_max_response_time_seconds Maximum observed time spent waiting for a server response +# TYPE haproxy_server_max_response_time_seconds gauge +haproxy_server_max_response_time_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.038000 +haproxy_server_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_response_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_max_total_time_seconds Maximum observed total request+response time (request+queue+connect+response+processing) +# TYPE haproxy_server_max_total_time_seconds gauge +haproxy_server_max_total_time_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0.038000 +haproxy_server_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +haproxy_server_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +haproxy_server_max_total_time_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP haproxy_server_connection_attempts_total Total number of connection establishment attempts. +# TYPE haproxy_server_connection_attempts_total counter +haproxy_server_connection_attempts_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 2 +haproxy_server_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_attempts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_connection_reuses_total Total number of connection reuses. +# TYPE haproxy_server_connection_reuses_total counter +haproxy_server_connection_reuses_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_reuses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_responses_denied_total Total number of denied responses. +# TYPE haproxy_server_responses_denied_total counter +haproxy_server_responses_denied_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_responses_denied_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_connection_errors_total Total number of connection errors. +# TYPE haproxy_server_connection_errors_total counter +haproxy_server_connection_errors_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_connection_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_response_errors_total Total number of response errors. +# TYPE haproxy_server_response_errors_total counter +haproxy_server_response_errors_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_response_errors_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_retry_warnings_total Total number of retry warnings. +# TYPE haproxy_server_retry_warnings_total counter +haproxy_server_retry_warnings_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_retry_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_redispatch_warnings_total Total number of redispatch warnings. +# TYPE haproxy_server_redispatch_warnings_total counter +haproxy_server_redispatch_warnings_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_redispatch_warnings_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_failed_header_rewriting_total Total number of failed header rewriting warnings. +# TYPE haproxy_server_failed_header_rewriting_total counter +haproxy_server_failed_header_rewriting_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_failed_header_rewriting_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_client_aborts_total Total number of data transfers aborted by the client. +# TYPE haproxy_server_client_aborts_total counter +haproxy_server_client_aborts_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_client_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_server_aborts_total Total number of data transfers aborted by the server. +# TYPE haproxy_server_server_aborts_total counter +haproxy_server_server_aborts_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_aborts_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_weight Service weight. +# TYPE haproxy_server_weight gauge +haproxy_server_weight{proxy="prometheus-exporter-internal",server="prometheus-internal"} 1 +haproxy_server_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +haproxy_server_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 1 +haproxy_server_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +haproxy_server_weight{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 1 +# HELP haproxy_server_check_failures_total Total number of failed check (Only counts checks failed when the server is up). +# TYPE haproxy_server_check_failures_total counter +haproxy_server_check_failures_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_check_failures_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3 +haproxy_server_check_failures_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 3 +haproxy_server_check_failures_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3 +haproxy_server_check_failures_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 3 +# HELP haproxy_server_check_up_down_total Total number of UP->DOWN transitions. +# TYPE haproxy_server_check_up_down_total counter +haproxy_server_check_up_down_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +haproxy_server_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 1 +haproxy_server_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +haproxy_server_check_up_down_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 1 +# HELP haproxy_server_downtime_seconds_total Total downtime (in seconds) for the service. +# TYPE haproxy_server_downtime_seconds_total counter +haproxy_server_downtime_seconds_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3353 +haproxy_server_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 3352 +haproxy_server_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3350 +haproxy_server_downtime_seconds_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 3349 +# HELP haproxy_server_check_last_change_seconds Number of seconds since the last UP<->DOWN transition. +# TYPE haproxy_server_check_last_change_seconds gauge +haproxy_server_check_last_change_seconds{proxy="prometheus-exporter-internal",server="prometheus-internal"} 3378 +haproxy_server_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3353 +haproxy_server_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 3352 +haproxy_server_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3350 +haproxy_server_check_last_change_seconds{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 3349 +# HELP haproxy_server_current_throttle Current throttle percentage for the server, when slowstart is active, or no value if not in slowstart. +# TYPE haproxy_server_current_throttle gauge +haproxy_server_current_throttle{proxy="prometheus-exporter-internal",server="prometheus-internal"} 100 +haproxy_server_current_throttle{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 100 +haproxy_server_current_throttle{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 100 +haproxy_server_current_throttle{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 100 +haproxy_server_current_throttle{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 100 +# HELP haproxy_server_loadbalanced_total Total number of times a service was selected, either for new sessions, or when redispatching. +# TYPE haproxy_server_loadbalanced_total counter +haproxy_server_loadbalanced_total{proxy="prometheus-exporter-internal",server="prometheus-internal"} 2 +haproxy_server_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_loadbalanced_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_http_responses_total Total number of HTTP responses. +# TYPE haproxy_server_http_responses_total counter +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="1xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="1xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="1xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="1xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="1xx"} 0 +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="2xx"} 2 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="2xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="2xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="2xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="2xx"} 0 +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="3xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="3xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="3xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="3xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="3xx"} 0 +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="4xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="4xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="4xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="4xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="4xx"} 0 +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="5xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="5xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="5xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="5xx"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="5xx"} 0 +haproxy_server_http_responses_total{proxy="prometheus-exporter-internal",server="prometheus-internal",code="other"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="other"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f",code="other"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="other"} 0 +haproxy_server_http_responses_total{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f",code="other"} 0 +# HELP haproxy_server_server_idle_connections_current Current number of idle connections available for reuse +# TYPE haproxy_server_server_idle_connections_current gauge +haproxy_server_server_idle_connections_current{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_server_idle_connections_current{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_idle_connections_current{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_server_idle_connections_current{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_idle_connections_current{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP haproxy_server_server_idle_connections_limit Limit on the number of available idle connections +# TYPE haproxy_server_server_idle_connections_limit gauge +haproxy_server_server_idle_connections_limit{proxy="prometheus-exporter-internal",server="prometheus-internal"} 0 +haproxy_server_server_idle_connections_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_idle_connections_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",server="88ee5795-d594-478b-8591-455acf30164f"} 0 +haproxy_server_server_idle_connections_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +haproxy_server_server_idle_connections_limit{proxy="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",server="88ee5795-d594-478b-8591-455acf30164f"} 0 diff --git a/octavia/tests/common/sample_octavia_prometheus b/octavia/tests/common/sample_octavia_prometheus new file mode 100644 index 0000000000..9ed333b6dc --- /dev/null +++ b/octavia/tests/common/sample_octavia_prometheus @@ -0,0 +1,695 @@ +# HELP octavia_loadbalancer_cpu Load balancer CPU utilization (percentage). +# TYPE octavia_loadbalancer_cpu gauge +octavia_loadbalancer_cpu 50.0 +# HELP octavia_loadbalancer_memory Load balancer memory utilization (percentage). +# TYPE octavia_loadbalancer_memory gauge +octavia_loadbalancer_memory 23.5 +# HELP octavia_memory_pool_allocated_bytes Total amount of memory allocated in the memory pools (in bytes). +# TYPE octavia_memory_pool_allocated_bytes gauge +octavia_memory_pool_allocated_bytes 111616 +# HELP octavia_memory_pool_used_bytes Total amount of memory used in the memory pools (in bytes). +# TYPE octavia_memory_pool_used_bytes gauge +octavia_memory_pool_used_bytes 78848 +# HELP octavia_memory_pool_failures_total Total number of failed memory pool allocations. +# TYPE octavia_memory_pool_failures_total counter +octavia_memory_pool_failures_total 0 +# HELP octavia_loadbalancer_max_connections Maximum number of concurrent connections. +# TYPE octavia_loadbalancer_max_connections gauge +octavia_loadbalancer_max_connections 150000 +# HELP octavia_loadbalancer_current_connections Number of active sessions. +# TYPE octavia_loadbalancer_current_connections gauge +octavia_loadbalancer_current_connections 1 +# HELP octavia_loadbalancer_connections_total Total number of created sessions. +# TYPE octavia_loadbalancer_connections_total counter +octavia_loadbalancer_connections_total 680 +# HELP octavia_loadbalancer_requests_total Total number of requests (TCP or HTTP). +# TYPE octavia_loadbalancer_requests_total counter +octavia_loadbalancer_requests_total 680 +# HELP octavia_loadbalancer_max_ssl_connections Configured maximum number of concurrent SSL connections. +# TYPE octavia_loadbalancer_max_ssl_connections gauge +octavia_loadbalancer_max_ssl_connections 0 +# HELP octavia_loadbalancer_current_ssl_connections Number of active SSL connections. +# TYPE octavia_loadbalancer_current_ssl_connections gauge +octavia_loadbalancer_current_ssl_connections 0 +# HELP octavia_loadbalancer_ssl_connections_total Total number of opened SSL connections. +# TYPE octavia_loadbalancer_ssl_connections_total counter +octavia_loadbalancer_ssl_connections_total 0 +# HELP octavia_loadbalancer_current_connection_rate Current number of connections per second over last elapsed second. +# TYPE octavia_loadbalancer_current_connection_rate gauge +octavia_loadbalancer_current_connection_rate 1 +# HELP octavia_loadbalancer_limit_connection_rate Configured maximum number of connections per second. +# TYPE octavia_loadbalancer_limit_connection_rate gauge +octavia_loadbalancer_limit_connection_rate 0 +# HELP octavia_loadbalancer_max_connection_rate Maximum observed number of connections per second. +# TYPE octavia_loadbalancer_max_connection_rate gauge +octavia_loadbalancer_max_connection_rate 2 +# HELP octavia_loadbalancer_current_session_rate Current number of sessions per second over last elapsed second. +# TYPE octavia_loadbalancer_current_session_rate gauge +octavia_loadbalancer_current_session_rate 1 +# HELP octavia_loadbalancer_limit_session_rate Configured maximum number of sessions per second. +# TYPE octavia_loadbalancer_limit_session_rate gauge +octavia_loadbalancer_limit_session_rate 0 +# HELP octavia_loadbalancer_max_session_rate Maximum observed number of sessions per second. +# TYPE octavia_loadbalancer_max_session_rate gauge +octavia_loadbalancer_max_session_rate 2 +# HELP octavia_loadbalancer_current_ssl_rate Current number of SSL sessions per second over last elapsed second. +# TYPE octavia_loadbalancer_current_ssl_rate gauge +octavia_loadbalancer_current_ssl_rate 0 +# HELP octavia_loadbalancer_limit_ssl_rate Configured maximum number of SSL sessions per second. +# TYPE octavia_loadbalancer_limit_ssl_rate gauge +octavia_loadbalancer_limit_ssl_rate 0 +# HELP octavia_loadbalancer_max_ssl_rate Maximum observed number of SSL sessions per second. +# TYPE octavia_loadbalancer_max_ssl_rate gauge +octavia_loadbalancer_max_ssl_rate 0 +# HELP octavia_loadbalancer_current_frontend_ssl_key_rate Current frontend SSL Key computation per second over last elapsed second. +# TYPE octavia_loadbalancer_current_frontend_ssl_key_rate gauge +octavia_loadbalancer_current_frontend_ssl_key_rate 0 +# HELP octavia_loadbalancer_max_frontend_ssl_key_rate Maximum observed frontend SSL Key computation per second. +# TYPE octavia_loadbalancer_max_frontend_ssl_key_rate gauge +octavia_loadbalancer_max_frontend_ssl_key_rate 0 +# HELP octavia_loadbalancer_frontent_ssl_reuse SSL session reuse ratio (percent). +# TYPE octavia_loadbalancer_frontent_ssl_reuse gauge +octavia_loadbalancer_frontent_ssl_reuse 0 +# HELP octavia_loadbalancer_current_backend_ssl_key_rate Current backend SSL Key computation per second over last elapsed second. +# TYPE octavia_loadbalancer_current_backend_ssl_key_rate gauge +octavia_loadbalancer_current_backend_ssl_key_rate 0 +# HELP octavia_loadbalancer_max_backend_ssl_key_rate Maximum observed backend SSL Key computation per second. +# TYPE octavia_loadbalancer_max_backend_ssl_key_rate gauge +octavia_loadbalancer_max_backend_ssl_key_rate 0 +# HELP octavia_loadbalancer_ssl_cache_lookups_total Total number of SSL session cache lookups. +# TYPE octavia_loadbalancer_ssl_cache_lookups_total counter +octavia_loadbalancer_ssl_cache_lookups_total 0 +# HELP octavia_loadbalancer_ssl_cache_misses_total Total number of SSL session cache misses. +# TYPE octavia_loadbalancer_ssl_cache_misses_total counter +octavia_loadbalancer_ssl_cache_misses_total 0 +# HELP octavia_loadbalancer_http_comp_bytes_in_total Number of bytes per second over last elapsed second, before http compression. +# TYPE octavia_loadbalancer_http_comp_bytes_in_total counter +octavia_loadbalancer_http_comp_bytes_in_total 0 +# HELP octavia_loadbalancer_http_comp_bytes_out_total Number of bytes per second over last elapsed second, after http compression. +# TYPE octavia_loadbalancer_http_comp_bytes_out_total counter +octavia_loadbalancer_http_comp_bytes_out_total 0 +# HELP octavia_loadbalancer_limit_http_comp Configured maximum input compression rate in bytes. +# TYPE octavia_loadbalancer_limit_http_comp gauge +octavia_loadbalancer_limit_http_comp 0 +# HELP octavia_loadbalancer_listeners Current number of active listeners. +# TYPE octavia_loadbalancer_listeners gauge +octavia_loadbalancer_listeners 6 +# HELP octavia_loadbalancer_dropped_logs_total Total number of dropped logs. +# TYPE octavia_loadbalancer_dropped_logs_total counter +octavia_loadbalancer_dropped_logs_total 0 +# HELP octavia_listener_status Current status of the listener. 0=OFFLINE, 1=ONLINE, 2=DEGRADED. +# TYPE octavia_listener_status gauge +octavia_listener_status{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 1 +octavia_listener_status{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +octavia_listener_status{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 1 +# HELP octavia_listener_current_sessions Current number of active sessions. +# TYPE octavia_listener_current_sessions gauge +octavia_listener_current_sessions{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_current_sessions{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_current_sessions{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_max_sessions Maximum observed number of active sessions. +# TYPE octavia_listener_max_sessions gauge +octavia_listener_max_sessions{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_max_sessions{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +octavia_listener_max_sessions{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_limit_sessions Configured session limit. +# TYPE octavia_listener_limit_sessions gauge +octavia_listener_limit_sessions{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 50000 +octavia_listener_limit_sessions{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 50000 +octavia_listener_limit_sessions{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 50000 +# HELP octavia_listener_sessions_total Total number of sessions. +# TYPE octavia_listener_sessions_total counter +octavia_listener_sessions_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_sessions_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +octavia_listener_sessions_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_limit_session_rate Configured limit on new sessions per second. +# TYPE octavia_listener_limit_session_rate gauge +octavia_listener_limit_session_rate{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_limit_session_rate{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_limit_session_rate{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_max_session_rate Maximum observed number of sessions per second. +# TYPE octavia_listener_max_session_rate gauge +octavia_listener_max_session_rate{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_max_session_rate{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +octavia_listener_max_session_rate{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_connections_rate_max Maximum observed number of connections per second. +# TYPE octavia_listener_connections_rate_max gauge +octavia_listener_connections_rate_max{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_connections_rate_max{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +octavia_listener_connections_rate_max{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_connections_total Total number of connections. +# TYPE octavia_listener_connections_total counter +octavia_listener_connections_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_connections_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +octavia_listener_connections_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_bytes_in_total Current total of incoming bytes. +# TYPE octavia_listener_bytes_in_total counter +octavia_listener_bytes_in_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_bytes_in_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 176 +octavia_listener_bytes_in_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_bytes_out_total Current total of outgoing bytes. +# TYPE octavia_listener_bytes_out_total counter +octavia_listener_bytes_out_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_bytes_out_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 145918 +octavia_listener_bytes_out_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_requests_denied_total Total number of denied requests. +# TYPE octavia_listener_requests_denied_total counter +octavia_listener_requests_denied_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_requests_denied_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_requests_denied_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_responses_denied_total Total number of denied responses. +# TYPE octavia_listener_responses_denied_total counter +octavia_listener_responses_denied_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_responses_denied_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_responses_denied_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_request_errors_total Total number of request errors. +# TYPE octavia_listener_request_errors_total counter +octavia_listener_request_errors_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_request_errors_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_request_errors_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_denied_connections_total Total number of requests denied by connection rules. +# TYPE octavia_listener_denied_connections_total counter +octavia_listener_denied_connections_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_denied_connections_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_denied_connections_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_denied_sessions_total Total number of requests denied by session rules. +# TYPE octavia_listener_denied_sessions_total counter +octavia_listener_denied_sessions_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_denied_sessions_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_denied_sessions_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_failed_header_rewriting_total Total number of failed header rewriting rules. +# TYPE octavia_listener_failed_header_rewriting_total counter +octavia_listener_failed_header_rewriting_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_failed_header_rewriting_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_failed_header_rewriting_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_requests_rate_max Maximum observed number of HTTP requests per second. +# TYPE octavia_listener_http_requests_rate_max gauge +octavia_listener_http_requests_rate_max{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_requests_rate_max{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 1 +octavia_listener_http_requests_rate_max{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_requests_total Total number of HTTP requests received. +# TYPE octavia_listener_http_requests_total counter +octavia_listener_http_requests_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_requests_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 2 +octavia_listener_http_requests_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_responses_total Total number of HTTP responses. +# TYPE octavia_listener_http_responses_total counter +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="1xx"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="1xx"} 0 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="1xx"} 0 +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="2xx"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="2xx"} 2 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="2xx"} 0 +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="3xx"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="3xx"} 0 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="3xx"} 0 +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="4xx"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="4xx"} 0 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="4xx"} 0 +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="5xx"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="5xx"} 0 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="5xx"} 0 +octavia_listener_http_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="other"} 0 +octavia_listener_http_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7",code="other"} 0 +octavia_listener_http_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db",code="other"} 0 +# HELP octavia_listener_intercepted_requests_total Total number of intercepted HTTP requests. +# TYPE octavia_listener_intercepted_requests_total counter +octavia_listener_intercepted_requests_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_intercepted_requests_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_intercepted_requests_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_cache_lookups_total Total number of HTTP cache lookups. +# TYPE octavia_listener_http_cache_lookups_total counter +octavia_listener_http_cache_lookups_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_cache_lookups_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_cache_lookups_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_cache_hits_total Total number of HTTP cache hits. +# TYPE octavia_listener_http_cache_hits_total counter +octavia_listener_http_cache_hits_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_cache_hits_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_cache_hits_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_comp_bytes_in_total Total number of HTTP response bytes fed to the compressor. +# TYPE octavia_listener_http_comp_bytes_in_total counter +octavia_listener_http_comp_bytes_in_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_comp_bytes_in_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_comp_bytes_in_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_comp_bytes_out_total Total number of HTTP response bytes emitted by the compressor. +# TYPE octavia_listener_http_comp_bytes_out_total counter +octavia_listener_http_comp_bytes_out_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_comp_bytes_out_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_comp_bytes_out_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_comp_bytes_bypassed_total Total number of bytes that bypassed the HTTP compressor (CPU/BW limit). +# TYPE octavia_listener_http_comp_bytes_bypassed_total counter +octavia_listener_http_comp_bytes_bypassed_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_comp_bytes_bypassed_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_comp_bytes_bypassed_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_listener_http_comp_responses_total Total number of HTTP responses that were compressed. +# TYPE octavia_listener_http_comp_responses_total counter +octavia_listener_http_comp_responses_total{listener="1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_listener_http_comp_responses_total{listener="4919eeb2-b3ed-40c5-8200-057400b83bb7"} 0 +octavia_listener_http_comp_responses_total{listener="0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_status Current status of the pool. 0=OFFLINE, 1=ONLINE. +# TYPE octavia_pool_status gauge +octavia_pool_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_current_sessions Current number of active sessions. +# TYPE octavia_pool_current_sessions gauge +octavia_pool_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_max_sessions Maximum observed number of active sessions. +# TYPE octavia_pool_max_sessions gauge +octavia_pool_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_limit_sessions Configured session limit. +# TYPE octavia_pool_limit_sessions gauge +octavia_pool_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 50000 +octavia_pool_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 50000 +# HELP octavia_pool_sessions_total Total number of sessions. +# TYPE octavia_pool_sessions_total counter +octavia_pool_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_max_session_rate Maximum observed number of sessions per second. +# TYPE octavia_pool_max_session_rate gauge +octavia_pool_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_last_session_seconds Number of seconds since last session assigned to a member. +# TYPE octavia_pool_last_session_seconds gauge +octavia_pool_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} -1 +octavia_pool_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} -1 +# HELP octavia_pool_current_queue Current number of queued requests. +# TYPE octavia_pool_current_queue gauge +octavia_pool_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_max_queue Maximum observed number of queued requests. +# TYPE octavia_pool_max_queue gauge +octavia_pool_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_connection_attempts_total Total number of connection establishment attempts. +# TYPE octavia_pool_connection_attempts_total counter +octavia_pool_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_connection_reuses_total Total number of connection reuses. +# TYPE octavia_pool_connection_reuses_total counter +octavia_pool_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_bytes_in_total Current total of incoming bytes. +# TYPE octavia_pool_bytes_in_total counter +octavia_pool_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_bytes_out_total Current total of outgoing bytes. +# TYPE octavia_pool_bytes_out_total counter +octavia_pool_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_queue_time_average_seconds Avg. queue time for last 1024 successful connections. +# TYPE octavia_pool_queue_time_average_seconds gauge +octavia_pool_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_connect_time_average_seconds Avg. connect time for last 1024 successful connections. +# TYPE octavia_pool_connect_time_average_seconds gauge +octavia_pool_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_response_time_average_seconds Avg. response time for last 1024 successful connections. +# TYPE octavia_pool_response_time_average_seconds gauge +octavia_pool_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_total_time_average_seconds Avg. total time for last 1024 successful connections. +# TYPE octavia_pool_total_time_average_seconds gauge +octavia_pool_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_max_queue_time_seconds Maximum observed time spent in the queue +# TYPE octavia_pool_max_queue_time_seconds gauge +octavia_pool_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_max_connect_time_seconds Maximum observed time spent waiting for a connection to complete +# TYPE octavia_pool_max_connect_time_seconds gauge +octavia_pool_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_max_response_time_seconds Maximum observed time spent waiting for a member response. +# TYPE octavia_pool_max_response_time_seconds gauge +octavia_pool_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_max_total_time_seconds Maximum observed total request+response time (request+queue+connect+response+processing) +# TYPE octavia_pool_max_total_time_seconds gauge +octavia_pool_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0.000000 +octavia_pool_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0.000000 +# HELP octavia_pool_requests_denied_total Total number of denied requests. +# TYPE octavia_pool_requests_denied_total counter +octavia_pool_requests_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_requests_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_responses_denied_total Total number of denied responses. +# TYPE octavia_pool_responses_denied_total counter +octavia_pool_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_connection_errors_total Total number of connection errors. +# TYPE octavia_pool_connection_errors_total counter +octavia_pool_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_response_errors_total Total number of response errors. +# TYPE octavia_pool_response_errors_total counter +octavia_pool_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_retry_warnings_total Total number of retry warnings. +# TYPE octavia_pool_retry_warnings_total counter +octavia_pool_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_redispatch_warnings_total Total number of redispatch warnings. +# TYPE octavia_pool_redispatch_warnings_total counter +octavia_pool_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_failed_header_rewriting_total Total number of failed header rewriting warnings. +# TYPE octavia_pool_failed_header_rewriting_total counter +octavia_pool_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_client_aborts_total Total number of data transfers aborted by the client. +# TYPE octavia_pool_client_aborts_total counter +octavia_pool_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_server_aborts_total Total number of data transfers aborted by the server. +# TYPE octavia_pool_member_aborts_total counter +octavia_pool_member_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_member_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_active_members Current number of active members. +# TYPE octavia_pool_active_members gauge +octavia_pool_active_members{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_active_members{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_backup_members Current number of backup members. +# TYPE octavia_pool_backup_members gauge +octavia_pool_backup_members{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_backup_members{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_check_up_down_total Total number of UP->DOWN transitions. +# TYPE octavia_pool_check_up_down_total counter +octavia_pool_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 1 +octavia_pool_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 1 +# HELP octavia_pool_check_last_change_seconds Number of seconds since the last UP<->DOWN transition. +# TYPE octavia_pool_check_last_change_seconds gauge +octavia_pool_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 3352 +octavia_pool_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 3349 +# HELP octavia_pool_downtime_seconds_total Total downtime (in seconds) for the pool. +# TYPE octavia_pool_downtime_seconds_total counter +octavia_pool_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 3352 +octavia_pool_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 3349 +# HELP octavia_pool_loadbalanced_total Total number of times a pool was selected, either for new sessions, or when redispatching. +# TYPE octavia_pool_loadbalanced_total counter +octavia_pool_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_requests_total Total number of HTTP requests received. +# TYPE octavia_pool_http_requests_total counter +octavia_pool_http_requests_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_requests_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_responses_total Total number of HTTP responses. +# TYPE octavia_pool_http_responses_total counter +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="1xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="1xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="2xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="2xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="3xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="3xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="4xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="4xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="5xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="5xx"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",code="other"} 0 +octavia_pool_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",code="other"} 0 +# HELP octavia_pool_http_cache_lookups_total Total number of HTTP cache lookups. +# TYPE octavia_pool_http_cache_lookups_total counter +octavia_pool_http_cache_lookups_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_cache_lookups_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_cache_hits_total Total number of HTTP cache hits. +# TYPE octavia_pool_http_cache_hits_total counter +octavia_pool_http_cache_hits_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_cache_hits_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_comp_bytes_in_total Total number of HTTP response bytes fed to the compressor. +# TYPE octavia_pool_http_comp_bytes_in_total counter +octavia_pool_http_comp_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_comp_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_comp_bytes_out_total Total number of HTTP response bytes emitted by the compressor. +# TYPE octavia_pool_http_comp_bytes_out_total counter +octavia_pool_http_comp_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_comp_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_comp_bytes_bypassed_total Total number of bytes that bypassed the HTTP compressor (CPU/BW limit). +# TYPE octavia_pool_http_comp_bytes_bypassed_total counter +octavia_pool_http_comp_bytes_bypassed_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_comp_bytes_bypassed_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_pool_http_comp_responses_total Total number of HTTP responses that were compressed. +# TYPE octavia_pool_http_comp_responses_total counter +octavia_pool_http_comp_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74"} 0 +octavia_pool_http_comp_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db"} 0 +# HELP octavia_member_status Current status of the member. 0=ERROR, 1=ONLINE, 2=OFFLINE, 3=DRAIN. +# TYPE octavia_member_status gauge +octavia_member_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_status{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_current_sessions Current number of active sessions. +# TYPE octavia_member_current_sessions gauge +octavia_member_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_current_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_max_sessions Maximum observed number of active sessions. +# TYPE octavia_member_max_sessions gauge +octavia_member_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_limit_sessions Configured session limit. +# TYPE octavia_member_limit_sessions gauge +octavia_member_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_limit_sessions{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_sessions_total Total number of sessions. +# TYPE octavia_member_sessions_total counter +octavia_member_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_sessions_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_max_session_rate Maximum observed number of sessions per second. +# TYPE octavia_member_max_session_rate gauge +octavia_member_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_session_rate{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_last_session_seconds Number of seconds since last session assigned to the member. +# TYPE octavia_member_last_session_seconds gauge +octavia_member_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} -1 +octavia_member_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} -1 +octavia_member_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} -1 +octavia_member_last_session_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} -1 +# HELP octavia_member_current_queue Current number of queued requests. +# TYPE octavia_member_current_queue gauge +octavia_member_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_current_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_max_queue Maximum observed number of queued requests. +# TYPE octavia_member_max_queue gauge +octavia_member_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_max_queue{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_queue_limit Configured maxqueue for the member (0 meaning no limit). +# TYPE octavia_member_queue_limit gauge +octavia_member_queue_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_queue_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_queue_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_queue_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_bytes_in_total Current total of incoming bytes. +# TYPE octavia_member_bytes_in_total counter +octavia_member_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_bytes_in_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_bytes_out_total Current total of outgoing bytes. +# TYPE octavia_member_bytes_out_total counter +octavia_member_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_bytes_out_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_queue_time_average_seconds Avg. queue time for last 1024 successful connections. +# TYPE octavia_member_queue_time_average_seconds gauge +octavia_member_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_queue_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_connect_time_average_seconds Avg. connect time for last 1024 successful connections. +# TYPE octavia_member_connect_time_average_seconds gauge +octavia_member_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_connect_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_response_time_average_seconds Avg. response time for last 1024 successful connections. +# TYPE octavia_member_response_time_average_seconds gauge +octavia_member_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_response_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_total_time_average_seconds Avg. total time for last 1024 successful connections. +# TYPE octavia_member_total_time_average_seconds gauge +octavia_member_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_total_time_average_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_max_queue_time_seconds Maximum observed time spent in the queue +# TYPE octavia_member_max_queue_time_seconds gauge +octavia_member_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_queue_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_max_connect_time_seconds Maximum observed time spent waiting for a connection to complete +# TYPE octavia_member_max_connect_time_seconds gauge +octavia_member_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_connect_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_max_response_time_seconds Maximum observed time spent waiting for a member response. +# TYPE octavia_member_max_response_time_seconds gauge +octavia_member_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_response_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_max_total_time_seconds Maximum observed total request+response time (request+queue+connect+response+processing) +# TYPE octavia_member_max_total_time_seconds gauge +octavia_member_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +octavia_member_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0.000000 +octavia_member_max_total_time_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0.000000 +# HELP octavia_member_connection_attempts_total Total number of connection establishment attempts. +# TYPE octavia_member_connection_attempts_total counter +octavia_member_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_attempts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_connection_reuses_total Total number of connection reuses. +# TYPE octavia_member_connection_reuses_total counter +octavia_member_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_reuses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_responses_denied_total Total number of denied responses. +# TYPE octavia_member_responses_denied_total counter +octavia_member_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_responses_denied_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_connection_errors_total Total number of connection errors. +# TYPE octavia_member_connection_errors_total counter +octavia_member_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_connection_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_response_errors_total Total number of response errors. +# TYPE octavia_member_response_errors_total counter +octavia_member_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_response_errors_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_retry_warnings_total Total number of retry warnings. +# TYPE octavia_member_retry_warnings_total counter +octavia_member_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_retry_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_redispatch_warnings_total Total number of redispatch warnings. +# TYPE octavia_member_redispatch_warnings_total counter +octavia_member_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_redispatch_warnings_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_failed_header_rewriting_total Total number of failed header rewriting warnings. +# TYPE octavia_member_failed_header_rewriting_total counter +octavia_member_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_failed_header_rewriting_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_client_aborts_total Total number of data transfers aborted by the client. +# TYPE octavia_member_client_aborts_total counter +octavia_member_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_client_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_server_aborts_total Total number of data transfers aborted by the server. +# TYPE octavia_member_server_aborts_total counter +octavia_member_server_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_server_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_server_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_server_aborts_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_weight Member weight. +# TYPE octavia_member_weight gauge +octavia_member_weight{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +octavia_member_weight{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 1 +octavia_member_weight{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +octavia_member_weight{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 1 +# HELP octavia_member_check_failures_total Total number of failed check (Only counts checks failed when the member is up). +# TYPE octavia_member_check_failures_total counter +octavia_member_check_failures_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3 +octavia_member_check_failures_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 3 +octavia_member_check_failures_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3 +octavia_member_check_failures_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 3 +# HELP octavia_member_check_up_down_total Total number of UP->DOWN transitions. +# TYPE octavia_member_check_up_down_total counter +octavia_member_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +octavia_member_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 1 +octavia_member_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 1 +octavia_member_check_up_down_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 1 +# HELP octavia_member_downtime_seconds_total Total downtime (in seconds) for the member. +# TYPE octavia_member_downtime_seconds_total counter +octavia_member_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3353 +octavia_member_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 3352 +octavia_member_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3350 +octavia_member_downtime_seconds_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 3349 +# HELP octavia_member_check_last_change_seconds Number of seconds since the last UP<->DOWN transition. +# TYPE octavia_member_check_last_change_seconds gauge +octavia_member_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3353 +octavia_member_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 3352 +octavia_member_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 3350 +octavia_member_check_last_change_seconds{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 3349 +# HELP octavia_member_current_throttle Current throttle percentage for the member, when slowstart is active, or no value if not in slowstart. +# TYPE octavia_member_current_throttle gauge +octavia_member_current_throttle{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 100 +octavia_member_current_throttle{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 100 +octavia_member_current_throttle{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 100 +octavia_member_current_throttle{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 100 +# HELP octavia_member_loadbalanced_total Total number of times a member was selected, either for new sessions, or when redispatching. +# TYPE octavia_member_loadbalanced_total counter +octavia_member_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_loadbalanced_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_http_responses_total Total number of HTTP responses. +# TYPE octavia_member_http_responses_total counter +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="1xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="1xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="1xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="1xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="2xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="2xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="2xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="2xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="3xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="3xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="3xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="3xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="4xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="4xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="4xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="4xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="5xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="5xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="5xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="5xx"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="other"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f",code="other"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77",code="other"} 0 +octavia_member_http_responses_total{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f",code="other"} 0 +# HELP octavia_member_idle_connections_current Current number of idle connections available for reuse +# TYPE octavia_member_idle_connections_current gauge +octavia_member_idle_connections_current{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_idle_connections_current{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_idle_connections_current{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_idle_connections_current{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +# HELP octavia_member_idle_connections_limit Limit on the number of available idle connections +# TYPE octavia_member_idle_connections_limit gauge +octavia_member_idle_connections_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_idle_connections_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:1a0c13c0-8e69-46c7-a68a-ca4937996d74",member="88ee5795-d594-478b-8591-455acf30164f"} 0 +octavia_member_idle_connections_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="edf6ca81-b5d5-4d94-a656-f6028d8bbb77"} 0 +octavia_member_idle_connections_limit{pool="6034884d-ed47-49d5-ade7-8fa2c4501a74:0b248d39-eb90-4180-91aa-5363be7df4db",member="88ee5795-d594-478b-8591-455acf30164f"} 0 diff --git a/octavia/tests/functional/api/test_root_controller.py b/octavia/tests/functional/api/test_root_controller.py index 6c4ee03536..dd84170997 100644 --- a/octavia/tests/functional/api/test_root_controller.py +++ b/octavia/tests/functional/api/test_root_controller.py @@ -45,7 +45,7 @@ class TestRootController(base_db_test.OctaviaDBTestBase): def test_api_versions(self): versions = self._get_versions_with_config() version_ids = tuple(v.get('id') for v in versions) - self.assertEqual(25, len(version_ids)) + self.assertEqual(26, len(version_ids)) self.assertIn('v2.0', version_ids) self.assertIn('v2.1', version_ids) self.assertIn('v2.2', version_ids) @@ -71,6 +71,7 @@ class TestRootController(base_db_test.OctaviaDBTestBase): self.assertIn('v2.22', version_ids) self.assertIn('v2.23', version_ids) self.assertIn('v2.24', version_ids) + self.assertIn('v2.25', version_ids) # Each version should have a 'self' 'href' to the API version URL # [{u'rel': u'self', u'href': u'http://localhost/v2'}] diff --git a/octavia/tests/functional/api/v2/test_l7policy.py b/octavia/tests/functional/api/v2/test_l7policy.py index 98c5ea1b18..c8d04be2e8 100644 --- a/octavia/tests/functional/api/v2/test_l7policy.py +++ b/octavia/tests/functional/api/v2/test_l7policy.py @@ -14,6 +14,7 @@ from unittest import mock +from octavia_lib.common import constants as lib_consts from oslo_config import cfg from oslo_config import fixture as oslo_fixture from oslo_utils import uuidutils @@ -858,6 +859,14 @@ class TestL7Policy(base.BaseAPITest): 'redirect_url': 'http://a.com'} self.post(self.L7POLICIES_PATH, self._build_body(l7policy), status=403) + def test_negative_create_prometheus_listener(self): + prometheus_listener = self.create_listener( + lib_consts.PROTOCOL_PROMETHEUS, 8123, lb_id=self.lb_id) + prometheus_listener_id = prometheus_listener.get('listener').get('id') + self.set_lb_status(self.lb_id) + l7policy = {'listener_id': prometheus_listener_id, 'name': 'test1'} + self.post(self.L7POLICIES_PATH, self._build_body(l7policy), status=400) + def test_update(self): api_l7policy = self.create_l7policy(self.listener_id, constants.L7POLICY_ACTION_REJECT, diff --git a/octavia/tests/functional/api/v2/test_listener.py b/octavia/tests/functional/api/v2/test_listener.py index 62863571c2..034676a460 100644 --- a/octavia/tests/functional/api/v2/test_listener.py +++ b/octavia/tests/functional/api/v2/test_listener.py @@ -799,10 +799,9 @@ class TestListener(base.BaseAPITest): resp = self.test_create(response_status=400, **optionals).json fault = resp.get('faultstring') self.assertIn( - 'Certificate container references are only allowed on ', fault) + 'Certificate container references are not allowed on ', fault) self.assertIn( - '{} protocol listeners.'.format( - constants.PROTOCOL_TERMINATED_HTTPS), fault) + '{} protocol listeners.'.format(constants.PROTOCOL_TCP), fault) def test_create_without_certs_if_terminated_https(self): optionals = { @@ -1361,6 +1360,27 @@ class TestListener(base.BaseAPITest): def test_negative_create_UDP_with_headers(self): self._test_negative_create_with_headers(constants.PROTOCOL_UDP) + def test_create_prometheus(self): + self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) + self.conf.config(group='api_settings', allow_prometheus_listeners=True) + listener = self.create_listener(lib_consts.PROTOCOL_PROMETHEUS, + 80, self.lb_id) + listener_path = self.LISTENER_PATH.format( + listener_id=listener['listener']['id']) + get_listener = self.get(listener_path).json['listener'] + self.assertEqual(lib_consts.PROTOCOL_PROMETHEUS, + get_listener['protocol']) + + def test_create_prometheus_disabled(self): + self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) + self.conf.config(group='api_settings', + allow_prometheus_listeners=False) + req_dict = {'name': 'create_listener_prometheus_disabled', + 'protocol': lib_consts.PROTOCOL_PROMETHEUS, + 'protocol_port': 6666, + 'loadbalancer_id': self.lb_id} + self.post(self.LISTENERS_PATH, self._build_body(req_dict), status=400) + def test_update_allowed_cidrs(self): allowed_cidrs = ['10.0.1.0/24', '10.0.2.0/24'] new_cidrs = ['10.0.1.0/24', '10.0.3.0/24'] @@ -1620,10 +1640,9 @@ class TestListener(base.BaseAPITest): response = self.put(listener_path, body, status=400).json fault = response.get('faultstring') self.assertIn( - 'Certificate container references are only allowed on ', fault) - self.assertIn( - '{} protocol listeners.'.format( - constants.PROTOCOL_TERMINATED_HTTPS), fault) + 'Certificate container references are not allowed on ', fault) + self.assertIn('{} protocol listeners.'.format( + constants.PROTOCOL_TCP), fault) def test_update_with_ca_cert(self): self.cert_manager_mock().get_secret.return_value = ( @@ -2617,8 +2636,8 @@ class TestListener(base.BaseAPITest): body = self._build_body({'sni_container_refs': [sni_id1, sni_id2]}) response = self.put(listener_path, body, status=400).json self.assertEqual( - "Validation failure: Certificate container references are only " - "allowed on TERMINATED_HTTPS protocol listeners.", + "Validation failure: Certificate container references are not " + "allowed on HTTP protocol listeners.", response['faultstring']) get_listener = self.get(listener_path).json['listener'] self.assertEqual([], get_listener.get('sni_container_refs')) diff --git a/octavia/tests/functional/api/v2/test_pool.py b/octavia/tests/functional/api/v2/test_pool.py index f136d7ad94..5259e2f252 100644 --- a/octavia/tests/functional/api/v2/test_pool.py +++ b/octavia/tests/functional/api/v2/test_pool.py @@ -1205,6 +1205,19 @@ class TestPool(base.BaseAPITest): 'project_id': self.project_id} self.post(self.POOLS_PATH, self._build_body(lb_pool), status=403) + def test_negative_create_prometheus_listener(self): + stats_listener = self.create_listener( + lib_constants.PROTOCOL_PROMETHEUS, 8123, + self.lb_id).get('listener') + stats_listener_id = stats_listener.get('id') + self.set_lb_status(self.lb_id) + + lb_pool = { + 'listener_id': stats_listener_id, + 'protocol': 'HTTP', + 'lb_algorithm': constants.LB_ALGORITHM_ROUND_ROBIN} + self.post(self.POOLS_PATH, self._build_body(lb_pool), status=400) + def test_update(self): api_pool = self.create_pool( self.lb_id, diff --git a/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py b/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py index 3e19c646eb..2b5a6ecc57 100644 --- a/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py +++ b/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py @@ -40,7 +40,7 @@ class HAProxyCompatTestCase(base.TestCase): " option redispatch\n" " option splice-request\n" " option splice-response\n" - " option http-keep-alive\n\n\n\n" + " option http-keep-alive\n\n\n\n\n" "frontend sample_listener_id_1\n" " maxconn {maxconn}\n" " bind 10.0.0.2:80\n" diff --git a/octavia/tests/unit/cmd/test_prometheus_proxy.py b/octavia/tests/unit/cmd/test_prometheus_proxy.py new file mode 100644 index 0000000000..2e4a9acb97 --- /dev/null +++ b/octavia/tests/unit/cmd/test_prometheus_proxy.py @@ -0,0 +1,169 @@ +# Copyright 2022 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +import signal +from unittest import mock + +from octavia.cmd import prometheus_proxy +from octavia.tests.unit import base + + +class TestPrometheusProxyCMD(base.TestCase): + + @mock.patch('http.server.SimpleHTTPRequestHandler.log_request') + @mock.patch('http.server.SimpleHTTPRequestHandler.__init__') + def test_log_request(self, mock_req_handler_init, mock_log_request): + mock_req_handler_init.return_value = None + proxy = prometheus_proxy.PrometheusProxy() + proxy.log_request() + mock_log_request.assert_not_called() + + @mock.patch('os.cpu_count', return_value=2) + @mock.patch('psutil.getloadavg', return_value=(1, 2, 3)) + @mock.patch('http.server.SimpleHTTPRequestHandler.__init__') + def test_add_cpu_utilization(self, mock_req_handler_init, mock_getloadavg, + mock_cpu_count): + mock_req_handler_init.return_value = None + proxy = prometheus_proxy.PrometheusProxy() + test_buffer = "TestStringBuffer\n" + result = proxy._add_cpu_utilization(test_buffer) + + expected_result = ( + "TestStringBuffer\n" + "# HELP octavia_loadbalancer_cpu Load balancer CPU utilization " + "(percentage).\n" + "# TYPE octavia_loadbalancer_cpu gauge\n" + "octavia_loadbalancer_cpu 50.0\n") + + self.assertEqual(expected_result, result) + + @mock.patch('psutil.virtual_memory', return_value=(1, 2, 23.5)) + @mock.patch('http.server.SimpleHTTPRequestHandler.__init__') + def test__add_memory_utilization(self, mock_req_handler_init, + mock_virt_mem): + mock_req_handler_init.return_value = None + proxy = prometheus_proxy.PrometheusProxy() + test_buffer = "TestStringMemoryBuffer\n" + result = proxy._add_memory_utilization(test_buffer) + + expected_result = ( + "TestStringMemoryBuffer\n" + "# HELP octavia_loadbalancer_memory Load balancer memory " + "utilization (percentage).\n" + "# TYPE octavia_loadbalancer_memory gauge\n" + "octavia_loadbalancer_memory 23.5\n") + + self.assertEqual(expected_result, result) + + @mock.patch('octavia.cmd.prometheus_proxy.PRINT_REJECTED', True) + # No need to print all of the rejected lines to the log + @mock.patch('builtins.print') + @mock.patch('urllib.request.urlopen') + @mock.patch('os.cpu_count', return_value=2) + @mock.patch('psutil.getloadavg', return_value=(1, 2, 3)) + @mock.patch('psutil.virtual_memory', return_value=(1, 2, 23.5)) + @mock.patch('http.server.SimpleHTTPRequestHandler.__init__') + def test_do_get(self, mock_req_handler_init, mock_virt_mem, + mock_getloadavg, mock_cpu_count, mock_urlopen, mock_print): + mock_req_handler_init.return_value = None + proxy = prometheus_proxy.PrometheusProxy() + + mock_send_response = mock.MagicMock() + proxy.send_response = mock_send_response + mock_send_header = mock.MagicMock() + proxy.send_header = mock_send_header + mock_end_headers = mock.MagicMock() + proxy.end_headers = mock_end_headers + mock_wfile = mock.MagicMock() + proxy.wfile = mock_wfile + + with open("octavia/tests/common/sample_haproxy_prometheus", + "rb") as file: + mock_urlopen.return_value = file + + proxy.do_GET() + + mock_send_response.assert_called_once_with(200) + + with open("octavia/tests/common/sample_octavia_prometheus", + "rb") as file2: + octavia_metrics = file2.read() + mock_wfile.write.assert_called_once_with(octavia_metrics) + + @mock.patch('urllib.request.urlopen') + @mock.patch('os.cpu_count', return_value=2) + @mock.patch('psutil.getloadavg', return_value=(1, 2, 3)) + @mock.patch('psutil.virtual_memory', return_value=(1, 2, 23.5)) + @mock.patch('http.server.SimpleHTTPRequestHandler.__init__') + def test_do_get_exception(self, mock_req_handler_init, mock_virt_mem, + mock_getloadavg, mock_cpu_count, mock_urlopen): + mock_urlopen.side_effect = [Exception('boom')] + mock_req_handler_init.return_value = None + proxy = prometheus_proxy.PrometheusProxy() + + mock_send_response = mock.MagicMock() + proxy.send_response = mock_send_response + mock_send_header = mock.MagicMock() + proxy.send_header = mock_send_header + mock_end_headers = mock.MagicMock() + proxy.end_headers = mock_end_headers + + proxy.do_GET() + + mock_send_response.assert_called_once_with(502) + + @mock.patch('signal.signal') + def test_signalhandler(self, mock_signal): + + sig_handler = prometheus_proxy.SignalHandler() + + calls = [mock.call(signal.SIGINT, sig_handler.shutdown), + mock.call(signal.SIGTERM, sig_handler.shutdown)] + mock_signal.assert_has_calls(calls) + + self.assertFalse(prometheus_proxy.EXIT_EVENT.is_set()) + sig_handler.shutdown() + self.assertTrue(prometheus_proxy.EXIT_EVENT.is_set()) + + @mock.patch('octavia.cmd.prometheus_proxy.EXIT_EVENT') + @mock.patch('signal.signal') + def test_shutdown_thread(self, mock_signal, mock_exit_event): + + mock_http = mock.MagicMock() + + prometheus_proxy.shutdown_thread(mock_http) + + mock_exit_event.wait.assert_called_once() + mock_http.shutdown.assert_called_once() + + @mock.patch('threading.Thread') + # TODO(johnsom) Switch this when we move to ThreadingHTTPServer + # @mock.patch('http.server.ThreadingHTTPServer.serve_forever') + @mock.patch('octavia.cmd.prometheus_proxy.ThreadedHTTPServer.' + 'serve_forever') + @mock.patch('octavia.amphorae.backends.utils.network_namespace.' + 'NetworkNamespace.__exit__') + @mock.patch('octavia.amphorae.backends.utils.network_namespace.' + 'NetworkNamespace.__enter__') + @mock.patch('octavia.cmd.prometheus_proxy.EXIT_EVENT') + @mock.patch('octavia.cmd.prometheus_proxy.SignalHandler') + def test_main(self, mock_signal_handler, mock_exit_event, mock_netns_enter, + mock_netns_exit, mock_serve_forever, mock_thread): + + mock_exit_event.is_set.side_effect = [False, False, True] + mock_netns_enter.side_effect = [Exception('boom'), True] + + prometheus_proxy.main() + + mock_signal_handler.assert_called_once() + mock_serve_forever.assert_called_once() diff --git a/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py b/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py index 1ba699f16b..9f4ead9cea 100644 --- a/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +++ b/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py @@ -16,6 +16,7 @@ import copy import os +from octavia_lib.common import constants as lib_consts from oslo_config import cfg from oslo_config import fixture as oslo_fixture @@ -39,7 +40,7 @@ class TestHaproxyCfg(base.TestCase): self.assertEqual('haproxy.cfg.j2', template.name) def test_render_template_tls(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -98,7 +99,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_no_sni(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -150,7 +151,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_no_ciphers(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -201,7 +202,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_no_versions(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -260,7 +261,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_no_ciphers_or_versions(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -312,7 +313,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_alpn(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -366,7 +367,7 @@ class TestHaproxyCfg(base.TestCase): rendered_obj) def test_render_template_tls_no_alpn(self): - conf = oslo_fixture.Config(cfg.CONF) + conf = self.useFixture(oslo_fixture.Config(cfg.CONF)) conf.config(group="haproxy_amphora", base_cert_dir='/fake_cert_dir') FAKE_CRT_LIST_FILENAME = os.path.join( CONF.haproxy_amphora.base_cert_dir, @@ -444,6 +445,55 @@ class TestHaproxyCfg(base.TestCase): sample_configs_combined.sample_base_expected_config(backend=be), rendered_obj) + def test_render_template_prometheus(self): + fe = ("frontend sample_listener_id_1\n" + " maxconn {maxconn}\n" + " bind 10.0.0.2:80\n" + " mode http\n" + " timeout client 50000\n" + " default_backend prometheus-exporter-internal\n").format( + maxconn=constants.HAPROXY_DEFAULT_MAXCONN) + be = "" + defaults = ("defaults\n" + " log global\n" + " retries 3\n" + " option redispatch\n" + " option splice-request\n" + " option splice-response\n" + " option http-keep-alive\n\n\n\n" + "frontend prometheus-exporter-internal-endpoint\n" + " bind 127.0.0.1:9101\n" + " mode http\n" + " no log\n" + " option http-use-htx\n" + " http-request use-service prometheus-exporter if { " + "path /metrics }\n" + " http-request reject\n" + " timeout http-request 5s\n" + " timeout client 5s\n" + "backend prometheus-exporter-internal\n" + " mode http\n" + " no log\n" + " balance first\n" + " timeout connect 5s\n" + " timeout server 5s\n" + " server prometheus-internal 127.0.0.1:9102") + logging = (" log-format 12345\\ sample_loadbalancer_id_1\\ %f\\ " + "%ci\\ %cp\\ %t\\ -\\ -\\ %B\\ %U\\ " + "%[ssl_c_verify]\\ %{+Q}[ssl_c_s_dn]\\ %b\\ %s\\ %Tt\\ " + "%tsc\n\n") + + rendered_obj = self.jinja_cfg.render_loadbalancer_obj( + sample_configs_combined.sample_amphora_tuple(), + [sample_configs_combined.sample_listener_tuple( + proto=lib_consts.PROTOCOL_PROMETHEUS, include_pools=False)], + feature_compatibility={lib_consts.PROTOCOL_PROMETHEUS: True}) + + self.assertEqual( + sample_configs_combined.sample_base_expected_config( + frontend=fe, backend=be, logging=logging, defaults=defaults), + rendered_obj) + def test_render_template_member_backup(self): be = ("backend sample_pool_id_1:sample_listener_id_1\n" " mode http\n" @@ -1434,6 +1484,15 @@ class TestHaproxyCfg(base.TestCase): in_listener.load_balancer) self.assertEqual(sample_configs_combined.RET_LISTENER_L7, ret) + def test_transform_listener_PROMETHEUS(self): + in_listener = sample_configs_combined.sample_listener_tuple() + ret = self.jinja_cfg._transform_listener( + in_listener, None, {lib_consts.PROTOCOL_PROMETHEUS: True}, + in_listener.load_balancer) + expected_config = copy.copy(sample_configs_combined.RET_LISTENER) + expected_config[lib_consts.PROTOCOL_PROMETHEUS] = True + self.assertEqual(expected_config, ret) + def test_transform_loadbalancer(self): in_amphora = sample_configs_combined.sample_amphora_tuple() in_listener = sample_configs_combined.sample_listener_tuple() @@ -1533,7 +1592,7 @@ class TestHaproxyCfg(base.TestCase): " option redispatch\n" " option splice-request\n" " option splice-response\n" - " option http-keep-alive\n\n") + " option http-keep-alive\n\n\n") rendered_obj = j_cfg.render_loadbalancer_obj( sample_configs_combined.sample_amphora_tuple(), [sample_configs_combined.sample_listener_tuple()] diff --git a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py index d608f6c972..810aadebdc 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py @@ -310,6 +310,7 @@ RET_LISTENER = { 'timeout_member_connect': 5000, 'timeout_member_data': 50000, 'timeout_tcp_inspect': 0, + 'PROMETHEUS': False, } RET_LISTENER_L7 = { @@ -332,6 +333,7 @@ RET_LISTENER_L7 = { 'timeout_member_connect': 5000, 'timeout_member_data': 50000, 'timeout_tcp_inspect': 0, + 'PROMETHEUS': False, } RET_LISTENER_TLS = { @@ -683,7 +685,8 @@ def sample_listener_tuple(proto=None, monitor=True, alloc_default_pool=True, sample_default_pool=1, pool_enabled=True, backend_alpn_protocols=constants. - AMPHORA_SUPPORTED_ALPN_PROTOCOLS): + AMPHORA_SUPPORTED_ALPN_PROTOCOLS, + include_pools=True): proto = 'HTTP' if proto is None else proto if be_proto is None: be_proto = 'HTTP' if proto == 'TERMINATED_HTTPS' else proto @@ -815,7 +818,7 @@ def sample_listener_tuple(proto=None, monitor=True, alloc_default_pool=True, intermediates=sample_certs.X509_IMDS_LIST, primary_cn=sample_certs.X509_CERT_CN_3))] if sni else [], - pools=pools, + pools=pools if include_pools else '', l7policies=l7policies, enabled=enabled, insert_headers=insert_headers, @@ -1239,7 +1242,7 @@ def sample_base_expected_config(frontend=None, logging=None, backend=None, " option redispatch\n" " option splice-request\n" " option splice-response\n" - " option http-keep-alive\n\n") + " option http-keep-alive\n\n\n") return ("# Configuration for loadbalancer sample_loadbalancer_id_1\n" "global\n" " daemon\n" diff --git a/releasenotes/notes/Add-PROMETHEUS-listeners-1b3924680b409a1a.yaml b/releasenotes/notes/Add-PROMETHEUS-listeners-1b3924680b409a1a.yaml new file mode 100644 index 0000000000..f36df8717a --- /dev/null +++ b/releasenotes/notes/Add-PROMETHEUS-listeners-1b3924680b409a1a.yaml @@ -0,0 +1,11 @@ +--- +features: + - | + Added a new PROMETHEUS listener that exposes a prometheus exporter + endpoint. +upgrade: + - | + PROMETHEUS listeners require an amphora image with HAProxy 2.0 or newer. +issues: + - | + PROMETHEUS listeners will not report information for UDP or SCTP listeners. diff --git a/requirements.txt b/requirements.txt index 424ff2579b..e16be6f8b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,6 +27,7 @@ oslo.reports>=1.18.0 # Apache-2.0 oslo.serialization>=2.28.1 # Apache-2.0 oslo.upgradecheck>=1.3.0 # Apache-2.0 oslo.utils>=4.7.0 # Apache-2.0 +psutil>=5.7.1 # BSD pyasn1!=0.2.3,>=0.1.8 # BSD pyasn1-modules>=0.0.6 # BSD python-barbicanclient>=4.5.2 # Apache-2.0 @@ -41,7 +42,7 @@ castellan>=0.16.0 # Apache-2.0 tenacity>=5.0.4 # Apache-2.0 distro>=1.2.0 # Apache-2.0 jsonschema>=3.2.0 # MIT -octavia-lib>=2.3.0 # Apache-2.0 +octavia-lib>=2.5.0 # Apache-2.0 netaddr>=0.7.19 # BSD simplejson>=3.13.2 # MIT setproctitle>=1.1.10 # BSD diff --git a/setup.cfg b/setup.cfg index d5aa845800..086056225c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -55,6 +55,7 @@ console_scripts = octavia-status = octavia.cmd.status:main amphora-health-checker = octavia.cmd.health_checker:main amphora-interface = octavia.cmd.interface:main + prometheus-proxy = octavia.cmd.prometheus_proxy:main octavia.api.drivers = noop_driver = octavia.api.drivers.noop_driver.driver:NoopProviderDriver noop_driver-alt = octavia.api.drivers.noop_driver.driver:NoopProviderDriver