From 287bcf86c559c11b23fb4b8de676049343520a5d Mon Sep 17 00:00:00 2001 From: zino Date: Wed, 13 Aug 2025 16:06:33 +0200 Subject: [PATCH] m --- progs/registry.mtail | 62 +++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/progs/registry.mtail b/progs/registry.mtail index b3f214a..1febdc5 100644 --- a/progs/registry.mtail +++ b/progs/registry.mtail @@ -1,7 +1,6 @@ -# Parses JSON access logs from NGINX fronting a Docker Registry. -# Emits Prometheus counters for pull/push bytes and seconds, plus request counts. +# Docker Registry via NGINX JSON logs -> Prometheus metrics (mtail) -# -------- Metrics +# -------- Metrics (comma-separated labels) counter registry_requests_total by method, path_class, status, repo, user, node counter registry_pull_blob_bytes_total by repo, user, node counter registry_pull_blob_seconds_total by repo, user, node @@ -9,6 +8,7 @@ counter registry_push_upload_bytes_total by repo, user, node counter registry_push_upload_seconds_total by repo, user, node # -------- Field extraction (order-independent) +# Strings /"method":"([A-Z]+)"/ { method = $1 } @@ -21,9 +21,20 @@ counter registry_push_upload_seconds_total by repo, user, node /"remote_user":"([^"]*)"/ { user = $1 } +/"docker_upload_uuid":"([^"]*)"/ { + upload_uuid = $1 +} +/"docker_content_digest":"([^"]*)"/ { + digest = $1 +} +/"upstream_range":"([^"]*)"/ { + up_range = $1 +} + +# Numbers /"status":([0-9]{3})/ { status = $1 - status_s = sprintf("%d", status) + status_s = string(status) # label must be string } /"request_time":([0-9.]+)/ { request_time = $1 @@ -31,17 +42,8 @@ counter registry_push_upload_seconds_total by repo, user, node /"body_bytes_sent":([0-9]+)/ { body_bytes_sent = $1 } -/"upstream_range":"([^"]*)"/ { - up_range = $1 -} -/"docker_upload_uuid":"([^"]*)"/ { - upload_uuid = $1 -} -/"docker_content_digest":"([^"]*)"/ { - digest = $1 -} -# Capture namespace/repo between /v2/ and the next section (blobs|manifests|tags|_catalog) +# Repo (supports namespaces) — capture everything after /v2/ up to common sections /"path":"\/v2\/(.+?)\/(blobs|manifests|tags|_catalog)/ { repo = $1 } @@ -53,49 +55,49 @@ counter registry_push_upload_seconds_total by repo, user, node node == "" { node = "unknown" } } -# Helper: parse upstream_range "a-b" => bytes = b+1 +# Parse upstream_range "a-b" => bytes = b+1 (exact uploaded bytes) /"upstream_range":"([0-9]+)-([0-9]+)"/ { uploaded_bytes = int($2) + 1 } # -------- Classify & emit -# Downloaded blob bytes/time: GET /v2//blobs/sha256:... +# PULL: GET /v2//blobs/sha256: /"method":"GET".*"\/v2\/.+\/blobs\/sha256:[a-f0-9]+"/ { - registry_pull_blob_bytes_total[repo=repo, user=user, node=node] += body_bytes_sent - registry_pull_blob_seconds_total[repo=repo, user=user, node=node] += request_time - registry_requests_total[method=method, path_class="pull_blob", status=status_s, repo=repo, user=user, node=node]++ + registry_pull_blob_bytes_total[repo][user][node] += body_bytes_sent + registry_pull_blob_seconds_total[repo][user][node] += request_time + registry_requests_total[method]["pull_blob"][status_s][repo][user][node]++ } -# Upload data transfer: PATCH /v2//blobs/uploads/ 202 +# PUSH upload (data transfer): PATCH /v2//blobs/uploads/ 202 /"method":"PATCH".*"\/v2\/.+\/blobs\/uploads\/[a-f0-9-]+"/ { uploaded_bytes > 0 { - registry_push_upload_bytes_total[repo=repo, user=user, node=node] += uploaded_bytes + registry_push_upload_bytes_total[repo][user][node] += uploaded_bytes } - registry_push_upload_seconds_total[repo=repo, user=user, node=node] += request_time - registry_requests_total[method=method, path_class="push_upload", status=status_s, repo=repo, user=user, node=node]++ + registry_push_upload_seconds_total[repo][user][node] += request_time + registry_requests_total[method]["push_upload"][status_s][repo][user][node]++ uploaded_bytes = 0 } -# Upload session start/end (bookkeeping) +# PUSH start/end bookkeeping /"method":"POST".*"\/v2\/.+\/blobs\/uploads\/"/ { - registry_requests_total[method=method, path_class="push_start", status=status_s, repo=repo, user=user, node=node]++ + registry_requests_total[method]["push_start"][status_s][repo][user][node]++ } /"method":"PUT".*"\/v2\/.+\/blobs\/uploads\/[a-f0-9-]+"/ { - registry_requests_total[method=method, path_class="push_commit", status=status_s, repo=repo, user=user, node=node]++ + registry_requests_total[method]["push_commit"][status_s][repo][user][node]++ } # Manifest pulls /"method":"GET".*"\/v2\/.+\/manifests\/[^"]+"/ { - registry_requests_total[method=method, path_class="pull_manifest", status=status_s, repo=repo, user=user, node=node]++ + registry_requests_total[method]["pull_manifest"][status_s][repo][user][node]++ } # Manifest writes /"method":"PUT".*"\/v2\/.+\/manifests\/[^"]+"/ { - registry_requests_total[method=method, path_class="push_manifest", status=status_s, repo=repo, user=user, node=node]++ + registry_requests_total[method]["push_manifest"][status_s][repo][user][node]++ } -# Root auth probe +# /v2/ probe (auth challenge etc.) /"path":"\/v2\/"/ { - registry_requests_total[method=method, path_class="v2_root", status=status_s, repo="none", user=user, node=node]++ + registry_requests_total[method]["v2_root"][status_s]["none"][user][node]++ }