diff options
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. |
