複雑なアラートで簡単に作業できます。またはBalerterの背後にある物語

誰もがアラートが大好きです。

もちろん、グラフを見て異常を探すよりも、何かが起こった(または修正された)ときに通知を受ける方がはるかに優れています。

そして、このために多くのツールが作成されています。PrometheusエコシステムのAlertmanagerとVictoriaMetrics製品グループのvmalert。GrafanaでのZabbixの通知とアラート。定期的にURLを取得し、問題があるかどうかを通知するbashおよびTelegramボットの自作スクリプト。すべての多く。

私たちの会社では、複雑になるまで、または複雑な複合アラートを作成することが不可能になるまで、さまざまなソリューションを使用していました。私たちが望んでいたこと、そして最終的に私たちがしたことは、カットの下にあります。TLDR:これがオープンソースプロジェクトBalerterの登場です

長い間、Grafanaで構成されたアラートでかなりうまくいっていました。はい、これは最善の方法ではありません。Alertmanagerなど、ある種の特殊なソリューションを使用することを常にお勧めします。そして、交差点の方向も何度も見ました。そして、ゆっくりと、もっと欲しかった。

特定のチャートがXX%減少/増加し、前のM時間と比較してN分間存在する場合を考えてみてください。GrafanaまたはAlertmanagerで実装を試みることができるようですが、それは簡単ではありません。(またはそうではないかもしれませんが、今は言いません)

アラートに関する決定をさまざまなソースからのデータに基づいて行う必要がある場合、事態はさらに複雑になります。実例:

2つのClickhouseデータベースのデータを確認し、それをPostgresのデータと比較して、アラートを決定します。信号またはキャンセル

そんな思いをたくさん積み重ねてきました。そして、まだ作成されていないこのサービスの要件/機能の最初のリストをコンパイルしようとしました

  • さまざまなデータソースにアクセスします。たとえば、Prometheus、Clickhouse、Postgres

  • テレグラム、スラックなど、さまざまなチャネルにアラートを送信します。

  • , ,

  • -

, , . - , - . .

, Balerter.

, . (, , . . )

?

Lua, ( Prometheus, Clickhouse .). - . / - . Balerter , (Email, telegram, 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

  • , (error) rps-min-limit

  • , rps-min-limit (success)

Balerter?

, , Balerter. https://balerter.com

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

    • slack

    • telegram

    • syslog

    • notiify (UI )

    • email

    • discord

  • , S3 ( )

  • - Key/Value

  • Lua (- lua- json, csv)

  • HTTP ( , )

  • API ( , )

  • Prometheus

?

,  cron. v1.0.0

. , - MongoDB. - Elastic Search. SMS / . , , , . .

- - ) , . ,

Balerterはかなり前から使用しています。何十ものスクリプトが私たちの安心を守っています。この作品が他の誰かに役立つことを願っています。

そして、あなたの問題とPRへようこそ。




All Articles