-
Notifications
You must be signed in to change notification settings - Fork 9
Description
요약
리소스 목록을 다시 가져온 뒤(새로고침·자동 갱신 등) Kubernetes 토폴로지가 다시 그려질 때, 노드/파드에 적용되던 CPU·메모리 사용률 색상이 사라지는 현상이 있었습니다.
재현 방법
- Kubernetes 페이지에서 토폴로지를 연다.
- 노드/파드에 색상(사용률)이 적용된 상태를 확인한다.
- 리소스 목록이 다시 로드되도록 한다. (새로고침, 네임스페이스 변경, 자동 갱신 등)
- 토폴로지가 다시 그려진 뒤, 이전에 색이 있던 노드/파드가 흰색으로 보인다.
원인
-
토폴로지만 다시 그리기
kubernetesD3Data가 바뀌면KubernetesHexagon의componentDidUpdate에서
d3.select('svg.kubernetes-svg').selectAll('g').remove()후drawChart()로 SVG를 통째로 다시 그립니다.
그 과정에서 이전에setD3K8sSeries()로 칠해 둔 색상이 모두 사라집니다. -
색상은 한 번만 적용
색상 적용은kubernetesObject가 바뀔 때만setD3K8sSeries()가 호출됩니다.
kubernetesD3Data만 바뀌는 경우(리소스 목록만 갱신)에는setD3K8sSeries()가 호출되지 않아, 새로 그려진 SVG에는 색이 다시 칠해지지 않습니다. -
실행 순서
부모의componentDidUpdate가 자식보다 먼저 실행되기 때문에,
kubernetesD3Data변경 시점에 부모에서setD3K8sSeries()를 호출해도
아직 Hexagon이g를 지우고 다시 그리기 전이라, 그때 적용한 색은 곧바로 지워집니다.
해결 방법
-
kubernetesD3Data가 바뀔 때도 색상 재적용
KubernetesPage의componentDidUpdate에서kubernetesD3Data가 변경된 경우,
자식이 DOM을 다시 그린 뒤 색상을 다시 칠하도록
requestAnimationFrame으로setD3K8sSeries()를 한 번 더 호출합니다. -
항상 토폴로지 SVG만 대상으로 하기
setD3K8sSeries()안에서d3.select('svg')대신
d3.select('svg.kubernetes-svg')를 사용해, 다른 SVG가 있어도 토폴로지 SVG만 갱신하도록 합니다. -
SVG가 없을 때 처리
setD3K8sSeries()초반에!node.node()체크를 넣어,
토폴로지 SVG나g가 아직 없을 때는 early return 하도록 합니다.
수정 후 동작
리소스 목록을 다시 가져와 토폴로리가 한 번 다시 그려진 뒤에도,
다음 프레임에서 setD3K8sSeries()가 한 번 더 실행되어 노드/파드 색상이 유지됩니다.
Metadata
Metadata
Assignees
Labels
Projects
Status