use serde::{Deserialize, Serialize};
use crate::web::HttpMethod;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpPullTelemetry {
pub state: HttpPullState,
pub wait_reason: Option<WaitReason>,
pub next_wake_unix_secs: Option<u64>,
pub last_success_unix_secs: Option<u64>,
pub requests_total: u64,
pub responses_2xx: u64,
pub responses_4xx: u64,
pub responses_5xx: u64,
pub rate_limited_total: u64,
pub retries_total: u64,
pub events_decoded_total: u64,
pub wait_seconds_rate_limit: f64,
pub wait_seconds_poll_interval: f64,
pub wait_seconds_backoff: f64,
}
impl Default for HttpPullTelemetry {
fn default() -> Self {
Self {
state: HttpPullState::Fetching,
wait_reason: None,
next_wake_unix_secs: None,
last_success_unix_secs: None,
requests_total: 0,
responses_2xx: 0,
responses_4xx: 0,
responses_5xx: 0,
rate_limited_total: 0,
retries_total: 0,
events_decoded_total: 0,
wait_seconds_rate_limit: 0.0,
wait_seconds_poll_interval: 0.0,
wait_seconds_backoff: 0.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum HttpPullState {
Fetching,
Waiting,
Terminal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WaitReason {
RateLimit,
PollInterval,
Backoff,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct HttpPullMeasurements {
pub requests_total: u64,
pub responses_2xx: u64,
pub responses_4xx: u64,
pub responses_5xx: u64,
pub rate_limited_total: u64,
pub retries_total: u64,
pub events_decoded_total: u64,
pub wait_seconds_rate_limit: f64,
pub wait_seconds_poll_interval: f64,
pub wait_seconds_backoff: f64,
}
impl From<&HttpPullTelemetry> for HttpPullMeasurements {
fn from(source: &HttpPullTelemetry) -> Self {
Self {
requests_total: source.requests_total,
responses_2xx: source.responses_2xx,
responses_4xx: source.responses_4xx,
responses_5xx: source.responses_5xx,
rate_limited_total: source.rate_limited_total,
retries_total: source.retries_total,
events_decoded_total: source.events_decoded_total,
wait_seconds_rate_limit: source.wait_seconds_rate_limit,
wait_seconds_poll_interval: source.wait_seconds_poll_interval,
wait_seconds_backoff: source.wait_seconds_backoff,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct HttpPullMetricsSnapshot {
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<HttpPullState>,
pub wait_reason: Option<WaitReason>,
pub next_wake_unix_secs: Option<u64>,
pub last_success_unix_secs: Option<u64>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub measurements: Option<HttpPullMeasurements>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpSurfaceMetricsSnapshot {
pub routes: Vec<HttpSurfaceRouteMetricsSnapshot>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpSurfaceRouteMetricsSnapshot {
pub surface_name: String,
pub method: HttpMethod,
pub path: String,
pub status_class: String,
pub requests_total: u64,
pub request_duration_ms_total: u64,
pub request_bytes_total: u64,
pub response_bytes_total: u64,
}