서버상태(M1~M4)

This commit is contained in:
Moon
2026-01-12 19:27:22 +09:00
parent 546981076c
commit f070b40378
8 changed files with 285 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.inference;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
import com.kamco.cd.kamcoback.inference.service.InferenceResultService; import com.kamco.cd.kamcoback.inference.service.InferenceResultService;
import com.kamco.cd.kamcoback.mapsheet.service.MapSheetMngService; import com.kamco.cd.kamcoback.mapsheet.service.MapSheetMngService;
@@ -217,4 +218,23 @@ public class InferenceResultApiController {
// inferenceResultService.getInferenceResultGeomList(id, searchGeoReq); // inferenceResultService.getInferenceResultGeomList(id, searchGeoReq);
// return ApiResponseDto.ok(geomList); // return ApiResponseDto.ok(geomList);
// } // }
@Operation(summary = "추론관리 추론진행 서버 현황", description = "추론관리 추론진행 서버 현황")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "검색 성공",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = Page.class))),
@ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content),
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
@GetMapping("/serverStatus")
public ApiResponseDto<List<InferenceServerStatusDto>> getInferenceServerStatusList() {
return ApiResponseDto.ok(inferenceResultService.getInferenceServerStatusList());
}
} }

View File

@@ -1,5 +1,6 @@
package com.kamco.cd.kamcoback.inference.dto; package com.kamco.cd.kamcoback.inference.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import com.kamco.cd.kamcoback.common.utils.enums.EnumType;
import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid; import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid;
@@ -196,4 +197,107 @@ public class InferenceResultDto {
private String mapSheetNum; private String mapSheetNum;
private String mapSheetName; private String mapSheetName;
} }
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class InferenceServerStatusDto {
private String serverName;
@JsonIgnore
private float cpu_user;
@JsonIgnore private float cpu_system;
@JsonIgnore private float memused;
private Long kbmemused;
private float gpuUtil;
//private String cpuStatusName;
//private String memStatusName;
//private String gpuStatusName;
//private float cpu_use_rate;
//private float gpu_use_rate;
//private float mem_use_rate;
public float getCpuUseRate()
{
return this.cpu_user+this.cpu_system;
}
public String getServerStatus()
{
String enumId = "SAFETY";
//if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
return enumId;
}
public String getServerStatusName()
{
//String enumId = "SAFETY";
//if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
return ServerStatus.SAFETY.getText();
}
public String getCpuStatus()
{
String enumId = "SAFETY";
if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
return enumId;
}
public String getGpuStatus()
{
String enumId = "SAFETY";
if( this.gpuUtil >= 80 )enumId = "CAUTION";
return enumId;
}
public String getMemStatus()
{
String enumId = "SAFETY";
if( this.memused >= 80 )enumId = "CAUTION";
return enumId;
}
public String getCpuStatusName()
{
if( this.cpu_user+this.cpu_system >= 80 )return ServerStatus.CAUTION.getText();
return ServerStatus.SAFETY.getText();
}
public String getGpuStatusName()
{
if( this.gpuUtil >= 80 )return ServerStatus.CAUTION.getText();
return ServerStatus.SAFETY.getText();
}
public String getMemStatusName()
{
if( this.memused >= 80 )return ServerStatus.CAUTION.getText();
return ServerStatus.SAFETY.getText();
}
}
@Getter
@AllArgsConstructor
public enum ServerStatus implements EnumType {
SAFETY("원활"),
CAUTION("주의"),
FAILUR("장애"),
;
private final String desc;
@Override
public String getId() {
return name();
}
@Override
public String getText() {
return desc;
}
}
} }

View File

@@ -9,6 +9,7 @@ import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Detail;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
@@ -361,4 +362,8 @@ public class InferenceResultService {
public List<MapSheet> listGetScenes5k(Long id) { public List<MapSheet> listGetScenes5k(Long id) {
return inferenceResultCoreService.listGetScenes5k(id); return inferenceResultCoreService.listGetScenes5k(id);
} }
public List<InferenceServerStatusDto> getInferenceServerStatusList() {
return inferenceResultCoreService.getInferenceServerStatusList();
}
} }

View File

@@ -6,6 +6,7 @@ import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Dashboard; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Dashboard;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
import com.kamco.cd.kamcoback.postgres.entity.MapInkx5kEntity; import com.kamco.cd.kamcoback.postgres.entity.MapInkx5kEntity;
@@ -216,4 +217,7 @@ public class InferenceResultCoreService {
.map(MapInkx5kEntity::toEntity) .map(MapInkx5kEntity::toEntity)
.toList(); .toList();
} }
public List<InferenceServerStatusDto> getInferenceServerStatusList(){return mapSheetLearnRepository.getInferenceServerStatusList();
}
} }

View File

@@ -0,0 +1,48 @@
package com.kamco.cd.kamcoback.postgres.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import java.time.OffsetDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@Getter
@Setter
@Entity
@Table(name = "gpu_metrics")
public class GpuMetricEntity {
@Id
@ColumnDefault("gen_random_uuid()")
@Column(name = "uuid", nullable = false)
private UUID id;
@NotNull
@ColumnDefault("nextval('gpu_metrics_id_seq')")
@Column(name = "id", nullable = false)
private Integer id1;
@NotNull
@ColumnDefault("now()")
@Column(name = "\"timestamp\"", nullable = false)
private OffsetDateTime timestamp;
@NotNull
@Column(name = "server_name", nullable = false, length = Integer.MAX_VALUE)
private String serverName;
@Column(name = "gpu_util")
private Float gpuUtil;
@Column(name = "gpu_mem_used")
private Float gpuMemUsed;
@Column(name = "gpu_mem_total")
private Float gpuMemTotal;
}

View File

@@ -0,0 +1,59 @@
package com.kamco.cd.kamcoback.postgres.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import java.time.OffsetDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@Getter
@Setter
@Entity
@Table(name = "system_metrics")
public class SystemMetricEntity {
@Id
@ColumnDefault("gen_random_uuid()")
@Column(name = "uuid", nullable = false)
private UUID id;
@NotNull
@ColumnDefault("nextval('system_metrics_id_seq')")
@Column(name = "id", nullable = false)
private Integer id1;
@NotNull
@Column(name = "\"timestamp\"", nullable = false)
private OffsetDateTime timestamp;
@NotNull
@Column(name = "server_name", nullable = false, length = Integer.MAX_VALUE)
private String serverName;
@Column(name = "cpu_user")
private Float cpuUser;
@Column(name = "cpu_system")
private Float cpuSystem;
@Column(name = "cpu_iowait")
private Float cpuIowait;
@Column(name = "cpu_idle")
private Float cpuIdle;
@Column(name = "kbmemfree")
private Long kbmemfree;
@Column(name = "kbmemused")
private Long kbmemused;
@Column(name = "memused")
private Float memused;
}

View File

@@ -1,10 +1,14 @@
package com.kamco.cd.kamcoback.postgres.repository.Inference; package com.kamco.cd.kamcoback.postgres.repository.Inference;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity;
import java.util.List;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
public interface MapSheetLearnRepositoryCustom { public interface MapSheetLearnRepositoryCustom {
Page<MapSheetLearnEntity> getInferenceMgnResultList(InferenceResultDto.SearchListReq req); Page<MapSheetLearnEntity> getInferenceMgnResultList(InferenceResultDto.SearchListReq req);
List<InferenceServerStatusDto> getInferenceServerStatusList();
} }

View File

@@ -1,11 +1,15 @@
package com.kamco.cd.kamcoback.postgres.repository.Inference; package com.kamco.cd.kamcoback.postgres.repository.Inference;
import static com.kamco.cd.kamcoback.postgres.entity.QGpuMetricEntity.gpuMetricEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QSystemMetricEntity.systemMetricEntity;
import com.kamco.cd.kamcoback.common.utils.DateRange; import com.kamco.cd.kamcoback.common.utils.DateRange;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.NumberExpression;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
@@ -73,4 +77,41 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
return new PageImpl<>(content, pageable, total == null ? 0L : total); return new PageImpl<>(content, pageable, total == null ? 0L : total);
} }
@Override
public List<InferenceServerStatusDto> getInferenceServerStatusList() {
BooleanBuilder builder = new BooleanBuilder();
List<Integer> latestIds = queryFactory
.select(systemMetricEntity.id1.max())
.from(systemMetricEntity)
.groupBy(systemMetricEntity.serverName)
.fetch();
List<Integer> latestGpuIds = queryFactory
.select(gpuMetricEntity.id1.max())
.from(gpuMetricEntity)
.groupBy(gpuMetricEntity.serverName)
.fetch();
List<InferenceServerStatusDto> foundContent = queryFactory
.select(Projections.constructor(
InferenceServerStatusDto.class,
systemMetricEntity.serverName,
systemMetricEntity.cpuUser,
systemMetricEntity.cpuSystem,
systemMetricEntity.memused,
systemMetricEntity.kbmemused,
gpuMetricEntity.gpuUtil
))
.from(systemMetricEntity)
.leftJoin(gpuMetricEntity).on(gpuMetricEntity.serverName.eq(systemMetricEntity.serverName))
.where(systemMetricEntity.id1.in(latestIds)) // In 절 사용
.orderBy(systemMetricEntity.serverName.asc())
.limit(4)
.fetch();
return foundContent;
}
} }