[Loki] 빈 레이블 제거에 더 단순한 함수 사용
PR #20938 - perf(logql): use simpler function to drop empty labels
들어가며
Grafana Loki의 LogQL 파서에서 레이블 문자열을 파싱한 후 빈 레이블 값을 제거하는 과정이 있습니다. Prometheus에서 빈 레이블 값은 부재(absent)와 동등하지만 Hash 값에 영향을 주기 때문에, 쓰기 경로 초기에 정규화해야 합니다. 기존에는 labels.NewBuilder를 사용했지만, 목적에 맞는 더 단순한 함수가 이미 존재했습니다.
핵심 코드 분석
Before
// Use the label builder to trim empty label values.
// Empty label values are equivalent to absent labels
// in Prometheus, but they unfortunately alter the
// Hash values created.
return labels.NewBuilder(ls).Labels(), nil
NewBuilder는 레이블 빌더 객체를 생성하고, 내부적으로 슬라이스를 복사한 뒤, Labels() 호출 시 빈 레이블을 필터링하면서 새 레이블 셋을 만듭니다.
After
// Empty label values are equivalent to absent labels
// in Prometheus, but they unfortunately alter the
// Hash values created.
return ls.WithoutEmpty(), nil
WithoutEmpty()는 빈 레이블을 제거하는 목적에 특화된 함수로, 빌더 생성이나 중간 복사 없이 직접 결과를 반환합니다.
왜 이게 좋은가
- 불필요한 중간 객체 제거:
NewBuilder가 생성하는 빌더 객체와 내부 슬라이스 복사가 사라집니다. - 의도 명확성:
WithoutEmpty()라는 이름이 코드의 목적을 직접적으로 표현합니다. - 메모리 할당 감소: 레이블 파싱은 쓰기 경로에서 매우 빈번하게 호출되므로, 작은 할당 감소도 누적 효과가 큽니다.
- 기존 API 활용: 이미 존재하는 목적 특화 함수를 사용하여 코드를 단순화한 좋은 사례입니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [triton] Triton Gluon을 활용한 Blackwell 아키텍처에서의 Multi-CTA 행렬 곱셈 최적화
- 현재글 : [Loki] 빈 레이블 제거에 더 단순한 함수 사용
- 다음글 [Loki] 싱크에 쓰기 전 레코드 배치 처리로 라운드트립 감소
댓글