Grafana + Loki + Promtail 安裝紀錄( Windows Event Log 為範例)

安裝 Grafana

Grafana 是一個跨平台、開源的資料視覺化網路應用程式平台,使用者可透過組態設定來連接多個資料來源,並且在此平台內顯示資料圖表或警告等等,例如,將各伺服器的事件檢視器的 Log 統一發送到 Grafana 監控,底下為安裝步驟的紀錄。

  1. 下載 grafana-10.2.2.windows-amd64.msi OSS 版本 並安裝 。
  2. 因預設使用 3000 Port 會與我另外一個服務 Rendertron 衝突,故需要調整一下 Port,這邊用 3333,若沒有這個問題,可略過此步驟。
    • 調整設定檔 C:\Program Files\GrafanaLabs\grafana\conf\defaults.ini 內,找到 http_port 並調整為 3333。
      # The http port to use
      # http_port = 3000
      http_port = 3333
      
  3. 若有需要開啟外部連線,也記得要調整 defaults.ini 的設定,若只有不提供外部使用可忽略此步驟。
    # The public facing domain name used to access grafana from a browser
    domain = localhost # 若直接對外開放需要改成你的 Domain
    
    # Redirect to correct domain if host header does not match domain
    # Prevents DNS rebinding attacks
    enforce_domain = true
    
    # The full public facing url
    # 若有使用 reverse proxy server 進行轉址
    # 也請改成你的對外網址,顯示的 http 協定或 port 可能不正確
    root_url = https://你的Domain 
    # root_url = %(protocol)s://%(domain)s:%(http_port)s/
    
  4. 郵件設定,若你需要使用忘記密碼功能,defaults.ini 需進行此設定。
    [smtp]
    enabled = true
    host = smtppro.zoho.com:587 # 改成你的 email 服務商的設定
    user = 你的郵件帳號
    # If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
    password = *****
    ;cert_file =
    ;key_file =
    ;skip_verify = false
    from_address = 你的郵件帳號@com.tw
    from_name = PrimeEagleX Grafana
    ;ehlo_identity =
    ;startTLS_policy =
    
  5. 若要使用 Google 登入,defaults.ini 需進行此設定,詳細資訊可參考 https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/google/
    [auth.google]
    name = Google
    icon = google
    enabled = true
    allow_sign_up = false # 允許使用者透過 Google 驗證進行註冊,若要禁止所有使用者都可以直接註冊,此項目記得關閉
    auto_login = false
    client_id = CLIENT_ID
    client_secret = CLIENT_SECRET
    
  6. 若要使用 AD 登入,需進行底下設定。 
    • 舉例說明 AD 的結構如下圖,如果要找到 lawrence_shen 的 dn,則必須要這樣設定 cn=lawrence_shn,ou=資訊處,ou=高雄,ou=Taiwan,dc=pex,dc=org,關於 AD 的相關說明可參考 https://www.tpisoftware.com/tpu/articleDetails/1265

    • 必須要到 defaults.ini 開啟設定,請注意 config_file 的設定值,因為我的環境使用 Windows,所以需調整成實際的路徑。
      [auth.ldap]
      enabled = true
      # config_file = /etc/grafana/ldap.toml
      config_file = C\Service\GrafanaLabs\grafana\conf\ldap.toml
      allow_sign_up = true # 允許使用者透過 AD 驗證進行註冊,若要禁止所有使用者都可以直接註冊,此項目記得關閉
      
    • 進行 ldap.toml 的基本設定。
      2~3 行,AD 伺服器設定。
      7~8 行,能取得 AD 相關資訊的 DN 帳號設定。
      12~15,登入時的 AD 設定。
      20~25,成功登入寫入的資訊。
      [[servers]]
      host = "192.168.0.100" # 調整成你的 AD Server IP
      port = 389  # 依需求自行調整成 AD Server Port 
      
      # 這個設定是要讓 Grafana 可以讀取到組織資訊帳號的 DN 位置
      # 因為 syncorg的 AD 我放在 Users 底下,實際的 DN 位置須根據你的 AD 來設定
      bind_dn = "cn=syncorg,cn=Users,dc=pex,dc=org"
      bind_password = 'syncorg 的密碼'
      
      # 使用者登入要查詢的 AD 屬性欄位,我要根據 AD 帳號進行登入,所以調整成底下的設定
      # 實際要驗證的欄位須根據你的 AD 屬性來決定,預設是 "(uid=%s)"
      search_filter = "(sAMAccountName=%s)"
      
      # An array of base dns to search through
      search_base_dns = ["dc=pex,dc=org"]
      
      # Specify names of the ldap attributes your ldap uses
      # 使用者註冊後,Grafana 這裡對應的值來當作帳號的相關資訊
      [servers.attributes]
      name = "givenName"
      surname = "sn"
      username = "cn"
      member_of = "memberOf"
      # email =  "email"
      email =  "mail" # 要小心,我的環境這邊的屬性是 mail,也要記得調整
      
    • ldap.toml 的權限設定,因為比較重要獨立說明,若有指定 [[servers.group_mappings]],就必須設定權限,因此入不須的權限也要記得備註此設定,其餘相關說明如下。
      # 權限設定
      [[servers.group_mappings]] 
      # 系統管理員的 DN 群組,我的管理者統一放在 domain admins 底下
      group_dn = "cn=domain admins,cn=users,dc=pex,dc=org" 
      
      # 登入後的權限,預設有設定 Admin、Editor、Viewer
      org_role = "Admin"
      
      # To make user an instance admin  (Grafana Admin) uncomment line below
      # Grafana Admin 如下說明
      grafana_admin = true 
      
      # Grafana v10.1 版開始,會強制同步 organization role
      # 管理員無法從後台管理介面設定登人人員的 organization role
      # 如果有需要調整登入人員的 organization role,需要關閉強制同步的設定(改成 true)
      skip_org_role_sync = false
      
    • 若上述設定成功後,可以到Home → Administration → Authentication → LDAP,進行相關資訊確認,下圖為我的帳號的權限示意圖,綠框的部分只要符合 org_role = Admin 就擁有此權限,但紅框的部分則必須設定 grafana_admin = true 才會有權限

    • 一般管理者 & Grafana 管理者的部分差異可參考官網說明,在管理端可看底下示意圖。
      一般管理者權限

      Grafana 管理者權限

  7. 重新啟動服務。

  8. 可用底下網址來測試服務是否正確啟用。
    http://localhost:3333 
    
  9. 第一次登入畫面輸入的帳號密碼預設都是 admin
  10. 連結 Loki DataSource,若有問題可參考 https://github.com/grafana/loki/issues/4699
  11. 若使用 IIS 來當作 Reverse proxy 需進行底下 web.config 的設定,相關設定說明可參考此處
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration> 
        <system.webServer>    
            <rewrite> 
                <rule name="GrafanaLabs" stopProcessing="true">
                  <match url="(.*)" />
                  <conditions> 
                    <add input="{HTTP_HOST}" pattern="你的網域" /> 
                  </conditions>  
                  <action type="Rewrite" url="http://localhost:3000/{R:1}" />
                </rule> 
              </rules>
            </rewrite> 
        </system.webServer>
    </configuration>
    
  12. 若設定完 Reverse proxy 後登入收到 origin not allowed 的錯誤訊息,此為 IIS Issue,可執行底下的語法來排除,詳細說明請參考 此處 說明。
    %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost
    


使用雲端服務版本

  1. 註冊 Grafana 帳號並登入服務平台,例如 https://lawrence8358.grafana.net/a/cloud-home-app。
  2. 建立 Loki Data Sources,並取得 Basic Auth Details 內的帳號密碼,程式裡面需要用到。

  3. 設定 Explore 查詢條件,例如查詢錯誤如下圖所示。

  4. 亦可將此查詢條件設定到 Dashboard 內方便下次查看。
  5. 預設每次查詢最大筆數為 1000,若需調整也可修改此設定。

安裝 Loki 服務

Loki 主伺服器,負責攝取和儲存日誌以及處理查詢(如下圖流程),安裝步驟如下說明 https://grafana.com/docs/loki/latest/installation/local/

  1. 下載執行檔 Loki v2.8.6 loki-windows-amd64.exe.zip 並且解壓縮後放置指定資料夾 ex. D:\inetpub\Loki
  2. 下載 loki-local-config.yaml ,並放置到相同資料夾路徑。
  3. 修改 Log 的儲存資料夾(非必要,若有需求再調整即可)。
    auth_enabled: false
    
    server:
      # 對外端口
      http_listen_port: 3100
      grpc_listen_port: 9096
    
    common:
      instance_addr: 127.0.0.1
      # path_prefix: /tmp/loki
      path_prefix: D:\Service\GrafanaLoki\temp
      storage:
        filesystem:
          # chunks_directory: /tmp/loki/chunks
          # rules_directory: /tmp/loki/rules
          chunks_directory: D:\Service\GrafanaLoki\temp\chunks
          rules_directory: D:\Service\GrafanaLoki\temp\rules
      replication_factor: 1
      ring:
        kvstore:
          store: inmemory
    
    query_range:
      results_cache:
        cache:
          embedded_cache:
            enabled: true
            max_size_mb: 100
    
    schema_config:
      configs:
        - from: 2020-10-24
          store: tsdb
          object_store: filesystem
          schema: v12
          index:
            prefix: index_
            period: 24h
    
    # 保留設定,必須為 24h 的倍數
    table_manager:
      retention_deletes_enabled: true
      retention_period: 168h
    
    ruler:
      alertmanager_url: http://localhost:9093
      
    limits_config:
      # 每次查詢的最大條目數
      # https://github.com/grafana/loki/issues/2854
      max_entries_limit_per_query: 5000
    
  4. 啟動 loki .\loki-windows-amd64.exe --config.file=loki-local-config.yaml
  5. 若要使用 Windows Service 來使用,請搭配 NSSM nssm install 開啟如下圖的設定,來註冊服務,註冊完成後記得要啟用服務。

  6. 可用底下兩個網址來測試 Loki 服務是否正確啟用。
    http://localhost:3100/ready
    http://localhost:3100/metrics
    
  7. 更多 Loki 參數設定 https://grafana.com/docs/loki/latest/configure/
  8. Loki 本身沒有授權機制(至少我沒查到),建議的方案是使用 Reverse proxy 來處理授權。

安裝 Promtail

Promtail 是一個代理程式,負責傳送本地端的日誌到私有的 Loki 或者是 Grafana Cloud,並安裝在想要監控的應用程式的機器中。

圖片來源 : https://medium.com/@jieshiun/%E5%A6%82%E4%BD%95%E5%B0%87-windows-event-logs-%E6%8E%A8%E9%80%81%E5%88%B0-grafana-loki-f07806c400ef

  1. 下載執行檔 Promtail v2.8.6 promtail-windows-amd64.exe.zip 並解壓縮後放置指定的資料夾路徑,ex. D:\inetpub\Promtail
  2. 在該目錄底下新增 promtail-local-config.yaml 文件,底下為抓取 Windows Event Log 為例,相關參數如下。
    server:
      http_listen_port: 9080
      grpc_listen_port: 0
      log_level: "info" # 紀錄 Log 的等級,debug, info, warn, error,預設 info
    
    positions:
      filename: "./positions.yaml"
    
    clients:
      - url: http://localhost:3100/loki/api/v1/push
        
    scrape_configs:
    # 第一個任務
    - job_name: windows
      windows_events:
        use_incoming_timestamp: true # 保留原始事件發生的時間戳
        bookmark_path: "./bookmark-application.xml"
        eventlog_name: "Application"
        exclude_event_data: false # 排除 XML 事件數據
        exclude_user_data: true # 排除 Windows 事件的用戶數據 
        xpath_query: '*' 
        poll_interval: 3 # 檢查新事件的間隔,預設 3 秒檢查一次
        labels:
          logsource: WindowsEventlog
      # 將 computer 變更成 host Tag(原標籤還是會保留)
      # relabel_configs:
      #   - source_labels: ['computer']
      #     target_label: 'host'
      # 將指定的欄位貼上對應的標籤(方便後續 Grafana 查詢用)
      pipeline_stages:
      - json:
          expressions:
            Source: source 
            Level: level
            LevelText: levelText
      - labels:
          Source: 
          Level:
          LevelText:
    
  3. bookmark_path 負責記錄最後處理的事件,當 Promtail 重新啟動時,會從中斷的地方繼續讀取日誌。
    <BookmarkList>
      <Bookmark Channel='Application' RecordId='183616' IsCurrent='true'/>
    </BookmarkList>
    
  4. 啟動 promtail .\promtail-windows-amd64 --config.file=promtail-local-config.yaml
  5. 若要使用 Windows Service 來使用,請搭配 NSSM nssm install 開啟如下圖的設定,來註冊服務,註冊完成後記得要啟用服務。


參考連結

留言