MCPcopy Create free account
hub / github.com/ScriptedAlchemy/tracedecay / durable_analytics_rows

Function durable_analytics_rows

src/dashboard/analytics_api.rs:114–159  ·  view source on GitHub ↗
(
    global_db: Option<&GlobalDb>,
    lcm_conn: Option<&libsql::Connection>,
    project_id: &str,
)

Source from the content-addressed store, hash-verified

112}
113
114async fn durable_analytics_rows(
115 global_db: Option<&GlobalDb>,
116 lcm_conn: Option<&libsql::Connection>,
117 project_id: &str,
118) -> Option<Vec<Value>> {
119 if let Some(db) = global_db {
120 if let Ok(events) = db
121 .query_analytics_events(&AnalyticsEventQuery {
122 provider: None,
123 project_id: Some(project_id.to_string()),
124 session_id: None,
125 event_kind: None,
126 since: None,
127 limit: ANALYTICS_EVENT_LIMIT,
128 })
129 .await
130 {
131 if !events.is_empty() {
132 return Some(events.iter().map(durable_analytics_event_row).collect());
133 }
134 }
135 }
136
137 let rows = query_rows(
138 lcm_conn?,
139 "SELECT provider, timestamp, event_kind, hook_name, tool_name,
140 tool_category, skill_name, hint_category, outcome, metadata_json
141 FROM (
142 SELECT provider, timestamp, event_kind, hook_name, tool_name,
143 tool_category, skill_name, hint_category, outcome, metadata_json, id
144 FROM analytics_events
145 WHERE project_id = ?1
146 ORDER BY timestamp DESC, id DESC
147 LIMIT 10000
148 )
149 ORDER BY timestamp, id",
150 libsql::params![project_id],
151 )
152 .await
153 .ok()?;
154 if rows.is_empty() {
155 None
156 } else {
157 Some(rows)
158 }
159}
160
161pub(crate) fn durable_analytics_event_row(event: &AnalyticsEventRecord) -> Value {
162 json!({

Callers 1

Calls 4

query_rowsFunction · 0.85
collectMethod · 0.80
is_emptyMethod · 0.45

Tested by

no test coverage detected