diff --git a/misc/metrics/CHANGELOG.md b/misc/metrics/CHANGELOG.md
index 66fe4890..193ff3d0 100644
--- a/misc/metrics/CHANGELOG.md
+++ b/misc/metrics/CHANGELOG.md
@@ -1,11 +1,13 @@
# 0.12.0 [unreleased]
-- Update to `libp2p-core` `v0.39.0`.
+- Update to `prometheus-client` `v0.19.0`. See [PR 3207].
- Add `connections_establishment_duration` metric. See [PR 3134].
- Bump MSRV to 1.65.0.
+- Update to `libp2p-core` `v0.39.0`.
+
- Update to `libp2p-dcutr` `v0.9.0`.
- Update to `libp2p-ping` `v0.42.0`.
@@ -19,6 +21,7 @@
- Update to `libp2p-swarm` `v0.42.0`.
[PR 3134]: https://github.com/libp2p/rust-libp2p/pull/3134/
+[PR 3207]: https://github.com/libp2p/rust-libp2p/pull/3207/
# 0.11.0
diff --git a/misc/metrics/Cargo.toml b/misc/metrics/Cargo.toml
index 9ef38949..cbbc0ab8 100644
--- a/misc/metrics/Cargo.toml
+++ b/misc/metrics/Cargo.toml
@@ -26,7 +26,7 @@ libp2p-kad = { version = "0.43.0", path = "../../protocols/kad", optional = true
libp2p-ping = { version = "0.42.0", path = "../../protocols/ping", optional = true }
libp2p-relay = { version = "0.15.0", path = "../../protocols/relay", optional = true }
libp2p-swarm = { version = "0.42.0", path = "../../swarm" }
-prometheus-client = "0.18.0"
+prometheus-client = "0.19.0"
[target.'cfg(not(target_os = "unknown"))'.dependencies]
libp2p-gossipsub = { version = "0.44.0", path = "../../protocols/gossipsub", optional = true }
@@ -52,4 +52,4 @@ rustc-args = ["--cfg", "docsrs"]
[[example]]
name = "metrics"
-required-features = ["ping"]
+required-features = ["ping", "identify"]
diff --git a/misc/metrics/examples/metrics/http_service.rs b/misc/metrics/examples/metrics/http_service.rs
index 05522cc2..d1baf946 100644
--- a/misc/metrics/examples/metrics/http_service.rs
+++ b/misc/metrics/examples/metrics/http_service.rs
@@ -29,6 +29,8 @@ use std::pin::Pin;
use std::sync::{Arc, Mutex};
use std::task::{Context, Poll};
+const METRICS_CONTENT_TYPE: &str = "application/openmetrics-text;charset=utf-8;version=1.0.0";
+
pub async fn metrics_server(registry: Registry) -> Result<(), std::io::Error> {
// Serve on localhost.
let addr = ([127, 0, 0, 1], 0).into();
@@ -55,27 +57,31 @@ impl MetricService {
fn get_reg(&mut self) -> SharedRegistry {
Arc::clone(&self.reg)
}
- fn respond_with_metrics(&mut self) -> Response
{
- let mut encoded: Vec = Vec::new();
+ fn respond_with_metrics(&mut self) -> Response {
+ let mut response: Response = Response::default();
+
+ response.headers_mut().insert(
+ hyper::header::CONTENT_TYPE,
+ METRICS_CONTENT_TYPE.try_into().unwrap(),
+ );
+
let reg = self.get_reg();
- encode(&mut encoded, ®.lock().unwrap()).unwrap();
- let metrics_content_type = "application/openmetrics-text;charset=utf-8;version=1.0.0";
- Response::builder()
- .status(StatusCode::OK)
- .header(hyper::header::CONTENT_TYPE, metrics_content_type)
- .body(Body::from(encoded))
- .unwrap()
+ encode(&mut response.body_mut(), ®.lock().unwrap()).unwrap();
+
+ *response.status_mut() = StatusCode::OK;
+
+ response
}
- fn respond_with_404_not_found(&mut self) -> Response {
+ fn respond_with_404_not_found(&mut self) -> Response {
Response::builder()
.status(StatusCode::NOT_FOUND)
- .body(Body::from("Not found try localhost:[port]/metrics"))
+ .body("Not found try localhost:[port]/metrics".to_string())
.unwrap()
}
}
impl Service> for MetricService {
- type Response = Response;
+ type Response = Response;
type Error = hyper::Error;
type Future = Pin> + Send>>;
diff --git a/misc/metrics/src/dcutr.rs b/misc/metrics/src/dcutr.rs
index 9e6f06bb..d2f0c639 100644
--- a/misc/metrics/src/dcutr.rs
+++ b/misc/metrics/src/dcutr.rs
@@ -18,7 +18,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::Family;
use prometheus_client::registry::Registry;
@@ -35,19 +35,19 @@ impl Metrics {
sub_registry.register(
"events",
"Events emitted by the relay NetworkBehaviour",
- Box::new(events.clone()),
+ events.clone(),
);
Self { events }
}
}
-#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Debug, Clone, Hash, PartialEq, Eq, EncodeLabelSet)]
struct EventLabels {
event: EventType,
}
-#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Debug, Clone, Hash, PartialEq, Eq, EncodeLabelValue)]
enum EventType {
InitiateDirectConnectionUpgrade,
RemoteInitiatedDirectConnectionUpgrade,
diff --git a/misc/metrics/src/gossipsub.rs b/misc/metrics/src/gossipsub.rs
index a82c1a72..4f4bf490 100644
--- a/misc/metrics/src/gossipsub.rs
+++ b/misc/metrics/src/gossipsub.rs
@@ -30,11 +30,7 @@ impl Metrics {
let sub_registry = registry.sub_registry_with_prefix("gossipsub");
let messages = Counter::default();
- sub_registry.register(
- "messages",
- "Number of messages received",
- Box::new(messages.clone()),
- );
+ sub_registry.register("messages", "Number of messages received", messages.clone());
Self { messages }
}
diff --git a/misc/metrics/src/identify.rs b/misc/metrics/src/identify.rs
index db44109e..4ba0da76 100644
--- a/misc/metrics/src/identify.rs
+++ b/misc/metrics/src/identify.rs
@@ -20,7 +20,7 @@
use crate::protocol_stack;
use libp2p_core::PeerId;
-use prometheus_client::encoding::text::{Encode, EncodeMetric, Encoder};
+use prometheus_client::encoding::{EncodeLabelSet, EncodeMetric, MetricEncoder};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::Family;
use prometheus_client::metrics::histogram::{exponential_buckets, Histogram};
@@ -51,14 +51,14 @@ impl Metrics {
"Number of connected nodes supporting a specific protocol, with \
\"unrecognized\" for each peer supporting one or more unrecognized \
protocols",
- Box::new(protocols.clone()),
+ protocols.clone(),
);
let error = Counter::default();
sub_registry.register(
"errors",
"Number of errors while attempting to identify the remote",
- Box::new(error.clone()),
+ error.clone(),
);
let pushed = Counter::default();
@@ -66,7 +66,7 @@ impl Metrics {
"pushed",
"Number of times identification information of the local node has \
been actively pushed to a peer.",
- Box::new(pushed.clone()),
+ pushed.clone(),
);
let received = Counter::default();
@@ -74,7 +74,7 @@ impl Metrics {
"received",
"Number of times identification information has been received from \
a peer",
- Box::new(received.clone()),
+ received.clone(),
);
let received_info_listen_addrs =
@@ -83,7 +83,7 @@ impl Metrics {
"received_info_listen_addrs",
"Number of listen addresses for remote peer received in \
identification information",
- Box::new(received_info_listen_addrs.clone()),
+ received_info_listen_addrs.clone(),
);
let received_info_protocols =
@@ -92,7 +92,7 @@ impl Metrics {
"received_info_protocols",
"Number of protocols supported by the remote peer received in \
identification information",
- Box::new(received_info_protocols.clone()),
+ received_info_protocols.clone(),
);
let sent = Counter::default();
@@ -100,14 +100,14 @@ impl Metrics {
"sent",
"Number of times identification information of the local node has \
been sent to a peer in response to an identification request",
- Box::new(sent.clone()),
+ sent.clone(),
);
let listen_addresses = Family::default();
sub_registry.register(
"listen_addresses",
"Number of listen addresses for remote peer per protocol stack",
- Box::new(listen_addresses.clone()),
+ listen_addresses.clone(),
);
Self {
@@ -208,12 +208,12 @@ impl super::Recorder>>>,
}
@@ -235,14 +235,14 @@ impl Protocols {
}
impl EncodeMetric for Protocols {
- fn encode(&self, mut encoder: Encoder) -> Result<(), std::io::Error> {
+ fn encode(&self, mut encoder: MetricEncoder) -> Result<(), std::fmt::Error> {
let count_by_protocol = self
.peers
.lock()
.expect("Lock not to be poisoned")
.iter()
.fold(
- HashMap::::default(),
+ HashMap::::default(),
|mut acc, (_, protocols)| {
for protocol in protocols {
let count = acc.entry(protocol.to_string()).or_default();
@@ -254,11 +254,8 @@ impl EncodeMetric for Protocols {
for (protocol, count) in count_by_protocol {
encoder
- .with_label_set(&("protocol", protocol))
- .no_suffix()?
- .no_bucket()?
- .encode_value(count)?
- .no_exemplar()?;
+ .encode_family(&[("protocol", protocol)])?
+ .encode_gauge(&count)?;
}
Ok(())
diff --git a/misc/metrics/src/kad.rs b/misc/metrics/src/kad.rs
index 6d10e5b1..af56eb08 100644
--- a/misc/metrics/src/kad.rs
+++ b/misc/metrics/src/kad.rs
@@ -18,7 +18,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::Family;
use prometheus_client::metrics::histogram::{exponential_buckets, Histogram};
@@ -52,42 +52,42 @@ impl Metrics {
sub_registry.register(
"query_result_get_record_ok",
"Number of records returned by a successful Kademlia get record query.",
- Box::new(query_result_get_record_ok.clone()),
+ query_result_get_record_ok.clone(),
);
let query_result_get_record_error = Family::default();
sub_registry.register(
"query_result_get_record_error",
"Number of failed Kademlia get record queries.",
- Box::new(query_result_get_record_error.clone()),
+ query_result_get_record_error.clone(),
);
let query_result_get_closest_peers_ok = Histogram::new(exponential_buckets(1.0, 2.0, 10));
sub_registry.register(
"query_result_get_closest_peers_ok",
"Number of closest peers returned by a successful Kademlia get closest peers query.",
- Box::new(query_result_get_closest_peers_ok.clone()),
+ query_result_get_closest_peers_ok.clone(),
);
let query_result_get_closest_peers_error = Family::default();
sub_registry.register(
"query_result_get_closest_peers_error",
"Number of failed Kademlia get closest peers queries.",
- Box::new(query_result_get_closest_peers_error.clone()),
+ query_result_get_closest_peers_error.clone(),
);
let query_result_get_providers_ok = Histogram::new(exponential_buckets(1.0, 2.0, 10));
sub_registry.register(
"query_result_get_providers_ok",
"Number of providers returned by a successful Kademlia get providers query.",
- Box::new(query_result_get_providers_ok.clone()),
+ query_result_get_providers_ok.clone(),
);
let query_result_get_providers_error = Family::default();
sub_registry.register(
"query_result_get_providers_error",
"Number of failed Kademlia get providers queries.",
- Box::new(query_result_get_providers_error.clone()),
+ query_result_get_providers_error.clone(),
);
let query_result_num_requests: Family<_, _> =
@@ -95,7 +95,7 @@ impl Metrics {
sub_registry.register(
"query_result_num_requests",
"Number of requests started for a Kademlia query.",
- Box::new(query_result_num_requests.clone()),
+ query_result_num_requests.clone(),
);
let query_result_num_success: Family<_, _> =
@@ -103,7 +103,7 @@ impl Metrics {
sub_registry.register(
"query_result_num_success",
"Number of successful requests of a Kademlia query.",
- Box::new(query_result_num_success.clone()),
+ query_result_num_success.clone(),
);
let query_result_num_failure: Family<_, _> =
@@ -111,7 +111,7 @@ impl Metrics {
sub_registry.register(
"query_result_num_failure",
"Number of failed requests of a Kademlia query.",
- Box::new(query_result_num_failure.clone()),
+ query_result_num_failure.clone(),
);
let query_result_duration: Family<_, _> =
@@ -120,21 +120,21 @@ impl Metrics {
"query_result_duration",
"Duration of a Kademlia query.",
Unit::Seconds,
- Box::new(query_result_duration.clone()),
+ query_result_duration.clone(),
);
let routing_updated = Family::default();
sub_registry.register(
"routing_updated",
"Number of peers added, updated or evicted to, in or from a specific kbucket in the routing table",
- Box::new(routing_updated.clone()),
+ routing_updated.clone(),
);
let inbound_requests = Family::default();
sub_registry.register(
"inbound_requests",
"Number of inbound requests",
- Box::new(inbound_requests.clone()),
+ inbound_requests.clone(),
);
Self {
@@ -258,12 +258,12 @@ impl super::Recorder for Metrics {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct QueryResult {
r#type: QueryType,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum QueryType {
Bootstrap,
GetClosestPeers,
@@ -306,12 +306,12 @@ impl From<&libp2p_kad::QueryResult> for QueryResult {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct GetRecordResult {
error: GetRecordError,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum GetRecordError {
NotFound,
QuorumFailed,
@@ -334,12 +334,12 @@ impl From<&libp2p_kad::GetRecordError> for GetRecordResult {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct GetClosestPeersResult {
error: GetClosestPeersError,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum GetClosestPeersError {
Timeout,
}
@@ -354,12 +354,12 @@ impl From<&libp2p_kad::GetClosestPeersError> for GetClosestPeersResult {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct GetProvidersResult {
error: GetProvidersError,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum GetProvidersError {
Timeout,
}
@@ -374,20 +374,20 @@ impl From<&libp2p_kad::GetProvidersError> for GetProvidersResult {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct RoutingUpdated {
action: RoutingAction,
bucket: u32,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum RoutingAction {
Added,
Updated,
Evicted,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct InboundRequest {
request: Request,
}
@@ -406,7 +406,7 @@ impl From<&libp2p_kad::InboundRequest> for InboundRequest {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum Request {
FindNode,
GetProvider,
diff --git a/misc/metrics/src/ping.rs b/misc/metrics/src/ping.rs
index fbd89338..0e7a7f26 100644
--- a/misc/metrics/src/ping.rs
+++ b/misc/metrics/src/ping.rs
@@ -18,13 +18,13 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::Family;
use prometheus_client::metrics::histogram::{exponential_buckets, Histogram};
use prometheus_client::registry::{Registry, Unit};
-#[derive(Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Clone, Hash, PartialEq, Eq, EncodeLabelSet, Debug)]
struct FailureLabels {
reason: Failure,
}
@@ -45,7 +45,7 @@ impl From<&libp2p_ping::Failure> for FailureLabels {
}
}
-#[derive(Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Clone, Hash, PartialEq, Eq, EncodeLabelValue, Debug)]
enum Failure {
Timeout,
Unsupported,
@@ -67,21 +67,21 @@ impl Metrics {
"rtt",
"Round-trip time sending a 'ping' and receiving a 'pong'",
Unit::Seconds,
- Box::new(rtt.clone()),
+ rtt.clone(),
);
let failure = Family::default();
sub_registry.register(
"failure",
"Failure while sending a 'ping' or receiving a 'pong'",
- Box::new(failure.clone()),
+ failure.clone(),
);
let pong_received = Counter::default();
sub_registry.register(
"pong_received",
"Number of 'pong's received",
- Box::new(pong_received.clone()),
+ pong_received.clone(),
);
Self {
diff --git a/misc/metrics/src/relay.rs b/misc/metrics/src/relay.rs
index b5892532..479a518e 100644
--- a/misc/metrics/src/relay.rs
+++ b/misc/metrics/src/relay.rs
@@ -18,7 +18,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::Family;
use prometheus_client::registry::Registry;
@@ -35,19 +35,19 @@ impl Metrics {
sub_registry.register(
"events",
"Events emitted by the relay NetworkBehaviour",
- Box::new(events.clone()),
+ events.clone(),
);
Self { events }
}
}
-#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Debug, Clone, Hash, PartialEq, Eq, EncodeLabelSet)]
struct EventLabels {
event: EventType,
}
-#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
+#[derive(Debug, Clone, Hash, PartialEq, Eq, EncodeLabelValue)]
enum EventType {
ReservationReqAccepted,
ReservationReqAcceptFailed,
diff --git a/misc/metrics/src/swarm.rs b/misc/metrics/src/swarm.rs
index b171f48b..354f0536 100644
--- a/misc/metrics/src/swarm.rs
+++ b/misc/metrics/src/swarm.rs
@@ -19,12 +19,10 @@
// DEALINGS IN THE SOFTWARE.
use crate::protocol_stack;
-use prometheus_client::encoding::text::Encode;
-use prometheus_client::metrics::{
- counter::Counter,
- family::Family,
- histogram::{exponential_buckets, Histogram},
-};
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
+use prometheus_client::metrics::counter::Counter;
+use prometheus_client::metrics::family::Family;
+use prometheus_client::metrics::histogram::{exponential_buckets, Histogram};
use prometheus_client::registry::Registry;
pub struct Metrics {
@@ -54,77 +52,77 @@ impl Metrics {
sub_registry.register(
"connections_incoming",
"Number of incoming connections per address stack",
- Box::new(connections_incoming.clone()),
+ connections_incoming.clone(),
);
let connections_incoming_error = Family::default();
sub_registry.register(
"connections_incoming_error",
"Number of incoming connection errors",
- Box::new(connections_incoming_error.clone()),
+ connections_incoming_error.clone(),
);
let new_listen_addr = Family::default();
sub_registry.register(
"new_listen_addr",
"Number of new listen addresses",
- Box::new(new_listen_addr.clone()),
+ new_listen_addr.clone(),
);
let expired_listen_addr = Family::default();
sub_registry.register(
"expired_listen_addr",
"Number of expired listen addresses",
- Box::new(expired_listen_addr.clone()),
+ expired_listen_addr.clone(),
);
let listener_closed = Family::default();
sub_registry.register(
"listener_closed",
"Number of listeners closed",
- Box::new(listener_closed.clone()),
+ listener_closed.clone(),
);
let listener_error = Counter::default();
sub_registry.register(
"listener_error",
"Number of listener errors",
- Box::new(listener_error.clone()),
+ listener_error.clone(),
);
let dial_attempt = Counter::default();
sub_registry.register(
"dial_attempt",
"Number of dial attempts",
- Box::new(dial_attempt.clone()),
+ dial_attempt.clone(),
);
let outgoing_connection_error = Family::default();
sub_registry.register(
"outgoing_connection_error",
"Number outgoing connection errors",
- Box::new(outgoing_connection_error.clone()),
+ outgoing_connection_error.clone(),
);
let connected_to_banned_peer = Family::default();
sub_registry.register(
"connected_to_banned_peer",
"Number of connection attempts to banned peer",
- Box::new(connected_to_banned_peer.clone()),
+ connected_to_banned_peer.clone(),
);
let connections_established = Family::default();
sub_registry.register(
"connections_established",
"Number of connections established",
- Box::new(connections_established.clone()),
+ connections_established.clone(),
);
let connections_closed = Family::default();
sub_registry.register(
"connections_closed",
"Number of connections closed",
- Box::new(connections_closed.clone()),
+ connections_closed.clone(),
);
let connections_establishment_duration = Family::new_with_constructor(
@@ -133,7 +131,7 @@ impl Metrics {
sub_registry.register(
"connections_establishment_duration",
"Time it took (locally) to establish connections",
- Box::new(connections_establishment_duration.clone()),
+ connections_establishment_duration.clone(),
);
Self {
@@ -293,7 +291,7 @@ impl super::Recorder for Role {
}
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct OutgoingConnectionErrorLabels {
peer: PeerStatus,
error: OutgoingConnectionErrorError,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq, Copy)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Copy, Debug)]
enum PeerStatus {
Known,
Unknown,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum OutgoingConnectionErrorError {
Banned,
ConnectionLimit,
@@ -354,13 +352,13 @@ enum OutgoingConnectionErrorError {
TransportOther,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct IncomingConnectionErrorLabels {
error: PendingInboundConnectionError,
protocols: String,
}
-#[derive(Encode, Hash, Clone, Eq, PartialEq)]
+#[derive(EncodeLabelValue, Hash, Clone, Eq, PartialEq, Debug)]
enum PendingInboundConnectionError {
WrongPeerId,
TransportErrorMultiaddrNotSupported,
diff --git a/protocols/gossipsub/CHANGELOG.md b/protocols/gossipsub/CHANGELOG.md
index 349defd9..01cf1a53 100644
--- a/protocols/gossipsub/CHANGELOG.md
+++ b/protocols/gossipsub/CHANGELOG.md
@@ -1,9 +1,13 @@
# 0.44.0 [unreleased]
+- Update to `prometheus-client` `v0.19.0`. See [PR 3207].
+
- Update to `libp2p-core` `v0.39.0`.
- Update to `libp2p-swarm` `v0.42.0`.
+[PR 3207]: https://github.com/libp2p/rust-libp2p/pull/3207/
+
# 0.43.0
- Update to `libp2p-core` `v0.38.0`.
diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml
index 6e69da58..02234bab 100644
--- a/protocols/gossipsub/Cargo.toml
+++ b/protocols/gossipsub/Cargo.toml
@@ -33,7 +33,7 @@ thiserror = "1.0"
wasm-timer = "0.2.5"
instant = "0.1.11"
# Metrics dependencies
-prometheus-client = "0.18.0"
+prometheus-client = "0.19.0"
[dev-dependencies]
async-std = "1.6.3"
diff --git a/protocols/gossipsub/src/metrics.rs b/protocols/gossipsub/src/metrics.rs
index eb33b542..0eb62de7 100644
--- a/protocols/gossipsub/src/metrics.rs
+++ b/protocols/gossipsub/src/metrics.rs
@@ -23,7 +23,7 @@
use std::collections::HashMap;
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
use prometheus_client::metrics::counter::Counter;
use prometheus_client::metrics::family::{Family, MetricConstructor};
use prometheus_client::metrics::gauge::Gauge;
@@ -188,7 +188,7 @@ impl Metrics {
macro_rules! register_family {
($name:expr, $help:expr) => {{
let fam = Family::default();
- registry.register($name, $help, Box::new(fam.clone()));
+ registry.register($name, $help, fam.clone());
fam
}};
}
@@ -269,7 +269,7 @@ impl Metrics {
registry.register(
"score_per_mesh",
"Histogram of scores per mesh topic",
- Box::new(score_per_mesh.clone()),
+ score_per_mesh.clone(),
);
let scoring_penalties = register_family!(
@@ -285,7 +285,7 @@ impl Metrics {
registry.register(
"heartbeat_duration",
"Histogram of observed heartbeat durations",
- Box::new(heartbeat_duration.clone()),
+ heartbeat_duration.clone(),
);
let topic_iwant_msgs = register_family!(
@@ -297,7 +297,7 @@ impl Metrics {
registry.register(
"memcache_misses",
"Number of times a message is not found in the duplicate cache when validating",
- Box::new(metric.clone()),
+ metric.clone(),
);
metric
};
@@ -360,7 +360,7 @@ impl Metrics {
if self.register_topic(topic).is_ok() {
self.topic_peers_count
.get_or_create(topic)
- .set(count as u64);
+ .set(count as i64);
}
}
@@ -417,7 +417,7 @@ impl Metrics {
pub fn set_mesh_peers(&mut self, topic: &TopicHash, count: usize) {
if self.register_topic(topic).is_ok() {
// Due to limits, this topic could have not been allowed, so we check.
- self.mesh_peer_counts.get_or_create(topic).set(count as u64);
+ self.mesh_peer_counts.get_or_create(topic).set(count as i64);
}
}
@@ -525,7 +525,7 @@ impl Metrics {
}
/// Reasons why a peer was included in the mesh.
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelValue, Clone, Debug)]
pub enum Inclusion {
/// Peer was a fanaout peer.
Fanout,
@@ -538,7 +538,7 @@ pub enum Inclusion {
}
/// Reasons why a peer was removed from the mesh.
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelValue, Clone, Debug)]
pub enum Churn {
/// Peer disconnected.
Dc,
@@ -553,7 +553,7 @@ pub enum Churn {
}
/// Kinds of reasons a peer's score has been penalized
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelValue, Clone, Debug)]
pub enum Penalty {
/// A peer grafted before waiting the back-off time.
GraftBackoff,
@@ -566,27 +566,27 @@ pub enum Penalty {
}
/// Label for the mesh inclusion event metrics.
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)]
struct InclusionLabel {
hash: String,
reason: Inclusion,
}
/// Label for the mesh churn event metrics.
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)]
struct ChurnLabel {
hash: String,
reason: Churn,
}
/// Label for the kinds of protocols peers can connect as.
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)]
struct ProtocolLabel {
protocol: PeerKind,
}
/// Label for the kinds of scoring penalties that can occur
-#[derive(PartialEq, Eq, Hash, Encode, Clone)]
+#[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)]
struct PenaltyLabel {
penalty: Penalty,
}
diff --git a/protocols/gossipsub/src/topic.rs b/protocols/gossipsub/src/topic.rs
index 1de587a7..342ee8be 100644
--- a/protocols/gossipsub/src/topic.rs
+++ b/protocols/gossipsub/src/topic.rs
@@ -20,7 +20,7 @@
use crate::rpc_proto;
use base64::encode;
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::EncodeLabelSet;
use prost::Message;
use sha2::{Digest, Sha256};
use std::fmt;
@@ -61,7 +61,7 @@ impl Hasher for Sha256Hash {
}
}
-#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Encode)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, EncodeLabelSet)]
pub struct TopicHash {
/// The topic hash. Stored as a string to align with the protobuf API.
hash: String,
diff --git a/protocols/gossipsub/src/types.rs b/protocols/gossipsub/src/types.rs
index 29c72d1f..10482611 100644
--- a/protocols/gossipsub/src/types.rs
+++ b/protocols/gossipsub/src/types.rs
@@ -22,7 +22,7 @@
use crate::rpc_proto;
use crate::TopicHash;
use libp2p_core::{connection::ConnectionId, PeerId};
-use prometheus_client::encoding::text::Encode;
+use prometheus_client::encoding::EncodeLabelValue;
use prost::Message;
use std::fmt;
use std::fmt::Debug;
@@ -95,7 +95,7 @@ pub struct PeerConnections {
}
/// Describes the types of peers that can exist in the gossipsub context.
-#[derive(Debug, Clone, PartialEq, Hash, Encode, Eq)]
+#[derive(Debug, Clone, PartialEq, Hash, EncodeLabelValue, Eq)]
pub enum PeerKind {
/// A gossipsub 1.1 peer.
Gossipsubv1_1,