博客 / 詳情

返回

Cloudtop 開源前端性能監控系統設計與開發一(簡述)

Cloudtop 前端監控系統是一套集流量監控、錯誤監控、性能監控、接口監控於一體的監控平台;目前支持 Web 端接入。

Github 地址:

https://github.com/zhedh/cloudtop

一、項目介紹

.
├── Dockerfile
├── README.md
├── cloudtop
├── cloudtop_monitor
├── cloudtop_monitor_server
├── cloudtop_server
├── init.sh
├── package.json
└── start.sh

cloudtop 前端性能監控探針

用於收集和分析網頁或 Web 應用在前端運行時的性能數據。通過對這些數據的分析,開發人員可以識別性能瓶頸,優化用户體驗,提高網頁加載速度和交互效率。

前端性能監控探針會蒐集下面幾個方面的數據信息:

  • 頁面加載時間:監控頁面從開始加載到完全加載所需的時間,包括 DNS 查詢、TCP 連接、請求和響應時間等。
  • 資源加載:跟蹤 HTML、CSS、JavaScript、圖片等資源的加載時間,瞭解哪些資源耗時較長。
  • 渲染時間:測量頁面渲染的時間,包括首屏時間、白屏時間等。
  • 用户交互響應:收集用户與頁面交互時的響應時間,如點擊按鈕、輸入數據等。
  • 錯誤監控:捕獲 JavaScript 錯誤、網絡請求失敗等異常情況。

cloudtop_server 前端性能日誌接收服務

用於接收、處理和存儲前端應用發送的日誌數據的服務。負責對前端發送的日誌進行有效的管理。

主要功能:

  • 提供的 API 接口,用於接收前端發送的日誌數據。
  • 對接收到的日誌數據進行解析,以便於後續處理。
  • 將解析後的日誌數據存儲到數據庫或日誌文件系統中。

cloudtop_monitor_server 前端性能監控數據檢索服務

提供用户查詢和分析前端性能監控數據的服務。

主要功能:

  • 提供 API,允許用户查詢性能數據。
  • 用於分析性能數據,生成報告和可視化圖表。
  • 根據性能數據設置閾值,當性能指標超過閾值時發送告警通知。
  • 用户權限管理。

cloudtop_monitor 前端性能監控數據大盤

前端監控綜合性的數據展示界面,彙總並可視化前端性能監控的關鍵指標和數據,以便於開發者和運維團隊快速瞭解前端應用的性能狀況。

主要功能:

  • 實時性能指標:顯示當前應用的實時性能數據,如頁面加載時間、響應時間、錯誤率等。
  • 歷史性能趨勢:展示性能指標隨時間變化的趨勢圖,幫助用户發現性能變化的趨勢和週期性波動。
  • 地域分佈:顯示不同地區用户的性能體驗,幫助識別地域性性能問題。
  • 設備類型分佈:展示不同設備類型(如桌面、移動設備)的性能數據,以便優化特定設備的用户體驗。
  • 頁面性能分佈:顯示不同頁面或視圖的性能數據,幫助識別性能瓶頸所在的頁面。
  • 錯誤統計:統計不同類型的錯誤發生次數和頻率,幫助定位和解決前端錯誤。
  • 用户行為分析:分析用户在前端應用中的行為模式,如頁面停留時間、點擊熱力圖等。
  • 性能閾值告警:設置性能指標的閾值,當指標超過閾值時發出告警,以便及時處理性能問題。

二、系統整體框架圖

image.png

三、項目部署

環境要求

nodejs + typescript + pm2
  • Node >= 16

下載(clone)項目源碼

git clone https://github.com/zhedh/cloudtop.git

環境變量配置

修改根目錄下 .env 文件,改成自己項目的配置

環境變量説明如下:

變量 描述 必填 默認值
CLOUDTOP_ELASTIC_NODE Elastic 連接 必填 -
CLOUDTOP_ELASTIC_USERNAME Elastic 賬號 必填 -
CLOUDTOP_ELASTIC_PASSWORD Elastic 密碼 必填 -
CLOUDTOP_ELASTIC_INDEX Elastic 索引 必填 -
CLOUDTOP_ELASTIC_TYPE Elastic 類型 必填 -
CLOUDTOP_DATABASE_HOST Mysql 主機 必填 -
CLOUDTOP_DATABASE_PORT Mysql 端口號 必填 -
CLOUDTOP_DATABASE_USER Mysql 賬號 必填 -
CLOUDTOP_DATABASE_PASSWORD Mysql 密碼 必填 -
CLOUDTOP_DATABASE_DATABASE Mysql 數據庫名 必填 -
VITE_PORT cloudtop_monitor 應用端口號 可選 8000
VITE_BASE_URL 接口域名 ,即 cloudtop_monitor_server 域名 必填
VITE_SHA1_SALT cloudtop_monitor 應用 sha1 key 可選 代碼指定
CLOUDTOP_MONITOR_SERVER_PORT cloudtop_monitor_server 應用端口號 可選 3100
CLOUDTOP_SERVER_PORT cloudtop_server 應用端口號 可選 3000

初始化項目

首次運行項目時執行

  • 全局安裝 pm2、typescript
  • 安裝項目依賴
npm run init

啓動項目

npm run start

查看日誌

pm2 log

Docker 部署

支持 Docker 部署,可根據需要修改 Dockerfile 文件。

  • 項目端口號需要在 Dockerfile 中 EXPOSE

四、創建項目

部署完成後,打開 cloudtop_monitor 監控面板應用,新建項目

image.png

  • 項目類型:目前僅支持 Web 項目接入
  • 項目標識:接入探針的應用唯一標識,請填寫英文字母或者數字,如 cloudtop_monitor
  • 項目名稱:接入探針的應用名稱

五、安裝探針

探針腳本打包

本項目使用 pnpm 包管理工具

# 進入到探針項目
cd cloudtop

# 安裝依賴
pnpm install

# 打包產物
pnpm build

Script 植入

1.複製探針代碼( cloudtop/packages/cloudtop/dist 路徑下的 cloudtop.iife.js 或 cloudtop.umd.js),將生產環境探針代碼插入到 head 標籤的最頂部

<head>
  <script>
    var Cloudtop=function()...
  </script>
</head>

2.探針初始化

字段 類型 必填 描述 示例
baseURL string 必填 日誌上報地址 http://localhost:3000
projectId string 必填 項目標識(項目 CODE,需與監控面板中的項目匹配) cloudtop_monitor
env string 必填 項目環境 ProjectEnv production
reportType string 可選 上報方式 ReportType beacon

ProjectEnv 枚舉

描述
production 生產環境
staging 預發環境
testing 測試環境
development 開發環境

ReportType 枚舉,默認 beacon

描述
beacon navigator.sendBeacon
img 圖片上報
xhr XMLHttpRequest
window.cloudtop = new Cloudtop({
  baseURL: 'http://localhost:3000',
  projectId: 'cloudtop_monitor',
  env: 'production', // 上報環境
  reportType: 'beacon', // 上報方式
})

3.對於單頁應用,路由變化需要調用 routeChange 方法,觸發 PV 上報

// pathname 推薦使用頁面路徑,可自定義
window.cloudtop.routeChange(pathname)

4.部分日誌服務可能不支持獲取客户端 ID,需要前端調用接口獲取後上報

  • 日誌服務支持獲取客户端 IP,可忽略
  • 根據項目需要客户端 IP 可選上報

上報示例如下

/**
 * 獲取客户端IP,用於性能監控
 */
const getClientIp = async () => {
  const { status, data } = await axios.get('https://api.ip.sb/geoip')
  if (status === 200) {
    window.cloudtop.setConfig({ clientIp: data.ip })
  }
}

NPM 接入

1.安裝

npm install cloudtop --save

2.引入

import Cloudtop from 'cloudtop'

const cloudtop = new Cloudtop({
  baseURL: 'http://localhost:3000',
  projectId: 'cloudtop-monitor',
  env: 'testing',
  reportType: 'beacon',
})

3.方法調用同 Script 植入

cloudtop.routeChange(pathname)
cloudtop.setConfig({ clientIp: data.ip })

六、監控面板截圖

首頁

image.png

概覽

image.png

健康狀況

image.png

訪問分佈圖

image.png

頁面性能

image.png

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.