Cacti如何实现电话告警,电话告警接口

4747 1172 2023-01-22

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

本文讲述了Cacti如何实现电话告警,电话告警接口。

Cacti是一套基于PHP,MySQL,SNMP及RRD Tool开发的网络流量监测图形分析工具。Cacti提供了一个快速轮询器,高级图表模板,多种数据采集方法和用户管理功能。所有这一切都被包装在一个直观的,易于使用的界面中,这对于局域网以及成千上万个设备的复杂网络来说是有意义的。
但是为了不错过重要的阀值告警,往往邮件通知是不够的,电话通知的方式往往是最直接方式。在产生重要的告警的时候,可以第一时间接收到告警电话,使得用户可以第一时间进行处理。睿象云智能告警平台 Cloud Alert就可以简单而又快速的实现电话告警,接下来就讲下如何实现吧!
主要分为三大步骤:
1.集成应用 — 也就是将Cacti集成到睿象云智能告警平台
2.设置分派策略 — 设置告警发生时的通知人
3.设置通知策略 — 设置电话的通知方式
一.集成应用
1.进入官网www.aiops.com,登录账号
2.在Cloud Alert中创建Cacti应用,点击集成 — 监控工具 — Cacti
3.填写“应用名称”,点击“保存并获取应用key”
4.安装并配置thold插件,配置邮件告警
5.修改thold插件,支持CloudAlert告警接入
(1)打开{cacti_home}/plugins/thold/thold_functions.php例如:
vim /var/www/html/cacti/plugins/thold/thold_functions.php
定位到function thold_mail函数:
/* Sends a group of graphs to a user */
function thold_mail($to, $from, $subject, $message, $filename, $headers = '') {
global $config;
thold_debug('Preparing to send email');
include_once($config['base_path'] . '/plugins/settings/include/mailer.php');
include_once($config['base_path'] . '/plugins/thold/setup.php');
$subject = trim($subject);
$message = str_replace('', $subject, $message);
...... //此处省略
}
在$message = str_replace('', $subject, $message); 后添加如下代码并替换appkey参数:
function onealert_for_cacti($msg, $subject) {
$fields = array(
"app" => "--", --处填入您新建应用时生成的appkey
"subject" => $subject,
"msg" => $msg
);
$fieldsdate = json_encode($fields);
$ch = curl_init("http://api.aiops.com/alert/api/event/cacti/new");
curl_setopt($ch, CURLOPT_HEADER, "Content-type: application/json");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldsdate);
$output = curl_exec($ch);
if(curl_errno($ch)){
print curl_error($ch);
}
curl_close($ch);
echo $output;
}
onealert_for_cacti($message,$subject);
(2)重启SNMP
service snmpd restart
(3)重启httpd
service httpd restart
(4)配置Cacti使之触发告警,查看Cloud Alert告警和邮件告警是否正常
二.设置分派策略
1.点击配置 — 分派策略 — 新建分派
2.输入分派策略名称 — 选择应用 — 设置分派人(告警发生时通知的人),点击保存
用户可以根据【告警级别】【告警内容】等条件,来添加指定条件分派。
三.设置通知策略
1.点击【配置】—【通知策略】-【新建通知】
2.通知策略的可选择性也是很高的,用户可选择的地方有:告警状态、告警级别、通知方式、时间设置、延迟策略、通知人等,其中的意思分别如下:
告警状态:选择告警通知的状态。分别有发生时、认领时、关闭时、全选,4种选择。
告警级别:选择告警通知的级别。分别有提醒、警告、严重、所有,4种选择。
通知方式:选择告警通知的方式。分别有电话、短信、邮件、微信、APP,5种选择。
时间设置:选择告警通知的时间。分别有任何时间、工作时间、非工作时间,3种选择。
延迟策略:选择告警通知是否延迟。
通知人:选择告警通知的人。
例如:任何时间告警发生时严重级别的告警立刻电话通知所有人。
告警状态 — 发生时;告警级别 — 严重;通知方式 — 电话;时间设置 — 任何时间;延迟策略 — 立刻;通知人 — 全选
Cacti与CA告警级别映射关系Cacti 所有告警默认严重级别 | subject包含NORMAL或是包含normal或是包含Restored 为恢复告警。
以上设置就完成了Cacti的电话通知设置,还有多种通知方式,用户看也可以根据自己的需求来进行设置。

电话报警(语音报警)可使用(OpsAlert) 支持电话、短信、邮件、微信多种报警,直接使用WebHook配置即可,比较简单。

介绍

Prometheus 将数据采集和报警分成两个模块。报警规则配置在Prometheus Servers上,然后发送报警信息到AlertManger,Alertmanager 对收到的告警信息进行处理,包括去重,降噪,分组,沉默,抑制,策略路由,告警通知。

流程 

Alertmanager 接收到告警,根据labels判断属于哪些Route(可存在多个Route,一个Route有多个Group,一个Group有多个Alert)

将告警分配到Group中,没有则新建Group,新的Group等待group_wait指定的时间(等待时可能收到同一Group的告警),根据resolve_timeout判断告警是否解决,然后发送通知

已有的Group等待group_interval指定的时间,判断告警是否解决,当上次发送通知到现在的间隔大于repeat_interval或者Group有更新时会发送通知

分组

分组是指当出现问题时,Alertmanager 会收到一个单一的通知,而当整个系统或网络故障时,很有可能有成百上千的告警会同时生成,这种机制在较大故障中特别有用。如当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager,但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,通过配置 Alertmanager 将警报分组打包,并发送一个相对看起来紧凑的通知。

抑制

抑制是指当告警发出后,停止重复发送由此告警引发其他错误的告警的机制。如当警报被触发,通知整个集群不可达,可以配置Alertmanager 忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。

沉默

沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。

沉默机制可以通过Alertmanager的Web页面进行配置。

安装

Download | Prometheus (下载最新版本的 Alertmanager)

cd /data/alertmanager

wget https://github.com/prometheus/alertmanager/releases/download/v0.17.0/alertmanager-0.17.0.linux-amd64.tar.gz

tar -zxvf alertmanager-0.17.0.linux-amd64.tar.gz

配置

cd alertmanager-0.17.0.linux-amd64/

vim alertmanager.yml

global:

  resolve_timeout: 5m #处理超时时间,默认为5分钟

  smtp_from: 'test@ywfuns.com'

  smtp_smarthost: 'smtp.exmail.qq.com:25'

  smtp_auth_username: 'test@ywfuns.com'

  smtp_auth_password: '123'

route:

  group_by: ['alertname', 'item']  # 传入报警分组在一起的标签,如item=测试和alertname=Disk的多个报警将批处理为单个组

  group_wait: 30s  # 最初即第一次等待多久时间发送一组警报的通知

  group_interval: 300s  # 在发送新警报前的等待时间

  repeat_interval: 4h  # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝

  receiver: 'mail.hook'   # 发送警报的接收者的名称,以下receivers name的名称

  routes:

    - receiver: 'web.hook'

      group_wait: 10s         

      match:           

        severity: node # 带有 severity=node 的报警将被发送到 web.hook

# 定义模板信心

# templates:

#   - '/data/template/*.tmpl'

receivers:

- name: 'web.hook'

  webhook_configs:

  #  webhook 接收地址

  - url: 'https://www.opsalert.cn/alert/prometheus/fd70c90f-823b-4299-b697-eaf27dea204e' 

    send_resolved: false  # 是否通知已解决的告警

# - url: 'http://127.0.0.1:8070/dingtalk/'         

#   send_resolved: true

- name: 'email'

  email_configs:

  - to: 'test@ywfuns.com'

#    html: '{{ template "mail.html" . }}'

#    headers: { Subject: " {{ .CommonAnnotations.summary }}" }

#- name: 'mail.hook' # 告警时同时发送到 webhook_configs 和 email_configs

#  webhook_configs:

#  - url: 'http://127.0.0.1:8070/hook/'

#  email_configs:

#  - to: 'test@ywfuns.com' # 多个用逗号隔开

# -name: 'wechat'

#   wechat_configs:

#   - url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信地址

#     to_party: '1' # 接收组的id

#     agent_id: '1000002' # (企业微信-->自定应用-->AgentId)

#     corp_id: '******' # 企业信息(我的企业-->CorpId[在底部])

#     api_secret: '******' # 企业微信(企业微信-->自定应用-->Secret)

#     message: '{{ template "wechat.html" . }}' # 发送消息模板的设定

inhibit_rules: # 抑制规则

  - source_match:

      severity: 'critical'

    target_match:

      severity: 'warning'

    equal: ['alertname', 'dev', 'instance', 'prod']

接收器 receivers 我这里只测试了webhook_configs 和 email_configs 当然还支持其他的接收器(pagerduty_configs、slack_config、opsgenie_configs、wechat_configs),使用方法都差不多。

API

#  GET 查看 receivers (发送渠道)列表

https://localhost/api/v2/receivers 

#  GET 查看 alerts (报警)列表

https://localhost/api/v2/alerts?silenced=false&inhibited=false 

#  POST 添加报警

alerts='[

  {

    "labels": {

       "alertname": "DiskAll",

       "dev": "sda1",

       "instance": "example"

     },

     "annotations": {

        "info": "The disk sda1 is running full",

        "summary": "please check the instance example"

      }

}]

curl -XPOST -d"$alerts" https://localhost/api/v2/alerts

#  GET 查看 silences (静默)列表

https://localhost/api/v2/silences?silenced=false&inhibited=false 

#  POST 添加静默

https://localhost/api/v2/silences

注意: API 添加 silences 的时候,因 prometheus 默认时区为UTC且无法改变时区,因此我们的报警时间应该 -8:00,如下脚本

#! /usr/bin/env python

# -*- coding:utf8 -*-

import datetime

import urllib2

import json

import time

def add(matchers, username, commit):

    UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"

    now_stamp = time.time()

    startsAt = datetime.datetime.utcfromtimestamp(now_stamp)

    endsAt = startsAt + datetime.timedelta(hours=4)

    data = {

        "matchers": matchers,

        "startsAt": startsAt.strftime(UTC_FORMAT),

        "endsAt": endsAt.strftime(UTC_FORMAT),

        "createdBy": username,

        "comment": commit,

        "id": "",

        "status": {"state": "active"}

    }

    request_header = {'Content-Type': 'application/json'}

    request = urllib2.Request("https://alert.test.com/api/v2/silences", headers=request_header, data = json.dumps(data))

    response = urllib2.urlopen(request).read()

    print response

matchers = [{'isRegex': False, 'name': 'test', 'value': 'test'}]

add(matchers, "test", "测试")

启动

vim /usr/lib/systemd/system/alertmanager.service

[Unit]

Description=alertmanager server daemon

Documentation=https://prometheus.io/docs/introduction/overview/

After=network.target

[Service]

ExecStart=/data/alertmanager/alertmanager-0.17.0.linux-amd64/alertmanager --config.file=/data/alertmanager/alertmanager-0.17.0.linux-amd64/alertmanager.yml --storage.path=/data/alertmanager/data

ExecReload=/bin/kill -HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=multi-user.target

# 启动

systemctl daemon-reload

systemctl restart alertmanager.service

Prometheus 配置添加 Alertmanager

# 添加如下配置并重启 prometheus 服务

vim prometheus.yml

alerting:

  alertmanagers:

  - static_configs:

    - targets:

      - localhost:9093

rule_files:

   - /data/prometheus/prometheus/rules/*.rules # 规则配置文件

模板

cat /data/template/wechat.tmpl

{{ define "wechat.html" }}

  {{ range $i, $alert := .Alerts.Firing }}

    [报警项名]:{{ index $alert.Labels "alertname" }}

    [报警主机]:{{ index $alert.Labels "instance" }}

    [报警阀值]:{{ index $alert.Annotations "value" }}

    [开始时间]:{{ $alert.StartsAt }}

  {{ end }}

{{ end }}

Prometheus 添加规则(rules)

警报规则允许你基于Prometheus表达式语言的表达式定义报警报条件,并在触发警报时发送通知给外部的接收者。每当警报表达式在给定时间点产生一个或者多个向量元素,这个警报统计活跃的这些元素标签集。

vim /data/prometheus/prometheus/rules/hoststats-alert.rules

groups:

- name: hostStatsAlert

  rules:

  - alert: instanceDown

    expr: up == 0

    for: 5m

    labels:

      severity: node

    annotations:

      summary: "Instance {{ $labels.instance }} down"

      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

  - alert: diskFree

    expr: (1-(node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"}) ) * 100 > 85

    for: 5m

    labels:

      severity: page

    annotations:

      summary: "Instance {{ $labels.instance }} down"

      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

FOR 选项语句会使Prometheus服务等待指定的时间, 在第一次遇到新的表达式输出向量元素(如:具有高HTTP错误率的实例)之间,并将该警报统计为该元素的触发。如果该元素的活跃的,且尚未触发,表示正在挂起状态。

LABELS 选项语句允许指定额外的标签列表,把它们附加在警告上。任何已存在的冲突标签会被重写。这个标签值能够被模板化。

ANNOTATIONS 选项语句指定了另一组标签,它们不被当做警告实例的身份标识。它们经常用于存储额外的信息,例如:警告描述,后者runbook链接。这个注释值能够被模板化。

我这里添加了2条报警规则,分别是实例Down了及磁盘使用大于85%就触发报警。

如果实例Down了的话就触发label为severity=node的receiver(上面alertmanager 配置文件中),可以看到上面的配置就会匹配web.hook这个receiver,然后会将报警信息POST到我们提供的 hook 接口中。

一个报警信息在生命周期内有下面3中状态:

inactive: 表示当前报警信息既不是firing状态也不是pending状态

pending: 表示在设置的阈值时间范围内被激活了

firing: 表示超过设置的阈值时间被激活了

上文就是小编为大家整理的Cacti如何实现电话告警,电话告警接口。

国内(北京、上海、广州、深圳、成都、重庆、杭州、西安、武汉、苏州、郑州、南京、天津、长沙、东莞、宁波、佛山、合肥、青岛)睿象云智能运维平台软件分析、比较及推荐。

上一篇:智能镜面显示屏将带你体验不一样的智能生活
下一篇:告警管理是什么意思啊英语(告警的英语)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~