| MMSI | +{t('abnormal.type')} | +{t('abnormal.time')} | +{t('abnormal.distance')} | +{t('abnormal.avgSpeedCol')} | +{t('abnormal.maxSpeedCol')} | +{t('abnormal.points')} | +
|---|---|---|---|---|---|---|
| {track.mmsi} | +
+ |
+ {formatDateTime(track.timeBucket)} | +{track.distanceNm?.toFixed(1) ?? '-'} nm | +{track.avgSpeed?.toFixed(1) ?? '-'} kn | +{track.maxSpeed?.toFixed(1) ?? '-'} kn | +{track.pointCount ?? '-'} | +
| {t('metrics.cacheLayer')} | +{t('metrics.size')} | +{t('metrics.maxSize')} | +{t('metrics.utilization')} | +{t('metrics.hitRate')} | +
|---|---|---|---|---|
| L1 (5min) | +{formatNumber(cacheDetails.l1_fiveMin.size)} | +{formatNumber(cacheDetails.l1_fiveMin.maxSize)} | ++ {((cacheDetails.l1_fiveMin.size / Math.max(cacheDetails.l1_fiveMin.maxSize, 1)) * 100).toFixed(1)}% + | +{cacheDetails.l1_fiveMin.hitRate?.toFixed(1) ?? '-'}% | +
| L2 (Hourly) | +{formatNumber(cacheDetails.l2_hourly.size)} | +{formatNumber(cacheDetails.l2_hourly.maxSize)} | ++ {((cacheDetails.l2_hourly.size / Math.max(cacheDetails.l2_hourly.maxSize, 1)) * 100).toFixed(1)}% + | +{cacheDetails.l2_hourly.hitRate?.toFixed(1) ?? '-'}% | +
| L3 (Daily) | +{cacheDetails.l3_daily.cachedDays ?? 0} days | +{cacheDetails.l3_daily.retentionDays ?? '-'} days | ++ {cacheDetails.l3_daily.totalMemoryMb?.toFixed(0) ?? 0} MB + | +{cacheDetails.l3_daily.totalVessels ?? 0} vessels | +
| AIS Target | +{formatNumber(cacheDetails.aisTarget.estimatedSize)} | +{formatNumber(cacheDetails.aisTarget.maxSize)} | ++ {((cacheDetails.aisTarget.estimatedSize / Math.max(cacheDetails.aisTarget.maxSize, 1)) * 100).toFixed(1)}% + | +{cacheDetails.aisTarget.hitRate?.toFixed(1) ?? '-'}% | +
{t('metrics.dbMetricsPlaceholder')}
+{t('metrics.dbMetricsDesc')}
+