1.30 k8s pods查询

This commit is contained in:
dengqichen 2025-12-14 01:00:32 +08:00
parent 06d4be5e8a
commit e54d6834c3

View File

@ -152,7 +152,7 @@ public class K8sPodServiceImpl implements IK8sPodService {
// 4. 调用K8s API获取原始日志获取足够多的日志以支持切片 // 4. 调用K8s API获取原始日志获取足够多的日志以支持切片
// 使用较大的tail值和缓冲区确保能够覆盖请求的范围 // 使用较大的tail值和缓冲区确保能够覆盖请求的范围
Integer effectiveTail = Math.max(5000, Math.abs(offsetFrom) + Math.abs(offsetTo) + 1000); Integer effectiveTail = Math.max(10000, Math.abs(offsetFrom) + Math.abs(offsetTo) + 2000);
String rawLogs = k8sServiceIntegration.getPodLogs( String rawLogs = k8sServiceIntegration.getPodLogs(
externalSystem, externalSystem,
namespace.getNamespaceName(), namespace.getNamespaceName(),
@ -178,60 +178,51 @@ public class K8sPodServiceImpl implements IK8sPodService {
com.qqchen.deploy.backend.deploy.utils.K8sLogParser.LogSliceResult result = com.qqchen.deploy.backend.deploy.utils.K8sLogParser.LogSliceResult result =
com.qqchen.deploy.backend.deploy.utils.K8sLogParser.selectLogs(logLines, selection); com.qqchen.deploy.backend.deploy.utils.K8sLogParser.selectLogs(logLines, selection);
// 8. 验证引用点是否有效仅对非newest/oldest模式 // 8. 如果返回空日志直接返回空响应引用点可能已丢失
if (!result.getLogs().isEmpty() && if (result.getLogs().isEmpty()) {
!referenceTimestamp.equals("newest") && log.warn("引用点定位失败返回空日志。referenceTimestamp: {}", referenceTimestamp);
!referenceTimestamp.equals("oldest")) {
// 获取返回日志的第一行和最后一行时间戳 return new com.qqchen.deploy.backend.deploy.dto.K8sPodLogsResponse(
String firstTimestamp = result.getLogs().get(0).getTimestamp(); podName,
String lastTimestamp = result.getLogs().get(result.getLogs().size() - 1).getTimestamp(); container != null ? container : "default",
null,
log.debug("引用点: {}, 返回日志范围: {} 到 {}", referenceTimestamp, firstTimestamp, lastTimestamp); null,
result.getLogs(),
// 验证如果是向后查询offsetFrom > 0返回的日志应该在引用点之后 result.isTruncated()
if (offsetFrom > 0) { );
// 检查第一行时间戳是否在引用点之后
if (firstTimestamp.compareTo(referenceTimestamp) <= 0) {
log.warn("引用点验证失败返回的日志在引用点之前或等于引用点。referenceTimestamp: {}, firstTimestamp: {}, 回退到newest模式",
referenceTimestamp, firstTimestamp);
// 回退到newest模式
selection = new com.qqchen.deploy.backend.deploy.dto.K8sLogSelection("newest", -100, 0);
result = com.qqchen.deploy.backend.deploy.utils.K8sLogParser.selectLogs(logLines, selection);
}
}
// 验证如果是向前查询offsetTo <= 0返回的日志应该在引用点之前
else if (offsetTo <= 0) {
// 检查最后一行时间戳是否在引用点之前
if (lastTimestamp.compareTo(referenceTimestamp) >= 0) {
log.warn("引用点验证失败返回的日志在引用点之后或等于引用点。referenceTimestamp: {}, lastTimestamp: {}, 回退到newest模式",
referenceTimestamp, lastTimestamp);
// 回退到newest模式
selection = new com.qqchen.deploy.backend.deploy.dto.K8sLogSelection("newest", -100, 0);
result = com.qqchen.deploy.backend.deploy.utils.K8sLogParser.selectLogs(logLines, selection);
}
}
} }
// 9. 如果返回空日志且不是newest/oldest模式回退到newest模式 // 9. 使用中点策略计算新的引用点Kubernetes Dashboard策略
if (result.getLogs().isEmpty() && // 中点引用点不容易因为日志增删而丢失
!referenceTimestamp.equals("newest") && int midIndex = result.getLogs().size() / 2;
!referenceTimestamp.equals("oldest")) { String midTimestamp = result.getLogs().get(midIndex).getTimestamp();
log.warn("引用点定位失败返回空日志。referenceTimestamp: {}, 回退到newest模式", referenceTimestamp);
// 回退到newest模式 log.debug("返回 {} 行日志,中点索引: {}, 中点时间戳: {}",
selection = new com.qqchen.deploy.backend.deploy.dto.K8sLogSelection("newest", -100, 0); result.getLogs().size(), midIndex, midTimestamp);
result = com.qqchen.deploy.backend.deploy.utils.K8sLogParser.selectLogs(logLines, selection);
}
// 10. 构建响应 // 10. 构建referenceForPrevious向前翻页
com.qqchen.deploy.backend.deploy.dto.K8sLogSelection referenceForPrevious =
new com.qqchen.deploy.backend.deploy.dto.K8sLogSelection(
midTimestamp,
-midIndex - 100, // 从中点向前100行
-midIndex
);
// 11. 构建referenceForNext向后翻页
int remainingAfterMid = result.getLogs().size() - midIndex;
com.qqchen.deploy.backend.deploy.dto.K8sLogSelection referenceForNext =
new com.qqchen.deploy.backend.deploy.dto.K8sLogSelection(
midTimestamp,
remainingAfterMid, // 从中点向后
remainingAfterMid + 100 // 向后100行
);
// 12. 构建响应
return new com.qqchen.deploy.backend.deploy.dto.K8sPodLogsResponse( return new com.qqchen.deploy.backend.deploy.dto.K8sPodLogsResponse(
podName, podName,
container != null ? container : "default", container != null ? container : "default",
result.getReferenceForPrevious(), referenceForPrevious,
result.getReferenceForNext(), referenceForNext,
result.getLogs(), result.getLogs(),
result.isTruncated() result.isTruncated()
); );