Merge pull request #773 from AppFlowy-IO/metrics-connect
chore: reconnect realtime metrics
This commit is contained in:
commit
77a4af8a58
|
|
@ -185,7 +185,7 @@ impl CollabBroadcast {
|
||||||
mut sink: Sink,
|
mut sink: Sink,
|
||||||
mut stream: Stream,
|
mut stream: Stream,
|
||||||
collab: Weak<RwLock<Collab>>,
|
collab: Weak<RwLock<Collab>>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
) -> Subscription
|
) -> Subscription
|
||||||
where
|
where
|
||||||
Sink: SinkExt<CollabMessage> + Clone + Send + Sync + Unpin + 'static,
|
Sink: SinkExt<CollabMessage> + Clone + Send + Sync + Unpin + 'static,
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ pub struct CollabGroup {
|
||||||
/// A list of subscribers to this group. Each subscriber will receive updates from the
|
/// A list of subscribers to this group. Each subscriber will receive updates from the
|
||||||
/// broadcast.
|
/// broadcast.
|
||||||
subscribers: DashMap<RealtimeUser, Subscription>,
|
subscribers: DashMap<RealtimeUser, Subscription>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
destroy_group_tx: mpsc::Sender<Arc<RwLock<Collab>>>,
|
destroy_group_tx: mpsc::Sender<Arc<RwLock<Collab>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,7 +62,7 @@ impl CollabGroup {
|
||||||
object_id: String,
|
object_id: String,
|
||||||
collab_type: CollabType,
|
collab_type: CollabType,
|
||||||
collab: Arc<RwLock<Collab>>,
|
collab: Arc<RwLock<Collab>>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
storage: Arc<S>,
|
storage: Arc<S>,
|
||||||
is_new_collab: bool,
|
is_new_collab: bool,
|
||||||
collab_redis_stream: Arc<CollabRedisStream>,
|
collab_redis_stream: Arc<CollabRedisStream>,
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ pub struct GroupManager<S, AC> {
|
||||||
state: GroupManagementState,
|
state: GroupManagementState,
|
||||||
storage: Arc<S>,
|
storage: Arc<S>,
|
||||||
access_control: Arc<AC>,
|
access_control: Arc<AC>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
collab_redis_stream: Arc<CollabRedisStream>,
|
collab_redis_stream: Arc<CollabRedisStream>,
|
||||||
control_event_stream: Arc<Mutex<StreamGroup>>,
|
control_event_stream: Arc<Mutex<StreamGroup>>,
|
||||||
persistence_interval: Duration,
|
persistence_interval: Duration,
|
||||||
|
|
@ -48,7 +48,7 @@ where
|
||||||
pub async fn new(
|
pub async fn new(
|
||||||
storage: Arc<S>,
|
storage: Arc<S>,
|
||||||
access_control: Arc<AC>,
|
access_control: Arc<AC>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
collab_stream: CollabRedisStream,
|
collab_stream: CollabRedisStream,
|
||||||
persistence_interval: Duration,
|
persistence_interval: Duration,
|
||||||
edit_state_max_count: u32,
|
edit_state_max_count: u32,
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ pub(crate) struct GroupManagementState {
|
||||||
group_by_object_id: Arc<DashMap<String, Arc<CollabGroup>>>,
|
group_by_object_id: Arc<DashMap<String, Arc<CollabGroup>>>,
|
||||||
/// Keep track of all [Collab] objects that a user is subscribed to.
|
/// Keep track of all [Collab] objects that a user is subscribed to.
|
||||||
editing_by_user: Arc<DashMap<RealtimeUser, HashSet<Editing>>>,
|
editing_by_user: Arc<DashMap<RealtimeUser, HashSet<Editing>>>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
metrics_calculate: Arc<CollabRealtimeMetrics>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GroupManagementState {
|
impl GroupManagementState {
|
||||||
pub(crate) fn new(metrics_calculate: CollabRealtimeMetrics) -> Self {
|
pub(crate) fn new(metrics_calculate: Arc<CollabRealtimeMetrics>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
group_by_object_id: Arc::new(DashMap::new()),
|
group_by_object_id: Arc::new(DashMap::new()),
|
||||||
editing_by_user: Arc::new(DashMap::new()),
|
editing_by_user: Arc::new(DashMap::new()),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use prometheus_client::metrics::gauge::Gauge;
|
use prometheus_client::metrics::gauge::Gauge;
|
||||||
use prometheus_client::registry::Registry;
|
use prometheus_client::registry::Registry;
|
||||||
|
use tokio::time::interval;
|
||||||
|
|
||||||
|
use database::collab::CollabStorage;
|
||||||
|
|
||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
pub struct CollabRealtimeMetrics {
|
pub struct CollabRealtimeMetrics {
|
||||||
|
|
@ -85,6 +91,27 @@ impl CollabRealtimeMetrics {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn spawn_metrics<S>(metrics: Arc<CollabRealtimeMetrics>, storage: Arc<S>)
|
||||||
|
where
|
||||||
|
S: CollabStorage,
|
||||||
|
{
|
||||||
|
tokio::task::spawn_local(async move {
|
||||||
|
let mut interval = interval(Duration::from_secs(120));
|
||||||
|
loop {
|
||||||
|
interval.tick().await;
|
||||||
|
|
||||||
|
// cache hit rate
|
||||||
|
let (total, success) = storage.encode_collab_redis_query_state();
|
||||||
|
metrics
|
||||||
|
.total_attempt_get_encode_collab_from_redis
|
||||||
|
.set(total as i64);
|
||||||
|
metrics
|
||||||
|
.total_success_get_encode_collab_from_redis
|
||||||
|
.set(success as i64);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CollabMetrics {
|
pub struct CollabMetrics {
|
||||||
success_write_snapshot_count: Gauge,
|
success_write_snapshot_count: Gauge,
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ use crate::error::{CreateGroupFailedReason, RealtimeError};
|
||||||
use crate::group::cmd::{GroupCommand, GroupCommandRunner, GroupCommandSender};
|
use crate::group::cmd::{GroupCommand, GroupCommandRunner, GroupCommandSender};
|
||||||
use crate::group::manager::GroupManager;
|
use crate::group::manager::GroupManager;
|
||||||
use crate::indexer::IndexerProvider;
|
use crate::indexer::IndexerProvider;
|
||||||
|
use crate::metrics::spawn_metrics;
|
||||||
use crate::rt_server::collaboration_runtime::COLLAB_RUNTIME;
|
use crate::rt_server::collaboration_runtime::COLLAB_RUNTIME;
|
||||||
use crate::state::RedisConnectionManager;
|
use crate::state::RedisConnectionManager;
|
||||||
use crate::{CollabRealtimeMetrics, RealtimeClientWebsocketSink};
|
use crate::{CollabRealtimeMetrics, RealtimeClientWebsocketSink};
|
||||||
|
|
@ -37,7 +38,6 @@ pub struct CollaborationServer<S, AC> {
|
||||||
storage: Arc<S>,
|
storage: Arc<S>,
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
metrics: Arc<CollabRealtimeMetrics>,
|
metrics: Arc<CollabRealtimeMetrics>,
|
||||||
metrics_calculate: CollabRealtimeMetrics,
|
|
||||||
enable_custom_runtime: bool,
|
enable_custom_runtime: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,7 +68,6 @@ where
|
||||||
info!("CollaborationServer with actix-web runtime");
|
info!("CollaborationServer with actix-web runtime");
|
||||||
}
|
}
|
||||||
|
|
||||||
let metrics_calculate = CollabRealtimeMetrics::default();
|
|
||||||
let connect_state = ConnectState::new();
|
let connect_state = ConnectState::new();
|
||||||
let access_control = Arc::new(access_control);
|
let access_control = Arc::new(access_control);
|
||||||
let collab_stream = CollabRedisStream::new_with_connection_manager(redis_connection_manager);
|
let collab_stream = CollabRedisStream::new_with_connection_manager(redis_connection_manager);
|
||||||
|
|
@ -76,7 +75,7 @@ where
|
||||||
GroupManager::new(
|
GroupManager::new(
|
||||||
storage.clone(),
|
storage.clone(),
|
||||||
access_control.clone(),
|
access_control.clone(),
|
||||||
metrics_calculate.clone(),
|
metrics.clone(),
|
||||||
collab_stream,
|
collab_stream,
|
||||||
group_persistence_interval,
|
group_persistence_interval,
|
||||||
edit_state_max_count,
|
edit_state_max_count,
|
||||||
|
|
@ -92,6 +91,8 @@ where
|
||||||
|
|
||||||
spawn_collaboration_command(command_recv, &group_sender_by_object_id);
|
spawn_collaboration_command(command_recv, &group_sender_by_object_id);
|
||||||
|
|
||||||
|
spawn_metrics(metrics.clone(), storage.clone());
|
||||||
|
|
||||||
spawn_handle_unindexed_collabs(indexer_provider);
|
spawn_handle_unindexed_collabs(indexer_provider);
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
|
|
@ -100,7 +101,6 @@ where
|
||||||
connect_state,
|
connect_state,
|
||||||
group_sender_by_object_id,
|
group_sender_by_object_id,
|
||||||
metrics,
|
metrics,
|
||||||
metrics_calculate,
|
|
||||||
enable_custom_runtime,
|
enable_custom_runtime,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -120,7 +120,7 @@ where
|
||||||
let new_client_router = ClientMessageRouter::new(conn_sink);
|
let new_client_router = ClientMessageRouter::new(conn_sink);
|
||||||
let group_manager = self.group_manager.clone();
|
let group_manager = self.group_manager.clone();
|
||||||
let connect_state = self.connect_state.clone();
|
let connect_state = self.connect_state.clone();
|
||||||
let metrics_calculate = self.metrics_calculate.clone();
|
let metrics_calculate = self.metrics.clone();
|
||||||
let storage = self.storage.clone();
|
let storage = self.storage.clone();
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
|
|
@ -152,7 +152,7 @@ where
|
||||||
) -> Pin<Box<dyn Future<Output = Result<(), RealtimeError>>>> {
|
) -> Pin<Box<dyn Future<Output = Result<(), RealtimeError>>>> {
|
||||||
let group_manager = self.group_manager.clone();
|
let group_manager = self.group_manager.clone();
|
||||||
let connect_state = self.connect_state.clone();
|
let connect_state = self.connect_state.clone();
|
||||||
let metrics_calculate = self.metrics_calculate.clone();
|
let metrics_calculate = self.metrics.clone();
|
||||||
let storage = self.storage.clone();
|
let storage = self.storage.clone();
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue