AI考拉技術分享-Node基礎架構專題(三)
轉眼新年過了,開始了搬磚的日子。在這裡給大家拜個晚年,送上一些小知識,希望大家好搬磚!
klg-tracer
鏈路追蹤工具,base onpandora
Installation
npm install klg-tracer 複製程式碼
Node.js >= 8.2.1 required.
Features
Pandora 提供基於 OpenTracing 標準的鏈路追蹤資訊,在此基礎上,klg-tracer 自定義了一些 tags,並支援將 tracer 資訊寫入 mongo。
QuickStart
一、配合 Pandora 使用,自定義tags
TODO
- export 拓展好的類
- 覆蓋 Pandora 的預設配置
二、將 tracer 結果寫入 Mongo
app.ts
import {TraceService, Tracer} from 'klg-tracer' new TraceService().registerHooks({ httpServer: { useKoa:true, // 在 koa 設定鉤子,比直接在 http 層設定鉤子穩定 // 過濾器,只記錄特定介面, 注意 return true 的才會被過濾 requestFilter: function (req) { const urlParsed = url.parse(req.url, true); return urlParsed.pathname.indexOf('product/') === -1; } } }).registerMongoReporter({ mongoUrl: config.database.mongodb[0].url, collectionName: 'tracer' }); 複製程式碼
完整的配置可以見 src/domain
interface TracerOptions { httpServer?: { recordGetParams?: boolean,// 是否記錄 query recordPostData?: boolean,// 是否記錄 post data recordResponse?: boolean,// 是否記錄 response requestFilter?: requestFilter,// 過濾器 interceptor?: interceptor// 中介軟體 TODO }, httpClient?: { enabled: boolean, options?: { recordGetParams?: boolean, recordPostData?: boolean, recordResponse?: boolean } }, mongodb?: { enabled: boolean, options?: any } } 複製程式碼
啟動你的 Web 服務並訪問,相關的請求資訊將會寫入 tracer 表中。
Search:
db.tracer.find({name : 'http-server'}).sort({_id : -1}) 複製程式碼
Result:
{ "_id" : ObjectId("5ad99bd3f29cf14de64516b3"), "tags" : { "httpMethod" : "POST", "url" : "/api/v1/account/register", "data" : { "userId" : "5527da927855af35354c39eb", "userRole" : "INVESTOR" }, "response" : { "code" : 0, "message" : "success", "data" : { "html" : "html" } } }, "traceId" : "6e11fe95c2035a7a", "name" : "http-server", "timestamp" : 1524210643694.0, "duration" : 152, "createdAt" : ISODate("2018-04-20T07:50:43.874Z"), "updatedAt" : ISODate("2018-04-20T07:50:43.874Z"), "__v" : 0 } 複製程式碼
Tracer tags
- http server
- http.method
- http.path// path
- http.query// query string
- http.data// post body, only json
- http.response
- http client
- http.method
- http.url// path
- http.hostname// send to where
- http.port
- http.query
- http.data
- http.response
- http.response_size
- http.status_code
- http.error_code
- mongo todo
Test
$ npm i $ npm test 複製程式碼
How it works
tracer
implements session withasync_hooks andcls-hooked
hook
serve : hack http createServer method, register listener.
http-client : hack http request method, register listener.
ChangeLog
3.0.0
- 基於 Pandorajs 重做,目前只提供 http-server http-client mongo 三個位置的監聽
1.2.0
- koa-server hook add requestFilter options
1.1.0
- koa-server hook add intercept options
1.0.3
- http-client hook trace request parameters and response
1.0.0
- add http-server koa-server hook
- add http-client hook
- add mongo report
常見問題
1 thenable 函式會 break cls 的上下文,像 mongoose 和 superagent 都是在 prototype 裡新增 then function 來支援 Promise 的,所有都會有這個問題。 目前只能通過改變寫法來避免這個問題,例如:
break session
await User.findOne({}) 複製程式碼
work
await User.findOne({}).then() 複製程式碼
詳情見此 issuegithub.com/midwayjs/pa…
2 mongodb nodejs driver 3.0 版本升級了 apm 的實現,Pandorajs 還未支援 詳情見此 issuegithub.com/midwayjs/pa…
著作權歸本文作者所有,未經授權,請勿轉載,謝謝。