Tencent Server Web(TSW) 是一套面向WEB 前端開發者,以提升問題定位效率為初衷,提供染色抓包和全息日誌的Node.js 基礎設施。 TSW 關注業務的運維監控能力,適用於http、https 協議的業務場景,可無縫與現有應用(Koa、Express)進行整合。
TSW 2.0 在1.0 的基礎上抽絲剝繭,輔以現代化的設計模式,去除了1.0 中的大量糟粕,同時對容器化、雲原生更加友好。做到了無侵入、低成本接入。
0 侵入 | ?全息日誌 | ?請求抓包 |
|---|---|---|
| 通過Hack NodeJS 底層代碼實現功能。對原有業務代碼0 侵入。 | 按照請求聚類的顯微鏡級別的全息日誌,給開發者完美的現場還原。 | 可抓取Server 端向外部發送的所有請求的完整包體內容,與後台溝通再無障礙。 |
npm install --save @tswjs/tsw
// yarn add @tswjs/tsw配置文件是TSW 啟動時加載進運行時的配置文件,主要聲明需要使用的插件列表。默認會加載項目根目錄下的tswconfig.js文件,也可以通過啟動參數-c或者--config來手動指定配置文件路徑。
注意事項: 2.0 中沒有集成開放平台相關邏輯,而是封裝成了一個插件讓用戶按需使用,詳情見插件章節。
配置文件示例:
module . exports = {
plugins : [
new MyPlugin ( { } )
]
}參數列表:
| Name | Type | default | Optional | Description |
|---|---|---|---|---|
| plugins | Array<Plugin> | - | yes | 插件列表 |
| cleanLog | boolean | false | yes | 是否關閉默認打印 |
| logLevel | DEBUG/INFO/WARN/ERROR | DEBUG | yes | 設置log level |
| winstonTransports | Array<TransportStream> | - | yes | Winston日誌通道 |
npx @tswjs/tsw ./index.js注意事項:原先node --inspect ./index.js中的CLI 參數如--inspect需要轉化為環境變量NODE_OPTIONS來執行,如NODE_OPTIONS="--inspect" npx @tswjs/tsw ./index.js 。
使用ts : 在保證項目有ts-node 依賴包的情況下,按照如下方式執行即可直接加載ts 文件。
NODE_OPTIONS= " --require=ts-node/register " npx @tswjs/tsw ./index.ts使用npx @tswjs/tsw --help來獲取CLI 選項。
我們提供了一些示例項目以讓大家盡快了解該項目。
cd ~git clone https://github.com/Tencent/TSW.gitcd TSWcd examples/koayarnyarn serve或者npm run servecurl -v localhost:4443/path/to/foo -X POST -d "hello, server" TSW 核心的實現方式是Hack NodeJS 自身的http.request以及http.createServer , 以此來實現抓包機制。在服務器處理請求的前後,在服務器向其他服務器發包的前後,等等,都會有相應的事件拋出,以供用戶來進行自定義處理。為了讓用戶更加方便地複用、傳播這樣一組組自定義處理,我們將他們抽像出來,形成了插件機制。
export . modules = class MyPlugin ( ) {
constructor ( ) {
this . name = "MyPlugin"
}
async init ( eventBus , config ) {
eventBus . on ( "RESPONSE_CLOSE" , ( payload ) => {
console . log ( payload ) ;
} )
}
} init方法是必須的,這個方法在插件加載開始時會被調用,可以是同步也可以是異步。
eventBus eventBus是通過new EventEmitter()得到的。 TSW 核心會在各個關鍵時機觸發上面的事件。
| key | 含義(觸發時機) | payload |
|---|---|---|
DNS_LOOKUP_SUCCESS | 在每次DNS 查詢成功之後觸發 | string | dns.LookupAddress[] |
DNS_LOOKUP_ERROR | 在每次DNS 查詢失敗之後觸發 | NodeJS.ErrorException |
RESPONSE_START | 在每次服務器開始返迴響應(執行writeHead )時觸發 | ResponseEventPayload |
RESPONSE_FINISH | 在響應結束時( res.on("finish") )觸發 | ResponseEventPayload |
RESPONSE_CLOSE | 在底層鏈接關閉時( res.on("close") )觸發 | ResponseEventPayload |
REQUEST_START | 在每次服務器接受到新的請求時觸發 | RequestEventPayload |
在默認的情況下,TSW 只是會把所有的日誌和抓包內容抓取到並且送到事件總線上,以供插件消費。所以將日誌和抓包內容落地查看一般需要用戶自己編寫插件以及提供存儲,使用成本過於高昂。
因此,TSW 官方提供了公共的服務平台https://tswjs.org,讓用戶低成本、更快、更方便地使用TSW 的特性,詳情見開放平台使用指引。
TSW 2.0 是面對容器化和雲原生設計的,所以沒有內置Cluster 相關功能,推薦直接使用容器的健康檢查來完成服務的無損重啟和故障重啟機制。對於沒有使用容器化方案的場景來說,我們推薦使用pm2 類似工具來實現多進程模式。
// ecosystem.config.json
{
"apps" : [
{
"name" : "app-name" ,
"script" : "built/index.js" ,
"interpreter" : "node" ,
"interpreter_args" : "./node_modules/@tswjs/tsw/dist/cli.js" ,
// other options
}
]
} // package.json
{
...
"scripts" : {
"start" : "pm2 start ecosystem.config.json"
} ,
...
} winston是一個通用且輕量的日誌包。 winston支持多個日誌通道,並且可以分別定義日誌優先級。除了內置的三個日誌傳輸通道Console 、 File 、 HTTP ,在Winston 項目外部還會維護一些傳輸模塊。查看winston官方文檔。
TSW 2.0 支持使用winston傳輸通道記錄日誌信息,用戶在配置文件中可以添加winston.transports實例,日誌會落到對應配置中。
使用winston記錄error級別以及debug級別以下的日誌信息到對應文件中,當前config文件配置如下:
module . exports = {
winstonTransports : [
new winston . transports . File ( { filename : 'error.log' , level : 'error' } ) ,
new winston . transports . File ( { filename : 'debug.log' , level : 'debug' } )
]
}日誌記錄




























Tencent Server Web 的開源協議為MIT, 詳情參見LICENSE 。