Grafana Agent에서 Alloy로 넘어가면서 밟은 지뢰들
Grafana Agent가 작년 11월에 공식 EOL 된 지 벌써 9개월이 넘었는데, 우리 팀은 부끄럽지만 지난주에야 Alloy로 완전히 넘어왔다. 마감 압박 없으면 이런 마이그레이션은 자꾸 미뤄지는 게 사람 심리인 것 같다. 로그/메트릭 수집기가 노드에서 22대, 사이드카로 40개 넘게 떠 있는 환경이라 무섭기도 했고.
결론부터 말하면 큰 사고는 없었지만, 문서만 보고 넘어갔다가는 새벽에 한 번쯤 페이지 받을 수 있는 함정이 몇 개 있었다. 정리해 둔다.
storage.path 하나 때문에 메트릭이 20분간 안 왔다
Alloy는 --storage.path 기본값이 data-alloy/로 바뀌었다. Agent Flow는 data-agent/였고. 이게 컨버터가 자동으로 안 바꿔주는 항목이라 문제였다.
WAL이 이 경로 밑에 쌓이는데, 우리는 데몬셋 컨테이너 안에서 emptyDir이 아니라 hostPath로 마운트해서 재시작해도 WAL을 보존하고 있었다. 배포하면서 경로가 갈아엎어졌고, 롤아웃 도중 몇 노드에서 Prometheus remote write에 20분 정도 공백이 생겼다. Grafana Cloud 쪽 대시보드에 이빨 빠진 그래프가 남아버렸다.
해결은 어렵지 않았다. 명시적으로 예전 경로로 고정해줬다.
args:
- run
- /etc/alloy/config.alloy
- --storage.path=/var/lib/grafana-agent/data
교훈이라기엔 좀 창피한데, 마이그레이션 툴이 만들어주는 config만 믿지 말고 실행 인자와 볼륨 마운트도 반드시 diff를 뜨자. 사실 릴리즈 노트에도 적혀 있는 내용이었다. 안 읽었을 뿐.
대시보드가 반쯤 죽었다 - agent_ 접두어
Alloy가 자기 내부 메트릭을 노출할 때 prefix가 agent_에서 alloy_로 바뀌었다. Wall of shame이지만 우리는 관측성 팀 대시보드에 agent_wal_storage_active_series 같은 걸 하드코딩해서 쓰고 있었다. 롤아웃 끝나자 관측성 팀 대시보드 절반이 회색이 됐다.
recording rule에 alias를 하나 만들어서 잠시 우회했다.
- record: agent_wal_storage_active_series
expr: alloy_prometheus_remote_write_wal_storage_active_series
이건 임시방편이고, 결국 대시보드 쿼리를 하나씩 새 이름으로 옮겼다. 근데 rename 된 메트릭이 1:1 매핑이 안 되는 것도 있어서 (Loki 쪽 write path 관련 몇 개), 그건 그냥 새로 만들었다. 대시보드가 30개쯤 되니까 반나절 걸렸다.
classic module 쓰던 곳이 다 깨졌다
Agent Flow 시절엔 module.file, module.git 같은 걸로 설정을 잘게 쪼개서 GitOps로 관리하고 있었다. Alloy에서는 이게 다 제거되고 import 블록으로 대체됐다. 컨버터가 어느 정도는 옮겨주긴 하는데, module.git으로 원격 저장소 참조하던 부분은 손으로 다시 짜야 했다.
import.git "shared" {
repository = "https://git.internal/o11y-config"
revision = "main"
path = "modules"
pull_frequency = "5m"
}
shared.metrics.node "default" { ... }
pull_frequency 기본값이 짧지 않은데, 우리는 5분으로 명시하는 게 마음이 편했다. 참고로 import.git은 인증 방식이 basic_auth, ssh_key 등 몇 가지 있는데, 우리는 SSH 배포 키로 붙였다.
사이드카 이미지 태그 pinning을 안 하고 있었다
이건 Alloy 잘못은 아니고 우리 잘못. grafana/agent:latest 태그를 쓰고 있던 앱이 몇 개 있었고, EOL 이후에도 latest는 리다이렉트 없이 그냥 옛날 이미지에 붙어 있었다. 이 사이드카들이 새 Alloy config를 못 읽어서 조용히 죽고 있었다. Kubernetes readiness probe를 이미지 헬스 엔드포인트에 안 걸어놨으면 며칠 더 몰랐을 것 같다.
이번 기회에 이미지 태그를 전부 SHA digest로 고정했다. 이건 사실 Alloy 마이그레이션이랑 별개로 진작 했어야 했다.
그래서 넘어오길 잘했나
솔직히 넘어오길 잘했다. Alloy는 사실상 OTel Collector 배포판이라, 앞으로 OpenTelemetry 관련 새 기능은 다 여기서 먼저 나올 것이다. 우리도 이 참에 몇몇 서비스 메트릭을 Prometheus scrape에서 OTLP push로 바꾸기 시작했는데, 코드 계측 표준 하나로 통일되는 그림이 슬슬 그려진다.
그리고 EOL 지난 컴포넌트 계속 쓰고 있는 스트레스가 사라진 게 제일 크다. 보안팀에서 매달 스캔 리포트 주는데, deprecated 목록에 우리 컴포넌트가 없다는 이유만으로 티켓 하나가 줄었다.
혹시 아직 Agent 쓰고 계신 분 있으면, 이번 분기 안에는 넘어오시길 권한다. 미루면 미룰수록 문서와 커뮤니티 답변이 옛날 정보로 오염돼서 디버깅이 더 힘들어진다.