Go์ฉ "gofmt"์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ๋ฌธ ํธ๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก Prometheus์ฉ "promfmt"๊ฐ ์์ด์ผ ํฉ๋๋ค. ์์คํ ์ด ํธ์ฐจ์ ํ์ต ๊ณก์ ์ ์ต์ํํ๋ ๊ท ์ผํ ์คํ์ผ์ ์์ฑํ๋ค๋ ์์ด๋์ด์ ๋๋ค.
YAML ๊ท์น ํ์ผ๋ก ์์ ํ ์ด๋ํ ํ ์ ๋ฐ์ดํธ : PromQL ํํ์์ ํ์์ ์ง์ ํ๋ ๊ฒ ์ธ์๋ PromQL ํํ์๊ณผ YAML ํ์ผ ๋ชจ๋์ ๋ํ ์ฃผ์์ ์ ์งํ๋ฉด์ ๊ณ ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก YAML ํ์ผ์ ํ์์ ์ง์ ํ๋ ค๊ณ ํฉ๋๋ค.
:+1: * :100:
๋ค, ์ข์ต๋๋ค. ์ฃผ์์ ๋ณด์กดํ๋ ๊ฒ์ ๊ฐ์ฅ ํฐ(๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ผํ) ๋ฌธ์ ์ ๋๋ค. ํํ์ ์ฌ๋ฌ ์ค๋ก ๋๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๋์.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ promtool์ ์ถ๊ฐํ๋ ์ค์ ์์ง ์์ต๋๊น?
๋ช ๊ฐ์ง ๊ด์ฐฐ:
gofmt
๊ฐ ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ ์ฐธ์กฐ).YAML์์ ๋ ์ฃผ์์ ๋ชจ๋ ๋ณด์กดํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ์ ํ์ฌ YAML ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๊ฒ์ ํ์ง ์์ง๋ง "๊ณง" ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๊ณ ์์ต๋๋ค.
๋ด gsoc ์ ์์์ ์ด๊ฒ์ ํฌํจํ๊ณ ์ถ์ต๋๋ค. @brian-brazil, ์ธ๊ธํ๋ YAML ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํ ์ ์์ต๋๊น?
https://github.com/go-yaml/yaml ํ์ง๋ง ์ด ๋ฒ์๋ฅผ PromQL๋ก๋ง ์ง์ ํ๊ฒ ์ต๋๋ค.
@brian-brazil ํ์ง๋ง ๊ท์น์ PromQL์ ํญ์ YAML ํ์ผ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ต์ํ YAML ์ฃผ์์ ๋ณด์กดํด์ผ ํฉ๋๋ค. ๋ง์ฃ ? ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌด๋ ์์ ์ง์ ์ ์ด์ ์ ์์ ์ ์๊ฒฌ์ ์๊ณ ์ถ์ดํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๊ฐ๋ณ๋ก ์ ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
์ข๊ฒ ์ง๋ง ๊ทธ๊ฒ ์์ด๋ ํํ์ ๋ฐ์ ์ ์์ต๋๋ค. ๋๋ ๋ํ gsoc ํ๋ก์ ํธ์ ๋ํ ์ผ์ ์ด ๋ถ๋ถ๋ช ํ ๊ฒ์ ์์กดํ์ง ์๊ณ ์ถ์ต๋๋ค.
PromQL ๋ถ๋ถ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฃผ์ ๋ฐ ์ฌ๋ฌ ์ค ๋ฌธ์์ด์ ๋ํ |2
๋ค์ฌ์ฐ๊ธฐ ํํธ๋ฅผ ๋ณด์กดํ๋ฉด YAML ๋ถ๋ถ์ ๊ฑฐ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
ํ์ธ!
์ด ๋ชจ๋ ๊ฒ์ ํ์ฉํด์ผ ํ๋ YAML ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ v3์ด ์ข ๋ฃ๋์์ต๋๋ค.
์ฐธ๊ณ ๋ก ๊ตฌ์ฑ์์ ์๋ฒฝํ๊ฒ ์ฝ์ ์ ์๋ ๊ท์น
(
kube_job_status_failed > 0
UNLESS kube_job_status_succeeded > 0
)
* on (namespace, job_name) group_left(maintainer) label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer", "(.*)")
* on (namespace, job_name) group_left(pager) label_replace(kube_job_labels, "pager", "$1", "label_pager", "(.*)")
* on (namespace, job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1", "label_paging", "(.*)")
VS ์น UI์ ๊ฐ๋น์ง ํํ
(kube_deployment_status_replicas_available
/ kube_deployment_spec_replicas * 100) * on(namespace, deployment) group_left(maintainer)
label_replace(kube_deployment_labels, "maintainer", "$1", "label_maintainer",
"(.*)") * on(namespace, deployment) group_left(pager) label_replace(kube_deployment_labels,
"pager", "$1", "label_pager", "(.*)") * on(namespace,
deployment) group_left(paging) label_replace(kube_deployment_labels, "paging",
"$1", "label_paging", "(.*)") < 100
@sylr ์น UI์์ ๋ค๋ฅธ ๊ท์น์ ๊ฒ์ํ ๊ฒ @beorn7 ์ด ๋ฌธ์ ์ ๋ํ ์์ ์ ์์ํ์ต๋๋ค.
๊ทํ์ ๊ท์น์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
(kube_job_status_failed
> 0 unless kube_job_status_succeeded > 0) * on(namespace, job_name) group_left(maintainer)
label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer",
"(.*)") * on(namespace, job_name) group_left(pager) label_replace(kube_job_labels,
"pager", "$1", "label_pager", "(.*)") * on(namespace,
job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1",
"label_paging", "(.*)")
@geekodour ์, ๋ ๊ฐ์ง ๊ท์น์ ํผ๋ํ์ต๋๋ค.
์ด๊ฒ์ ์์ง ์ด๋ ค ์๊ณ ํฅํ GSOC(https://github.com/cncf/soc#rule-formatting-tool)์ ๋ํ ํ๋ก์ ํธ ์์ด๋์ด์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ GSOC ๋์ ์ด ์์
์ ์๋ฃํ๊ณ ์ถ์ต๋๋ค. ์ด์ ๊ดํ ์ต์ ์
๋ฐ์ดํธ ๋ฐ ์ถ๊ฐ ์ ๋ณด๋ @codesome @brian-brazil @juliusv @geekodour @simonpasquier @sylr์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ฃผ์ ๋ฐ ๊ธฐํ ์ฐธ์กฐ ๋งํฌ๋ฅผ ์ฝ์ ํ ๋ค์ ์์
ํฌ์ธํธ๋ promQL AST๋ฅผ ์ฌ์ฉํ์ฌ promQL ํํ์์ ์ํ ํฌ๋งทํฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@haibeey ์ด๋ฏธ ๊ทธ ๋ฐฉํฅ์ผ๋ก ์ฝ๊ฐ์ ์ง์ ์ด ์์์ต๋๋ค.
์ด๋ฌํ ํฌ๋งทํฐ๋ฅผ ๊ตฌ์ถํ ๋ ์ด๋ฏธ ์ฌ๊ธฐ์ ๊ตฌํ๋ ๊ฒ์ผ๋ก ์์ํ๊ณ ์ ์ ํ ๊ณต๋ฐฑ๊ณผ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ด ๊ณง ์ถ์๋ PromQL ์ธ์ด ์๋ฒ ์ ํตํฉ๋ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ธ์ด ์๋ฒ ์ฝ๋ ๋ด๋ถ์๋ YAML ํ์ผ์ ํ์์ ์ง์ ํ๋ ๋ฐ ํ์ํ ๋ง์ ํญ๋ชฉ์ด ์ด๋ฏธ ๊ตฌํ๋์ด ์์ผ๋ฉฐ ์ผ๋ถ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
๊ด์ฐฎ์! @slrtbtfs ๊ฐ์ฌ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น? ์ด๊ฒ์ ๊ตฌํํ๊ณ ์ถ์ต๋๋ค.
@haibeey ๋ ์ด๋ฏธ ์ด๋ป๊ฒ๋ ์ด ์์ ์ ๊ณํํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@roidelaluie ๋๋ ์ด๋ฏธ ๊ทธ ์ผ๋ถ๋ฅผ ์ด์ ์ ๊ตฌํํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ธ๊ธํ์ง ์์์ ๋ฟ์ ๋๋ค.
์ฐธ๊ณ ๋ก ๊ตฌ์ฑ์์ ์๋ฒฝํ๊ฒ ์ฝ์ ์ ์๋ ๊ท์น
( kube_job_status_failed > 0 UNLESS kube_job_status_succeeded > 0 ) * on (namespace, job_name) group_left(maintainer) label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer", "(.*)") * on (namespace, job_name) group_left(pager) label_replace(kube_job_labels, "pager", "$1", "label_pager", "(.*)") * on (namespace, job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1", "label_paging", "(.*)")
VS ์น UI์ ๊ฐ๋น์ง ํํ
(kube_deployment_status_replicas_available / kube_deployment_spec_replicas * 100) * on(namespace, deployment) group_left(maintainer) label_replace(kube_deployment_labels, "maintainer", "$1", "label_maintainer", "(.*)") * on(namespace, deployment) group_left(pager) label_replace(kube_deployment_labels, "pager", "$1", "label_pager", "(.*)") * on(namespace, deployment) group_left(paging) label_replace(kube_deployment_labels, "paging", "$1", "label_paging", "(.*)") < 100
์ด ์์ ์คํ์ผ์ด ํ์ฉ๋ฉ๋๊น? @codesome @juliusv @brian-brazil @beorn7
์ด ์คํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์์๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค.
ํฌ๋งท ํ ์ต์ข ํํ์ GSoC ๊ธฐ๊ฐ ๋์ ๋ ผ์๋๊ณ ๊ฒฐ์ ๋ ์ ์์ต๋๋ค. ๋๋ (๋ชจ๋ GSoC ์ง๋ง์๋ค์๊ฒ) ์ด๊ฒ์ _์ด๋ป๊ฒ_ ๋ฌ์ฑํ ๊ฒ์ธ๊ฐ์ ์ด์ ์ ๋ง์ถ ๊ฒ์ ์ ์ํฉ๋๋ค.
https://prometheus.io/docs/practices/rules/ ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
goyacc ๋ฌธ๋ฒ ๊ท์น์ ์ฝ๊ฐ ๋ณด๊ฐํ์ฌ ์ฃผ์์ ๋ณด์กดํ๊ธฐ ์ํด ๋๋ต์ ์ธ ํ๋กํ ํ์ ์ ์์ฑํ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ปค๋ฐํ์ญ์์ค. https://github.com/haibeey/prometheus/commit/885566786ac20bfd400b2e7db470c92545919690
๊ทธ๊ฒ์ ์ณ์ง ์์ ๋ณด์ ๋๋ค. ์ด์์๋ ์์ ์ ๋ผ์ธ์ ์์ง ์์ต๋๋ค.
์ด ๊ทธ๋. ๊ทธ ์ปค๋ฐ์ ํฌ๋งท์ ํ์ง ์์ต๋๋ค. ์ธ์๋ฅผ ์ํด ํ๊ฐํ ํ promql expr์ ์ฃผ์์ ๋ณด์กดํ๊ธฐ ์ํ ๊ฒ์
๋๋ค.
์ด์ ๋ฒ์ ์ ํ๊ฐ ํ ๋ชจ๋ ์ฃผ์์ ๋ฌด์ํฉ๋๋ค.
goyacc ๋ฌธ๋ฒ ๊ท์น์ ์ฝ๊ฐ ๋ณด๊ฐํ์ฌ ์ฃผ์์ ๋ณด์กดํ๊ธฐ ์ํด ๋๋ต์ ์ธ ํ๋กํ ํ์ ์ ์์ฑํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ปค๋ฐ [haibeey@8855667]
AST์ ์ฃผ์์ ๋ฃ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ธ ์๊ฐ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ฑฐ๊ธฐ์ ๊ตฌํ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฒฌ์ ๋จ๊ฒผ์ต๋๋ค.
https://prometheus.io/docs/practices/rules/ ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ค์์ ์ํํ์ง ๋ง์ญ์์ค.
sum without (instance)(instance_path:requests:rate5m{job="myjob"})
~ ์์
sum(instance_path:requests:rate5m{job="myjob"}) without (instance)
๊ทธ๋ฃนํ ์์ ์๋ฅผ ๋จผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ด๋ฏธ ์ธ์ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค์ํ์ง ์์ ํํ์์ ์ฝ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
๋ค, ์ ๋ ์ฒ์์ ์ด๊ฒ์ ๋ํด ๊ฐํ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ์ฒ์์ Prometheus๋ sum(x) by(y)
๋ง ์ง์ํ๋๋ฐ, ๊ทธ ์ด์ ๋ ์ ์๊ฒ ๋ ์์ด์ฒ๋ผ ์ฝํ์ ์ ๋ ํจ์ฌ ๋ ์ ํธํ์ง๋ง, ์ฌ์ํ x
๊ฒฝ์ฐ ์ด๋ค ์ฐจ์์ ์ง๊ณํ๊ณ ์๋์ง ๋ณด๊ธฐ๊ฐ ์ ๋ง ์ด๋ ค์์ง๋๋ค. / ์ ์ง. ์ฒ์๋ถํฐ sum by(y) (x)
๋ก ๋ง๋ค๊ณ ์ ์ผํ ๋ฒ์ ๋ณํ์ผ๋ก ๋ง๋ค์์ผ๋ฉด ํฉ๋๋ค.
๋๋ ์์ง๋ ์ ํ ์ข์ํ์ง ์์ ์ ํํ ์์ sum by (y)(x)
์ ํธ ์ ๋์ sum by(y) (x)
(๋์๊ฒ ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค), ์ฐ๋ฆฌ๋ ๋ฌธ์์์ ํ์์ ๊ฐ ๊ฒ์ ์ ํํ์ง ์๋๋ก ์ด์ .
๋๋ ๋ชจ๋ ์ฌ๋์ด ์ด๊ฒ์ ๋ํด ์์ ์ ์๊ฒฌ์ ๊ฐ์ง ์๊ฒฉ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก "๋ชจ๋ฒ ์ฌ๋ก"๊ฐ ๋์ฐํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋ชจ๋ ๊ตฌ๋ฌธ์ด ํฉ๋ฒ์ด๋ฏ๋ก ํ๋๋ฅผ ๋ค๋ฅธ ๊ตฌ๋ฌธ ์์ ์ ์ฉํ์ง ๋ง์ญ์์ค.
promfmt
๋๊ตฌ์ ์์ ์ ์ํํ์ง ์๋๋ผ๋ gofmt
์ ๋งค์ฐ ์ ์ฌํ ํน์ "์ ์" ํ์์ ๋ค์ ์ ์ฒด ์ธ์ ๋ฌธ์์ด๊ณผ ํจ๊ป "๋ณด์ฆ"ํ๋ ๊ฒ์
๋๋ค.
์, gofmt
์ ํ์์ ์๋ฌด๋ ์ข์ํ์ง ์์ง๋ง ์ต์ํ ๊ทธ ์์ฒด๋ก ๊ฐ์น๊ฐ ์๋ ๋ง์ ๋ค๋ฅธ ์คํ์ผ๋ณด๋ค๋ ํ๋์ ์ผ๊ด๋ ์คํ์ผ์ ๋ง๋ญ๋๋ค.
์ฐธ๊ณ ๋ก ์ด๊ฒ์ GSoC์์ ์ ๊ทน์ ์ผ๋ก ์ถ๊ตฌ๋๊ณ ์์ต๋๋ค. @haibeey GSoC ์๋ ๊ด์ฌ์ด ์์ผ์ ๊ฐ ๋ด ๋๋ค. ์ง๊ธ ํด์ฃผ์ ์ ํ ์์ ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ GSoC์์ ํ๋ก์ ํธ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ โโ์กฐ์ ํ ์ ์๋๋ก GSoC ์ ์ ๋๋ ๊ธฐํ์์ ๊ณต๊ฐ ํ ๋ก ๊ณผ ๋์์ธ ๊ณต์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. :)
์๋ก์ด go-yamlv3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฃผ์ ๋ณด์กด ๊ธฐ๋ฅ์ด ์ด๋ฏธ ์ ์ง์๋ฉ๋๋ค. ๊ตฌํ์ด ๋๋ฌด ์๋ฒฝํ์ฌ ์ฃผ์์ ์์ค์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ฑฑ์ ์์ด Prometheus ์ฝ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฉ์ปค๋์ฆ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ด์ฐฎ์. ๋ด ์ ์ ์ด์ GSoC ์ ์์ ๊ณต์ ํ ์๊ฐ์ ๋๋ค.
์ต์ข ์ด์์ด ์์ฑ๋๊ธฐ ์ ์ ๊ฒํ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์
@Harkishen-Singh ๋ ๊ฐ์ง ์์ค์ ์ฃผ์์ด ์์ต๋๋ค. YAML ์ฃผ์๊ณผ PromQL ํํ์ ๋ด์ ์ฃผ์์ ๋๋ค. https://github.com/prometheus/prometheus/issues/21#issuecomment -604213849๋ PromQL์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค(๊ทธ๋ฌ๋ YAML๋ ๋ณด์กดํ๋ ๊ฒ์ด ์ข์ต๋๋ค).
์๋ก์ด go-yamlv3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฃผ์ ๋ณด์กด ๊ธฐ๋ฅ์ด ์ด๋ฏธ ์ ์ง์๋ฉ๋๋ค. ๊ตฌํ์ด ๋๋ฌด ์๋ฒฝํ์ฌ ์ฃผ์์ ์์ค์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ฑฑ์ ์์ด Prometheus ์ฝ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฉ์ปค๋์ฆ์ ์ ์งํ ์ ์์ต๋๋ค.
PromQL ํํ์์ ํ๊ฐํ๋ ๋์ ์ฃผ์์ด ์ ๊ฑฐ๋ฉ๋๋ค.
์ฆ, ํ์ ์ง์ ์ ๊ท์น ํ์ผ๋ฟ๋ง ์๋๋ผ ์น UI์ ๊ฐ์ ์ผ๋ถ ์์น์์๋ ์ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. @juliusv ์ด๊ฒ ์ฌ์ค
๋ฐ๋ผ์ @slrtbtfs๊ฐ ์ง์ ํ
YAML ์ฃผ์๊ณผ ๊ด๋ จํ์ฌ Cortex์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ v3 ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๊ฐ ๋ชจ๋ ํด๊ฒฐ๋ ๋๊น์ง ์ถ๊ฐ ๋กค์์์ ํผํด์ผ ํฉ๋๋ค.
์ฆ, ํ์ ์ง์ ์ ๊ท์น ํ์ผ๋ฟ๋ง ์๋๋ผ ์น UI์ ๊ฐ์ ์ผ๋ถ ์์น์์๋ ์ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ ์ฌ์ค์ด์ผ?
์น UI๋ ์๋ฃ๋๋ ์ ์ผํ ์ฅ์์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
promfmt
๋๊ตฌ์ ์์ ์ ์ํํ์ง ์๋๋ผ๋gofmt
์ ๋งค์ฐ ์ ์ฌํ ํน์ "์ ์" ํ์์ ๋ค์ ์ ์ฒด ์ธ์ ๋ฌธ์์ด๊ณผ ํจ๊ป "๋ณด์ฆ"ํ๋ ๊ฒ์ ๋๋ค.