Spaces:
Build error
Build error
File size: 5,214 Bytes
d8435ba |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
use std::collections::HashMap;
use collection::shards::shard::PeerId;
use common::types::{DetailsLevel, TelemetryDetail};
use schemars::JsonSchema;
use segment::common::anonymize::Anonymize;
use serde::Serialize;
use storage::dispatcher::Dispatcher;
use storage::types::{ClusterStatus, ConsensusThreadStatus, PeerInfo, StateRole};
use crate::settings::Settings;
#[derive(Serialize, Clone, Debug, JsonSchema)]
pub struct P2pConfigTelemetry {
connection_pool_size: usize,
}
#[derive(Serialize, Clone, Debug, JsonSchema)]
pub struct ConsensusConfigTelemetry {
max_message_queue_size: usize,
tick_period_ms: u64,
bootstrap_timeout_sec: u64,
}
#[derive(Serialize, Clone, Debug, JsonSchema)]
pub struct ClusterConfigTelemetry {
grpc_timeout_ms: u64,
p2p: P2pConfigTelemetry,
consensus: ConsensusConfigTelemetry,
}
impl From<&Settings> for ClusterConfigTelemetry {
fn from(settings: &Settings) -> Self {
ClusterConfigTelemetry {
grpc_timeout_ms: settings.cluster.grpc_timeout_ms,
p2p: P2pConfigTelemetry {
connection_pool_size: settings.cluster.p2p.connection_pool_size,
},
consensus: ConsensusConfigTelemetry {
max_message_queue_size: settings.cluster.consensus.max_message_queue_size,
tick_period_ms: settings.cluster.consensus.tick_period_ms,
bootstrap_timeout_sec: settings.cluster.consensus.bootstrap_timeout_sec,
},
}
}
}
#[derive(Serialize, Clone, Debug, JsonSchema)]
pub struct ClusterStatusTelemetry {
pub number_of_peers: usize,
pub term: u64,
pub commit: u64,
pub pending_operations: usize,
pub role: Option<StateRole>,
pub is_voter: bool,
pub peer_id: Option<PeerId>,
pub consensus_thread_status: ConsensusThreadStatus,
}
#[derive(Serialize, Clone, Debug, JsonSchema)]
pub struct ClusterTelemetry {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<ClusterStatusTelemetry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<ClusterConfigTelemetry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub peers: Option<HashMap<PeerId, PeerInfo>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
impl ClusterTelemetry {
pub fn collect(
detail: TelemetryDetail,
dispatcher: &Dispatcher,
settings: &Settings,
) -> ClusterTelemetry {
ClusterTelemetry {
enabled: settings.cluster.enabled,
status: (detail.level >= DetailsLevel::Level1)
.then(|| match dispatcher.cluster_status() {
ClusterStatus::Disabled => None,
ClusterStatus::Enabled(cluster_info) => Some(ClusterStatusTelemetry {
number_of_peers: cluster_info.peers.len(),
term: cluster_info.raft_info.term,
commit: cluster_info.raft_info.commit,
pending_operations: cluster_info.raft_info.pending_operations,
role: cluster_info.raft_info.role,
is_voter: cluster_info.raft_info.is_voter,
peer_id: Some(cluster_info.peer_id),
consensus_thread_status: cluster_info.consensus_thread_status,
}),
})
.flatten(),
config: (detail.level >= DetailsLevel::Level2)
.then(|| ClusterConfigTelemetry::from(settings)),
peers: (detail.level >= DetailsLevel::Level2)
.then(|| match dispatcher.cluster_status() {
ClusterStatus::Disabled => None,
ClusterStatus::Enabled(cluster_info) => Some(cluster_info.peers),
})
.flatten(),
metadata: (detail.level >= DetailsLevel::Level1)
.then(|| {
dispatcher
.consensus_state()
.map(|state| state.persistent.read().cluster_metadata.clone())
.filter(|metadata| !metadata.is_empty())
})
.flatten(),
}
}
}
impl Anonymize for ClusterTelemetry {
fn anonymize(&self) -> Self {
ClusterTelemetry {
enabled: self.enabled,
status: self.status.clone().map(|x| x.anonymize()),
config: self.config.clone().map(|x| x.anonymize()),
peers: None,
metadata: None,
}
}
}
impl Anonymize for ClusterStatusTelemetry {
fn anonymize(&self) -> Self {
ClusterStatusTelemetry {
number_of_peers: self.number_of_peers,
term: self.term,
commit: self.commit,
pending_operations: self.pending_operations,
role: self.role,
is_voter: self.is_voter,
peer_id: None,
consensus_thread_status: self.consensus_thread_status.clone(),
}
}
}
impl Anonymize for ClusterConfigTelemetry {
fn anonymize(&self) -> Self {
self.clone()
}
}
|