mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-09 02:47:45 +08:00
feat(health): refine health monitor metrics
- add TPS to model and provider health payloads - exclude user-cancelled 499 requests from health statistics - update model/provider health cards with average latency, average TTFB, TPS, and availability
This commit is contained in:
@@ -263,6 +263,12 @@ fn usage_matches_list_query(item: &StoredRequestUsageAudit, query: &UsageAuditLi
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if item
|
||||
.status_code
|
||||
.is_some_and(|status_code| query.exclude_status_codes.contains(&status_code))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
if item.is_stream != is_stream {
|
||||
return false;
|
||||
@@ -323,6 +329,12 @@ fn usage_matches_keyword_search_query(
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if item
|
||||
.status_code
|
||||
.is_some_and(|status_code| query.exclude_status_codes.contains(&status_code))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
if item.is_stream != is_stream {
|
||||
return false;
|
||||
@@ -540,6 +552,12 @@ fn usage_matches_breakdown_summary_query(
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if item
|
||||
.status_code
|
||||
.is_some_and(|status_code| query.exclude_status_codes.contains(&status_code))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
match query.group_by {
|
||||
UsageBreakdownGroupBy::Model | UsageBreakdownGroupBy::Provider => true,
|
||||
UsageBreakdownGroupBy::ApiFormat => item.api_format.is_some(),
|
||||
|
||||
@@ -86,6 +86,24 @@ fn dashboard_utc_to_unix_secs(value: DateTime<Utc>) -> u64 {
|
||||
value.timestamp().max(0) as u64
|
||||
}
|
||||
|
||||
fn push_postgres_usage_excluded_status_codes(
|
||||
builder: &mut QueryBuilder<'_, Postgres>,
|
||||
has_where: &mut bool,
|
||||
status_codes: &[u16],
|
||||
) {
|
||||
if status_codes.is_empty() {
|
||||
return;
|
||||
}
|
||||
builder.push(if *has_where { " AND " } else { " WHERE " });
|
||||
*has_where = true;
|
||||
builder.push("(\"usage\".status_code IS NULL OR \"usage\".status_code NOT IN (");
|
||||
let mut separated = builder.separated(", ");
|
||||
for status_code in status_codes {
|
||||
separated.push_bind(i32::from(*status_code));
|
||||
}
|
||||
separated.push_unseparated("))");
|
||||
}
|
||||
|
||||
fn dashboard_utc_midnight(value: DateTime<Utc>) -> DateTime<Utc> {
|
||||
DateTime::<Utc>::from_naive_utc_and_offset(
|
||||
value
|
||||
@@ -2529,6 +2547,7 @@ ORDER BY request_count DESC, "usage".provider_name ASC
|
||||
}
|
||||
if let Some(user_id) = query.user_id.as_deref() {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
builder
|
||||
.push("\"usage\".user_id = ")
|
||||
.push_bind(user_id.to_string());
|
||||
@@ -2566,6 +2585,11 @@ ORDER BY request_count DESC, "usage".provider_name ASC
|
||||
separated.push_unseparated(")");
|
||||
}
|
||||
}
|
||||
push_postgres_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
@@ -2625,6 +2649,7 @@ OR (\"usage\".error_message IS NOT NULL AND BTRIM(\"usage\".error_message) <> ''
|
||||
}
|
||||
if let Some(user_id) = query.user_id.as_deref() {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
builder
|
||||
.push("\"usage\".user_id = ")
|
||||
.push_bind(user_id.to_string());
|
||||
@@ -2662,6 +2687,11 @@ OR (\"usage\".error_message IS NOT NULL AND BTRIM(\"usage\".error_message) <> ''
|
||||
separated.push_unseparated(")");
|
||||
}
|
||||
}
|
||||
push_postgres_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
@@ -2840,6 +2870,11 @@ OR (\"usage\".error_message IS NOT NULL AND BTRIM(\"usage\".error_message) <> ''
|
||||
separated.push_unseparated(")");
|
||||
}
|
||||
}
|
||||
push_postgres_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
@@ -2926,6 +2961,11 @@ OR (\"usage\".error_message IS NOT NULL AND BTRIM(\"usage\".error_message) <> ''
|
||||
separated.push_unseparated(")");
|
||||
}
|
||||
}
|
||||
push_postgres_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
builder.push(if has_where { " AND " } else { " WHERE " });
|
||||
has_where = true;
|
||||
@@ -4801,6 +4841,11 @@ WITH filtered_usage AS (
|
||||
.push("\"usage\".provider_name = ")
|
||||
.push_bind(provider_name.to_string());
|
||||
}
|
||||
push_postgres_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
builder.push(filtered_extra_where);
|
||||
builder.push(
|
||||
r#"
|
||||
@@ -4893,6 +4938,9 @@ ORDER BY request_count DESC, group_key ASC
|
||||
&self,
|
||||
query: &UsageBreakdownSummaryQuery,
|
||||
) -> Result<Vec<StoredUsageBreakdownSummaryRow>, DataLayerError> {
|
||||
if !query.exclude_status_codes.is_empty() {
|
||||
return self.summarize_usage_breakdown_raw(query).await;
|
||||
}
|
||||
if query.provider_name.is_some() {
|
||||
return self.summarize_usage_breakdown_raw(query).await;
|
||||
}
|
||||
@@ -4918,6 +4966,7 @@ ORDER BY request_count DESC, group_key ASC
|
||||
created_until_unix_secs: dashboard_utc_to_unix_secs(raw_end),
|
||||
user_id: Some(user_id.to_string()),
|
||||
provider_name: None,
|
||||
exclude_status_codes: query.exclude_status_codes.clone(),
|
||||
group_by: query.group_by,
|
||||
})
|
||||
.await?;
|
||||
@@ -4941,6 +4990,7 @@ ORDER BY request_count DESC, group_key ASC
|
||||
created_until_unix_secs: dashboard_utc_to_unix_secs(raw_end),
|
||||
user_id: Some(user_id.to_string()),
|
||||
provider_name: None,
|
||||
exclude_status_codes: query.exclude_status_codes.clone(),
|
||||
group_by: query.group_by,
|
||||
})
|
||||
.await?;
|
||||
|
||||
@@ -466,6 +466,7 @@ fn push_sqlite_usage_list_filters(
|
||||
separated.push_unseparated(")");
|
||||
}
|
||||
}
|
||||
push_sqlite_usage_excluded_status_codes(builder, has_where, &query.exclude_status_codes);
|
||||
if let Some(is_stream) = query.is_stream {
|
||||
push_sqlite_usage_where(builder, has_where);
|
||||
builder
|
||||
@@ -482,6 +483,23 @@ OR (error_message IS NOT NULL AND TRIM(error_message) <> ''))",
|
||||
}
|
||||
}
|
||||
|
||||
fn push_sqlite_usage_excluded_status_codes(
|
||||
builder: &mut QueryBuilder<'_, Sqlite>,
|
||||
has_where: &mut bool,
|
||||
status_codes: &[u16],
|
||||
) {
|
||||
if status_codes.is_empty() {
|
||||
return;
|
||||
}
|
||||
push_sqlite_usage_where(builder, has_where);
|
||||
builder.push("(status_code IS NULL OR status_code NOT IN (");
|
||||
let mut separated = builder.separated(", ");
|
||||
for status_code in status_codes {
|
||||
separated.push_bind(i64::from(*status_code));
|
||||
}
|
||||
separated.push_unseparated("))");
|
||||
}
|
||||
|
||||
fn push_sqlite_usage_keyword_filters(
|
||||
builder: &mut QueryBuilder<'_, Sqlite>,
|
||||
query: &UsageAuditKeywordSearchQuery,
|
||||
@@ -497,6 +515,7 @@ fn push_sqlite_usage_keyword_filters(
|
||||
model: query.model.clone(),
|
||||
api_format: query.api_format.clone(),
|
||||
statuses: query.statuses.clone(),
|
||||
exclude_status_codes: query.exclude_status_codes.clone(),
|
||||
is_stream: query.is_stream,
|
||||
error_only: query.error_only,
|
||||
limit: None,
|
||||
@@ -2471,6 +2490,11 @@ FROM "usage"
|
||||
"provider_name",
|
||||
query.provider_name.as_deref(),
|
||||
);
|
||||
push_sqlite_usage_excluded_status_codes(
|
||||
&mut builder,
|
||||
&mut has_where,
|
||||
&query.exclude_status_codes,
|
||||
);
|
||||
if matches!(query.group_by, UsageBreakdownGroupBy::ApiFormat) {
|
||||
push_sqlite_usage_where(&mut builder, &mut has_where);
|
||||
builder.push("api_format IS NOT NULL");
|
||||
|
||||
Reference in New Issue
Block a user