Skip to content

Commit 06c6f44

Browse files
authored
feat: request & RPC ID analytics (#949)
* feat: request & RPC ID analytics * fix: don't have default value
1 parent 0e54a95 commit 06c6f44

File tree

9 files changed

+23
-10
lines changed

9 files changed

+23
-10
lines changed

src/analytics/message_info.rs

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use {
22
crate::{handlers::RpcQueryParams, json_rpc::JsonRpcRequest, providers::ProviderKind},
3+
hyper::HeaderMap,
34
parquet_derive::ParquetRecordWriter,
45
serde::{Deserialize, Serialize},
56
std::sync::Arc,
@@ -16,6 +17,9 @@ pub struct MessageInfo {
1617
pub method: Arc<str>,
1718
pub source: String,
1819

20+
pub request_id: Option<String>,
21+
pub rpc_id: String,
22+
1923
pub origin: Option<String>,
2024
pub provider: String,
2125

@@ -32,6 +36,7 @@ impl MessageInfo {
3236
#[allow(clippy::too_many_arguments)]
3337
pub fn new(
3438
query_params: &RpcQueryParams,
39+
headers: &HeaderMap,
3540
request: &JsonRpcRequest,
3641
region: Option<Vec<String>>,
3742
country: Option<Arc<str>>,
@@ -53,6 +58,12 @@ impl MessageInfo {
5358
.unwrap_or(&MessageSource::Rpc)
5459
.to_string(),
5560

61+
request_id: headers
62+
.get("x-request-id")
63+
.and_then(|v| v.to_str().ok())
64+
.map(|v| v.to_string()),
65+
rpc_id: request.id.to_string(),
66+
5667
origin,
5768
provider: provider.to_string(),
5869

@@ -65,6 +76,7 @@ impl MessageInfo {
6576
}
6677
}
6778

79+
// Note: these are all INTERNAL sources (except Rpc). While technically the user can override this via query param currently, this is just a technical limitation of the implementation here.
6880
#[derive(Debug, Clone, EnumString, Display, Deserialize, PartialEq)]
6981
#[strum(serialize_all = "snake_case")]
7082
#[serde(rename_all = "snake_case")]

src/handlers/balance.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ async fn handler_internal(
248248
let (country, continent, region) = state
249249
.analytics
250250
.lookup_geo_data(
251-
network::get_forwarded_ip(headers).unwrap_or_else(|| connect_info.0.ip()),
251+
network::get_forwarded_ip(&headers).unwrap_or_else(|| connect_info.0.ip()),
252252
)
253253
.map(|geo| (geo.country, geo.continent, geo.region))
254254
.unwrap_or((None, None, None));

src/handlers/chain_agnostic/route.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ async fn handler_internal(
553553
let (country, continent, region) = state
554554
.analytics
555555
.lookup_geo_data(
556-
network::get_forwarded_ip(headers).unwrap_or_else(|| connect_info.0.ip()),
556+
network::get_forwarded_ip(&headers).unwrap_or_else(|| connect_info.0.ip()),
557557
)
558558
.map(|geo| (geo.country, geo.continent, geo.region))
559559
.unwrap_or((None, None, None));

src/handlers/history.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ async fn handler_internal(
203203

204204
let (country, continent, region) = state
205205
.analytics
206-
.lookup_geo_data(network::get_forwarded_ip(headers).unwrap_or_else(|| connect_info.0.ip()))
206+
.lookup_geo_data(network::get_forwarded_ip(&headers).unwrap_or_else(|| connect_info.0.ip()))
207207
.map(|geo| (geo.country, geo.continent, geo.region))
208208
.unwrap_or((None, None, None));
209209

src/handlers/identity.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ async fn handler_internal(
134134
let (country, continent, region) = state
135135
.analytics
136136
.lookup_geo_data(
137-
network::get_forwarded_ip(headers).unwrap_or_else(|| connect_info.0.ip()),
137+
network::get_forwarded_ip(&headers).unwrap_or_else(|| connect_info.0.ip()),
138138
)
139139
.map(|geo| (geo.country, geo.continent, geo.region))
140140
.unwrap_or((None, None, None));

src/handlers/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ pub async fn rate_limit_middleware<B>(
9898
next: Next<B>,
9999
) -> Response {
100100
let headers = req.headers().clone();
101-
let ip = match network::get_forwarded_ip(headers.clone()) {
101+
let ip = match network::get_forwarded_ip(&headers) {
102102
Some(ip) => ip.to_string(),
103103
None => {
104104
error!(

src/handlers/profile/register.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ pub async fn handler_internal(
195195
let (country, continent, region) = state
196196
.analytics
197197
.lookup_geo_data(
198-
network::get_forwarded_ip(headers).unwrap_or_else(|| connect_info.0.ip()),
198+
network::get_forwarded_ip(&headers).unwrap_or_else(|| connect_info.0.ip()),
199199
)
200200
.map(|geo| (geo.country, geo.continent, geo.region))
201201
.unwrap_or((None, None, None));

src/handlers/proxy.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,13 @@ pub async fn rpc_provider_call(
196196
if let Ok(rpc_request) = serde_json::from_slice(&body) {
197197
let (country, continent, region) = state
198198
.analytics
199-
.lookup_geo_data(network::get_forwarded_ip(headers).unwrap_or_else(|| addr.ip()))
199+
.lookup_geo_data(network::get_forwarded_ip(&headers).unwrap_or_else(|| addr.ip()))
200200
.map(|geo| (geo.country, geo.continent, geo.region))
201201
.unwrap_or((None, None, None));
202202

203203
state.analytics.message(MessageInfo::new(
204204
&query_params,
205+
&headers,
205206
&rpc_request,
206207
region,
207208
country,

src/utils/network.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ fn is_public_ip_addr(addr: IpAddr) -> bool {
6666
RESERVED_NETWORKS.iter().all(|range| !range.contains(&addr))
6767
}
6868

69-
pub fn get_forwarded_ip(headers: HeaderMap) -> Option<IpAddr> {
69+
pub fn get_forwarded_ip(headers: &HeaderMap) -> Option<IpAddr> {
7070
headers
7171
.get("X-Forwarded-For")
7272
.and_then(|header| header.to_str().ok())
@@ -84,7 +84,7 @@ mod tests {
8484
let mut headers_single = HeaderMap::new();
8585
headers_single.insert("X-Forwarded-For", "10.128.128.1".parse().unwrap());
8686
assert_eq!(
87-
get_forwarded_ip(headers_single).unwrap(),
87+
get_forwarded_ip(&headers_single).unwrap(),
8888
"10.128.128.1".parse::<IpAddr>().unwrap()
8989
);
9090

@@ -95,7 +95,7 @@ mod tests {
9595
"10.128.128.1, 10.128.128.2".parse().unwrap(),
9696
);
9797
assert_eq!(
98-
get_forwarded_ip(headers_multiple).unwrap(),
98+
get_forwarded_ip(&headers_multiple).unwrap(),
9999
"10.128.128.2".parse::<IpAddr>().unwrap()
100100
);
101101
}

0 commit comments

Comments
 (0)