Envoy 내부 구조 · 이름이 곧 인터페이스다 · 실습
오백 개의 숫자에서 필요한 것만 꺼낸다
목표
통계 이름의 구조를 세 갈래로 나눠 보고, 꺼내는 법과 쪼개는 규칙과 덜어내는 법을 차례로 익힌 뒤, 이름을 바꿨을 때 무엇이 사라지는지 직접 확인한다.
왜 중요한가
통계는 대시보드와 알림이 딛고 서 있는 바닥이다. 그런데 그 바닥은 이름으로 되어 있어서, 이름의 규칙을 모르면 /stats 에서 본 값을 대시보드 질의로 옮기지 못하고, 이름을 가볍게 바꿨다가 그래프를 통째로 비운다. 여기에 더해 카운터와 게이지를 구분하지 못하면 '되돌렸는데 안 바뀐다' 에서 막히고, 제외 목록의 성질을 모르면 '필요해지면 그때 켜지' 라고 미뤘다가 정작 필요한 순간에 과거 값이 없는 것을 알게 된다.
단계
1. 업스트림 둘을 띄우세요 — 8093 는 ok, 8094 는 fail. /root/envd-stats/stats.yaml 에 stat_prefix 가 shop 인 리스너와 클러스터 good·bad 를 두고 띄우세요(관리 9971, 리스너 127.0.0.1:10071). /hello 를 다섯 번, /bad/x 를 한 번 요청한 뒤 /root/envd-stats/01-names.txt 에 cluster=·http=·listener= 세 줄을 적으세요 — 각각 cluster.good.upstream_rq_total, http.shop.downstream_rq_total, 그 리스너의 downstream_cx_total 통계의 이름 전체입니다.
2. /stats 에 filter 를 붙여 upstream_rq_total 이 든 통계만 뽑고, format=json 을 함께 붙여 /root/envd-stats/02-filter.json 에 저장하세요. 그리고 /root/envd-stats/02-filter.txt 에 total_stats=(필터 없이 받은 줄 수)와 matched=(필터로 좁힌 통계 개수) 두 줄을 적으세요.
3. /stats/prometheus 를 받아 /root/envd-stats/03-prom.txt 에 cluster.good.upstream_rq_total 에 해당하는 줄만 저장하세요. 그리고 /root/envd-stats/03-prom.map 에 envoy_name=(프로메테우스에서의 지표 이름), label_key=(클러스터 이름이 담긴 라벨의 열쇠), value=(그 값) 세 줄을 적으세요.
4. /reset_counters 를 POST 한 뒤 두 통계를 다시 읽어 /root/envd-stats/04-reset.txt 에 counter_before=·counter_after=(cluster.good.upstream_rq_total), gauge_before=·gauge_after=(cluster.good.membership_total) 네 줄을 적으세요.
5. /root/envd-stats/stats-tags.yaml 을 만드세요 — stats.yaml 과 같되 최상위에 stats_config.stats_tags 를 두어 태그 이름 envd_cluster 를 정규식 ^cluster\.((.+?)\.) 로 뽑습니다. 띄우고 /hello 를 두 번 요청한 뒤 /stats/prometheus 에서 envd_cluster 라벨이 붙은 줄 하나를 /root/envd-stats/05-tags.txt 에 저장하세요.
6. /root/envd-stats/stats-trim.yaml 을 만드세요 — stats_config.stats_matcher.exclusion_list 로 접두사 cluster.bad. 인 통계를 제외합니다. 띄운 뒤 /root/envd-stats/06-trim.txt 에 before=(5단계 설정에서의 전체 통계 줄 수), after=(이 설정에서의 줄 수), bad_stats=(이 설정에서 cluster.bad. 로 시작하는 줄 수) 세 줄을 적으세요.
7. /root/envd-stats/stats-rename.yaml 을 만드세요 — 1단계 설정에서 stat_prefix 만 shop 에서 checkout 으로 바꾼 것입니다. 띄우고 /hello 를 두 번 요청한 뒤 /root/envd-stats/07-rename.txt 에 old_prefix_stats=(http.shop. 로 시작하는 통계 줄 수), new_prefix_stats=(http.checkout. 로 시작하는 줄 수), new_rq_total=(http.checkout.downstream_rq_total 의 값) 세 줄을 적으세요.
8. /root/envd-stats/08-report.md 에 counter_after_reset=·gauge_after_reset=(4단계), prom_label=(5단계에서 더한 태그 이름), trim_removed=(6단계의 before 에서 after 를 뺀 값), renamed_lost=(7단계에서 옛 접두사 통계가 사라졌으면 yes) 다섯 줄을 적고, 그 아래 배운 것을 네 줄 이상 적으세요.
참고
- 관리 포트의 주소에
?나&가 들어가면 주소 전체를 따옴표로 감싸세요. 감싸지 않으면 셸이 그 뒤를 잘라 먹습니다. - Envoy 를 다시 띄우기 전에는
pkill -x envoy로 정리하고, 기동은/ready가 LIVE 를 돌려줄 때까지 도는 루프로 기다리세요. /reset_counters와/quitquitquit같은 관리 명령은 POST 입니다.curl -X POST를 씁니다.- 통계 값은
이름: 값형식이라grep -m1 '^이름:' | awk '{print $2}'로 꺼냅니다. - 흔한 실수 — 필드 이름을
stat_tags로 쓰는 것. 올바른 이름은stats_tags이고, 틀리면 '그런 필드가 없다' 며 설정이 통째로 거절됩니다.
단계 8개
- 이름은 세 갈래로 시작한다
- 오백 개 중에서 필요한 것만 꺼낸다
- 같은 값이 다른 이름으로 나간다
- 되돌리는 단추는 절반에만 듣는다
- 이름을 쪼개는 규칙을 직접 정한다
- 내보내지 않을 것을 고른다
- 낱말 하나를 바꾸면 대시보드가 빈다
- 통계 운영 메모를 남긴다