AI考拉技術分享-Node基礎架構專題(三)

前言

轉眼新年過了,開始了搬磚的日子。在這裏給你們拜個晚年,送上一些小知識,但願你們好搬磚!html

klg-tracer

鏈路追蹤工具,base on pandoranode

Installation

npm install klg-tracer
複製代碼

Node.js >= 8.2.1 required.git

Features

Pandora 提供基於 OpenTracing 標準的鏈路追蹤信息,在此基礎上,klg-tracer 自定義了一些 tags,並支持將 tracer 信息寫入 mongo。github

QuickStart

1、配合 Pandora 使用,自定義tags

TODOmongodb

  1. export 拓展好的類
  2. 覆蓋 Pandora 的默認配置

2、將 tracer 結果寫入 Mongo

app.tstypescript

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/domainnpm

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 表中。json

Search:api

db.tracer.find({name : 'http-server'}).sort({_id : -1})
複製代碼

Result:bash

{
    "_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

  1. http server
  • http.method
  • http.path // path
  • http.query // query string
  • http.data // post body, only json
  • http.response
  1. 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
  1. mongo todo

Test

$ npm i
$ npm test
複製代碼

How it works

tracer

implements session with async_hooks and cls-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()
複製代碼

詳情見此 issue github.com/midwayjs/pa…

2 mongodb nodejs driver 3.0 版本升級了 apm 的實現,Pandorajs 還未支持 詳情見此 issue github.com/midwayjs/pa…


著做權歸本文做者全部,未經受權,請勿轉載,謝謝。

相關文章
相關標籤/搜索