Added MMR metrics proxying support

This commit is contained in:
Michael Hollister 2024-07-22 17:38:34 -05:00
parent cb7726f4a8
commit 2c360a99fe
4 changed files with 121 additions and 66 deletions

View File

@ -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: |-

View File

@ -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

View File

@ -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", "type": "grafana",
"uid": "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",

View File

@ -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