Skip to content

Overhaul stats: Refactor UDP metrics in Prometheus format #1438

@josecelano

Description

@josecelano

I've realized there are a couple of improvements:

http_tracker_core

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

udp_tracker_core

Same as in HTTP Tracker core.

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

udp_tracker_server

udp_tracker_server_responses_sent_total{kind="",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 32
udp_tracker_server_responses_sent_total{kind="connect",result="ok",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 19
  • 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="" and fis the result. It should be "error".
  • Fix copy/paste error in:
            let (result_label_value, kind_label_value) = match kind {
                UdpResponseKind::Ok { req_kind } => match req_kind {
                    UdpRequestKind::Connect => {
                        let new_avg = stats_repository
                            .recalculate_udp_avg_connect_processing_time_ns(req_processing_time)
                            .await;

                        // Extendable metrics
                        stats_repository
                            .set_gauge(
                                &MetricName::new("udp_tracker_server_performance_avg_connect_processing_time_ns"),
                                &LabelSet::from(context.clone()),
                                new_avg,
                                now,
                            )
                            .await;

                        (LabelValue::new("ok"), LabelValue::new(&UdpRequestKind::Connect.to_string()))
                    }
                    UdpRequestKind::Announce => {
                        let new_avg = stats_repository
                            .recalculate_udp_avg_announce_processing_time_ns(req_processing_time)
                            .await;

                        // Extendable metrics
                        stats_repository
                            .set_gauge(
                                &MetricName::new("udp_tracker_server_performance_avg_announce_processing_time_ns"),
                                &LabelSet::from(context.clone()),
                                new_avg,
                                now,
                            )
                            .await;

                        (LabelValue::new("ok"), LabelValue::new(&UdpRequestKind::Connect.to_string()))
                    }
                    UdpRequestKind::Scrape => {
                        let new_avg = stats_repository
                            .recalculate_udp_avg_scrape_processing_time_ns(req_processing_time)
                            .await;

                        // Extendable metrics
                        stats_repository
                            .set_gauge(
                                &MetricName::new("udp_tracker_server_performance_avg_scrape_processing_time_ns"),
                                &LabelSet::from(context.clone()),
                                new_avg,
                                now,
                            )
                            .await;

                        (LabelValue::new("ok"), LabelValue::new(&UdpRequestKind::Connect.to_string()))
                    }
                },
                UdpResponseKind::Error { opt_req_kind: _ } => (LabelValue::new("ok"), LabelValue::ignore()),
            };

The label is wrong for announce and scrape.

UPDATE: Instead of fixing the copy/paste, we have to rename the metric:

From:

udp_tracker_server_performance_avg_connect_processing_time_ns
udp_tracker_server_performance_avg_announce_processing_time_ns
udp_tracker_server_performance_avg_scrape_processing_time_ns

To:

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"}

Metadata

Metadata

Assignees

Labels

BugIncorrect Behavior

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions