Trace each step of the feed list (#164)
GET /api/feeds took 250-300 ms in production with nothing under it in its trace but feed_summary spans of a millisecond, so there was no telling where the time went. feed_rows now wraps the catalogue, the person's subscriptions, the subscriber counts, the pins and feed_list in a step span each, and feed_list each of its five queries. db::step makes a span only inside one already: the healthcheck's status every 30 s and the page's live updates run the same code outside any trace, where each span would be a trace of its own, as feed_summary's already are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
14
src/web.rs
14
src/web.rs
@@ -807,20 +807,24 @@ async fn feeds(
|
||||
/// The feed list as this person sees it, or with `only` the one row for that feed: what a live
|
||||
/// update sends after the feed changes, so the page redraws a row instead of reloading the list.
|
||||
async fn feed_rows(state: &WebState, user: &crate::db::User, only: Option<&str>) -> anyhow::Result<Vec<FeedRow>> {
|
||||
use crate::db::step;
|
||||
use tracing::Instrument;
|
||||
let cfg = state.ctx.cfg();
|
||||
// Config entries plus the feeds derived from OPML subscriptions -- the catalogue.
|
||||
// What comes back is only the part of it this person subscribes to.
|
||||
let subs = crate::subscriptions(&state.ctx).await?;
|
||||
let subs = crate::subscriptions(&state.ctx).instrument(step("catalogue")).await?;
|
||||
let mine: std::collections::HashMap<String, crate::db::Sub> = state
|
||||
.ctx
|
||||
.db
|
||||
.subscriptions_for(user.id).await?
|
||||
.subscriptions_for(user.id)
|
||||
.instrument(step("subscriptions"))
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|s| (s.feed_id.clone(), s))
|
||||
.collect();
|
||||
let counts = state.ctx.db.subscriber_counts().await?;
|
||||
let pinned = state.ctx.db.pinned_feeds(user.id).await?;
|
||||
let mut listed = state.ctx.db.feed_list(user.id, only).await?;
|
||||
let counts = state.ctx.db.subscriber_counts().instrument(step("subscriber_counts")).await?;
|
||||
let pinned = state.ctx.db.pinned_feeds(user.id).instrument(step("pinned")).await?;
|
||||
let mut listed = state.ctx.db.feed_list(user.id, only).instrument(step("feed_list")).await?;
|
||||
let mut out = Vec::with_capacity(mine.len());
|
||||
for sub in subs.iter().filter(|s| only.is_none_or(|o| o == s.id)) {
|
||||
let (id, feed) = (&sub.id, &sub.cfg);
|
||||
|
||||
Reference in New Issue
Block a user