Prometheus監控學習筆記之容器監控Grafana模塊

 

0x00 概述

Grafana 是一個開源的,能夠用於大規模指標數據的可視化項目,甚至還能對指標進行報警。基於友好的 Apache License 2.0 開源協議,目前是prometheus監控展現的首選。優勢以下:html

1.使用:

  • 配置方便:支持Dashboard、Panel、Row等組合,且支持折線圖、柱狀圖等多種圖例
  • 圖表漂亮:能夠選擇暗黑系或純白系,你也能夠本身定義顏色
  • 模板不少:grafana模板很活躍,有不少用戶貢獻的面板,直接導入就能用
  • 支持多種數據源:grafana做爲展現面板,支持不少數據源,如Graphite、ES、Prometheus等
  • 權限管理簡單:有admin、viewer等多種角色管控

2.二次開發:

若是默認的grafana不能知足你的需求,要二次開發,官方也提供了不少支持:前端

  • 協議爲Apache License 2.0:商業友好,隨便改吧,改完拿去賣也行。
  • 完善的API調用:權限、面板、用戶、報警都支持api調用。
  • 多種鑑權方式:OAuth、LADP、Proxy多種方式,你能夠接入本身公司的鑑權系統
  • 插件開發:若是你不想直接改代碼,能夠作本身的插件
  • go+Angular+react:經常使用的技術棧,方便二次開發

prometheus + grafana 作爲監控組合很方便,很強大,改造了鑑權以後更加香。一開始咱們還嘗試使用grafana自帶的報警功能,惋惜比較雞肋,沒法用於生產,報警的issue一大堆官方也不想修改,做罷node

 

0x01 Grafana-k8s部署

步驟一:安裝grafana

Grafana提供了不少種部署方式,若是你的展現報警是在K8S集羣外,能夠二進制直接部署,若是grafana自己在集羣內,或者管理端也是k8s集羣,能夠用yaml部署:mysql

Deployment配置:react

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-system
  name: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      namespace: kube-system
      annotations:
        grafana-version: '1.0'
      name: grafana
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:5.1.0
        imagePullPolicy: Always
        securityContext:
          runAsUser: 0
        env: 
        - name: GF_SECURITY_ADMIN_PASSWORD
          value: "admin"
        ports:
        - name: grafana
          containerPort: 3000
        resources:
          requests:
            memory: "100Mi"
            cpu: "100m"
          limits:
            memory: "2048Mi"
            cpu: "1024m"

Service配置:git

apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: grafana
  annotations:
    prometheus.io/scrape: 'true'
  labels:
    name: grafana
spec:
  selector:
    app: grafana
  type: LoadBalancer
  ports:
  - name: grafana
    protocol: TCP
    port: 3000

grafana配置文件的字段含義:github

app_mode:應用名稱,默認是production
 
[path]
data:一個grafana用來存儲sqlite三、臨時文件、回話的地址路徑
logs:grafana存儲logs的路徑
 
[server]
http_addr:監聽的ip地址,,默認是0.0.0.0
http_port:監聽的端口,默認是3000
protocol:http或者https,,默認是http
domain:這個設置是root_url的一部分,當你經過瀏覽器訪問grafana時的公開的domian名稱,默認是localhost
enforce_domain:若是主機的header不匹配domian,則跳轉到一個正確的domain上,默認是false
root_url:這是一個web上訪問grafana的全路徑url,默認是%(protocol)s://%(domain)s:%(http_port)s/
router_logging:是否記錄web請求日誌,默認是false
cert_file:若是使用https則須要設置
cert_key:若是使用https則須要設置
 
[database]
grafana默認須要使用數據庫存儲用戶和dashboard信息,默認使用sqlite3來存儲,你也能夠換成其餘數據庫
type:能夠是mysql、postgres、sqlite3,默認是sqlite3
path:只是sqlite3須要,定義sqlite3的存儲路徑
host:只是mysql、postgres須要,默認是127.0.0.1:3306
name:grafana的數據庫名稱,默認是grafana
user:鏈接數據庫的用戶
password:數據庫用戶的密碼
ssl_mode:只是postgres使用
 
 
[security]
admin_user:grafana默認的admin用戶,默認是admin
admin_password:grafana admin的默認密碼,默認是admin
login_remember_days:多少天內保持登陸狀態
secret_key:保持登陸狀態的簽名
disable_gravatar:
 
 
[users]
allow_sign_up:是否容許普通用戶登陸,若是設置爲false,則禁止用戶登陸,默認是true,則admin能夠建立用戶,並登陸grafana
allow_org_create:若是設置爲false,則禁止用戶建立新組織,默認是true
auto_assign_org:當設置爲true的時候,會自動的把新增用戶增長到id爲1的組織中,當設置爲false的時候,新建用戶的時候會新增一個組織
auto_assign_org_role:新建用戶附加的規則,默認是Viewer,還能夠是Admin、Editor
 
 
[auth.anonymous]
enabled:設置爲true,則開啓容許匿名訪問,默認是false
org_name:爲匿名用戶設置組織名稱
org_role:爲匿名用戶設置的訪問規則,默認是Viewer
 
 
[auth.github]
針對github項目的,很明顯,呵呵
enabled = false
allow_sign_up = false
client_id = some_id
client_secret = some_secret
scopes = user:email
auth_url = https://github.com/login/oauth/authorize
token_url = https://github.com/login/oauth/access_token
api_url = https://api.github.com/user
team_ids =
allowed_domains =
allowed_organizations =
 
 
[auth.google]
針對google app的,呵呵
enabled = false
allow_sign_up = false
client_id = some_client_id
client_secret = some_client_secret
scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
auth_url = https://accounts.google.com/o/oauth2/auth
token_url = https://accounts.google.com/o/oauth2/token
api_url = https://www.googleapis.com/oauth2/v1/userinfo
allowed_domains =
 
 
[auth.basic]
enabled:當設置爲true,則http api開啓基本認證
 
 
[auth.ldap]
enabled:設置爲true則開啓LDAP認證,默認是false
config_file:若是開啓LDAP,指定LDAP的配置文件/etc/grafana/ldap.toml
 
 
[auth.proxy]
容許你在一個HTTP反向代理上進行認證設置
enabled:默認是false
header_name:默認是X-WEBAUTH-USER
header_property:默認是個名稱username
auto_sign_up:默認是true。開啓自動註冊,若是用戶在grafana DB中不存在
 
[analytics]
reporting_enabled:若是設置爲true,則會發送匿名使用分析到stats.grafana.org,主要用於跟蹤容許實例、版本、dashboard、錯誤統計。默認是true
google_analytics_ua_id:使用GA進行分析,填寫你的GA ID便可
 
 
[dashboards.json]
若是你有一個系統自動產生json格式的dashboard,則能夠開啓這個特性試試
enabled:默認是false
path:一個全路徑用來包含你的json dashboard,默認是/var/lib/grafana/dashboards
 
 
[session]
provider:默認是file,值還能夠是memory、mysql、postgres
provider_config:這個值的配置由provider的設置來肯定,若是provider是file,則是data/xxxx路徑類型,若是provider是mysql,則是user:password@tcp(127.0.0.1:3306)/database_name,若是provider是postgres,則是user=a password=b host=localhost port=5432 dbname=c sslmode=disable
cookie_name:grafana的cookie名稱
cookie_secure:若是設置爲true,則grafana依賴https,默認是false
session_life_time:session過時時間,默認是86400秒,24小時
 
 
如下是官方文檔沒有,配置文件中有的
[smtp]
enabled = false
host = localhost:25
user =
password =
cert_file =
key_file =
skip_verify = false
from_address = admin@grafana.localhost
 
[emails]
welcome_email_on_sign_up = false
templates_pattern = emails/*.html
 
 
[log]
mode:能夠是console、file,默認是console、file,也能夠設置多個,用逗號隔開
buffer_len:channel的buffer長度,默認是10000
level:能夠是"Trace", "Debug", "Info", "Warn", "Error", "Critical",默認是info
 
[log.console]
level:設置級別
 
[log.file]
level:設置級別
log_rotate:是否開啓自動輪轉
max_lines:單個日誌文件的最大行數,默認是1000000
max_lines_shift:單個日誌文件的最大大小,默認是28,表示256MB
daily_rotate:天天是否進行日誌輪轉,默認是true
max_days:日誌過時時間,默認是7,7天后刪除

注意的幾個點:web

  1. 對全部的資源都作request、limit限制,防止耗盡主機資源
  2. grafana的一些配置能夠經過變量傳入:如admin的密碼GF_SECURITY_ADMIN_PASSWORD
  3. 若是要對grafana的數據進行持久化,建議掛volume或者外部存儲,持久化的內容通常都是面板配置。監控面板的配置能夠導入導出
  4. securityContext:由於版本問題,若是提示grafana的權限不足,能夠配置runAsUser: 0

建立了grafana以後,能夠經過service暴露的端口地址查看頁面:sql

登陸成功後,會顯示須要初始化的內容docker

 

步驟二:配置數據源

grafana支持多種數據源,能夠在「type」的下拉框選項中看到,這裏咱們選擇prometheus做爲數據源。HTTP的訪問方式選擇proxy,URL填寫grafana能訪問到的地址。

由於grafana和prometheus都在同一個k8s集羣中,這裏用svc地址

 

點擊「save and test」測試鏈接性。

步驟三:建立面板

 

有了數據源,接下來就是如何更好地展現數據,grafana支持多種類型的圖表,如Graph、singlestat、Table等。能夠組合出多種形式。這裏先建立一個Demo,保存現有模板的快捷鍵是Ctrl + S

 

你的全部面板均可以在左上角的下拉框中找到:

咱們還能夠導入現有的面板(Dashboard),你們貢獻的模板地址:https://grafana.com/dashboards

 

選擇左上角的➕號,而後import,有兩種形式的導入:

  • URL直接導入:粘貼對應模板的url,前提是grafana必須能訪問外網。
  • 上傳json文件:通常是遷移時使用,把現有的json導出,再導入

grafana的面板、圖表有不少配置,接下來咱們說幾個經常使用的配置項

 

0x02 經常使用配置

示例:K8S的節點數量趨勢圖

編輯圖表時默認進入的是Metric,內容包括:

  1. Data Source:填寫剛剛配置過的數據源的名稱,這裏是prometheus
  2. A和B指的是這張圖有幾條線,這裏是A一條線、右側的小眼睛表明是否隱藏該線
  3. A線中,輸入框填寫的是查詢語句,這裏指合法的promsql,legend format指A線的顯示名稱

除了Metric以外,還有幾個選項,含義分別是:

  • General:通常是將其餘項都配置好後再回頭設置General,而在General配置標籤中通常只會用到「Title」,就是圖表的標題,如這裏的Node數量
Title:圖表標題;
Description:圖表描述;
Span:圖表間隔,無需設定,在前端可手動調整圖表大小;
Height:圖表高度,無需設定,在前端可手動調整圖表高度;
Transparent:背景是否透明,默認狀況下不勾選,若是以爲不須要深灰色背景,能夠勾選此項;
Templating和Drilldown / detail link用處不大,忽略便可。
  • Metric:比較重要,配指標表達式和指標線的地方,上邊已經舉例
  • Axes:配置數據軸的地方,如偏移縮放,格式轉換
  • Legend:圖例,是否限制以及顯示的方式
  • Display: 展現相關的配置,如線條寬度,排序方式、空值處理
  • Alert: 報警配置,grafana算是少有的展現圖表支持報警的,但他的報警只支持到單圖表,沒法嵌套模板,有點雞肋。如左上角有篩選node的下拉框,圖表又傳入了變量時,若是配置報警,是配置失敗的。報錯爲:「Template variables are not supported in alert queries」
  • TimeRange: 配置單圖表的展現時間,如24h內的數據
Override relative time:  覆蓋右上角選擇的時間,設置要顯示的時間範圍,這裏我設置24h(單位本身可選)。 
Add time shift:  這裏是偏移量設置,好比填寫2h表示不顯示最近2h的數據。 
Hide time ocerride info:  上邊相對時間設置以後在graph中會顯示本圖表的時間信息,在此處選擇後能夠把顯示的信息隱藏掉

更多詳細的配置能夠查看:https://grafana.com/docs/features/panels/graph/

 

變量配置:

對於一些複雜場景,可能須要傳入變量,若有多臺機器,每臺機器都要展現其cpu內存等指標。而機器列表又是動態的,這個時候就可使用變量,示例:

首先在該面板的setting中選擇variables,注意是該面板的設置,不是全局設置

 

填寫名稱,下拉框選項的數據獲取表達式,刷新週期,是否有ALL選項等,而後保存

接下來在具體的圖表中使用該變量

 

在metric中,將變量$Node寫在表達式中作匹配便可。

grafana的變量支持高級匹配,如$Node.*表明以Node開頭的字符,利用變量的方式,能夠實現多級篩選,知足更復雜的需求,如pod資源的查看

關於變量的更多信息:what-is-a-variable

 

0x03 報警配置

grafana在v4.0版本開始引入了報警功能。

仍是以Node節點數爲例,咱們配置一條規則:

當可用節點數小於3時,報警給demo@126.com

alert支持avg、sum等表達式,不過持續時間依賴數據自己的採集頻率。須要多測試一下。

Notifications:配置報警的收件組和詳細內容。而報警收件人的配置在專門的Alerting頁面上

Alert Rules:已經配置的報警規則,並展現其觸發狀態。

報警郵件的樣式:

 

模板變量報警

以上的報警配置方式只適合沒有變量傳入的圖表,若是遇到上邊提到的選擇node,傳入變量的圖表,就沒辦法支持了。

 

相關issue:https://github.com/grafana/gr...

官方對這個功能解釋了一堆,最新版本仍然沒有支持。借用issue的一句話哈哈哈

It would be grate to add templates support in alerts. Otherwise the feature looks useless a bit.

本文爲容器監控實踐系列文章,完整內容見:container-monitor-book

相關文章
相關標籤/搜索