Grafana是一套開源的監控圖表顯示框架,可以很方便地和監控框架結合來顯示精美的監控圖,比如常見的基于Zabbix監控來顯示圖表,這方面本文不細說了。
單圖表(panel)告警郵件
說到監控就一定會有告警郵件,否則如果要人每時每刻去關注圖標是否超出指標,那也太累了。Grafana目前有一個很好的功能,就是可以直接在Grafana上設置告警項,不需要去其底層監控框架操作,這樣一來我們獲得的告警郵件也是基于日常熟悉的Grafana圖表來的。
在Grafana的左側菜單欄,有一個鈴鐺的圖表就是進行告警和通知設置的:
第一個Alert Rules是設置告警規則,這里可以查看所有設置過的告警條目,查看各個條目的當前狀態(是否處于異常狀態),并可以對各條進行操作(比如停止監控告警或者編輯條目)。這里需要說明的一點是,Grafana的告警項一旦觸發異常告警,那就只會進行一次通知,然后等待人來處理,即使你設置了每分鐘檢查一次,也不會每次都給你發通知說異常了,也就是說,只會在狀態從正常轉到異常的那一次會通知,直到人處理后恢復正常,才會繼續判斷。
第二個Notification channels是通知渠道,Grafana支持多種通知方式,比較常用的是發郵件的Email方式和回調指定接口的webhook方式。其中webhook是指當觸發異常告警后,會對你指定的接口進行一次請求,發送你指定的內容,因此這種方式可以有很大的自定義性,但主要是獲取數據和文本。我們這里主要講Email方式。
想要發送Email,當然得進行郵件配置,Grafana采用標準SMTP協議,所以我們需要有一個開啟了SMTP協議的郵箱,這方面的細節可以參考我這篇博客:Python利用SMTP協議發html格式含圖片郵件
Grafana的郵箱配置不在web界面上,而是要修改一個配置文件,文件默認是在/etc/grafana/grafana.ini,修改配置文件如下:
# 郵件服務器配置,自行修改配置
[smtp]
enabled = true
host = smtp.qq.com:465
user = 你的郵箱
# 這個密碼是你開啟smtp服務生成的授權碼
password = 你的密碼
;cert_file =
;key_file =
;skip_verify = false
from_address = 你的郵箱
from_name = Grafana
修改配置文件后,需要重啟Grafana服務來生效。這時候就可以設置通過郵件來告警了。
我們在Notification channels中添加一項通過Email來發通知的channel:
要注意下面的Email addresses中是告警時會收到通知的郵箱列表,不是發送人,發送人在配置文件里配好了,都會由那個郵箱發出。
現在選擇一個要監控告警的圖表(panel),點擊標題,選擇Edit按鈕:
選中Alert標簽頁,就可以發現其中的Notification頁多了一個郵件通知的選項了:
這時候就可以在Alert Config中根據需要配置告警條件,一旦觸發就會發郵件到我們設置的接收郵箱報警(只會報警一次,直到你處理后恢復正常)。值得一提的是,設置告警條件時,圖表中會同步出現一個心型圖標,可以拖動進行閾值設置。
設置完成并保存后,一旦觸發異常條件,就會發郵件告警了:
如果你收到的郵件中只有圖表,沒有文字,那很可能是服務器上沒有安裝字體庫,參考這里的解答:https://github.com/grafana/grafana/issues/7026。需要通過命令安裝相關的庫:
yum install fontconfig
yum install freetype*
yum install urw-fonts
如果你用了中文,那上面的步驟還是無法在圖片中渲染中文,還需要給服務器的環境配一下中文支持。
面板圖(Dashboard)日報郵件
上面的做法有兩個限制,第一是只有在出發告警的情況下才會發郵件,而且發一次后除非你處理了,否則不會繼續發了。第二是只能對發單個圖表的圖片郵件,但Grafana有一個很大的用法是Dashboard,也就是在一個面板中放置多個圖表,方便一眼看過去很明了。
如果我想要發面板圖的日報郵件呢?
這是一個很常見的需求,但是目前Grafana并沒有直接支持。所以需要一些特別的方法。
方案之一
首先,有一個開源工具叫Grafana reporter。他的做法是另起一個服務,然后利用Grafana的一個功能:Links。
在Grafana的Dashboard界面,點擊設置按鈕可以看到左邊的標簽中有一個“Links”,該功能可以給當前面板上加一些按鈕,來調用某些鏈接(Link)。所以這個工具的做法是另外運行一個HTTP服務,然后在Grafana的面板中添加這個鏈接,點擊后可以生成當前面板的PDF文件,當然也可以下載該PDF文件。
那么利用這個工具,你就可以自行訪問該鏈接,拼裝Dashboard的uid進去,得到該面板的PDF文件,通過腳本下載下來后再發郵件就行了。
這個方法的麻煩之處在于需要另外跑一個服務來提供PDF生成能力,而且PDF也不太好直接放在郵件正文里展現,更適合作為附件存在。所以我在嘗試之后最終沒有使用該方法,有相應需求的話可以參考這兩篇博客進行配置和使用:
更簡單的方案
我們點擊單個圖表的標題,出現的按鈕列表中有一個share按鈕,點擊后可以發現:
最底下有個按鈕可以直接獲取渲染圖的鏈接,點擊后你會發現你會直接得到一個該圖表的圖片URL。雖然URL是一長串,但其實這個GET方法的參數都很明確,有不確定的查一下官方文檔也能夠清楚:http://docs.grafana.org/reference/sharing/#direct-link-rendered-image
那既然單個圖表可以這樣訪問,那整個dashboard有沒有這種直接的渲染圖url呢?有的!
打開官方文檔:http://docs.grafana.org/http_api/dashboard/#get-dashboard-by-uid
有一個GET api可以直接通過dashboard的uid來獲取它。uid是什么?這個頁面的最上面有解釋,id就是dashboard在我們的Grafana中的序號,而uid就是一個唯一標識。
但是這個api還不夠,我們要做日報還需要像圖表url那樣設定面板圖的時間區間并得到圖片才有意義,那我們就把鏈接仿造上面圖表的形式寫一遍,大概變成了這樣:
http://grafana-server-url/render/d/uid?from=1546387200000&to=1546991999000&var-datasource=xxx&width=1500&height=700
前面替換成你的服務域名,從“d/”后面可以進行自己組裝,uid怎么獲取?在你的面板界面的鏈接中可以看到,結構基本差不多。from和to兩個數字是時間戳,后面依此是數據源、圖片的寬和高,其實也可以像圖表一樣跟上tz和timeout參數,但不跟也能正常訪問。
這時候我們就可以根據這個鏈接來獲取到我們要的時間段內的指定dashboard的圖片快照了!
需要特別注意的是這個GET請求是需要鑒權的,畢竟不能讓任何人拿到了鏈接都能隨便看我的監控數據吧,所以Grafana也有一套鑒權方案,是以Bearer的方式,具體不細說,用法就是在請求url的時候需要加一個header:
- "Authorization": "Bearer YourAdminApiKeyToken"
如果不加這個header,那就會返回授權失敗。這個token怎么得來呢?可以參考官方文檔:http://docs.grafana.org/http_api/auth/。在Admin賬號下進入設置界面創建API Key,這個Key也有角色,分別是Viewer、Editor、Admin,權利遞增,而Admin角色的Key擁有訪問一切鏈接的權利。創建好Key(token)后,記得保存,因為只會在創建的時候顯示給你看那一次,之后就要用這個token來訪問URL了。
接下來就是使用腳本來定時訪問組裝好的url、下載圖片、發送郵件了。這方面不再細說,分別可以查看我的博客:
另外我也寫了份完整的工程代碼:https://github.com/Cloudox/grafana_dashboard_mail/tree/master
定時每天獲取指定時間區間的dashboard圖片并發送日報郵件,如果下載dashboard圖失敗,也會發郵件進行提醒,如果有幫助請不吝給星~
參考文章:
https://www.cnblogs.com/yyhh/p/4792830.html
http://kubiops.com/blog/2017/02/27/Grafana%E5%91%8A%E8%AD%A6%E9%85%8D%E7%BD%AE.html
https://www.imooc.com/article/73338?block_id=tuijian_wz
https://github.com/Isma399/grafana_mail