diff --git a/swh/web/metrics/prometheus.py b/swh/web/metrics/prometheus.py --- a/swh/web/metrics/prometheus.py +++ b/swh/web/metrics/prometheus.py @@ -21,6 +21,7 @@ SaveOriginRequest, ) from swh.web.save_code_now.origin_save import get_savable_visit_types +from swh.web.save_origin_webhooks.generic_receiver import SUPPORTED_FORGE_TYPES SWH_WEB_METRICS_REGISTRY = CollectorRegistry(auto_describe=True) @@ -33,6 +34,17 @@ registry=SWH_WEB_METRICS_REGISTRY, ) +SUBMITTED_SAVE_REQUESTS_FROM_WEBHOOKS_METRIC = ( + "swh_web_submitted_save_requests_from_webhooks" +) + +_submitted_save_requests_from_webhooks_gauge = Gauge( + name=SUBMITTED_SAVE_REQUESTS_FROM_WEBHOOKS_METRIC, + documentation="Number of submitted origin save requests through forge webhook receivers", + labelnames=["status", "webhook_origin"], + registry=SWH_WEB_METRICS_REGISTRY, +) + ACCEPTED_SAVE_REQUESTS_METRIC = "swh_web_accepted_save_requests" @@ -88,6 +100,11 @@ for labels in labels_set: _submitted_save_requests_gauge.labels(*labels).set(0) + labels_set = product(request_statuses, SUPPORTED_FORGE_TYPES) + + for labels in labels_set: + _submitted_save_requests_from_webhooks_gauge.labels(*labels).set(0) + labels_set = product(load_task_statuses, visit_types) for labels in labels_set: @@ -112,6 +129,12 @@ status=sor.status, visit_type=sor.visit_type ).inc() + if sor.from_webhook: + _submitted_save_requests_from_webhooks_gauge.labels( + status=sor.status, + webhook_origin=sor.webhook_origin, + ).inc() + if ( sor.loading_task_status in (SAVE_TASK_SUCCEEDED, SAVE_TASK_FAILED) and sor.visit_date is not None diff --git a/swh/web/metrics/tests/test_metrics.py b/swh/web/metrics/tests/test_metrics.py --- a/swh/web/metrics/tests/test_metrics.py +++ b/swh/web/metrics/tests/test_metrics.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2021 The Software Heritage developers +# Copyright (C) 2019-2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -13,6 +13,7 @@ from swh.web.metrics.prometheus import ( ACCEPTED_SAVE_REQUESTS_DELAY_METRIC, ACCEPTED_SAVE_REQUESTS_METRIC, + SUBMITTED_SAVE_REQUESTS_FROM_WEBHOOKS_METRIC, SUBMITTED_SAVE_REQUESTS_METRIC, get_savable_visit_types, ) @@ -28,6 +29,7 @@ SAVE_TASK_SUCCEEDED, SaveOriginRequest, ) +from swh.web.save_origin_webhooks.generic_receiver import SUPPORTED_FORGE_TYPES from swh.web.tests.django_asserts import assert_contains from swh.web.tests.helpers import check_http_get_response from swh.web.utils import reverse @@ -51,16 +53,23 @@ SAVE_TASK_RUNNING, ) - for _ in range(random.randint(50, 100)): + supported_forge_types = list(SUPPORTED_FORGE_TYPES) + + for i in range(random.randint(50, 100)): visit_type = random.choice(visit_types) request_satus = random.choice(request_statuses) load_task_status = random.choice(load_task_statuses) + from_webhook = i % 2 == 0 sor = SaveOriginRequest.objects.create( origin_url="origin", visit_type=visit_type, status=request_satus, loading_task_status=load_task_status, + from_webhook=from_webhook, + webhook_origin=random.choice(supported_forge_types) + if from_webhook + else None, ) if load_task_status in (SAVE_TASK_SUCCEEDED, SAVE_TASK_FAILED): @@ -106,6 +115,20 @@ assert_contains(resp, metric_text) + labels_set = product(request_statuses, SUPPORTED_FORGE_TYPES) + for labels in labels_set: + sor_count = SaveOriginRequest.objects.filter( + status=labels[0], webhook_origin=labels[1] + ).count() + + metric_text = ( + f"{SUBMITTED_SAVE_REQUESTS_FROM_WEBHOOKS_METRIC}{{" + f'status="{labels[0]}",' + f'webhook_origin="{labels[1]}"}} {float(sor_count)}\n' + ) + + assert_contains(resp, metric_text) + # delay metrics save_requests = SaveOriginRequest.objects.all()