๋ชจ๋๊ฐ ์๋ฆผ์ ์ข์ํฉ๋๋ค.
๋ฌผ๋ก ์์์ ๊ทธ๋ํ๋ฅผ ๋ณด๊ณ ์ด์ ํ์์ ์ฐพ๋ ๊ฒ๋ณด๋ค ์ด๋ค ์ผ์ด ๋ฐ์(๋๋ ์์ )๋์์ ๋ ์๋ฆผ์ ๋ฐ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
์ด๋ฅผ ์ํด ๋ง์ ๋๊ตฌ๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค. Prometheus ์ํ๊ณ์ Alertmanager์ VictoriaMetrics ์ ํ ๊ทธ๋ฃน์ vmalert์ ๋๋ค. Grafana์ Zabbix ์๋ฆผ ๋ฐ ๊ฒฝ๊ณ . ์ ๊ธฐ์ ์ผ๋ก ์ผ๋ถ URL์ ๊ฐ์ ธ์์ ๋ฌธ์ ๊ฐ ์๋์ง ์๋ ค์ฃผ๋ bash ๋ฐ Telegram ๋ด์ ์์ฒด ์์ฑ ์คํฌ๋ฆฝํธ์ ๋๋ค. ๋ชจ๋ ๊ฒ.
์ฐ๋ฆฌ ํ์ฌ์์๋ ๋ณต์กํ ๋ณตํฉ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ณต์กํ๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ ๋๊น์ง ๋ค์ํ ์๋ฃจ์
์ ์ฌ์ฉํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ๊ณผ ๊ฒฐ๊ตญ ํ๊ฒ ๋ ๊ฒ์ ์ปท ์๋์ ์์ต๋๋ค. TLDR: ์คํ์์ค ํ๋ก์ ํธ๋ ์ด๋ ๊ฒ ๋ํ๋ฌ์ต๋๋ค
๊ฝค ์ค๋ซ๋์ ์ฐ๋ฆฌ๋ Grafana์ ๊ตฌ์ฑ๋ ๊ฒฝ๊ณ ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ด์์ต๋๋ค. ์, ์ด๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ํญ์ Alertmanager์ ๊ฐ์ ์ผ๋ถ ํน์ ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ํ ํ ๋ฒ ์ด์ ์์ง์ด๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฐจ ์ฐ๋ฆฌ๋ ๋ ๋ง์ ๊ฒ์ ์ํ๊ฒ ๋์์ต๋๋ค.
ํน์ ์ฐจํธ๊ฐ XX% ํ๋ฝ/์ฆ๊ฐํ๊ณ ์ด์ M์๊ฐ์ ๋นํด N๋ถ ๋์ ๋จธ๋ฌผ๋ ๋ค๊ณ ๊ฐ์ ํด ๋ณด์ธ์. Grafana๋ Alertmanager๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ง๋ง ์ฝ์ง ์์ต๋๋ค. (๋๋ ๋ถ๊ฐ๋ฅํ ์๋ ์์ต๋๋ค. ์ง๊ธ์ ๋งํ์ง ์๊ฒ ์ต๋๋ค)
๋ค์ํ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๊ณ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๋ฉด ์ํฉ์ ๋์ฑ ๋ณต์กํด์ง๋๋ค. ์ค์ ์:
๋ ๊ฐ์ Clickhouse ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ๋ค์ ์ด๋ฅผ Postgres์ ์ผ๋ถ ๋ฐ์ดํฐ์ ๋น๊ตํ๊ณ ๊ฒฝ๊ณ ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ ํธ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ทจ์ํ์ธ์
์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ๊ฒฐ์ ์ ๋ํด ์๊ฐํด ๋ณด๊ณ ์ถ์ ๋น์ทํ ์๊ตฌ๋ฅผ ๊ฝค ๋ง์ด ์ถ์ ํด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ง ์์ฑ๋์ง ์์ ์ด ์๋น์ค์ ์ฒซ ๋ฒ์งธ ์๊ตฌ ์ฌํญ/๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ปดํ์ผํ๋ ค๊ณ ํ์ต๋๋ค.
-
๋ค์ํ ๋ฐ์ดํฐ ์์ค์ ์ก์ธ์คํ์ธ์. ์๋ฅผ ๋ค์ด ํ๋ก๋ฉํ ์ฐ์ค, ํด๋ฆญํ์ฐ์ค, ํฌ์คํธ๊ทธ๋ ์ค
-
ํ ๋ ๊ทธ๋จ, ์ฌ๋ ๋ฑ ๋ค์ํ ์ฑ๋๋ก ์๋ฆผ์ ๋ณด๋ ๋๋ค.
-
์๊ฐํ๋ ๊ณผ์ ์์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ์ ์ธ์ ์ธ ์ค๋ช ์ด ์๋๋ผ ์คํฌ๋ฆฝํธ ์์ฑ ๋ฅ๋ ฅ์ด๋ผ๋ ๊ฒ์ด ๋ถ๋ช ํด์ก์ต๋๋ค.
-
์ผ์ ์ ๋ฐ๋ผ ์คํฌ๋ฆฝํธ ์คํ
-
์๋น์ค๋ฅผ ๋ค์ ์์ํ์ง ์๊ณ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ๊ฒ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
-
์์ค ์ฝ๋์์ ์๋น์ค๋ฅผ ๋ค์ ๊ตฌ์ถํ์ง ์๊ณ ๋ ์ด๋ป๊ฒ๋ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ ๋ฅ๋ ฅ
์ด ๋ชฉ๋ก์ ๋๋ต์ ์ธ ๊ฒ์ด๋ฉฐ ์ ํํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ค ์ ์ ๋ฐ๋์๊ณ , ์ด๋ค ์ ์ ์ฃฝ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ํ์์ ๊ฐ์ต๋๋ค.
์ฌ์ค ๋ฐ๋ ํฐ์ ์ญ์ฌ๋ ์ด๋ ๊ฒ ์์๋๋ค.
๊ฒฐ๊ตญ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๊ณ ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค. (๋ค, ๋ฌผ๋ก ์ด๊ฒ ๋์ ์๋๋๋ค. ์ ํ ๊ฐ๋ฐ ๊ณํ๋ ๋ง์ต๋๋ค. ์ค๋์ ์ด๋ง ๋ง์น๊ฒ ์ต๋๋ค)
์ด๋ป๊ฒ ์๋ํฉ๋๊น?
Prometheus, Clickhouse ๋ฑ์ ์์ฒญ์ ๋ช ์์ ์ผ๋ก ๋ณด๋ด๋ ์คํฌ๋ฆฝํธ๋ฅผ Lua์์ ์์ฑํฉ๋๋ค. ๋ต๋ณ์ ๋ฐ๊ณ ์ด๋ป๊ฒ๋ ์ฒ๋ฆฌํ๊ณ ๋น๊ตํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ผ์ข ์ ๊ฒฝ๊ณ ๋ฅผ ์ผ๊ฑฐ๋ ๋๋๋ค. Balerter ์์ฒด๋ ๊ทํ๊ฐ ๊ตฌ์ฑํ ์ฑ๋(์ด๋ฉ์ผ, ํ ๋ ๊ทธ๋จ, Slack ๋ฑ)๋ก ์๋ฆผ์ ๋ณด๋ ๋๋ค. ์คํฌ๋ฆฝํธ๋ ์ง์ ๋ ๊ฐ๊ฒฉ์ผ๋ก ์คํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ... ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค)
ะัััะต ะฒัะตะณะพ ะฟะพะบะฐะทะฐัั ะฝะฐ ะฟัะธะผะตัะต:
-- @interval 10s
-- @name script1
local minRequestsRPS = 100
local log = require("log")
local ch1 = require("datasource.clickhouse.ch1")
local res, err = ch1.query("SELECT sum(requests) AS rps FROM some_table WHERE date = now()")
if err ~= nil then
log.error("clickhouse 'ch1' query error: " .. err)
return
end
local resultRPS = res[1].rps
if resultRPS < minResultRPS then
alert.error("rps-min-limit", "Requests RPS are very small: " .. tostring(resultRPS))
else
alert.success("rps-min-limit", "Requests RPS ok")
end
๋ฌด์จ ์ผ์ด์ผ?
-
์ด ์คํฌ๋ฆฝํธ๋ 10์ด๋ง๋ค ์คํ๋์ด์ผ ํจ์ ๋ํ๋ ๋๋ค.
-
์คํฌ๋ฆฝํธ ์ด๋ฆ ํ์(API์ฉ, ๋ก๊ทธ ํ์์ฉ, ํ ์คํธ์ฉ)
-
๋ก๊ทธ ์ถ๋ ฅ์ฉ ๋ชจ๋ ์ฐ๊ฒฐ
-
์ด๋ฆ์ด ์๋ ํด๋ฆญํ์ฐ์ค์ ์ก์ธ์คํ๋ ค๋ฉด ๋ชจ๋์ ์ฐ๊ฒฐํ์ธ์.
ch1
(์ฐ๊ฒฐ ์์ฒด๋ ๊ตฌ์ฑ์์ ๊ตฌ์ฑ๋ฉ๋๋ค) -
ํด๋ฆญํ์ฐ์ค์ ์์ฒญ ๋ณด๋ด๊ธฐ
-
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ก๊ทธ์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ์ข ๋ฃํฉ๋๋ค.
-
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์์์ ๋น๊ตํฉ๋๋ค(์ค์ ์์ ์์๋ Postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์์ ์ด ๊ฐ์ ์ป์ ์ ์์).
-
ID๋ก ์๋ฆผ ํ์ฑํ ๋๋ ๋นํ์ฑํ
rps-min-limit
-
๊ฒฝ๊ณ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฆผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด ์๋ ๋งค์ฐ ๊ฐ๋จํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌผ๋ก ์ค์ ์ํ์์ ์คํฌ๋ฆฝํธ๋ ์๋นํ ๊ธธ๊ณ ๋ณต์กํ ์ ์์ต๋๋ค. ํผ๋์ค๋ฌ์์ ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค.
ะะพััะพะผั ัะพะทัะตะปะพ ะปะพะณะธัะฝะพะต ะถะตะปะฐะฝะธะต โ ะธะผะตัั ะฒะพะทะผะพะถะฝะพััั ะฝะฐะฟะธััะฐัั ัะตััั ะดะปั ัะฒะพะธั ัะบัะธะฟัะพะฒ. ะ ะฒ ะฒะตััะธะธ v0.4.0 ััะพ ะฟะพัะฒะธะปะพัั.
ํ ์คํธ ์คํฌ๋ฆฝํธ
์ ์์ ์ ์คํฌ๋ฆฝํธ์ ๋ํ ์์ ํ ์คํธ:
-- @test script1
-- @name script1-test
test = require('test')
local resp = {
{
rps = 10
}
}
test.datasource('clickhouse.ch1').on('query', 'SELECT sum(requests) AS rps FROM some_table WHERE date = now()').response(resp)
test.alert().assertCalled('error', 'rps-min-limit', 'Requests RPS are very small: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')
๋จ๊ณ๋ณ:
-
ํ ์คํธ๊ฐ ์์ฑ๋ ์คํฌ๋ฆฝํธ์ ์ด๋ฆ์ ๋ํ๋ ๋๋ค.
-
ํ ์คํธ ์ด๋ฆ(๋ก๊ทธ์ฉ)
-
ํ ์คํธ ๋ชจ๋์ ์ฐ๊ฒฐํ์ญ์์ค
-
ํด๋ฆญํ์ฐ์ค์ ๋ํ ํน์ ์์ฒญ์ ๋ํด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋์ด์ผ ํ๋์ง ์๋ ค์ค๋๋ค.
ch1
-
์ง์ ๋ ๋ฉ์์ง๊ฐ ํฌํจ๋ ๊ฒฝ๊ณ (์ค๋ฅ) rps-min-limit๊ฐ ํธ์ถ๋์๋์ง ํ์ธํฉ๋๋ค.
-
ะฟัะพะฒะตััะตะผ, ััะพ ะฐะปะตัั rps-min-limit ะฝะต ะฑัะป ะพัะบะปััะตะฝ (success)
Balerter๋ ๋ ๋ฌด์์ ํ ์ ์๋์?
์ ์๊ฐ์๋ ๊ฐ์ฅ ์ค์ํ Balerter ๊ธฐ์ ์ ๋ํด ๋ค๋ฃจ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค. ๊ณต์ ํํ์ด์ง์์ ๋ชจ๋ ๋ด์ฉ์ ์์ธํ ๋ณด์ค ์ ์์ต๋๋ค
-
์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค
-
ํด๋ฆญํ์ฐ์ค
-
ํฌ์คํธ ๊ทธ๋ ์ค
-
MySQL์
-
ํ๋ก ๋ฉํ ์ฐ์ค
-
๋กํค
-
-
์ฑ๋์ ์๋ฆผ ๋ณด๋ด๊ธฐ
-
๋์จํ๊ฒ
-
์ ๋ณด
-
syslog
-
์๋ฆผ(์ปดํจํฐ์ UI ์๋ฆผ)
-
์ด๋ฉ์ผ
-
๋ถ์ผ์น
-
-
๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ณ S3 ํธํ ์คํ ๋ฆฌ์ง์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ํ ์๋ฆผ์ ์ฒจ๋ถํฉ๋๋ค(
์ฌ์ง์ ์ ) -
์คํฌ๋ฆฝํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค - ์ ์ญ ํค/๊ฐ ์ ์ฅ์
-
Lua์์ ์์ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํฉ๋๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก json, csv ์์ ์ ์ํด lua ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค.)
-
์คํฌ๋ฆฝํธ์์ HTTP ์์ฒญ ๋ณด๋ด๊ธฐ(๋ฌผ๋ก ์๋ต ๋ฐ๊ธฐ)
-
API๋ฅผ ์ ๊ณตํฉ๋๋ค(์์ง ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋งํผ ๊ธฐ๋ฅ์ ์ด์ง ์์)
-
์ธก์ ํญ๋ชฉ์ Prometheus ํ์์ผ๋ก ๋ด๋ณด๋ ๋๋ค.
๋ ๋ฌด์์ ํ๊ณ ์ถ๋์?
์ฌ์ฉ์์ ์ฐ๋ฆฌ๊ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ ์คํ์ ์ ์ดํ๋ โโ๊ธฐ๋ฅ์ ์ํ๋ค๋ ๊ฒ์ ์ด๋ฏธ ๋ถ๋ช ํฉ๋๋ค. ํฌ๋ก . ์ด ์์ ์ ๋ฒ์ v1.0.0 ์ด์ ์ ์ํ๋ฉ๋๋ค.
๋ ๋ง์ ๋ฐ์ดํฐ ์์ค์ ์๋ฆผ ์ ๋ฌ ์ฑ๋์ ์ง์ํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋๊ตฐ๊ฐ๋ ๋ถ๋ช ํ MongoDB๋ฅผ ๊ทธ๋ฆฌ์ํ ๊ฒ์ ๋๋ค. ์ผ๋ถ์ ๋ํ ํ๋ ฅ์ ๊ฒ์. SMS๋ฅผ ๋ณด๋ด๊ฑฐ๋ ํด๋ํฐ์ผ๋ก ์ ํ๋ฅผ ๊ฑธ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ์ผ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์์๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ์ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋ณด๋ค ์ฌ์ฉ์ ์นํ์ ์ธ ์น์ฌ์ดํธ์ ํ๋ก์ ํธ์ ๋ํ ๋ ๋์ ๋ฌธ์๋ฅผ ์ํฉ๋๋ค.
๋๊ตฐ๊ฐ๋ ํญ์ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๋ค.) ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฐ์ ์์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๋ผ๋ ์ปค๋ฎค๋ํฐ์ ์์ฒญ์ ์์กดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ ์คํํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ๊ธฐ ์ํด
๊ฒฐ๋ก ์ ์ผ๋ก
์ฐ๋ฆฌ๋ ์ฌ์ฉ
๊ทธ๋ฆฌ๊ณ ๊ทํ์ ์ด์์ PR์ ํ์ํฉ๋๋ค.
์ถ์ฒ : habr.com