Zabbix 整合 睿象雲智慧告警平臺 CA ( Cloud Alert )
一 、簡介與前期瞭解
Cloud Alert 通過應用,接入監控系統/平臺的告警,集中管理您的告警,統一分派通知,統一分析。
這個平臺最先了解和使用是在 2017 年下半年,之前的名稱叫 oneitsM
。預警產品名稱為 : OneAlert
, 現在該產品已經遷移到 睿象雲,並更名為 CloudAlert
。本文主要是介紹和記錄下該預警產品的使用。
我們首先要註冊一個賬號:官網連結,然後登陸我們的賬號。選擇我們的 Cloud Alert
。
然後點選我們上方的整合。
我們可以直接整合業界主流的監控工具,如:Zabbix、Nagios、Prometheus、OpenFalcon、SolarWinds等,同時也可以通過 Email 郵箱整合或者 REST API 方式接入您的告警。
二、整合到 Zabbix
我們需要先獲取我們的 APPkey
,然後在安裝的時候,傳入該引數。
一、安裝 Agent
- 切換到
zabbix
指令碼目錄 (如何檢視zabbix
指令碼目錄):
cd /usr/local/zabbix-server/share/zabbix/alertscripts
- 獲取Cloud Alert Agent包:
wget https://download.aiops.com/ca_agent/zabbix/ca_zabbix_release-2.1.0.tar.gz
- 解壓、安裝。
tar -xzf ca_zabbix_release-2.1.0.tar.gz
cd cloudalert/bin
bash install.sh APPkey
注:1、在安裝過程中根據安裝提示,輸入zabbix管理地址、管理員使用者名稱、密碼。
2、zabbix管理地址正確示例:http://zabbix.server.com/zabbix
- 當提示"安裝成功"時表示安裝成功!
- 在
zabbix server
管理介面檢視是否新增成功。
出現該指令碼就意味著成功了。
三 、建立分派策略和通知策略
這裡要嚴重的注意一點,就是 CloudAlert
的 預警級別只有三種,它和 zabbix
的級別對應見下表.我們在設定通知策略和分派策略需要注意.
zabbix 級別狀態 | 引數值 | OneAlert 級別狀態 |
---|---|---|
information (資訊) | 1 | 提醒 |
not_classified (未分類) | 1 | 提醒 |
warning (警告) | 2 | 警告 |
average (一般嚴重) | 2 | 警告 |
high (嚴重) | 3 | 嚴重 |
disaster (災難) | 3 | 嚴重 |
分派策略
通知策略
我們這裡只使用到 CloudAlert
的通知策略的通知方式中的電話和簡訊,因為我們 微信已經對接了我們的企業微信預警,郵箱也使用了企業郵箱(進垃圾郵箱的概率更低一些).所以我們這裡只設定 通知方式為 電話和簡訊. 並且只有在嚴重預警的時候才會觸發.
四 、設定動作
在執行安裝指令碼的時候,預設已經幫我們新增好了動作 cloudalert action
。但是沒有設定觸發條件,我們可以設定一下觸發條件,觸發器示警度 大於等於 嚴重 的時候,進行觸發該動作.
五 、生成預警
當我們的預警達到閾值,就會觸發報警.
簡訊預警內容:
【睿象雲】16:48:53,發生嚴重級別告警:Zabbix agent on Test-186 is unreachable for 5 minutesTest-186 Agent ping:Up (1)Zabbix agent on Test-186 is unreachable for 5 minutes,告警物件:Test-186,告警編號:585679
六 、解除安裝Cloud Alert
Web 設定解除安裝
- 刪除報警媒介
cloudalert media
。 - 刪除使用者群組
cloudalert group
。 - 刪除使用者
cloudalert
。 - 刪除動作
cloudalert action
。
有人會說我們沒有新增上面的東西,為什麼會存在上面這些內容,我們在 執行
install.sh
指令碼的時候就會新增這些.
指令碼檔案解除安裝
刪除指令碼 刪除 /usr/local/zabbix-server/share/zabbix/alertscripts
的cloudalert
資料夾。
七、注意事項
錯誤內容
我安裝的 zabbix server
是使用的 docker 安裝的, 指令碼目錄是使用的資料卷(我們可以用 docker inspect container_id
檢視到)。我們將指令碼放置在該資料卷後,安裝,也提示成功了,但是在預警的時候,有報錯。
報錯內容如下:
/usr/lib/zabbix/alertscripts/cloudalert/bin
/usr/lib/zabbix/alertscripts/cloudalert/bin/log.sh: line 11: /var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log: No such file or directory
cp: cannot stat '/var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log': No such file or directory
/usr/lib/zabbix/alertscripts/cloudalert/bin/log.sh: line 16: /var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log: No such file or directory
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 623 0 89 100 534 1141 6850 --:--:-- --:--:-- --:--:-- 6935
/usr/lib/zabbix/alertscripts/cloudalert/bin/log.sh: line 11: /var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log: No such file or directory
cp: cannot stat '/var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log': No such file or directory
/usr/lib/zabbix/alertscripts/cloudalert/bin/log.sh: line 16: /var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log: No such file or directory
解析過程與解決問題
從上面我們可以看到是指令碼 log.sh
執行的過程中報錯了,提示沒有該檔案,它寫入的檔案是 /var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/logs/cloudalert.log
,這個檔案路徑是 docker 宿主機的日誌檔案路徑,程式在 docker 裡面執行,這個路徑肯定是獲取不到的。我們通過檢視 log.sh
指令碼發現,
#!/bin/bash
if [ -z "$DIR" ]; then
DIR="$( cd "$( dirname "$0" )" && pwd )"
fi
source $DIR/cloudalert.conf
function log(){
path=$base_path
log=$path/logs/cloudalert.log
time=`date +%Y-%m-%d\ %H:%M:%S`
echo $time $1 [$2]: "$3" >> $log
bak_log=$path/logs/cloudalert.log_`date +%Y-%m`
if [ ! -f $bak_log ];
then
cp $log $bak_log
> $log
fi
}
日誌路徑引用了 base_path
,這個值是在 cloudalert.conf
裡定義的. 我們可以在配置檔案中看到, base_path
值獲取的是 宿主機 cloudalert
所在的路徑. 而不是實際在 docker 容器裡的路徑。
current_path=/var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert/bin
base_path=/var/lib/docker/volumes/bb221b74a7d8ad528194867830db0c1ac8fdc31f2ab0ee4456ffce61646fd83a/_data/cloudalert
agentVersion=1130
AppKey=1233444555666
zabbix_host=http://127.0.0.1
zabbix_url=http://127.0.0.1/api_jsonrpc.php
user=Admin
password=admin
我們將 base_path
的值更改為 在docker 容器裡面的值 /usr/lib/zabbix/alertscripts/cloudalert
.
然後就沒有報錯了.
反思
這個問題的引起,是我在 宿主機下將執行的該指令碼,導致的指令碼執行的時候獲取的是宿主機的目錄,而不是 docker 主機裡面的目錄路徑,在 docker 容器裡面執行指令碼,即可避免該問題。