mirror of
				https://github.com/spantaleev/matrix-docker-ansible-deploy.git
				synced 2025-10-31 07:17:57 +01:00 
			
		
		
		
	Merge pull request #1094 from coetzeer/master
Add support for a prometheus postgres exporter
This commit is contained in:
		
							
								
								
									
										29
									
								
								docs/configuring-playbook-prometheus-postgres.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								docs/configuring-playbook-prometheus-postgres.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| # Enabling metrics and graphs for Postgres (optional) | ||||
|  | ||||
| Expanding on the metrics exposed by the [syapse exporter and the node exporter](configuring-playbook-prometheus-grafana.md), the playbook enables the [postgres exporter](https://github.com/prometheus-community/postgres_exporter) that exposes more detailed information about what's happening on your postgres database. | ||||
|  | ||||
| You can enable this with the following settings in your configuration file (`inventory/host_vars/matrix.<your-domain>/vars.yml`): | ||||
|  | ||||
|  | ||||
| ```yaml | ||||
| matrix_prometheus_postgres_exporter_enabled: true | ||||
|  | ||||
| # the role creates a postgres user as credential. You can configure these if required: | ||||
| matrix_prometheus_postgres_exporter_database_username: 'matrix_prometheus_postgres_exporter' | ||||
| matrix_prometheus_postgres_exporter_database_password: 'some-password' | ||||
|  | ||||
| ``` | ||||
|  | ||||
| ## What does it do? | ||||
|  | ||||
| Name | Description | ||||
| -----|---------- | ||||
| `matrix_prometheus_postgres_exporter_enabled`|Enable the postgres prometheus exporter. This sets up the docker container, connects it to the database and adds a 'job' to the prometheus config which tells prometheus about this new exporter. The default is 'false' | ||||
| `matrix_prometheus_postgres_exporter_database_username`| The 'username' for the user that the exporter uses to connect to the database. The default is 'matrix_prometheus_postgres_exporter' | ||||
| `matrix_prometheus_postgres_exporter_database_password`| The 'username' for the user that the exporter uses to connect to the database. | ||||
|  | ||||
|  | ||||
| ## More information | ||||
|  | ||||
| - [The PostgresSQL dashboard](https://grafana.com/grafana/dashboards/9628) (generic postgres dashboard) | ||||
|  | ||||
| @@ -1466,6 +1466,13 @@ matrix_postgres_additional_databases: | | ||||
|       'username': matrix_sygnal_database_username, | ||||
|       'password': matrix_sygnal_database_password, | ||||
|     }] if (matrix_sygnal_enabled and matrix_sygnal_database_engine == 'postgres' and matrix_sygnal_database_hostname == 'matrix-postgres') else []) | ||||
|      + | ||||
|     ([{ | ||||
|       'name': matrix_prometheus_postgres_exporter_database_name, | ||||
|       'username': matrix_prometheus_postgres_exporter_database_username, | ||||
|       'password': matrix_prometheus_postgres_exporter_database_password, | ||||
|     }] if (matrix_prometheus_postgres_exporter_enabled and matrix_prometheus_postgres_exporter_database_hostname == 'matrix-postgres') else []) | ||||
|     | ||||
|    }} | ||||
|  | ||||
| matrix_postgres_import_roles_to_ignore: | | ||||
| @@ -1766,6 +1773,10 @@ matrix_prometheus_scraper_synapse_rules_synapse_tag: "{{ matrix_synapse_docker_i | ||||
| matrix_prometheus_scraper_node_enabled: "{{ matrix_prometheus_node_exporter_enabled }}" | ||||
| matrix_prometheus_scraper_node_targets: "{{ ['matrix-prometheus-node-exporter:9100'] if matrix_prometheus_node_exporter_enabled else [] }}" | ||||
|  | ||||
| matrix_prometheus_scraper_postgres_enabled: "{{ matrix_prometheus_postgres_exporter_enabled }}" | ||||
| matrix_prometheus_scraper_postgres_targets: "{{ ['matrix-prometheus-postgres-exporter:'+ matrix_prometheus_postgres_exporter_port|string] if matrix_prometheus_scraper_postgres_enabled else [] }}" | ||||
|  | ||||
|  | ||||
| ###################################################################### | ||||
| # | ||||
| # /matrix-prometheus | ||||
| @@ -1773,6 +1784,27 @@ matrix_prometheus_scraper_node_targets: "{{ ['matrix-prometheus-node-exporter:91 | ||||
| ###################################################################### | ||||
|  | ||||
|  | ||||
| ###################################################################### | ||||
| # | ||||
| # matrix-prometheus-postgres-exporter | ||||
| # | ||||
| ###################################################################### | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_enabled: false | ||||
| matrix_prometheus_postgres_exporter_database_password: "{{ matrix_synapse_macaroon_secret_key | password_hash('sha512', 'prometheus.pg.db') | to_uuid }}" | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_systemd_required_services_list: | | ||||
|   {{ | ||||
|     ['docker.service'] | ||||
|     + | ||||
|     (['matrix-postgres.service'] if matrix_postgres_enabled else []) | ||||
|   }} | ||||
|  | ||||
| ###################################################################### | ||||
| # | ||||
| # /matrix-prometheus-postgres-exporter | ||||
| # | ||||
| ###################################################################### | ||||
|  | ||||
| ###################################################################### | ||||
| # | ||||
| @@ -1787,6 +1819,14 @@ matrix_grafana_enabled: false | ||||
| # Grafana's HTTP port to the local host. | ||||
| matrix_grafana_container_http_host_bind_port: "{{ '' if matrix_nginx_proxy_enabled else '127.0.0.1:3000' }}" | ||||
|  | ||||
| matrix_grafana_dashboard_download_urls_all: | | ||||
|   {{ | ||||
|     matrix_grafana_dashboard_download_urls | ||||
|     + | ||||
|     (matrix_prometheus_postgres_exporter_dashboard_urls if matrix_prometheus_postgres_exporter_enabled else []) | ||||
|   }} | ||||
|  | ||||
|  | ||||
| ###################################################################### | ||||
| # | ||||
| # /matrix-grafana | ||||
|   | ||||
| @@ -64,7 +64,7 @@ | ||||
|     mode: 0440 | ||||
|     owner: "{{ matrix_user_username }}" | ||||
|     group: "{{ matrix_user_groupname }}" | ||||
|   with_items: "{{ matrix_grafana_dashboard_download_urls }}" | ||||
|   with_items: "{{ matrix_grafana_dashboard_download_urls_all }}" | ||||
|   when: matrix_grafana_enabled|bool | ||||
|  | ||||
| - name: Ensure matrix-grafana.service installed | ||||
|   | ||||
							
								
								
									
										49
									
								
								roles/matrix-prometheus-postgres-exporter/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								roles/matrix-prometheus-postgres-exporter/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| # matrix-prometheus-postgres-exporter is an Prometheus exporter for postgres metrics | ||||
| # See: https://github.com/prometheus-community/postgres_exporter | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_enabled: false | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_version: v0.9.0 | ||||
| matrix_prometheus_postgres_exporter_port: 9187 | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_docker_image: "quay.io/prometheuscommunity/postgres-exporter:{{ matrix_prometheus_postgres_exporter_version }}" | ||||
| matrix_prometheus_postgres_exporter_docker_image_force_pull: "{{ matrix_prometheus_postgres_exporter_docker_image.endswith(':latest') }}" | ||||
|  | ||||
| # A list of extra arguments to pass to the container | ||||
| matrix_prometheus_postgres_exporter_container_extra_arguments: ["-e PG_EXPORTER_AUTO_DISCOVER_DATABASES=true", | ||||
|  "-e PG_EXPORTER_WEB_LISTEN_ADDRESS=\":{{matrix_prometheus_postgres_exporter_port}}\"", | ||||
|  "-e DATA_SOURCE_NAME=\"postgresql://{{matrix_prometheus_postgres_exporter_database_username}}:{{matrix_prometheus_postgres_exporter_database_password}}@{{matrix_prometheus_postgres_exporter_database_hostname}}:5432/{{matrix_prometheus_postgres_exporter_database_name}}?sslmode=disable\"" ] | ||||
|  | ||||
| # List of systemd services that matrix-prometheus-postgres-exporter.service depends on | ||||
| matrix_prometheus_postgres_exporter_systemd_required_services_list: ['docker.service'] | ||||
|  | ||||
| # List of systemd services that matrix-prometheus-postgres-exporter.service wants | ||||
| matrix_prometheus_postgres_exporter_systemd_wanted_services_list: [] | ||||
|  | ||||
| # details for connecting to the database | ||||
| matrix_prometheus_postgres_exporter_database_username: 'matrix_prometheus_postgres_exporter' | ||||
| matrix_prometheus_postgres_exporter_database_password: 'some-password' | ||||
| matrix_prometheus_postgres_exporter_database_hostname: 'matrix-postgres' | ||||
| matrix_prometheus_postgres_exporter_database_port: 5432 | ||||
| matrix_prometheus_postgres_exporter_database_name: 'matrix_prometheus_postgres_exporter' | ||||
|  | ||||
|  | ||||
| # Controls whether the matrix-prometheus container exposes its HTTP port (tcp/9100 in the container). | ||||
| # | ||||
| # Takes an "<ip>:<port>" value (e.g. "127.0.0.1:9100"), or empty string to not expose. | ||||
| # | ||||
| # Official recommendations are to run this container with `--net=host`, | ||||
| # but we don't do that, since it: | ||||
| # - likely exposes the metrics web server way too publicly (before applying https://github.com/spantaleev/matrix-docker-ansible-deploy/pull/1008) | ||||
| # - or listens on a loopback interface only (--net=host and 127.0.0.1:9100), which is not reachable from another container (like `matrix-prometheus`) | ||||
| # | ||||
| # Using `--net=host` and binding to Docker's `matrix` bridge network may be a solution to both, | ||||
| # but that's trickier to accomplish and won't necessarily work (hasn't been tested). | ||||
| # | ||||
| # Not using `--net=host` means that our network statistic reports are likely broken (inaccurate), | ||||
| # because node-exporter can't see all interfaces, etc. | ||||
| # For now, we'll live with that, until someone develops a better solution. | ||||
| matrix_prometheus_postgres_exporter_container_http_host_bind_port: '' | ||||
|  | ||||
| matrix_prometheus_postgres_exporter_dashboard_urls: | ||||
| - "https://grafana.com/api/dashboards/9628/revisions/7/download" | ||||
							
								
								
									
										5
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/init.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/init.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| - set_fact: | ||||
|     matrix_systemd_services_list: "{{ matrix_systemd_services_list + ['matrix-prometheus-postgres-exporter.service'] }}" | ||||
|   when: matrix_prometheus_postgres_exporter_enabled|bool | ||||
|  | ||||
|  | ||||
							
								
								
									
										8
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| - import_tasks: "{{ role_path }}/tasks/init.yml" | ||||
|   tags: | ||||
|     - always | ||||
|  | ||||
| - import_tasks: "{{ role_path }}/tasks/setup.yml" | ||||
|   tags: | ||||
|     - setup-all | ||||
|     - setup-prometheus-postgres-exporter | ||||
							
								
								
									
										54
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/setup.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								roles/matrix-prometheus-postgres-exporter/tasks/setup.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| --- | ||||
|  | ||||
| # | ||||
| # Tasks related to setting up matrix-prometheus-postgres-exporter | ||||
| # | ||||
|  | ||||
| - name: Ensure matrix-prometheus-postgres-exporter image is pulled | ||||
|   docker_image: | ||||
|     name: "{{ matrix_prometheus_postgres_exporter_docker_image }}" | ||||
|     source: "{{ 'pull' if ansible_version.major > 2 or ansible_version.minor > 7 else omit }}" | ||||
|     force_source: "{{ matrix_prometheus_postgres_exporter_docker_image_force_pull if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}" | ||||
|     force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_prometheus_postgres_exporter_docker_image_force_pull }}" | ||||
|   when: "matrix_prometheus_postgres_exporter_enabled|bool" | ||||
|  | ||||
| - name: Ensure matrix-prometheus-postgres-exporter.service installed | ||||
|   template: | ||||
|     src: "{{ role_path }}/templates/systemd/matrix-prometheus-postgres-exporter.service.j2" | ||||
|     dest: "{{ matrix_systemd_path }}/matrix-prometheus-postgres-exporter.service" | ||||
|     mode: 0644 | ||||
|   register: matrix_prometheus_postgres_exporter_systemd_service_result | ||||
|   when: matrix_prometheus_postgres_exporter_enabled|bool | ||||
|  | ||||
| - name: Ensure systemd reloaded after matrix-prometheus.service installation | ||||
|   service: | ||||
|     daemon_reload: yes | ||||
|   when: "matrix_prometheus_postgres_exporter_enabled|bool and matrix_prometheus_postgres_exporter_systemd_service_result.changed" | ||||
|  | ||||
| # | ||||
| # Tasks related to getting rid of matrix-prometheus-postgres-exporter (if it was previously enabled) | ||||
| # | ||||
|  | ||||
| - name: Check existence of matrix-prometheus-postgres-exporter service | ||||
|   stat: | ||||
|     path: "{{ matrix_systemd_path }}/matrix-prometheus-postgres-exporter.service" | ||||
|   register: matrix_prometheus_postgres_exporter_service_stat | ||||
|  | ||||
| - name: Ensure matrix-prometheus-postgres-exporter is stopped | ||||
|   service: | ||||
|     name: matrix-prometheus-postgres-exporter | ||||
|     state: stopped | ||||
|     daemon_reload: yes | ||||
|   register: stopping_result | ||||
|   when: "not matrix_prometheus_postgres_exporter_enabled|bool and matrix_prometheus_postgres_exporter_service_stat.stat.exists" | ||||
|  | ||||
| - name: Ensure matrix-prometheus-postgres-exporter.service doesn't exist | ||||
|   file: | ||||
|     path: "{{ matrix_systemd_path }}/matrix-prometheus-postgres-exporter.service" | ||||
|     state: absent | ||||
|   when: "not matrix_prometheus_postgres_exporter_enabled|bool and matrix_prometheus_postgres_exporter_service_stat.stat.exists" | ||||
|  | ||||
| - name: Ensure systemd reloaded after matrix-prometheus-postgres-exporter.service removal | ||||
|   service: | ||||
|     daemon_reload: yes | ||||
|   when: "not matrix_prometheus_postgres_exporter_enabled|bool and matrix_prometheus_postgres_exporter_service_stat.stat.exists" | ||||
| @@ -0,0 +1,42 @@ | ||||
| #jinja2: lstrip_blocks: "True" | ||||
| [Unit] | ||||
| Description=matrix-prometheus-postgres-exporter | ||||
| {% for service in matrix_prometheus_postgres_exporter_systemd_required_services_list %} | ||||
| Requires={{ service }} | ||||
| After={{ service }} | ||||
| {% endfor %} | ||||
| {% for service in matrix_prometheus_postgres_exporter_systemd_wanted_services_list %} | ||||
| Wants={{ service }} | ||||
| {% endfor %} | ||||
| DefaultDependencies=no | ||||
|  | ||||
| [Service] | ||||
| Type=simple | ||||
| Environment="HOME={{ matrix_systemd_unit_home_path }}" | ||||
| ExecStartPre=-{{ matrix_host_command_sh }} -c '{{ matrix_host_command_docker }} kill matrix-prometheus-postgres-exporter 2>/dev/null' | ||||
| ExecStartPre=-{{ matrix_host_command_sh }} -c '{{ matrix_host_command_docker }} rm matrix-prometheus-postgres-exporter 2>/dev/null' | ||||
|  | ||||
|  | ||||
| ExecStart={{ matrix_host_command_docker }} run --rm --name matrix-prometheus-postgres-exporter \ | ||||
| 			--log-driver=none \ | ||||
| 			--user={{ matrix_user_uid }}:{{ matrix_user_gid }} \ | ||||
| 			--cap-drop=ALL \ | ||||
| 			--read-only \ | ||||
| 			{% for arg in matrix_prometheus_postgres_exporter_container_extra_arguments %} | ||||
| 			{{ arg }} \ | ||||
| 			{% endfor %} | ||||
| 			--network={{ matrix_docker_network }} \ | ||||
| 			{% if matrix_prometheus_postgres_exporter_container_http_host_bind_port %} | ||||
| 			-p {{ matrix_prometheus_postgres_exporter_container_http_host_bind_port }}:{{matrix_prometheus_postgres_exporter_port}} \ | ||||
| 			{% endif %} | ||||
| 			--pid=host \ | ||||
| 			{{ matrix_prometheus_postgres_exporter_docker_image }}  | ||||
|  | ||||
| ExecStop=-{{ matrix_host_command_sh }} -c '{{ matrix_host_command_docker }} kill matrix-prometheus-postgres-exporter 2>/dev/null' | ||||
| ExecStop=-{{ matrix_host_command_sh }} -c '{{ matrix_host_command_docker }} rm matrix-prometheus-postgres-exporter 2>/dev/null' | ||||
| Restart=always | ||||
| RestartSec=30 | ||||
| SyslogIdentifier=matrix-prometheus-postgres-exporter | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
| @@ -38,3 +38,9 @@ scrape_configs: | ||||
|     static_configs: | ||||
|       - targets: {{ matrix_prometheus_scraper_node_targets|to_json }} | ||||
|   {% endif %} | ||||
|  | ||||
|   {% if matrix_prometheus_scraper_postgres_enabled %} | ||||
|   - job_name: postgres | ||||
|     static_configs: | ||||
|       - targets: {{ matrix_prometheus_scraper_postgres_targets|to_json }} | ||||
|   {% endif %} | ||||
		Reference in New Issue
	
	Block a user