mirror of
https://github.com/chirpstack/chirpstack.git
synced 2025-06-13 04:58:09 +00:00
Save metrics in one pipelined Redis query.
This saves the metrics in one pipelined Redis query, rather than one query per aggregation level. This saves 2 queries per save.
This commit is contained in:
@ -83,18 +83,14 @@ pub async fn save_state(name: &str, state: &str) -> Result<()> {
|
||||
}
|
||||
|
||||
pub async fn save(name: &str, record: &Record) -> Result<()> {
|
||||
for a in get_aggregations() {
|
||||
save_for_interval(a, name, record).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn save_for_interval(a: Aggregation, name: &str, record: &Record) -> Result<()> {
|
||||
if record.metrics.is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let mut pipe = redis::pipe();
|
||||
pipe.atomic();
|
||||
|
||||
for a in get_aggregations() {
|
||||
let ttl = get_ttl(a);
|
||||
|
||||
let ts: DateTime<Local> = match a {
|
||||
@ -124,8 +120,6 @@ async fn save_for_interval(a: Aggregation, name: &str, record: &Record) -> Resul
|
||||
};
|
||||
|
||||
let key = get_key(&name, a, ts);
|
||||
let mut pipe = redis::pipe();
|
||||
pipe.atomic();
|
||||
|
||||
for (k, v) in &record.metrics {
|
||||
// Passing a reference to hincr will return a runtime error.
|
||||
@ -153,11 +147,13 @@ async fn save_for_interval(a: Aggregation, name: &str, record: &Record) -> Resul
|
||||
pipe.cmd("PEXPIRE")
|
||||
.arg(&key)
|
||||
.arg(ttl.as_millis() as usize)
|
||||
.ignore()
|
||||
.query_async(&mut get_async_redis_conn().await?)
|
||||
.await?;
|
||||
.ignore();
|
||||
|
||||
info!(name = %name, aggregation = %a, "Metrics saved");
|
||||
}
|
||||
|
||||
pipe.query_async(&mut get_async_redis_conn().await?).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -339,9 +335,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::HOUR, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -408,9 +402,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::DAY, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -477,9 +469,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::DAY, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -546,9 +536,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::MONTH, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -607,9 +595,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::HOUR, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -658,9 +644,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::HOUR, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
@ -709,9 +693,7 @@ pub mod test {
|
||||
},
|
||||
];
|
||||
for r in &records {
|
||||
save_for_interval(Aggregation::HOUR, "test", r)
|
||||
.await
|
||||
.unwrap();
|
||||
save("test", r).await.unwrap();
|
||||
}
|
||||
|
||||
let resp = get(
|
||||
|
Reference in New Issue
Block a user