aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ansible/group_vars/all/prometheus.yml4
-rw-r--r--ansible/inventory/all-in-one4
-rw-r--r--ansible/inventory/multinode4
-rw-r--r--ansible/roles/openvswitch/defaults/main.yml1
-rw-r--r--ansible/roles/openvswitch/handlers/main.yml1
-rw-r--r--ansible/roles/ovn-controller/defaults/main.yml1
-rw-r--r--ansible/roles/ovn-controller/tasks/config.yml9
-rw-r--r--ansible/roles/ovn-db/defaults/main.yml4
-rw-r--r--ansible/roles/ovn-db/tasks/config.yml9
-rw-r--r--ansible/roles/prometheus/defaults/main.yml26
-rw-r--r--ansible/roles/prometheus/handlers/main.yml14
-rw-r--r--ansible/roles/prometheus/tasks/config.yml14
-rw-r--r--ansible/roles/prometheus/tasks/precheck.yml15
-rw-r--r--ansible/roles/prometheus/templates/openstack-network-exporter.yaml.j21
-rw-r--r--ansible/roles/prometheus/templates/prometheus-openstack-network-exporter.json.j217
-rw-r--r--ansible/roles/prometheus/templates/prometheus.yml.j215
-rw-r--r--ansible/site.yml1
-rw-r--r--etc/kolla/globals.yml1
-rw-r--r--releasenotes/notes/add-prometheus-network-exporter-b5eb1e0e7a33077a.yaml6
-rw-r--r--tests/templates/globals-default.j22
-rw-r--r--tests/templates/inventory.j24
21 files changed, 153 insertions, 0 deletions
diff --git a/ansible/group_vars/all/prometheus.yml b/ansible/group_vars/all/prometheus.yml
index 0eeca4e7c..b6c746587 100644
--- a/ansible/group_vars/all/prometheus.yml
+++ b/ansible/group_vars/all/prometheus.yml
@@ -23,6 +23,7 @@ enable_prometheus_libvirt_exporter: "{{ enable_prometheus | bool and enable_nova
enable_prometheus_etcd_integration: "{{ enable_prometheus | bool and enable_etcd | bool }}"
enable_prometheus_proxysql_exporter: "{{ enable_prometheus | bool and enable_proxysql | bool }}"
enable_prometheus_valkey_exporter: "{{ enable_prometheus | bool and enable_valkey | bool }}"
+enable_prometheus_openstack_network_exporter: "{{ enable_prometheus | bool }}"
prometheus_alertmanager_user: "admin"
prometheus_ceph_exporter_interval: "{{ prometheus_scrape_interval }}"
@@ -81,5 +82,8 @@ prometheus_elasticsearch_exporter_port: "9108"
# Prometheus blackbox-exporter ports
prometheus_blackbox_exporter_port: "9115"
+# Prometheus network exporter ports
+prometheus_openstack_network_exporter_port: "1981"
+
# Prometheus instance label to use for metrics
prometheus_instance_label:
diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index 79704c8de..25215d34f 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -543,6 +543,10 @@ monitoring
[prometheus-libvirt-exporter:children]
compute
+[prometheus-openstack-network-exporter:children]
+compute
+network
+
[prometheus-valkey-exporter:children]
valkey
diff --git a/ansible/inventory/multinode b/ansible/inventory/multinode
index cbb0db70c..eb3f0b99e 100644
--- a/ansible/inventory/multinode
+++ b/ansible/inventory/multinode
@@ -561,6 +561,10 @@ monitoring
[prometheus-libvirt-exporter:children]
compute
+[prometheus-openstack-network-exporter:children]
+compute
+network
+
[prometheus-valkey-exporter:children]
valkey
diff --git a/ansible/roles/openvswitch/defaults/main.yml b/ansible/roles/openvswitch/defaults/main.yml
index aea56f828..1eabdd65c 100644
--- a/ansible/roles/openvswitch/defaults/main.yml
+++ b/ansible/roles/openvswitch/defaults/main.yml
@@ -21,6 +21,7 @@ openvswitch_services:
image: "{{ openvswitch_vswitchd_image_full }}"
enabled: "{{ enable_openvswitch }}"
group: openvswitch
+ pid_mode: host
host_in_groups: >-
{{
inventory_hostname in groups['compute']
diff --git a/ansible/roles/openvswitch/handlers/main.yml b/ansible/roles/openvswitch/handlers/main.yml
index a4fbd3f02..cf29888de 100644
--- a/ansible/roles/openvswitch/handlers/main.yml
+++ b/ansible/roles/openvswitch/handlers/main.yml
@@ -38,3 +38,4 @@
privileged: "{{ service.privileged | default(False) }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck }}"
+ pid_mode: "{{ service.pid_mode }}"
diff --git a/ansible/roles/ovn-controller/defaults/main.yml b/ansible/roles/ovn-controller/defaults/main.yml
index e5a32f3ac..8cc7dc309 100644
--- a/ansible/roles/ovn-controller/defaults/main.yml
+++ b/ansible/roles/ovn-controller/defaults/main.yml
@@ -22,6 +22,7 @@ ovn_controller_dimensions: "{{ default_container_dimensions }}"
ovn_controller_default_volumes:
- "{{ node_config_directory }}/ovn-controller/:{{ container_config_directory }}/:ro"
- "/run/openvswitch:/run/openvswitch:shared"
+ - "/run/ovn:/run/ovn:shared"
- "/etc/localtime:/etc/localtime:ro"
- "kolla_logs:/var/log/kolla/"
diff --git a/ansible/roles/ovn-controller/tasks/config.yml b/ansible/roles/ovn-controller/tasks/config.yml
index d2a789ec5..e64f5ddf4 100644
--- a/ansible/roles/ovn-controller/tasks/config.yml
+++ b/ansible/roles/ovn-controller/tasks/config.yml
@@ -9,6 +9,15 @@
become: true
with_dict: "{{ ovn_controller_services | select_services_enabled_and_mapped_to_host }}"
+- name: Create /run/ovn directory on host
+ become: true
+ ansible.builtin.file:
+ path: /run/ovn
+ state: directory
+ mode: "0770"
+ owner: "{{ config_owner_user }}"
+ group: "{{ config_owner_group }}"
+
- name: Copying over config.json files for services
ansible.builtin.template:
src: "{{ item.key }}.json.j2"
diff --git a/ansible/roles/ovn-db/defaults/main.yml b/ansible/roles/ovn-db/defaults/main.yml
index f01a739ce..7a17087a6 100644
--- a/ansible/roles/ovn-db/defaults/main.yml
+++ b/ansible/roles/ovn-db/defaults/main.yml
@@ -70,20 +70,24 @@ ovn_sb_db_relay_dimensions: "{{ default_container_dimensions }}"
ovn_northd_default_volumes:
- "{{ node_config_directory }}/ovn-northd/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
+ - "/run/ovn:/run/ovn:shared"
- "kolla_logs:/var/log/kolla/"
ovn_nb_db_default_volumes:
- "{{ node_config_directory }}/ovn-nb-db/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
- "ovn_nb_db:/var/lib/openvswitch/ovn-nb/"
+ - "/run/ovn:/run/ovn:shared"
- "kolla_logs:/var/log/kolla/"
ovn_sb_db_default_volumes:
- "{{ node_config_directory }}/ovn-sb-db/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
- "ovn_sb_db:/var/lib/openvswitch/ovn-sb/"
+ - "/run/ovn:/run/ovn:shared"
- "kolla_logs:/var/log/kolla/"
ovn_sb_db_relay_default_volumes:
- "{{ node_config_directory }}/ovn-sb-db-relay{{ ('-' + item | string) if item is defined }}/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
+ - "/run/ovn:/run/ovn:shared"
- "kolla_logs:/var/log/kolla/"
ovn_db_extra_volumes: "{{ default_extra_volumes }}"
diff --git a/ansible/roles/ovn-db/tasks/config.yml b/ansible/roles/ovn-db/tasks/config.yml
index 21dc08069..4adfeea3e 100644
--- a/ansible/roles/ovn-db/tasks/config.yml
+++ b/ansible/roles/ovn-db/tasks/config.yml
@@ -1,4 +1,13 @@
---
+- name: Create /run/ovn directory on host
+ become: true
+ ansible.builtin.file:
+ path: /run/ovn
+ state: directory
+ mode: "0770"
+ owner: "{{ config_owner_user }}"
+ group: "{{ config_owner_group }}"
+
- name: Ensuring config directories exist
ansible.builtin.file:
path: "{{ node_config_directory }}/{{ item.key }}"
diff --git a/ansible/roles/prometheus/defaults/main.yml b/ansible/roles/prometheus/defaults/main.yml
index 03eaae027..1145286c8 100644
--- a/ansible/roles/prometheus/defaults/main.yml
+++ b/ansible/roles/prometheus/defaults/main.yml
@@ -121,6 +121,14 @@ prometheus_services:
image: "{{ prometheus_libvirt_exporter_image_full }}"
volumes: "{{ prometheus_libvirt_exporter_default_volumes + prometheus_libvirt_exporter_extra_volumes }}"
dimensions: "{{ prometheus_libvirt_exporter_dimensions }}"
+ prometheus-openstack-network-exporter:
+ container_name: "prometheus_openstack_network_exporter"
+ group: "prometheus-openstack-network-exporter"
+ enabled: "{{ enable_prometheus_openstack_network_exporter | bool }}"
+ image: "{{ prometheus_openstack_network_exporter_image_full }}"
+ volumes: "{{ prometheus_openstack_network_exporter_default_volumes + prometheus_openstack_network_exporter_extra_volumes }}"
+ dimensions: "{{ prometheus_openstack_network_exporter_dimensions }}"
+ pid_mode: host
prometheus-valkey-exporter:
container_name: "prometheus_valkey_exporter"
group: "prometheus-valkey-exporter"
@@ -405,6 +413,10 @@ prometheus_libvirt_exporter_image: "{{ docker_image_url }}prometheus-libvirt-exp
prometheus_libvirt_exporter_tag: "{{ prometheus_tag }}"
prometheus_libvirt_exporter_image_full: "{{ prometheus_libvirt_exporter_image }}:{{ prometheus_libvirt_exporter_tag }}"
+prometheus_openstack_network_exporter_image: "{{ docker_image_url }}prometheus-openstack-network-exporter"
+prometheus_openstack_network_exporter_tag: "{{ prometheus_tag }}"
+prometheus_openstack_network_exporter_image_full: "{{ prometheus_openstack_network_exporter_image }}:{{ prometheus_openstack_network_exporter_tag }}"
+
prometheus_valkey_exporter_image: "{{ docker_image_url }}prometheus-valkey-exporter"
prometheus_valkey_exporter_tag: "{{ prometheus_tag }}"
prometheus_valkey_exporter_image_full: "{{ prometheus_valkey_exporter_image }}:{{ prometheus_valkey_exporter_tag }}"
@@ -417,6 +429,7 @@ prometheus_openstack_exporter_dimensions: "{{ default_container_dimensions }}"
prometheus_elasticsearch_exporter_dimensions: "{{ default_container_dimensions }}"
prometheus_blackbox_exporter_dimensions: "{{ default_container_dimensions }}"
prometheus_libvirt_exporter_dimensions: "{{ default_container_dimensions }}"
+prometheus_openstack_network_exporter_dimensions: "{{ default_container_dimensions }}"
prometheus_valkey_exporter_dimensions: "{{ default_container_dimensions }}"
prometheus_server_default_volumes:
@@ -453,6 +466,13 @@ prometheus_libvirt_exporter_default_volumes:
- "{{ node_config_directory }}/prometheus-libvirt-exporter/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
- "/run/libvirt:/run/libvirt:ro"
+prometheus_openstack_network_exporter_default_volumes:
+ - "{{ node_config_directory }}/prometheus-openstack-network-exporter/:{{ container_config_directory }}/:ro"
+ - "/etc/localtime:/etc/localtime:ro"
+ - "/run/ovn:/run/ovn:ro"
+ - "/run/openvswitch:/run/openvswitch:ro"
+ - "{{ '/etc/timezone:/etc/timezone:ro' if ansible_facts.os_family == 'Debian' else '' }}"
+ - "kolla_logs:/var/log/kolla/"
prometheus_valkey_exporter_default_volumes:
- "{{ node_config_directory }}/prometheus-valkey-exporter/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"
@@ -467,6 +487,7 @@ prometheus_openstack_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
prometheus_elasticsearch_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
prometheus_blackbox_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
prometheus_libvirt_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
+prometheus_openstack_network_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
prometheus_valkey_exporter_extra_volumes: "{{ prometheus_extra_volumes }}"
prometheus_openstack_exporter_disabled_volume: "{{ '--disable-service.volume' if not enable_cinder | bool else '' }}"
@@ -496,6 +517,11 @@ prometheus_openstack_exporter_cmdline_extras: ""
prometheus_alertmanager_external_url: "{{ internal_protocol }}://{{ kolla_internal_fqdn | put_address_in_context('url') }}:{{ prometheus_alertmanager_port }}"
+############
+# Intervals
+############
+prometheus_openstack_network_exporter_interval: "{{ prometheus_scrape_interval }}"
+
###################
# Copy certificates
###################
diff --git a/ansible/roles/prometheus/handlers/main.yml b/ansible/roles/prometheus/handlers/main.yml
index f83129840..0765efca0 100644
--- a/ansible/roles/prometheus/handlers/main.yml
+++ b/ansible/roles/prometheus/handlers/main.yml
@@ -105,6 +105,20 @@
volumes: "{{ service.volumes }}"
dimensions: "{{ service.dimensions }}"
+- name: Restart prometheus-openstack-network-exporter container
+ vars:
+ service_name: "prometheus-openstack-network-exporter"
+ service: "{{ prometheus_services[service_name] }}"
+ become: true
+ kolla_container:
+ action: "recreate_or_restart_container"
+ common_options: "{{ docker_common_options }}"
+ name: "{{ service.container_name }}"
+ image: "{{ service.image }}"
+ volumes: "{{ service.volumes }}"
+ dimensions: "{{ service.dimensions }}"
+ pid_mode: "{{ service.pid_mode }}"
+
- name: Restart prometheus-valkey-exporter container
vars:
service_name: "prometheus-valkey-exporter"
diff --git a/ansible/roles/prometheus/tasks/config.yml b/ansible/roles/prometheus/tasks/config.yml
index a86eab67b..9145230b4 100644
--- a/ansible/roles/prometheus/tasks/config.yml
+++ b/ansible/roles/prometheus/tasks/config.yml
@@ -176,6 +176,20 @@
- "{{ node_custom_config }}/prometheus/prometheus-blackbox-exporter.yml"
- "{{ role_path }}/templates/prometheus-blackbox-exporter.yml.j2"
+- name: Copying config file for openstack network exporter
+ become: true
+ vars:
+ service: "{{ prometheus_services['prometheus-openstack-network-exporter'] }}"
+ ansible.builtin.template:
+ src: "{{ item }}"
+ dest: "{{ node_config_directory }}/prometheus-openstack-network-exporter/openstack-network-exporter.yaml"
+ mode: "0660"
+ when: service | service_enabled_and_mapped_to_host
+ with_first_found:
+ - "{{ node_custom_config }}/prometheus-openstack-network-exporter/{{ inventory_hostname }}/openstack-network-exporter.yaml"
+ - "{{ node_custom_config }}/prometheus-openstack-network-exporter/openstack-network-exporter.yaml"
+ - "{{ role_path }}/templates/openstack-network-exporter.yaml.j2"
+
- name: Copy extra prometheus server config files
vars:
base: "{{ node_custom_config }}/prometheus/"
diff --git a/ansible/roles/prometheus/tasks/precheck.yml b/ansible/roles/prometheus/tasks/precheck.yml
index 9dfc666e5..d4bdf0eba 100644
--- a/ansible/roles/prometheus/tasks/precheck.yml
+++ b/ansible/roles/prometheus/tasks/precheck.yml
@@ -20,6 +20,7 @@
- prometheus_elasticsearch_exporter
- prometheus_blackbox_exporter
- prometheus_libvirt_exporter
+ - prometheus_openstack_network_exporter
check_mode: false
register: container_facts
@@ -159,3 +160,17 @@
- enable_prometheus_libvirt_exporter | bool
with_items:
- "{{ prometheus_libvirt_exporter_port }}"
+
+- name: Checking free ports for Prometheus network-exporter
+ ansible.builtin.wait_for:
+ host: "{{ 'api' | kolla_address }}"
+ port: "{{ item }}"
+ connect_timeout: 1
+ timeout: 1
+ state: stopped
+ when:
+ - container_facts.containers['prometheus_openstack_network_exporter'] is not defined
+ - inventory_hostname in groups['prometheus-openstack-network-exporter']
+ - enable_prometheus_openstack_network_exporter | bool
+ with_items:
+ - "{{ prometheus_openstack_network_exporter_port }}"
diff --git a/ansible/roles/prometheus/templates/openstack-network-exporter.yaml.j2 b/ansible/roles/prometheus/templates/openstack-network-exporter.yaml.j2
new file mode 100644
index 000000000..819f9e36f
--- /dev/null
+++ b/ansible/roles/prometheus/templates/openstack-network-exporter.yaml.j2
@@ -0,0 +1 @@
+http-listen: "{{ api_interface_address | put_address_in_context('url') }}:{{ prometheus_openstack_network_exporter_port }}"
diff --git a/ansible/roles/prometheus/templates/prometheus-openstack-network-exporter.json.j2 b/ansible/roles/prometheus/templates/prometheus-openstack-network-exporter.json.j2
new file mode 100644
index 000000000..ea74a9b7a
--- /dev/null
+++ b/ansible/roles/prometheus/templates/prometheus-openstack-network-exporter.json.j2
@@ -0,0 +1,17 @@
+{
+ "command": "/opt/openstack-network-exporter/dataplane-node-exporter",
+ "config_files": [
+ {
+ "source": "{{ container_config_directory }}/openstack-network-exporter.yaml",
+ "dest": "/etc/dataplane-node-exporter.yaml",
+ "owner": "prometheus",
+ "perm": "0600"
+ }{% if kolla_copy_ca_into_containers | bool %},
+ {
+ "source": "{{ container_config_directory }}/ca-certificates",
+ "dest": "/var/lib/kolla/share/ca-certificates",
+ "owner": "root",
+ "perm": "0600"
+ }{% endif %}
+ ]
+}
diff --git a/ansible/roles/prometheus/templates/prometheus.yml.j2 b/ansible/roles/prometheus/templates/prometheus.yml.j2
index f07e89cea..e6d95467e 100644
--- a/ansible/roles/prometheus/templates/prometheus.yml.j2
+++ b/ansible/roles/prometheus/templates/prometheus.yml.j2
@@ -212,6 +212,21 @@ scrape_configs:
{% endfor %}
{% endif %}
+{% if enable_prometheus_openstack_network_exporter | bool %}
+ - job_name: network_exporter
+ scrape_interval: {{ prometheus_openstack_network_exporter_interval }}
+ honor_labels: true
+ static_configs:
+{% for host in groups["prometheus-openstack-network-exporter"] %}
+ - targets:
+ - '{{ 'api' | kolla_address(host, override_var='prometheus_target_address') | put_address_in_context('url') }}:{{ hostvars[host]['prometheus_openstack_network_exporter_port'] }}'
+{% if hostvars[host].prometheus_instance_label | default(false, true) %}
+ labels:
+ instance: "{{ hostvars[host].prometheus_instance_label }}"
+{% endif %}
+{% endfor %}
+{% endif %}
+
{% if enable_prometheus_etcd_integration | bool %}
- job_name: etcd
{% if etcd_enable_tls | bool %}
diff --git a/ansible/site.yml b/ansible/site.yml
index 18d9c3c92..51838593c 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -474,6 +474,7 @@
- prometheus-elasticsearch-exporter
- prometheus-blackbox-exporter
- prometheus-libvirt-exporter
+ - prometheus-openstack-network-exporter
- prometheus-valkey-exporter
- "&enable_prometheus_True"
serial: '{{ kolla_serial|default("0") }}'
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index da9246a4d..b4ade81ca 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -733,6 +733,7 @@ workaround_ansible_issue_8743: true
#enable_prometheus_elasticsearch_exporter: "{{ enable_prometheus | bool and enable_elasticsearch | bool }}"
#enable_prometheus_blackbox_exporter: "{{ enable_prometheus | bool }}"
#enable_prometheus_libvirt_exporter: "{{ enable_prometheus | bool and enable_nova | bool and nova_compute_virt_type in ['kvm', 'qemu'] }}"
+#enable_prometheus_openstack_network_exporter: "{{ enable_prometheus | bool }}"
#enable_prometheus_etcd_integration: "{{ enable_prometheus | bool and enable_etcd | bool }}"
#enable_prometheus_valkey_exporter: "{{ enable_prometheus | bool and enable_valkey | bool }}"
diff --git a/releasenotes/notes/add-prometheus-network-exporter-b5eb1e0e7a33077a.yaml b/releasenotes/notes/add-prometheus-network-exporter-b5eb1e0e7a33077a.yaml
new file mode 100644
index 000000000..39aef5aca
--- /dev/null
+++ b/releasenotes/notes/add-prometheus-network-exporter-b5eb1e0e7a33077a.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Adds support for deploying ``OpenStack Network Exporter`` for gathering
+ OVS/OVN related metrics. This is enabled by default when using
+ Prometheus.
diff --git a/tests/templates/globals-default.j2 b/tests/templates/globals-default.j2
index 313e7d5cf..feb6a6054 100644
--- a/tests/templates/globals-default.j2
+++ b/tests/templates/globals-default.j2
@@ -199,6 +199,8 @@ enable_octavia: "yes"
octavia_provider_drivers: "ovn:OVN provider"
octavia_provider_agents: "ovn"
neutron_dns_domain: "example.org."
+enable_prometheus: true
+enable_prometheus_openstack_exporter: "no"
{% endif %}
{% if scenario == "prometheus-opensearch" %}
diff --git a/tests/templates/inventory.j2 b/tests/templates/inventory.j2
index 9a7787b31..e2f4b3dcc 100644
--- a/tests/templates/inventory.j2
+++ b/tests/templates/inventory.j2
@@ -630,6 +630,10 @@ monitoring
[prometheus-libvirt-exporter:children]
compute
+[prometheus-openstack-network-exporter:children]
+compute
+network
+
# NOTE(yoctozepto): In CI we want to test Masakari HA but not of other services,
# to conserve the resources. Hence, we set Masakari groups to use both
# primary and secondary while the parent group (control) uses only primary.