|
1 | | -//! Datadog-compatible intake routes. |
| 1 | +//! Datadog-compatible HTTP intake routes. |
| 2 | +//! |
| 3 | +//! This module owns the public routes that Datadog Agent and ADP send to: |
| 4 | +//! |
| 5 | +//! - `POST /api/v2/series`: accepts metric series payloads and records payload |
| 6 | +//! shape assertions. |
| 7 | +//! - `POST /api/beta/sketches`: accepts distribution sketch payloads. |
| 8 | +//! - `POST /api/v1/events_batch`: accepts protobuf event batches. |
| 9 | +//! - `POST /api/v1/events`: accepts JSON event intake payloads and rejects |
| 10 | +//! malformed bodies. |
| 11 | +//! - `POST /intake/`: accepts the shared JSON intake endpoint and ignores |
| 12 | +//! non-event bodies. |
| 13 | +//! - `POST /api/v1/check_run`: accepts service check payloads. |
| 14 | +//! - `GET /api/v1/validate`: accepts Datadog Agent connectivity validation. |
2 | 15 |
|
3 | | -use axum::{extract::DefaultBodyLimit, middleware::from_fn, routing::post, Router}; |
| 16 | +use axum::{ |
| 17 | + extract::DefaultBodyLimit, |
| 18 | + http::StatusCode, |
| 19 | + middleware::from_fn, |
| 20 | + routing::{get, post}, |
| 21 | + Router, |
| 22 | +}; |
4 | 23 | use tower::ServiceBuilder; |
5 | 24 | use tower_http::decompression::RequestDecompressionLayer; |
6 | 25 |
|
7 | | -use self::metrics::handle_series; |
8 | 26 | use super::middleware::measure_compressed_size; |
9 | 27 | use super::state::AppState; |
10 | 28 |
|
| 29 | +mod events; |
11 | 30 | mod metrics; |
| 31 | +mod service_checks; |
12 | 32 |
|
13 | 33 | /// Build Datadog-compatible intake routes. |
14 | 34 | pub(crate) fn routes() -> Router<AppState> { |
| 35 | + Router::new() |
| 36 | + .merge(metric_routes()) |
| 37 | + .merge(event_routes()) |
| 38 | + .merge(service_check_routes()) |
| 39 | + .route("/api/v1/validate", get(|| async { StatusCode::OK })) |
| 40 | +} |
| 41 | + |
| 42 | +fn metric_routes() -> Router<AppState> { |
15 | 43 | // Pyld01-Pyld06 and Pyld22 need the compressed body and raw headers, so the series |
16 | 44 | // route runs `measure_compressed_size` outermost, then decompresses, then |
17 | 45 | // lifts the body limit (the middleware's own cap is the backstop). |
18 | | - let series = post(handle_series).layer( |
| 46 | + let series = post(metrics::handle_series).layer( |
19 | 47 | ServiceBuilder::new() |
20 | 48 | .layer(from_fn(measure_compressed_size)) |
21 | 49 | .layer(RequestDecompressionLayer::new().pass_through_unaccepted(true)) |
22 | 50 | .layer(DefaultBodyLimit::disable()), |
23 | 51 | ); |
24 | 52 |
|
25 | | - Router::new().route("/api/v2/series", series) |
| 53 | + let decoded_payload_route = ServiceBuilder::new() |
| 54 | + .layer(RequestDecompressionLayer::new().pass_through_unaccepted(true)) |
| 55 | + .layer(DefaultBodyLimit::disable()); |
| 56 | + |
| 57 | + Router::new().route("/api/v2/series", series).route( |
| 58 | + "/api/beta/sketches", |
| 59 | + post(metrics::handle_sketches).layer(decoded_payload_route), |
| 60 | + ) |
| 61 | +} |
| 62 | + |
| 63 | +fn event_routes() -> Router<AppState> { |
| 64 | + let decoded_payload_route = ServiceBuilder::new() |
| 65 | + .layer(RequestDecompressionLayer::new().pass_through_unaccepted(true)) |
| 66 | + .layer(DefaultBodyLimit::disable()); |
| 67 | + |
| 68 | + Router::new() |
| 69 | + .route( |
| 70 | + "/api/v1/events_batch", |
| 71 | + post(events::handle_events_batch).layer(decoded_payload_route.clone()), |
| 72 | + ) |
| 73 | + .route( |
| 74 | + "/api/v1/events", |
| 75 | + post(events::handle_events_v1).layer(decoded_payload_route.clone()), |
| 76 | + ) |
| 77 | + .route( |
| 78 | + "/intake/", |
| 79 | + post(events::handle_intake).layer(decoded_payload_route.clone()), |
| 80 | + ) |
| 81 | +} |
| 82 | + |
| 83 | +fn service_check_routes() -> Router<AppState> { |
| 84 | + let decoded_payload_route = ServiceBuilder::new() |
| 85 | + .layer(RequestDecompressionLayer::new().pass_through_unaccepted(true)) |
| 86 | + .layer(DefaultBodyLimit::disable()); |
| 87 | + |
| 88 | + Router::new().route( |
| 89 | + "/api/v1/check_run", |
| 90 | + post(service_checks::handle_check_run_v1).layer(decoded_payload_route), |
| 91 | + ) |
26 | 92 | } |
0 commit comments