| @@ -3611,6 +3611,12 @@ matrix_media_repo_container_labels_traefik_internal_media_entrypoints: "{{ matri | |||||
| matrix_media_repo_container_labels_traefik_internal_matrix_client_media_enabled: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_enabled }}" | matrix_media_repo_container_labels_traefik_internal_matrix_client_media_enabled: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_enabled }}" | ||||
| matrix_media_repo_container_labels_traefik_internal_matrix_client_media_entrypoints: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_name }}" | matrix_media_repo_container_labels_traefik_internal_matrix_client_media_entrypoints: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_name }}" | ||||
| matrix_media_repo_metrics_proxying_enabled: "{{ matrix_media_repo_metrics_enabled and matrix_metrics_exposure_enabled }}" | |||||
| matrix_media_repo_metrics_proxying_hostname: "{{ matrix_metrics_exposure_hostname }}" | |||||
| matrix_media_repo_metrics_proxying_path: "{{ matrix_metrics_exposure_path_prefix }}/matrix-media-repo" | |||||
| matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_enabled: "{{ matrix_metrics_exposure_http_basic_auth_enabled }}" | |||||
| matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_users: "{{ matrix_metrics_exposure_http_basic_auth_users }}" | |||||
| matrix_media_repo_database_hostname: "{{ devture_postgres_connection_hostname if devture_postgres_enabled else '' }}" | matrix_media_repo_database_hostname: "{{ devture_postgres_connection_hostname if devture_postgres_enabled else '' }}" | ||||
| matrix_media_repo_database_username: matrix_media_repo | matrix_media_repo_database_username: matrix_media_repo | ||||
| matrix_media_repo_database_password: "{{ '%s' | format(matrix_homeserver_generic_secret_key) | password_hash('sha512', 'mediarepo.db', rounds=655555) | to_uuid }}" | matrix_media_repo_database_password: "{{ '%s' | format(matrix_homeserver_generic_secret_key) | password_hash('sha512', 'mediarepo.db', rounds=655555) | to_uuid }}" | ||||
| @@ -4880,11 +4886,6 @@ grafana_provisioning_dashboard_template_files: | | |||||
| 'path': 'roles/custom/matrix-prometheus-nginxlog-exporter/templates/grafana/nginx-proxy.json', | 'path': 'roles/custom/matrix-prometheus-nginxlog-exporter/templates/grafana/nginx-proxy.json', | ||||
| 'name': 'nginx-proxy.json', | 'name': 'nginx-proxy.json', | ||||
| }] if matrix_prometheus_nginxlog_exporter_enabled else []) | }] if matrix_prometheus_nginxlog_exporter_enabled else []) | ||||
| + | |||||
| ([{ | |||||
| 'path': 'roles/custom/matrix-media-repo/templates/grafana/media-repo.json', | |||||
| 'name': 'media-repo.json', | |||||
| }] if matrix_media_repo_metrics_enabled else []) | |||||
| }} | }} | ||||
| grafana_default_home_dashboard_path: |- | grafana_default_home_dashboard_path: |- | ||||
| @@ -44,6 +44,11 @@ matrix_media_repo_container_network: "{{ matrix_media_repo_identifier }}" | |||||
| # Use this to expose this container to another reverse proxy, which runs in a different container network. | # Use this to expose this container to another reverse proxy, which runs in a different container network. | ||||
| matrix_media_repo_container_additional_networks: [] | matrix_media_repo_container_additional_networks: [] | ||||
| # Controls whether media repo metrics should be proxied (exposed) on `matrix.DOMAIN/metrics/matrix-media-repo` | |||||
| matrix_media_repo_metrics_proxying_enabled: false | |||||
| matrix_media_repo_metrics_proxying_hostname: "" | |||||
| matrix_media_repo_metrics_proxying_path: "/metrics/matrix-media-repo" | |||||
| # Controls whether the matrix-media-repo container exposes its HTTP port (tcp/8000 in the container). | # Controls whether the matrix-media-repo container exposes its HTTP port (tcp/8000 in the container). | ||||
| # | # | ||||
| # Takes an "<ip>:<port>" or "<port>" value (e.g. "127.0.0.1:8000"), or empty string to not expose. | # Takes an "<ip>:<port>" or "<port>" value (e.g. "127.0.0.1:8000"), or empty string to not expose. | ||||
| @@ -134,6 +139,18 @@ matrix_media_repo_container_labels_traefik_t2bot_entrypoints: "{{ matrix_media_r | |||||
| matrix_media_repo_container_labels_traefik_t2bot_tls: "{{ matrix_media_repo_container_labels_traefik_t2bot_entrypoints != 'web' }}" | matrix_media_repo_container_labels_traefik_t2bot_tls: "{{ matrix_media_repo_container_labels_traefik_t2bot_entrypoints != 'web' }}" | ||||
| matrix_media_repo_container_labels_traefik_t2bot_tls_certResolver: default # noqa var-naming | matrix_media_repo_container_labels_traefik_t2bot_tls_certResolver: default # noqa var-naming | ||||
| # Controls whether labels will be added that expose the media repo metrics endpoint | |||||
| matrix_media_repo_container_labels_traefik_metrics_enabled: "{{ matrix_media_repo_metrics_enabled and matrix_media_repo_metrics_proxying_enabled }}" | |||||
| matrix_media_repo_container_labels_traefik_metrics_rule: "Host(`{{ matrix_media_repo_metrics_proxying_hostname }}`) && PathPrefix(`{{ matrix_media_repo_metrics_proxying_path }}`)" | |||||
| matrix_media_repo_container_labels_traefik_metrics_priority: 0 | |||||
| matrix_media_repo_container_labels_traefik_metrics_entrypoints: "{{ matrix_media_repo_container_labels_traefik_entrypoints }}" | |||||
| matrix_media_repo_container_labels_traefik_metrics_tls: "{{ matrix_media_repo_container_labels_traefik_t2bot_entrypoints != 'web' }}" | |||||
| matrix_media_repo_container_labels_traefik_metrics_tls_certResolver: default # noqa var-naming | |||||
| matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_enabled: false | |||||
| # See: https://doc.traefik.io/traefik/middlewares/http/basicauth/#users | |||||
| matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_users: '' | |||||
| # Traefik labels handling the old `/_matrix/media` endpoints on the federation entrypint. | # Traefik labels handling the old `/_matrix/media` endpoints on the federation entrypint. | ||||
| # These are being superseded by `/_matrix/federation/VERSION/media` endpoints - see `matrix_media_repo_container_labels_traefik_federation_matrix_federation_media_*`. | # These are being superseded by `/_matrix/federation/VERSION/media` endpoints - see `matrix_media_repo_container_labels_traefik_federation_matrix_federation_media_*`. | ||||
| matrix_media_repo_container_labels_traefik_media_federation_enabled: true | matrix_media_repo_container_labels_traefik_media_federation_enabled: true | ||||
| @@ -1,59 +1,16 @@ | |||||
| { | { | ||||
| "__inputs": [ | |||||
| { | |||||
| "name": "DS_PROMETHEUS", | |||||
| "label": "Prometheus", | |||||
| "description": "", | |||||
| "type": "datasource", | |||||
| "pluginId": "prometheus", | |||||
| "pluginName": "Prometheus" | |||||
| } | |||||
| ], | |||||
| "__elements": {}, | |||||
| "__requires": [ | |||||
| { | |||||
| "type": "grafana", | |||||
| "id": "grafana", | |||||
| "name": "Grafana", | |||||
| "version": "10.1.0" | |||||
| }, | |||||
| { | |||||
| "type": "panel", | |||||
| "id": "heatmap", | |||||
| "name": "Heatmap", | |||||
| "version": "" | |||||
| }, | |||||
| { | |||||
| "type": "datasource", | |||||
| "id": "prometheus", | |||||
| "name": "Prometheus", | |||||
| "version": "1.0.0" | |||||
| }, | |||||
| { | |||||
| "type": "panel", | |||||
| "id": "timeseries", | |||||
| "name": "Time series", | |||||
| "version": "" | |||||
| } | |||||
| ], | |||||
| "annotations": { | "annotations": { | ||||
| "list": [ | "list": [ | ||||
| { | { | ||||
| "builtIn": 1, | "builtIn": 1, | ||||
| "datasource": { | "datasource": { | ||||
| "type": "datasource", | |||||
| "uid": "grafana" | |||||
| "type": "grafana", | |||||
| "uid": "${DS_PROMETHEUS}" | |||||
| }, | }, | ||||
| "enable": true, | "enable": true, | ||||
| "hide": true, | "hide": true, | ||||
| "iconColor": "rgba(0, 211, 255, 1)", | "iconColor": "rgba(0, 211, 255, 1)", | ||||
| "name": "Annotations & Alerts", | "name": "Annotations & Alerts", | ||||
| "target": { | |||||
| "limit": 100, | |||||
| "matchAny": false, | |||||
| "tags": [], | |||||
| "type": "dashboard" | |||||
| }, | |||||
| "type": "dashboard" | "type": "dashboard" | ||||
| } | } | ||||
| ] | ] | ||||
| @@ -153,7 +110,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "expr": "rate(media_http_requests_total[2m])", | |||||
| "expr": "rate(media_http_requests_total{host=\"$host\"}[2m])", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| "legendFormat": "{{ '{{host}}: {{method}} {{action}}' }}", | "legendFormat": "{{ '{{host}}: {{method}} {{action}}' }}", | ||||
| @@ -166,7 +123,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "expr": "rate(media_invalid_http_requests_total[2m])", | |||||
| "expr": "rate(media_invalid_http_requests_total{host=\"$host\"}[2m])", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| "legendFormat": "{{ 'Invalid Host: {{method}} {{action}}' }}", | "legendFormat": "{{ 'Invalid Host: {{method}} {{action}}' }}", | ||||
| @@ -265,7 +222,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "expr": "rate(media_http_responses_total[2m])", | |||||
| "expr": "rate(media_http_responses_total{host=\"$host\"}[2m])", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| "legendFormat": "{{ '{{host}}: {{method}} {{action}} {{statusCode}}' }}", | "legendFormat": "{{ '{{host}}: {{method}} {{action}} {{statusCode}}' }}", | ||||
| @@ -278,7 +235,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "expr": "rate(media_invalid_http_requests_total[2m])", | |||||
| "expr": "rate(media_invalid_http_requests_total{host=\"$host\"}[2m])", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "hide": false, | "hide": false, | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| @@ -369,7 +326,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": false, | "exemplar": false, | ||||
| "expr": "sum(rate(media_http_response_time_seconds_bucket{action=~\"download|thumbnail\"}[2m])) by (le)", | |||||
| "expr": "sum(rate(media_http_response_time_seconds_bucket{action=~\"download|thumbnail\", host=\"$host\"}[2m])) by (le)", | |||||
| "format": "heatmap", | "format": "heatmap", | ||||
| "instant": false, | "instant": false, | ||||
| "interval": "", | "interval": "", | ||||
| @@ -460,7 +417,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": false, | "exemplar": false, | ||||
| "expr": "sum(rate(media_http_response_time_seconds_bucket{action=\"upload\"}[2m])) by (le)", | |||||
| "expr": "sum(rate(media_http_response_time_seconds_bucket{action=\"upload\", host=\"$host\"}[2m])) by (le)", | |||||
| "format": "heatmap", | "format": "heatmap", | ||||
| "instant": false, | "instant": false, | ||||
| "legendFormat": "{{ '{{method}} {{action}} - {{le}}' }}", | "legendFormat": "{{ '{{method}} {{action}} - {{le}}' }}", | ||||
| @@ -560,7 +517,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_alloc_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_alloc_bytes", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "interval": "", | "interval": "", | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| @@ -574,7 +531,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_sys_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_sys_bytes", | |||||
| "interval": "", | "interval": "", | ||||
| "legendFormat": "memory usage (sys)", | "legendFormat": "memory usage (sys)", | ||||
| "refId": "C" | "refId": "C" | ||||
| @@ -585,7 +542,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_heap_alloc_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_heap_alloc_bytes", | |||||
| "interval": "", | "interval": "", | ||||
| "legendFormat": "heap usage (alloc)", | "legendFormat": "heap usage (alloc)", | ||||
| "refId": "A" | "refId": "A" | ||||
| @@ -596,7 +553,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_heap_idle_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_heap_idle_bytes", | |||||
| "interval": "", | "interval": "", | ||||
| "legendFormat": "heap usage (idle)", | "legendFormat": "heap usage (idle)", | ||||
| "refId": "D" | "refId": "D" | ||||
| @@ -607,7 +564,7 @@ | |||||
| "uid": "${DS_PROMETHEUS}" | "uid": "${DS_PROMETHEUS}" | ||||
| }, | }, | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_heap_inuse_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_heap_inuse_bytes", | |||||
| "interval": "", | "interval": "", | ||||
| "legendFormat": "heap usage (used)", | "legendFormat": "heap usage (used)", | ||||
| "refId": "E" | "refId": "E" | ||||
| @@ -619,7 +576,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_memstats_heap_released_bytes{job=\"media_repo\"}", | |||||
| "expr": "go_memstats_heap_released_bytes", | |||||
| "hide": false, | "hide": false, | ||||
| "legendFormat": "heap usage (released)", | "legendFormat": "heap usage (released)", | ||||
| "range": true, | "range": true, | ||||
| @@ -718,7 +675,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_goroutines{job=\"media_repo\"}", | |||||
| "expr": "go_goroutines", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "interval": "", | "interval": "", | ||||
| "intervalFactor": 1, | "intervalFactor": 1, | ||||
| @@ -733,7 +690,7 @@ | |||||
| }, | }, | ||||
| "editorMode": "code", | "editorMode": "code", | ||||
| "exemplar": true, | "exemplar": true, | ||||
| "expr": "go_threads{job=\"media_repo\"}", | |||||
| "expr": "go_threads", | |||||
| "format": "time_series", | "format": "time_series", | ||||
| "hide": false, | "hide": false, | ||||
| "interval": "", | "interval": "", | ||||
| @@ -1263,9 +1220,51 @@ | |||||
| "refresh": "1m", | "refresh": "1m", | ||||
| "schemaVersion": 38, | "schemaVersion": 38, | ||||
| "style": "dark", | "style": "dark", | ||||
| "tags": [], | |||||
| "tags": [ | |||||
| "matrix" | |||||
| ], | |||||
| "templating": { | "templating": { | ||||
| "list": [] | |||||
| "list": [ | |||||
| { | |||||
| "current": {}, | |||||
| "hide": 0, | |||||
| "includeAll": false, | |||||
| "label": "Datasource", | |||||
| "multi": false, | |||||
| "name": "DS_PROMETHEUS", | |||||
| "options": [], | |||||
| "query": "prometheus", | |||||
| "queryValue": "", | |||||
| "refresh": 1, | |||||
| "regex": "", | |||||
| "skipUrlSync": false, | |||||
| "type": "datasource" | |||||
| }, | |||||
| { | |||||
| "current": {}, | |||||
| "datasource": { | |||||
| "type": "prometheus", | |||||
| "uid": "${DS_PROMETHEUS}" | |||||
| }, | |||||
| "definition": "label_values(media_http_response_time_seconds_bucket,host)", | |||||
| "hide": 0, | |||||
| "includeAll": false, | |||||
| "label": "Host", | |||||
| "multi": false, | |||||
| "name": "host", | |||||
| "options": [], | |||||
| "query": { | |||||
| "qryType": 1, | |||||
| "query": "label_values(media_http_response_time_seconds_bucket,host)", | |||||
| "refId": "PrometheusVariableQueryEditor-VariableQuery" | |||||
| }, | |||||
| "refresh": 1, | |||||
| "regex": "", | |||||
| "skipUrlSync": false, | |||||
| "sort": 0, | |||||
| "type": "query" | |||||
| } | |||||
| ] | |||||
| }, | }, | ||||
| "time": { | "time": { | ||||
| "from": "now-1h", | "from": "now-1h", | ||||
| @@ -6,6 +6,7 @@ traefik.docker.network={{ matrix_media_repo_container_labels_traefik_docker_netw | |||||
| {% endif %} | {% endif %} | ||||
| traefik.http.services.matrix-media-repo.loadbalancer.server.port={{ matrix_media_repo_port }} | traefik.http.services.matrix-media-repo.loadbalancer.server.port={{ matrix_media_repo_port }} | ||||
| traefik.http.services.matrix-media-repo-metrics.loadbalancer.server.port={{ matrix_media_repo_metrics_port }} | |||||
| {% set middlewares = [] %} | {% set middlewares = [] %} | ||||
| @@ -243,6 +244,43 @@ traefik.http.routers.matrix-media-repo-public-t2bot.tls.certResolver={{ matrix_m | |||||
| {% endif %} | {% endif %} | ||||
| {% if matrix_media_repo_container_labels_traefik_metrics_enabled %} | |||||
| ############################################################ | |||||
| # # | |||||
| # Metrics # | |||||
| # # | |||||
| ############################################################ | |||||
| {% set metricsMiddlewares = ['matrix-media-repo-metrics-replace-path'] %} | |||||
| traefik.http.middlewares.matrix-media-repo-metrics-replace-path.replacepath.path=/metrics | |||||
| {% if matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_enabled %} | |||||
| {% set metricsMiddlewares = metricsMiddlewares + ['matrix-media-repo-metrics-basic-auth'] %} | |||||
| traefik.http.middlewares.matrix-media-repo-metrics-basic-auth.basicauth.users={{ matrix_media_repo_container_labels_traefik_metrics_middleware_basic_auth_users }} | |||||
| {% endif %} | |||||
| traefik.http.routers.matrix-media-repo-metrics.rule={{ matrix_media_repo_container_labels_traefik_metrics_rule }} | |||||
| traefik.http.routers.matrix-media-repo-metrics.middlewares={{ metricsMiddlewares | join(',') }} | |||||
| {% if matrix_media_repo_container_labels_traefik_metrics_priority | int > 0 %} | |||||
| traefik.http.routers.matrix-media-repo-metrics.priority={{ matrix_media_repo_container_labels_traefik_metrics_priority }} | |||||
| {% endif %} | |||||
| traefik.http.routers.matrix-media-repo-metrics.service=matrix-media-repo-metrics | |||||
| traefik.http.routers.matrix-media-repo-metrics.entrypoints={{ matrix_media_repo_container_labels_traefik_metrics_entrypoints }} | |||||
| traefik.http.routers.matrix-media-repo-metrics.tls={{ matrix_media_repo_container_labels_traefik_metrics_tls | to_json }} | |||||
| {% if matrix_media_repo_container_labels_traefik_metrics_tls %} | |||||
| traefik.http.routers.matrix-media-repo-metrics.tls.certResolver={{ matrix_media_repo_container_labels_traefik_metrics_tls_certResolver }} | |||||
| {% endif %} | |||||
| ############################################################ | |||||
| # # | |||||
| # /Metrics # | |||||
| # # | |||||
| ############################################################ | |||||
| {% endif %} | |||||
| {% if matrix_media_repo_homeserver_federation_enabled %} | {% if matrix_media_repo_homeserver_federation_enabled %} | ||||
| # Matrix Federation | # Matrix Federation | ||||