Skip to content

Overhaul stats: Refactor metrics in Prometheus format#1443

Merged
josecelano merged 3 commits into
torrust:developfrom
josecelano:1438-overhaul-stats-refactor-udp-metrics-in-prometheus-format
Apr 11, 2025
Merged

Overhaul stats: Refactor metrics in Prometheus format#1443
josecelano merged 3 commits into
torrust:developfrom
josecelano:1438-overhaul-stats-refactor-udp-metrics-in-prometheus-format

Conversation

@josecelano
Copy link
Copy Markdown
Member

@josecelano josecelano commented Apr 11, 2025

Some fixes for the UDP metrics.

The new version is:

http_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
http_tracker_core_requests_received_total{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
udp_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_core_requests_received_total{request_kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_core_requests_received_total{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_performance_avg_processing_time_ns{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 53430
udp_tracker_server_performance_avg_processing_time_ns{request_kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 43320.5
udp_tracker_server_performance_avg_processing_time_ns{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 45595
udp_tracker_server_requests_accepted_total{kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_requests_accepted_total{kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_server_requests_accepted_total{kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 4
udp_tracker_server_responses_sent_total{request_kind="announce",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_responses_sent_total{request_kind="connect",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_server_responses_sent_total{request_kind="scrape",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1

You get those metrics running the tracker and the following command:

cargo run -p torrust-tracker-client --bin http_tracker_client announce http://127.0.0.1:7070 443c7602b4fde83d1154d6d9da48808418b181b6 | jq
cargo run -p torrust-tracker-client --bin http_tracker_client scrape http://127.0.0.1:7070 443c7602b4fde83d1154d6d9da48808418b181b6 | jq
cargo run -p torrust-tracker-client --bin udp_tracker_client announce udp://127.0.0.1:6969 443c7602b4fde83d1154d6d9da48808418b181b6 | jq
cargo run -p torrust-tracker-client --bin udp_tracker_client scrape udp://127.0.0.1:6969 443c7602b4fde83d1154d6d9da48808418b181b6 | jq
curl "http://127.0.0.1:1212/api/v1/metrics?token=MyAccessToken&format=prometheus" | sort

Metrics explained:

# each tracker client request makes also a connect requests so there are 4 requests in total

# http tracker core
http_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
http_tracker_core_requests_received_total{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1

# udp tracker core (4 received)
udp_tracker_core_requests_received_total{request_kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_core_requests_received_total{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1

# udp tracker server

# request received (passed the ban filter)
udp_tracker_server_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 4

# request accepted
udp_tracker_server_requests_accepted_total{kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_server_requests_accepted_total{kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_requests_accepted_total{kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1

udp_tracker_server_responses_sent_total{request_kind="connect",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 2
udp_tracker_server_responses_sent_total{request_kind="announce",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1
udp_tracker_server_responses_sent_total{request_kind="scrape",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 1

udp_tracker_server_performance_avg_processing_time_ns{request_kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 43320.5
udp_tracker_server_performance_avg_processing_time_ns{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 53430
udp_tracker_server_performance_avg_processing_time_ns{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 45595

@josecelano josecelano added Code Cleanup / Refactoring Tidying and Making Neat - Developer - Torrust Improvement Experience labels Apr 11, 2025
@josecelano josecelano linked an issue Apr 11, 2025 that may be closed by this pull request
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 11, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 84.51%. Comparing base (8a36e45) to head (5f57f78).
Report is 4 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #1443      +/-   ##
===========================================
- Coverage    84.54%   84.51%   -0.03%     
===========================================
  Files          254      254              
  Lines        19189    19157      -32     
  Branches     19189    19157      -32     
===========================================
- Hits         16223    16191      -32     
  Misses        2694     2694              
  Partials       272      272              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Extract `request_kind` label. Putting the request type in the metric name does not make sense. The purpose of the refactor to build the new extendable-labeled metrics was to start using labels to group metrics instead of changes in metric's names.

From this:

```
udp_tracker_core_announce_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 619656
udp_tracker_core_connect_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 308493
udp_tracker_core_scrape_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 32487
```

To this:

```
udp_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 619656
udp_tracker_core_requests_received_total{request_kind="connect",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 308493
udp_tracker_core_requests_received_total{request_kind="scrape",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 32487
```
Extract `request_kind` label. Putting the request type in the metric name does not make sense. The purpose of the refactor to build the new extendable-labeled metrics was to start using labels to group metrics instead of changes in metric's names.

From this:

```
http_tracker_core_announce_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
http_tracker_core_scrape_requests_received_total{server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
```

To this:

```
http_tracker_core_requests_received_total{request_kind="announce",server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
http_tracker_core_requests_received_total{request_kind="scrape", server_binding_ip="0.0.0.0",server_binding_port="7070",server_binding_protocol="http"} 1
```
- Rename label `kind` to `request_kind`. It's more explicit. There could be other "kind" of things in the future.
- Remove the empty label `kind=""` when the response is an error.
- Fix result label for error response.
- Merge performace metrics in one and convert request kind into a label:

```
udp_tracker_server_performance_avg_connect_processing_time_ns{request_kind="connect"}
udp_tracker_server_performance_avg_connect_processing_time_ns{request_kind="announce"}
udp_tracker_server_performance_avg_connect_processing_time_ns{request_kind="scrape"}
```
@josecelano josecelano force-pushed the 1438-overhaul-stats-refactor-udp-metrics-in-prometheus-format branch from 19d7d06 to 5f57f78 Compare April 11, 2025 15:59
@josecelano
Copy link
Copy Markdown
Member Author

ACK 5f57f78

@josecelano josecelano marked this pull request as ready for review April 11, 2025 16:00
@josecelano josecelano requested a review from da2ce7 April 11, 2025 16:00
@josecelano josecelano changed the title Overhaul stats: refactor UDP metrics in Prometheus format Overhaul stats: refactor metrics in Prometheus format Apr 11, 2025
@josecelano josecelano merged commit 30684b5 into torrust:develop Apr 11, 2025
23 checks passed
@josecelano josecelano changed the title Overhaul stats: refactor metrics in Prometheus format Overhaul stats: Refactor metrics in Prometheus format Apr 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

- Developer - Torrust Improvement Experience Code Cleanup / Refactoring Tidying and Making Neat

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Overhaul stats: Refactor UDP metrics in Prometheus format

1 participant