Skip to content

Commit eabbdae

Browse files
committed
feat(uptime): add assertion checks to check_executor; add endpoint check
1 parent 50f88aa commit eabbdae

File tree

10 files changed

+503
-184
lines changed

10 files changed

+503
-184
lines changed

Cargo.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ iprange = "0.6.7"
6565
http = "1.2.0"
6666
relay-pattern = { git = "https://github.com/getsentry/relay", rev = "7ba03b5f6ffe95c2429ba315f661d2b8ee3c0efe" }
6767
pest = "2.7.15"
68-
axum = "0.8.6"
68+
axum = { version = "0.8.6", features = ["macros"] }
6969

7070
[patch.crates-io]
7171
rdkafka = { git = "https://github.com/fede1024/rust-rdkafka" }
@@ -82,3 +82,5 @@ redis-test-macro = { path = "./redis-test-macro" }
8282
ntest = "0.9.3"
8383
socket-server-mocker = "0.5.0"
8484
httpmock = "0.7.0-rc.1"
85+
tower = { version = "0.5.2", features = ["util"] }
86+
http-body-util = "0.1.0"

src/assertions/compiled.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use jsonpath_rust::{
33
parser::{errors::JsonPathError, model::JpQuery, parse_json_path},
44
query::js_path_process,
55
};
6+
use serde::Serialize;
67
use std::{
78
borrow::{Borrow, BorrowMut},
89
str::FromStr,
@@ -11,7 +12,7 @@ use std::{
1112
const GLOB_COMPLEXITY_LIMIT: u64 = 20;
1213
const ASSERTION_MAX_GAS: u32 = 100;
1314

14-
#[derive(thiserror::Error, Debug)]
15+
#[derive(thiserror::Error, Debug, Serialize)]
1516
pub enum Error {
1617
#[error("Invalid glob: {0}")]
1718
InvalidGlob(String),

src/assertions/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ use serde::{Deserialize, Serialize};
55
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
66
#[serde(rename_all = "snake_case")]
77
pub struct Assertion {
8-
root: Op,
8+
pub(crate) root: Op,
99
}
1010

1111
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
1212
#[serde(tag = "cmp", rename_all = "snake_case")]
13-
enum Comparison {
13+
pub(crate) enum Comparison {
1414
LessThan,
1515
GreaterThan,
1616
Equal,
@@ -19,20 +19,20 @@ enum Comparison {
1919

2020
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
2121
#[serde(rename_all = "snake_case")]
22-
struct GlobPattern {
23-
value: String,
22+
pub(crate) struct GlobPattern {
23+
pub(crate) value: String,
2424
}
2525

2626
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
2727
#[serde(tag = "header_op", rename_all = "snake_case")]
28-
enum HeaderOperand {
28+
pub(crate) enum HeaderOperand {
2929
Literal { value: String },
3030
Glob { pattern: GlobPattern },
3131
}
3232

3333
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
3434
#[serde(tag = "header_cmp", rename_all = "snake_case")]
35-
enum HeaderComparison {
35+
pub(crate) enum HeaderComparison {
3636
Always,
3737
Never,
3838
Equals { test_value: HeaderOperand },
@@ -43,7 +43,7 @@ enum HeaderComparison {
4343

4444
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
4545
#[serde(tag = "op", rename_all = "snake_case")]
46-
enum Op {
46+
pub(crate) enum Op {
4747
And {
4848
children: Vec<Op>,
4949
},

src/check_executor.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,21 @@ pub struct ScheduledCheck {
3838
}
3939

4040
impl ScheduledCheck {
41+
pub fn new(
42+
kind: CheckKind,
43+
tick: Tick,
44+
config: Arc<CheckConfig>,
45+
resolve_tx: Sender<Option<CheckResult>>,
46+
) -> ScheduledCheck {
47+
ScheduledCheck {
48+
kind,
49+
tick,
50+
config,
51+
resolve_tx,
52+
retry_count: 0,
53+
}
54+
}
55+
4156
#[cfg(test)]
4257
pub fn new_for_test(tick: Tick, config: CheckConfig) -> Self {
4358
let (resolve_tx, _) = tokio::sync::oneshot::channel();
@@ -284,7 +299,7 @@ async fn executor_loop(
284299
}
285300

286301
#[allow(clippy::too_many_arguments)]
287-
async fn do_check(
302+
pub(crate) async fn do_check(
288303
failure_retries: u16,
289304
scheduled_check: ScheduledCheck,
290305
job_checker: Arc<HttpChecker>,
@@ -367,13 +382,15 @@ fn record_result_metrics(result: &CheckResult, is_retry: bool, will_retry: bool)
367382
CheckStatus::MissedWindow => "missed_window",
368383
CheckStatus::DisallowedByRobots => "disallowed_by_robots",
369384
};
370-
let failure_reason = match status_reason.as_ref().map(|r| r.status_type) {
385+
let failure_reason = match status_reason.as_ref().map(|r| &r.status_type) {
371386
Some(CheckStatusReasonType::Failure) => Some("failure"),
372387
Some(CheckStatusReasonType::DnsError) => Some("dns_error"),
373388
Some(CheckStatusReasonType::Timeout) => Some("timeout"),
374389
Some(CheckStatusReasonType::TlsError) => Some("tls_error"),
375390
Some(CheckStatusReasonType::ConnectionError) => Some("connection_error"),
376391
Some(CheckStatusReasonType::RedirectError) => Some("redirect_error"),
392+
Some(CheckStatusReasonType::AssertionFailure) => Some("assertion_failure"),
393+
Some(CheckStatusReasonType::AssertionError) => Some("assertion_error"),
377394
None => None,
378395
};
379396
let status_code = match request_info.as_ref().and_then(|a| a.http_status_code) {

0 commit comments

Comments
 (0)