Code Monkey home page Code Monkey logo

elastalert-docker's Introduction

elastalert-docker

elastalert docker images , this image include Wechat enterprise alerter plugin and Dingtalk alerter plugin

elastalert docker 镜像 并且开箱既用的集成了 微信企业号报警插件 和 钉钉报警插件(基于钉钉群机器人的webhook,支持签名安全认证,支持text和markdown格式)

Features(特性)

  • Making everything available using environment variables. (通过环境变量进行构建和配置)

  • Integration with the following external services via environment variables: (通过环境变量进行外部服务集成)

    • E-mail (General SMTP) (SMTP方式的email)
    • Exotel
    • Gitter
    • HipChat
    • JIRA
    • OpsGenie
    • PagerDuty
    • Slack
    • Telegram
    • Twilio
    • VictorOps
    • Wechat (微信企业号)
    • Dingtalk (钉钉群机器人)
  • NTP syncrhonization and support change timezone. (同步NTP同步时间,并且支持修改时区)

  • Startup check and install enhancement's and alerter's dependencies. (启动时检查和安装增强器和报警器的依赖pip包)

  • Offset @timestamp to local time(Use timezone) (支持根据本地时区修改 @timestamp)

Usage(使用)

docker run -e"ELASTICSEARCH_HOST=es-host" \
    -e"CONTAINER_TIMEZONE=Asia/Shanghai"  \
    -e"TZ=Asia/Shanghai" \
    -e"ELASTALERT_DINGTALK_ACCESS_TOKEN=xxx" \
    -e"ELASTALERT_DINGTALK_SECURITY_TYPE=sign" \
    -e"ELASTALERT_DINGTALK_SECRET=xxx" \
    anjia0532/elastalert-docker:v0.2.4

demo rules(示例rules)

name: log-error
type: frequency
index: logstash-*
num_events: 20
timeframe:
    minutes: 5
filter:
- query:
    query_string:
      query: "level:ERROR"
      
compare_key:
- app_name
query_key:
- app_name

# 告警抑制
# 5 分钟内相同的报警不会重复发送
realert:
  minutes: 5

exponential_realert:
# 指数级扩大 realert 时间,中间如果有报警,
# 则按照 5 -> 10 -> 20 -> 40 -> 60 不断增大报警时间到制定的最大时间,
# 如果之后报警减少,则会慢慢恢复原始 realert 时间
exponential_realert:
  hours: 1

alert:
- "elastalert_modules.dingtalk_alert.DingTalkAlerter"
#- "elastalert_modules.wechat_qiye_alert.WeChatAlerter"

match_enhancements:
- "elastalert_enhancements.TimeEnhancement.TimeEnhancement"

alert_text_type: alert_text_only
alert_text: |
  从 {} 到 {} 产生了 {} 次 错误日志

  时间: {}

  模块: {}

  内容: {}

  堆栈: `{}`

alert_text_args:
  - local_starttime
  - local_endtime
  - num_hits
  - local_time
  - app_name
  - message
  - stack_trace

Environment Variables(环境变量)

Set at buildtime(构建时设置的变量)

These variables are set during the Docker build, and are generally necessary for running core functionality of Elastalert.

在构建镜像时设置的环境变量,是运行Elastalert所必须的

Env var Elastalert config var Default Description
ELASTALERT_HOME N/A /opt/elastalert Place Elastalert home here
SET_CONTAINER_TIMEZONE N/A True Whether or not to set the container timezone to ${CONTAINER_TIMEZONE}
CONTAINER_TIMEZONE N/A Etc/UTC Container timezone value
ELASTALERT_RULES_DIRECTORY N/A ${ELASTALERT_HOME}/rules Folder where Elastalert scans for rules
ELASTALERT_PLUGIN_DIRECTORY N/A ${ELASTALERT_HOME}/elastalert_modules Folder where Elastalert scans for alerters
ELASTALERT_ENHANCEMENT_DIRECTORY N/A ${ELASTALERT_HOME}/elastalert_enhancements Folder where Elastalert scans for enhancements
ELASTALERT_CONFIG N/A ${ELASTALERT_HOME}/config.yaml Name and location of the config file referenced by docker-entrypoint.sh to start the Python daemon
ELASTALERT_INDEX writeback_index elastalert_status Name of the Elastalert index in your Elasticsearch cluster
ELASTALERT_SYSTEM_GROUP N/A elastalert Name of the user running Elastalert; used for the daemon and folder permissions
ELASTALERT_SYSTEM_USER N/A elastalert Name of the group running Elastalert; used for the daemon and folder permissions
ELASTALERT_VERSION N/A 0.1.29 Version of Elastalert to install from pip
ELASTICSEARCH_HOST es_host elasticsearch Desc
ELASTICSEARCH_PORT es_port 9200 Desc
ELASTICSEARCH_USE_SSL use_ssl False Connect with TLS to Elasticsearch
ELASTICSEARCH_VERIFY_CERTS verify_certs False Use SSL authentication with client certificates

Set at runtime(启动时设置)

These variables are settings available in the Elastalert configuration file. Most of these settings apply to third-party integrations (JIRA, OpsGenie, etc), or are things documented here: Elastalert common configuration options

这些环境变量都是Elastalert 配置文件所需的,主要是通用配置和三方集成配置(Wechat,dingtalk等)

common configuration options(常用配置)

Env var Elastalert config var Default Description
ELASTALERT_RUN_EVERY run_every: => minutes: 3 Number of minutes to wait before re-checking Elastalert rules. Currently only available as values in minutes
ELASTALERT_BUFFER_TIME buffer_time: => minutes: 45 ElastAlert will buffer results from the most recent period of time, in case some log sources are not in real time
ELASTALERT_AWS_REGION aws_region No default set
ELASTICSEARCH_URL_PREFIX es_url_prefix No default set
ELASTICSEARCH_SEND_GET_BODY_AS es_send_get_body_as No default set
ELASTALERT_TIME_LIMIT alert_time_limit: => minutes: 5 If an alert fails for some reason, ElastAlert will retry sending the alert until this time period has elapsed
ELASTALERT_DISABLE_RULES_ON_ERROR disable_rules_on_error: => Bool True If true, ElastAlert will disable rules which throw uncaught (not EAException) exceptions
ELASTALERT_MATCH_ENHANCEMENTS match_enhancements: => array No Default set A list of enhancement modules to use with this rule
ELASTALERT_RUN_ENHANCEMENTS_FIRST run_enhancements_first: => Bool False If set to true, enhancements will be run as soon as a match is found
ELASTICSEARCH_CA_CERTS ca_certs No default set
ELASTICSEARCH_CLIENT_CERT client_cert No default set
ELASTICSEARCH_CLIENT_KEY client_key No default set
ELASTICSEARCH_PASSWORD es_password No default set
ELASTICSEARCH_USER es_username No default set

third-party integrations(三方集成)

Env var Elastalert config var Default Description
wechat(微信企业号)
ELASTALERT_WECHAT_CORP_ID wechat_corp_id No default set corp id
ELASTALERT_WECHAT_SECRET wechat_secret No default set corp secret
ELASTALERT_WECHAT_AGENT_ID wechat_agent_id No default set agent id
ELASTALERT_WECHAT_PARTY_ID wechat_party_id No default set party id (party1,party2...)
ELASTALERT_WECHAT_USER_ID wechat_user_id No default set user id (user1,user2,user3...)
ELASTALERT_WECHAT_TAG_ID wechat_tag_id No default set tag id(tag1,tag2,tag3...)
dingtalk(钉钉群机器人)
ELASTALERT_DINGTALK_ACCESS_TOKEN dingtalk_access_token No default set dingtalk access token
ELASTALERT_DINGTALK_SECURITY_TYPE dingtalk_security_type sign sign/keyword/whitelist
ELASTALERT_DINGTALK_SECRET dingtalk_secret No default set if ELASTALERT_DINGTALK_SECURITY_TYPE ==sign, must be not null
ELASTALERT_DINGTALK_AT_MOBILES dingtalk_at_mobiles No default set phone's array to @someone
ELASTALERT_DINGTALK_AT_ALL dingtalk_at_all False @all or not
ELASTALERT_DINGTALK_MSGTYPE dingtalk_msgtype text text/markdown
E-mail
ELASTALERT_EMAIL email No default set
ELASTALERT_EMAIL_REPLY_TO email_reply_to No default set
ELASTALERT_FROM_ADDR from_addr No default set
ELASTALERT_NOTIFY_EMAIL notify_email No default set
ELASTALERT_SMTP_HOST smtp_host No default set
exotel
ELASTALERT_EXOTEL_ACCOUNT_SID exotel_account_sid No default set
ELASTALERT_EXOTEL_AUTH_TOKEN exotel_auth_token No default set
ELASTALERT_EXOTEL_FROM_NUMBER exotel_from_number No default set
ELASTALERT_EXOTEL_TO_NUMBER exotel_to_number No default set
gitter
ELASTALERT_GITTER_MSG_LEVEL gitter_msg_level No default set
ELASTALERT_GITTER_PROXY gitter_proxy No default set
ELASTALERT_GITTER_WEBHOOK_URL gitter_webhook_url No default set
hipchat
ELASTALERT_HIPCHAT_AUTH_TOKEN hipchat_auth_token No default set
ELASTALERT_HIPCHAT_DOMAIN hipchat_domain No default set
ELASTALERT_HIPCHAT_FROM hipchat_from No default set
ELASTALERT_HIPCHAT_IGNORE_SSL_ERRORS hipchat_ignore_ssl_errors No default set
ELASTALERT_HIPCHAT_NOTIFY hipchat_notify No default set
ELASTALERT_HIPCHAT_ROOM_ID hipchat_room_id No default set
jira
ELASTALERT_JIRA_ACCOUNT_FILE jira_account_file No default set
ELASTALERT_JIRA_ASSIGNEE jira_assignee No default set
ELASTALERT_JIRA_BUMP_IN_STATUSES jira_bump_in_statuses No default set
ELASTALERT_JIRA_BUMP_NOT_IN_STATUSES jira_bump_not_in_statuses No default set
ELASTALERT_JIRA_BUMP_TICKETS jira_bump_tickets No default set
ELASTALERT_JIRA_COMPONENT jira_component No default set
ELASTALERT_JIRA_COMPONENTS jira_components No default set
ELASTALERT_JIRA_ISSUETYPE jira_issuetype No default set
ELASTALERT_JIRA_LABEL jira_label No default set
ELASTALERT_JIRA_LABELS jira_labels No default set
ELASTALERT_JIRA_MAX_AGE jira_max_age No default set
ELASTALERT_JIRA_PROJECT jira_project No default set
ELASTALERT_JIRA_SERVER jira_server No default set
ELASTALERT_JIRA_WATCHERS jira_watchers No default set
opsgenie
ELASTALERT_OPSGENIE_ACCOUNT opsgenie_account No default set
ELASTALERT_OPSGENIE_ADDR opsgenie_addr No default set
ELASTALERT_OPSGENIE_ALIAS opsgenie_alias No default set
ELASTALERT_OPSGENIE_KEY opsgenie_key No default set
ELASTALERT_OPSGENIE_MESSAGE opsgenie_message No default set
ELASTALERT_OPSGENIE_PROXY opsgenie_proxy No default set
ELASTALERT_OPSGENIE_RECIPIENTS opsgenie_recipients No default set
ELASTALERT_OPSGENIE_TAGS opsgenie_tags No default set
ELASTALERT_OPSGENIE_TEAMS opsgenie_teams No default set
pagerduty
ELASTALERT_PAGERDUTY_CLIENT_NAME pagerduty_client_name No default set
ELASTALERT_PAGERDUTY_EVENT_TYPE pagerduty_event_type No default set
ELASTALERT_PAGERDUTY_SERVICE_KEY pagerduty_service_key No default set
slack
ELASTALERT_SLACK_EMOJI_OVERRIDE slack_emoji_override No default set
ELASTALERT_SLACK_ICON_URL_OVERRIDE slack_icon_url_override No default set
ELASTALERT_SLACK_MSG_COLOR slack_msg_color No default set
ELASTALERT_SLACK_PARSE_OVERRIDE slack_parse_override No default set
ELASTALERT_SLACK_TEXT_STRING slack_text_string No default set
ELASTALERT_SLACK_USERNAME_OVERRIDE slack_username_override No default set
ELASTALERT_SLACK_WEBHOOK_URL slack_webhook_url No default set
telegram
ELASTALERT_TELEGRAM_API_URL telegram_api_url No default set
ELASTALERT_TELEGRAM_BOT_TOKEN telegram_bot_token No default set
ELASTALERT_TELEGRAM_ROOM_ID telegram_room_id No default set
twilio
ELASTALERT_TWILIO_ACCOUNT_SID twilio_account_sid No default set
ELASTALERT_TWILIO_AUTH_TOKEN twilio_auth_token No default set
ELASTALERT_TWILIO_FROM_NUMBER twilio_from_number No default set
ELASTALERT_TWILIO_TO_NUMBER twilio_to_number No default set
victorops
ELASTALERT_VICTOROPS_API_KEY victorops_api_key No default set
ELASTALERT_VICTOROPS_ENTITY_DISPLAY_NAME victorops_entity_display_name No default set
ELASTALERT_VICTOROPS_MESSAGE_TYPE victorops_message_type No default set
ELASTALERT_VICTOROPS_ROUTING_KEY victorops_routing_key No default set

Build(构建)

git clone https://github.com/anjia0532/elastalert-docker.git

cd elastalert-docker

docker build . -t anjia0532/elastalert-docker:v0.2.4 \ 
    [-t anjia0532/elastalert-docker:latest] [--build-arg ELASTALERT_VERSION=0.2.4] \
    [--build-arg MIRROR=true --build-arg ALPINE_HOST="mirrors.aliyun.com" --build-arg PIP_MIRROR="https://mirrors.aliyun.com/pypi/simple/"] 

Note:

注意:

Thanks(鸣谢)

Feedback(反馈)

welcome to commit new issues

有问题的话欢迎提交 新的 issues 来向我反馈

Copyright and License(版权和授权信息)

This module is licensed under the BSD license.

Copyright (C) 2020-, by AnJia [email protected].

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

elastalert-docker's People

Contributors

anjia0532 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

elastalert-docker's Issues

build failed

docker build . -t xxx/elastalert-docker:v0.2.4 --build-arg MIRROR=true

#10 6.760 OK: 18 MiB in 43 packages
#10 6.827 + apk add --no-cache --virtual .build-dependencies gcc libffi-dev python-dev tar musl-dev openssl-dev
#10 6.834 fetch https://mirrors.aliyun.com/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
#10 7.082 fetch https://mirrors.aliyun.com/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
#10 7.479 ERROR: unable to select packages:
#10 7.531 python-dev (no such package):
#10 7.531 required by: .build-dependencies-20210827.095016[python-dev]

elastalert elasticsearch密码

dock部署elastalert连接elasticsearch时候密码用a123456可以启动成功。如果使用这种密码X@a#i&i47,docker容器启动的时候,会刷报错,waitting for elasticsearch。elastalert是不是不支持含有特殊字符的es密码

docker build报错

命令:

docker build . -t anjia0532/elastalert-docker:v0.2.4 --build-arg MIRROR=true --build-arg ALPINE_HOST="mirrors.aliyun.com" --build-arg PIP_MIRROR="https://mirrors.aliyun.com/pypi/simple/"

报错:

+ apk add --no-cache --virtual .build-dependencies gcc libffi-dev python-dev tar musl-dev openssl-dev
fetch http://mirrors.aliyun.com/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
ERROR: unsatisfiable constraints:
  python-dev (missing):
    required by: .build-dependencies-20200814.022322[python-dev]
The command '/bin/sh -c set -ex &&     if $MIRROR; then sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_HOST}/g" /etc/apk/repositories ; pip config set global.index-url ${PIP_MIRROR} ; /bin/echo -e "[easy_install]\\nindex-url = ${PIP_MIRROR}" >> ~/.pydistutils.cfg ; fi &&     apk update &&     apk upgrade &&     apk add --no-cache         ca-certificates         tzdata         su-exec         dumb-init         bash         curl         openssl &&     apk add --no-cache --virtual         .build-dependencies         gcc         libffi-dev         python-dev         tar         musl-dev         openssl-dev &&     pip install --upgrade pip' returned a non-zero code: 2

能否增加一个通用webhook

你好,如题,现在是你这边给出钉钉和企微,用的人就只能用这两个固定的webhook,我想能不能增加一个通用的webhook,我自己来准备一个过滤清洗转发的web服务来接收,再转到钉钉,企微,飞书等平台上去,这样灵活程度更高。

使用微信告警发生获取访问_token失败(qyapi.weixin.qq.com)这是为什么

ERROR:root:Error while running alert WeChatAlerter: get access_token failed , stacktrace:HTTPSConnectionPool(host='qyapi.weixin.qq.com', port=443): Max retries exceeded with url: /cgi-bin/gettoken?corpid=ww5afd903541d35bad&corpsecret=UikmL5UHdmH093GGYhG0xDL9LvLIMqanQckU7_2uP7o (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fb548ada470>: Failed to establish a new connection: [Errno 110] Operation timed out',))

时区问题

运行elastalert,在shell窗口,显示时间是对的。但是在elastalert_status里面时区-8了,rule就在es里面找前8个小时的日志进行filter。这个问题在哪里设置可以解决,谢谢

插件集成建议

请问大佬这个可以集成到kibana上么,以插件得形式,在kibana上配置

如何对alert_text_args进行字数限制?

告警推送规则

alert_text_type: alert_text_only
alert_text: |
  ========start===========
  触发时间: {}
  告警主题: {} 服务异常
  告警数量: {} 
  --------详细信息--------
  trace.id: {}
  报错接口: {}
  接口参数: {}
  错误内容: {}
  状态码: {}
  ========end============
alert_text_args:
  - "@timestamp"
  - service.name
  - num_hits
  - trace.id
  - transaction.custom.api
  - transaction.custom.errorMessage
  - transaction.custom.responseStatus
  - transaction.custom.data    >>> 这个内容经常会超过2048,我希望它限制在500个字数

我研究了下好像是alert_text_values这个字段可以限制,但是几经周折都失败了。不知道哪里出错了

class BasicMatchString(object):
def _add_custom_alert_text(self):
        missing = self.rule.get('alert_missing_value', 'null')
        alert_text = str(self.rule.get('alert_text', ''))
        if 'alert_text_args' in self.rule:
            alert_text_args = self.rule.get('alert_text_args')
            alert_text_values = [lookup_es_key(self.match, arg) for arg in alert_text_args]

            # Support referencing other top-level rule properties
            # This technically may not work if there is a top-level rule property with the same name
            # as an es result key, since it would have been matched in the lookup_es_key call above
            for i, text_value in enumerate(alert_text_values):
                if text_value is None:
                    alert_value = self.rule.get(alert_text_args[i])
                    if alert_value:
                        alert_text_values[i] = alert_value
            alert_text_values = [missing if val is None else val for val in alert_text_values]
             # 单字段长度判断
            if len(alert_text_values) > 500:
                alert_text_values = alert_text_values[:500]+"..."
            alert_text = alert_text.format(*alert_text_values)
        elif 'alert_text_kw' in self.rule:
            kw = {}
            for name, kw_name in list(self.rule.get('alert_text_kw').items()):
                val = lookup_es_key(self.match, name)

                # Support referencing other top-level rule properties
                # This technically may not work if there is a top-level rule property with the same name
                # as an es result key, since it would have been matched in the lookup_es_key call above
                if val is None:
                    val = self.rule.get(name)
                kw[kw_name] = missing if val is None else val
            alert_text = alert_text.format(**kw)
        self.text += alert_text

讨论一个推送告警的思路问题

我的日志里有十几个服务,但是每次告警统计的是所有的服务。

比如这种

从 2020-06-23 13:27 CST 到 2020-06-23 13:28 CST 产生了 88 次 错误日志
> 时间: 2020-06-23 13:28 CST
> 服务名: xxxx
> 项目名: XXX
> 方法 getTableList
> 名称: 促销活动 - 促销活动管理

这里面写的88次不一定都是xxxx这个服务的错误,因为我需要根据服务名推送给相关负责人,如果我把上面的内容推送出去,推送相当于xxxx这个服务出现了88次错误。 这里应该如何细化?

如果分出来给每个服务都建立一个rules,假如30分钟出现了5条不同等级的错误,那么告警应该怎么取最重要的那条消息推送出去?
另外一个服务一个查询请求,30个服务30次请求,也会降低es的负载能力。

对于elastalert-docker有个问题,怎么实现告警推送分组功能?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.