Skip to content

Commit b238224

Browse files
feat(http): Implement Isahc HTTP checker (#282)
Adds a new Isahc HTTP checker. We would like to experiment with this checker to collect better metrics about the HTTP requets being made. There are a few things we still need to fix before we can enable this - [ ] We need some way to restrict (See internal https://getsentry.atlassian.net/jira/servicedesk/projects/INF/issues/INF-449) - [ ] We need to be able to configure the DNS servers since our kube-dns is flakey. See sagebind/isahc#364
1 parent 62c5bb4 commit b238224

File tree

8 files changed

+964
-51
lines changed

8 files changed

+964
-51
lines changed

Cargo.lock

+109-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ time = "0.3"
4747
ctor = "0.2"
4848
hostname = "0.4.0"
4949
tokio-metrics = "0.4.0"
50+
isahc = "1.7.2"
51+
http = "1.2.0"
5052
[patch.crates-io]
5153
rdkafka = { git = "https://github.com/fede1024/rust-rdkafka" }
5254
reqwest = { git = "https://github.com/getsentry/reqwest-uptime", rev = "be34e1e20c88190dfd46dd609f43aeb15e9ede1b" }

src/app/config.rs

+15-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ pub enum ProducerMode {
2525
Vector,
2626
}
2727

28+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)]
29+
#[serde(rename_all = "snake_case")]
30+
pub enum CheckerMode {
31+
Reqwest,
32+
Isahc,
33+
}
34+
2835
#[serde_as]
2936
#[derive(PartialEq, Debug, Serialize, Deserialize)]
3037
pub struct MetricsConfig {
@@ -78,6 +85,9 @@ pub struct Config {
7885
/// Which config provider to use to load configs into memory
7986
pub config_provider_mode: ConfigProviderMode,
8087

88+
/// Which checker implementation to use to run the HTTP checks.
89+
pub checker_mode: CheckerMode,
90+
8191
/// which producer to use to send results
8292
pub producer_mode: ProducerMode,
8393

@@ -151,6 +161,7 @@ impl Default for Config {
151161
results_kafka_cluster: vec![],
152162
results_kafka_topic: "uptime-results".to_owned(),
153163
config_provider_mode: ConfigProviderMode::Redis,
164+
checker_mode: CheckerMode::Reqwest,
154165
vector_batch_size: 10,
155166
vector_endpoint: "http://localhost:8020".to_owned(),
156167
producer_mode: ProducerMode::Kafka,
@@ -222,12 +233,9 @@ mod tests {
222233
use std::net::IpAddr;
223234
use std::{borrow::Cow, collections::BTreeMap, path::PathBuf};
224235

225-
use crate::{
226-
app::{cli, config::ProducerMode},
227-
logging,
228-
};
236+
use crate::{app::cli, logging};
229237

230-
use super::{Config, ConfigProviderMode, MetricsConfig};
238+
use super::{CheckerMode, Config, ConfigProviderMode, MetricsConfig, ProducerMode};
231239

232240
fn test_with_config<F>(yaml: &str, env_vars: &[(&str, &str)], test_fn: F)
233241
where
@@ -292,6 +300,7 @@ mod tests {
292300
],
293301
results_kafka_topic: "uptime-results".to_owned(),
294302
config_provider_mode: ConfigProviderMode::Redis,
303+
checker_mode: CheckerMode::Reqwest,
295304
config_provider_redis_update_ms: 1000,
296305
config_provider_redis_total_partitions: 128,
297306
redis_enable_cluster: false,
@@ -377,6 +386,7 @@ mod tests {
377386
],
378387
results_kafka_topic: "uptime-results".to_owned(),
379388
config_provider_mode: ConfigProviderMode::Redis,
389+
checker_mode: CheckerMode::Reqwest,
380390
config_provider_redis_update_ms: 2000,
381391
config_provider_redis_total_partitions: 32,
382392
redis_enable_cluster: true,

src/checker.rs

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
pub mod dummy_checker;
2-
pub mod http_checker;
32
pub mod ip_filter;
3+
pub mod isahc_checker;
4+
pub mod reqwest_checker;
45

56
use std::future::Future;
67

8+
use isahc_checker::IsahcChecker;
9+
use reqwest_checker::ReqwestChecker;
710
use sentry::protocol::SpanId;
811
use uuid::Uuid;
912

@@ -50,3 +53,30 @@ pub trait Checker: Send + Sync {
5053
region: &str,
5154
) -> impl Future<Output = CheckResult> + Send;
5255
}
56+
57+
#[derive(Debug)]
58+
pub enum HttpChecker {
59+
ReqwestChecker(ReqwestChecker),
60+
IsahcChecker(IsahcChecker),
61+
}
62+
63+
impl Checker for HttpChecker {
64+
async fn check_url(&self, config: &CheckConfig, tick: &Tick, region: &str) -> CheckResult {
65+
match self {
66+
Self::IsahcChecker(c) => c.check_url(config, tick, region).await,
67+
Self::ReqwestChecker(c) => c.check_url(config, tick, region).await,
68+
}
69+
}
70+
}
71+
72+
impl From<ReqwestChecker> for HttpChecker {
73+
fn from(checker: ReqwestChecker) -> Self {
74+
HttpChecker::ReqwestChecker(checker)
75+
}
76+
}
77+
78+
impl From<IsahcChecker> for HttpChecker {
79+
fn from(checker: IsahcChecker) -> Self {
80+
HttpChecker::IsahcChecker(checker)
81+
}
82+
}

0 commit comments

Comments
 (0)