본문으로 건너뛰기

[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()는 빈 레이블을 제거하는 목적에 특화된 함수로, 빌더 생성이나 중간 복사 없이 직접 결과를 반환합니다.

왜 이게 좋은가

  1. 불필요한 중간 객체 제거: NewBuilder가 생성하는 빌더 객체와 내부 슬라이스 복사가 사라집니다.
  2. 의도 명확성: WithoutEmpty()라는 이름이 코드의 목적을 직접적으로 표현합니다.
  3. 메모리 할당 감소: 레이블 파싱은 쓰기 경로에서 매우 빈번하게 호출되므로, 작은 할당 감소도 누적 효과가 큽니다.
  4. 기존 API 활용: 이미 존재하는 목적 특화 함수를 사용하여 코드를 단순화한 좋은 사례입니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글