feat: improve admin performance analysis

This commit is contained in:
fawney19
2026-05-06 02:01:32 +08:00
parent f1358dd845
commit cf27773582
9 changed files with 833 additions and 205 deletions

View File

@@ -453,6 +453,14 @@ export interface ProviderPerformanceSummary {
avg_output_tps: number | null
avg_first_byte_time_ms: number | null
avg_response_time_ms: number | null
p90_response_time_ms?: number | null
p99_response_time_ms?: number | null
p90_first_byte_time_ms?: number | null
p99_first_byte_time_ms?: number | null
tps_sample_count?: number
response_time_sample_count?: number
first_byte_sample_count?: number
slow_request_count?: number
}
export interface ProviderPerformanceItem {
@@ -467,9 +475,13 @@ export interface ProviderPerformanceItem {
avg_first_byte_time_ms: number | null
avg_response_time_ms: number | null
p90_response_time_ms: number | null
p99_response_time_ms?: number | null
p90_first_byte_time_ms: number | null
p99_first_byte_time_ms?: number | null
tps_sample_count: number
response_time_sample_count?: number
first_byte_sample_count: number
slow_request_count?: number
}
export interface ProviderPerformanceTimelineItem {
@@ -482,6 +494,7 @@ export interface ProviderPerformanceTimelineItem {
avg_first_byte_time_ms: number | null
avg_response_time_ms: number | null
success_rate: number
slow_request_count?: number
}
export interface ProviderPerformanceResponse {
@@ -983,6 +996,13 @@ export const adminApi = {
tz_offset_minutes?: number
granularity?: 'day' | 'hour'
limit?: number
provider_id?: string
model?: string
api_format?: string
endpoint_kind?: string
is_stream?: boolean
has_format_conversion?: boolean
slow_threshold_ms?: number
}): Promise<ProviderPerformanceResponse> {
const cacheKey = buildCacheKey('admin:stats:performance:providers', params)
return cachedRequest(

View File

@@ -118,8 +118,21 @@ export interface GatewayMetricsSummary {
distributed: GatewayGateMetrics
tunnel: {
proxyConnections: number | null
availableProxyConnections: number | null
closingProxyConnections: number | null
drainingProxyConnections: number | null
softAvoidProxyConnections: number | null
nodes: number | null
activeStreams: number | null
outboundQueueDepthTotal: number | null
outboundQueueDepthMax: number | null
outboundQueueCapacityTotal: number | null
outboundQueueRejectedFullTotal: number | null
outboundQueueRejectedClosedTotal: number | null
proxyConnectionCongestedTotal: number | null
softAvoidSelectionTotal: number | null
selectionRetryTotal: number | null
selectionUnavailableTotal: number | null
}
fallbackTotal: number
fallbacks: GatewayFallbackMetricSummary[]
@@ -159,8 +172,21 @@ export function buildGatewayMetricsSummary(text: string): GatewayMetricsSummary
distributed: buildGateMetrics(samples, 'gateway_requests_distributed'),
tunnel: {
proxyConnections: findMetricValueNumber(samples, 'tunnel_proxy_connections'),
availableProxyConnections: findMetricValueNumber(samples, 'tunnel_proxy_connections_available'),
closingProxyConnections: findMetricValueNumber(samples, 'tunnel_proxy_connections_closing'),
drainingProxyConnections: findMetricValueNumber(samples, 'tunnel_proxy_connections_draining'),
softAvoidProxyConnections: findMetricValueNumber(samples, 'tunnel_proxy_connections_soft_avoid'),
nodes: findMetricValueNumber(samples, 'tunnel_nodes'),
activeStreams: findMetricValueNumber(samples, 'tunnel_active_streams'),
outboundQueueDepthTotal: findMetricValueNumber(samples, 'tunnel_proxy_outbound_queue_depth_total'),
outboundQueueDepthMax: findMetricValueNumber(samples, 'tunnel_proxy_outbound_queue_depth_max'),
outboundQueueCapacityTotal: findMetricValueNumber(samples, 'tunnel_proxy_outbound_queue_capacity_total'),
outboundQueueRejectedFullTotal: findMetricValueNumber(samples, 'tunnel_proxy_outbound_queue_rejected_full_total'),
outboundQueueRejectedClosedTotal: findMetricValueNumber(samples, 'tunnel_proxy_outbound_queue_rejected_closed_total'),
proxyConnectionCongestedTotal: findMetricValueNumber(samples, 'tunnel_proxy_connection_congested_total'),
softAvoidSelectionTotal: findMetricValueNumber(samples, 'tunnel_proxy_soft_avoid_selection_total'),
selectionRetryTotal: findMetricValueNumber(samples, 'tunnel_proxy_selection_retry_total'),
selectionUnavailableTotal: findMetricValueNumber(samples, 'tunnel_proxy_selection_unavailable_total'),
},
fallbackTotal: fallbacks.reduce((total, item) => total + item.total, 0),
fallbacks,

File diff suppressed because it is too large Load Diff