diff --git a/vehicle-data-platform/apps/api/internal/platform/mock_store.go b/vehicle-data-platform/apps/api/internal/platform/mock_store.go index 55c3ef51..5393495b 100644 --- a/vehicle-data-platform/apps/api/internal/platform/mock_store.go +++ b/vehicle-data-platform/apps/api/internal/platform/mock_store.go @@ -32,12 +32,13 @@ func NewMockStore() *MockStore { } func (m *MockStore) DashboardSummary(context.Context) (DashboardSummary, error) { + kafkaLag := 0 return DashboardSummary{ OnlineVehicles: 3, ActiveToday: 4, FrameToday: 1286320, IssueVehicles: 7, - KafkaLag: 0, + KafkaLag: &kafkaLag, Protocols: []ProtocolStat{ {Protocol: "GB32960", Online: 18, Total: 64}, {Protocol: "JT808", Online: 73, Total: 318}, diff --git a/vehicle-data-platform/apps/api/internal/platform/model.go b/vehicle-data-platform/apps/api/internal/platform/model.go index db8d49d1..61b1394b 100644 --- a/vehicle-data-platform/apps/api/internal/platform/model.go +++ b/vehicle-data-platform/apps/api/internal/platform/model.go @@ -12,7 +12,7 @@ type DashboardSummary struct { ActiveToday int `json:"activeToday"` FrameToday int `json:"frameToday"` IssueVehicles int `json:"issueVehicles"` - KafkaLag int `json:"kafkaLag"` + KafkaLag *int `json:"kafkaLag"` Protocols []ProtocolStat `json:"protocols"` LinkHealth []LinkHealth `json:"linkHealth"` } @@ -134,7 +134,7 @@ type QualityIssueRow struct { type OpsHealth struct { LinkHealth []LinkHealth `json:"linkHealth"` - KafkaLag int `json:"kafkaLag"` + KafkaLag *int `json:"kafkaLag"` RedisOnlineKeys int `json:"redisOnlineKeys"` TDengineWritable bool `json:"tdengineWritable"` MySQLWritable bool `json:"mysqlWritable"` diff --git a/vehicle-data-platform/apps/api/internal/platform/production_store.go b/vehicle-data-platform/apps/api/internal/platform/production_store.go index d4c7cec4..e937486a 100644 --- a/vehicle-data-platform/apps/api/internal/platform/production_store.go +++ b/vehicle-data-platform/apps/api/internal/platform/production_store.go @@ -385,8 +385,8 @@ func (s *ProductionStore) OpsHealth(ctx context.Context) (OpsHealth, error) { {Name: "vehicle_realtime_snapshot", Status: "ok", Detail: "读取实时快照表"}, {Name: "vehicle_realtime_location", Status: "ok", Detail: "读取实时位置表"}, {Name: "TDengine raw_frames", Status: tdengineStatus(s.tdengine), Detail: tdengineDetail(s.tdengine)}, + {Name: "Kafka lag", Status: "warning", Detail: "平台暂未接入 Kafka consumer lag 监控"}, }, - KafkaLag: 0, RedisOnlineKeys: redisKeys, TDengineWritable: s.tdengine != nil, MySQLWritable: mysqlStatus == "ok", diff --git a/vehicle-data-platform/apps/web/src/api/types.ts b/vehicle-data-platform/apps/web/src/api/types.ts index a9ae4ba6..a208d3ee 100644 --- a/vehicle-data-platform/apps/web/src/api/types.ts +++ b/vehicle-data-platform/apps/web/src/api/types.ts @@ -21,7 +21,7 @@ export interface DashboardSummary { activeToday: number; frameToday: number; issueVehicles: number; - kafkaLag: number; + kafkaLag: number | null; protocols: ProtocolStat[]; linkHealth: LinkHealth[]; } @@ -124,7 +124,7 @@ export interface QualityIssueRow { export interface OpsHealth { linkHealth: LinkHealth[]; - kafkaLag: number; + kafkaLag: number | null; redisOnlineKeys: number; tdengineWritable: boolean; mysqlWritable: boolean; diff --git a/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx b/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx index a3a407e1..ebdf2d2a 100644 --- a/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx +++ b/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx @@ -11,6 +11,10 @@ const statusColor: Record = { error: 'red' }; +function formatLag(value?: number | null) { + return value == null ? '未接入' : value.toLocaleString(); +} + export function Dashboard({ onOpenVehicle }: { onOpenVehicle: (vin: string) => void }) { const [summary, setSummary] = useState(null); const [vehicles, setVehicles] = useState([]); @@ -104,7 +108,7 @@ export function Dashboard({ onOpenVehicle }: { onOpenVehicle: (vin: string) => v - Kafka 当前消费积压:{summary?.kafkaLag ?? 0} + Kafka 当前消费积压:{formatLag(summary?.kafkaLag)}
loadCoverage(values as Record)} style={{ marginBottom: 12 }}> diff --git a/vehicle-data-platform/apps/web/src/pages/Quality.tsx b/vehicle-data-platform/apps/web/src/pages/Quality.tsx index 237ca149..3d970757 100644 --- a/vehicle-data-platform/apps/web/src/pages/Quality.tsx +++ b/vehicle-data-platform/apps/web/src/pages/Quality.tsx @@ -4,6 +4,10 @@ import { api } from '../api/client'; import type { OpsHealth, QualityIssueRow } from '../api/types'; import { PageHeader } from '../components/PageHeader'; +function formatLag(value?: number | null) { + return value == null ? '未接入' : value.toLocaleString(); +} + export function Quality() { const [issues, setIssues] = useState([]); const [health, setHealth] = useState(null); @@ -36,7 +40,7 @@ export function Quality() {
- {health?.kafkaLag ?? 0} + {formatLag(health?.kafkaLag)} {health?.redisOnlineKeys ?? 0} {health?.tdengineWritable && health.mysqlWritable ? '正常' : '异常'}