use std::collections::HashMap;
use futures::stream::futures_unordered;
use futures::{Future, IntoFuture, Stream};
use hyper::client::connect::Connect;
use hyper::Uri;
use serde_derive::{Deserialize, Serialize};
use crate::client::{Client, Response};
use crate::error::Error;
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct LeaderStats {
pub leader: String,
pub followers: HashMap<String, FollowerStats>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct FollowerStats {
pub counts: CountStats,
pub latency: LatencyStats,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct CountStats {
pub fail: u64,
pub success: u64,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct LatencyStats {
pub average: f64,
pub current: f64,
pub maximum: f64,
pub minimum: f64,
#[serde(rename = "standardDeviation")]
pub standard_deviation: f64,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct SelfStats {
pub id: String,
pub name: String,
#[serde(rename = "leaderInfo")]
pub leader_info: LeaderInfo,
#[serde(rename = "recvAppendRequestCnt")]
pub received_append_request_count: u64,
#[serde(rename = "recvBandwidthRate")]
pub received_bandwidth_rate: Option<f64>,
#[serde(rename = "recvPkgRate")]
pub received_package_rate: Option<f64>,
#[serde(rename = "sendAppendRequestCnt")]
pub sent_append_request_count: u64,
#[serde(rename = "sendBandwidthRate")]
pub sent_bandwidth_rate: Option<f64>,
#[serde(rename = "sendPkgRate")]
pub sent_package_rate: Option<f64>,
#[serde(rename = "startTime")]
pub start_time: String,
pub state: String,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct LeaderInfo {
#[serde(rename = "leader")]
pub id: String,
#[serde(rename = "startTime")]
pub start_time: String,
pub uptime: String,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct StoreStats {
#[serde(rename = "compareAndDeleteFail")]
pub compare_and_delete_fail: u64,
#[serde(rename = "compareAndDeleteSuccess")]
pub compare_and_delete_success: u64,
#[serde(rename = "compareAndSwapFail")]
pub compare_and_swap_fail: u64,
#[serde(rename = "compareAndSwapSuccess")]
pub compare_and_swap_success: u64,
#[serde(rename = "createFail")]
pub create_fail: u64,
#[serde(rename = "createSuccess")]
pub create_success: u64,
#[serde(rename = "deleteFail")]
pub delete_fail: u64,
#[serde(rename = "deleteSuccess")]
pub delete_success: u64,
#[serde(rename = "expireCount")]
pub expire_count: u64,
#[serde(rename = "getsFail")]
pub get_fail: u64,
#[serde(rename = "getsSuccess")]
pub get_success: u64,
#[serde(rename = "setsFail")]
pub set_fail: u64,
#[serde(rename = "setsSuccess")]
pub set_success: u64,
#[serde(rename = "updateFail")]
pub update_fail: u64,
#[serde(rename = "updateSuccess")]
pub update_success: u64,
pub watchers: u64,
}
pub fn leader_stats<C>(
client: &Client<C>,
) -> impl Future<Item = Response<LeaderStats>, Error = Error> + Send
where
C: Clone + Connect,
{
let url = build_url(&client.endpoints()[0], "v2/stats/leader");
let uri = url.parse().map_err(Error::from).into_future();
client.request(uri)
}
pub fn self_stats<C>(
client: &Client<C>,
) -> impl Stream<Item = Response<SelfStats>, Error = Error> + Send
where
C: Clone + Connect,
{
let futures = client.endpoints().iter().map(|endpoint| {
let url = build_url(&endpoint, "v2/stats/self");
let uri = url.parse().map_err(Error::from).into_future();
client.request(uri)
});
futures_unordered(futures)
}
pub fn store_stats<C>(
client: &Client<C>,
) -> impl Stream<Item = Response<StoreStats>, Error = Error> + Send
where
C: Clone + Connect,
{
let futures = client.endpoints().iter().map(|endpoint| {
let url = build_url(&endpoint, "v2/stats/store");
let uri = url.parse().map_err(Error::from).into_future();
client.request(uri)
});
futures_unordered(futures)
}
fn build_url(endpoint: &Uri, path: &str) -> String {
format!("{}{}", endpoint, path)
}