elastalert2通過飛書報(bào)警

目標(biāo)

基于docker運(yùn)行ElastAlert2,并集成第三方告警插件,向飛書發(fā)送報(bào)警信息;

重新build ElastAlert2鏡像

由于官方的鏡像中不包含飛書通知方式,因此需要重新打包鏡像;
分別下載ElastAlert2和elastalert-feishu-plugin源碼,見參考;
拷貝elastalert-feishu-plugin中的elastalert_modules目錄到ElastAlert2的根目錄下,目錄結(jié)構(gòu)如圖:


image.png

修改Dockerfile:

FROM python:3-slim-buster as builder

LABEL description="ElastAlert 2 Official Image"
LABEL maintainer="Jason Ertel"

COPY . /tmp/elastalert

RUN mkdir -p /opt/elastalert && \
    cd /tmp/elastalert && \
    pip install setuptools wheel && \
    python setup.py sdist bdist_wheel

FROM python:3-slim-buster

ARG GID=1000
ARG UID=1000
ARG USERNAME=elastalert

COPY --from=builder /tmp/elastalert/dist/*.tar.gz /tmp/

RUN apt update && apt -y upgrade && \
    apt -y install jq curl gcc libffi-dev && \
    rm -rf /var/lib/apt/lists/* && \
    pip install /tmp/*.tar.gz && \
    rm -rf /tmp/* && \
    apt -y remove gcc libffi-dev && \
    apt -y autoremove && \
    mkdir -p /opt/elastalert && \
    mkdir -p /usr/local/lib/python3.10/site-packages/elastalert/elastalert_modules && \
    echo "#!/bin/sh" >> /opt/elastalert/run.sh && \
    echo "set -e" >> /opt/elastalert/run.sh && \
    echo "elastalert-create-index --config /opt/elastalert/config.yaml" \
        >> /opt/elastalert/run.sh && \
    echo "elastalert --config /opt/elastalert/config.yaml \"\$@\"" \
        >> /opt/elastalert/run.sh && \
    chmod +x /opt/elastalert/run.sh && \
    groupadd -g ${GID} ${USERNAME} && \
    useradd -u ${UID} -g ${GID} -M -b /opt -s /sbin/nologin \
        -c "ElastAlert 2 User" ${USERNAME}
COPY ./elastalert_modules/feishu_alert.py /usr/local/lib/python3.10/site-packages/elastalert/elastalert_modules/
COPY ./elastalert_modules/__init__.py /usr/local/lib/python3.10/site-packages/elastalert/elastalert_modules/
USER ${USERNAME}
ENV TZ ""Asia/Shanghai""

WORKDIR /opt/elastalert
ENTRYPOINT ["/opt/elastalert/run.sh"]

重新build鏡像

docker build -t elastalertfs:1.0 . 

準(zhǔn)備elastalert配置文件elastalert.yaml,修改你的es地址和端口


rules_folder: /opt/elastalert/rules

run_every:
  seconds: 10

buffer_time:
  minutes: 15

es_host: es
es_port: 9200

writeback_index: elastalert_status

alert_time_limit:
  days: 2

創(chuàng)建rules目錄,在目錄內(nèi)創(chuàng)建報(bào)警規(guī)則文件testrule.yaml,注意修改index名稱、過濾條件、飛書機(jī)器人botid等;
創(chuàng)建飛書機(jī)器人可參考:
自定義機(jī)器人指南 - 客戶端文檔 - 開發(fā)文檔 - 飛書開放平臺 (feishu.cn)

name: "testrule"
type: "frequency"
index: "es-index-*"
is_enabled: true
num_events: 1
realert:
  minutes: 5
terms_size: 50
timeframe:
  minutes: 5
timestamp_field: "@timestamp"
timestamp_type: "iso"
use_strftime_index: false

filter:
  - bool:
      filter:
        - match_all: {}
        - match_phrase:
            level: ERROR
alert:
- "elastalert_modules.feishu_alert.FeishuAlert"

# 飛書機(jī)器人接口地址
feishualert_url: "https://open.feishu.cn/open-apis/bot/v2/hook/"
# 飛書機(jī)器人id
feishualert_botid:
  "botid"

# 告警標(biāo)題
feishualert_title:
  "test"

# 這個(gè)時(shí)間段內(nèi)的匹配將不告警,適用于某些時(shí)間段請求低谷避免誤報(bào)警
feishualert_skip:
  start: "01:00:00"
  end: "09:00:00"

# 告警內(nèi)容
# 使用{}可匹配matches
# 如匹配到的es數(shù)據(jù)為{"host":"aa.com","ip":"127.0.0.1"}
feishualert_body:
  "
  告警策略:  {feishualert_title}\n
  總請求數(shù):  {num_hits}\n
  觸發(fā)時(shí)間:  {feishualert_time}\n
  匹配域名:  {host}\n
  匹配ip:  {ip}
  "

運(yùn)行docker,有新增的規(guī)則直接放到掛載的宿主機(jī)的rules目錄內(nèi)即可;

docker run  -d --name elastalert --restart=always \
-v $(pwd)/elastalert.yaml:/opt/elastalert/config.yaml \
-v $(pwd)/rules:/opt/elastalert/rules \
elastalertfs:1.0 --verbose

tips:如果要在k8s上運(yùn)行elastalert2鏡像,務(wù)必注意檢查容器內(nèi)環(huán)境變量,elastalert2默認(rèn)環(huán)境變量優(yōu)先級高于配置文件

參考及引用

https://github.com/jertel/elastalert2
gpYang/elastalert-feishu-plugin: elastalert 飛書插件 (github.com)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容