Node服务接入点评Cat监控之egg-cat-client插件接入指南


Cat是大众点评用于对服务端应用进行业务监控的一整套系统,具体可以直接参考他们的github有非常详细的介绍,这里只是单独将Node服务接入Cat的流程整理出来,并介绍了为Egg编写的客户端插件egg-cat-client


系统支持

OSX (>=10.13)
Alpine linux
CentOS 6
CentOS 7
Ubuntu 14.04 LTS
Ubuntu 16.04 LTS
Ubuntu 18.04 LTS

node版本

node v8+

准备工作

下载Cat代码到本地
git clone git@github.com:dianping/cat.git
编译libcatclient动态库

查看lib/node.js/binding.gyp的c库依赖,发现node包的安装需要依赖一个lcatclient的动态链接库,这里需要先编译出这个库并加载到系统中。

{
    "targets": [
        {
            "target_name": "nodecat",
            "sources": [
                "src/nodecat.cc",
            ],
            "include_dirs": [
                "include"
            ],
            "libraries": [
                "-lcatclient"
            ]
        }
    ]
}
  1. 需要安装一个支持C99或者C编译器,Mac直接安装Xcode就可以。
  2. 需要安装cmake和make,这个用来构建动态链接库的工具。
  3. 进入lib/c目录并执行下面的命令:
1. mkdir -p cmake
2. cd cmake 
3. cmake ..  
4. make -j
5. make install

上面👆执行完成后,libcatclient.so (或Mac下 libcatclient.dylib)已经安装到LD_LIBRARY_PATH目录下,大多数情况下是 /usr/local/lib

安装node cat client
npm i @dp-cat/client
cat环境配置

cat的client所链接的cat server并不是在代码里面进行设置的,而是cat的默认系统目录/data进行配置的:

  1. 创建/data/appdatas/cat目录并保证读写权限。
  2. 创建/data/applogs/cat目录并保证读写权限。
  3. 创建/data/appdatas/cat/client.xml配置文件:
<?xml version="1.0" encoding="utf-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
    <servers>
        <server ip="<cat server ip address>" port="2280" http-port="8080" />
    </servers>
</config>

根据上面👆的配置文件,配置cat client所连接的server。这样所有的准备工作就完成了,可以在业务代码中直接使用了。

cat使用

cat中已经包含了使用的examples,可以直接查看:

Transaction
var cat = require('@dp-cat/client')

cat.init({
    appkey: 'nodecat'
})

cat = new cat.Cat(true)

let t = cat.newTransaction('foo', 'bar')
t.addData("key", "val")
t.addData("context")
t.setStatus(cat.STATUS.SUCCESS)
setTimeout(() => t.complete(), 3000)
Event
var cat = require('@dp-cat/client')

cat.init({
    appkey: 'nodecat'
})

// Log a event with success status and empty data.
cat.logEvent("Event", "E1")

// The 3rd parameter (status) is optional, default is "0".
// It can be any of string value.
// The event will be treated as "problem" unless the given status == cat.STATUS.SUCCESS ("0")
// which will be recorded in our problem report.
cat.logEvent("Event", "E2", cat.STATUS.FAIL)
cat.logEvent("Event", "E3", "failed")

// The 4th parameter (data) is optional, default is "".
// It can be any of string value.
cat.logEvent("Event", "E4", "failed", "some debug info")

// The 4th parameter (data) can also be an object
// In this case, the object will be dumped into json.
cat.logEvent("Event", "E5", "failed", {a: 1, b: 2})
Error
var cat = require('@dp-cat/client')

cat.init({
    appkey: 'nodecat'
})

cat.logError('ErrorInTransaction', new Error())

这样我们在cat的web端(http://<cat server ip address>:8080/cat/r)就可以看到相应的数据了。

Egg的支持

这里为egg的服务端封装了一个插件egg-cat-client,可以方便egg的应用直接接入cat:

安装
$ npm i egg-cat-client --save
使用
// {app_root}/config/plugin.js
exports.catClient = {
  enable: true,
  package: 'egg-cat-client',
};
配置
// {app_root}/config/config.default.js
exports.catClient = {
    appKey: '<your application name>'
    connection: {
        ip:'127.0.0.1', // ip与host同时存在的话优先用ip
        host: 'xxx.xxx.xx', //host 和 ip只要填其中一个即可如果, 
        port: '2208',
        http-port: '8080'
    }
}; 
// {app_root}/app.js
 
module.exports = app => {
  app.beforeStart(async () => {
    app.cat = app.catFactory.createClient(app.config.catClient.appKey, {});
    await app.cat.ready(true);
  });
};
代码嵌入
class HomeController extends Controller {
  async index() {
    this.ctx.body = 'hi, egg';

    // 获取初始化好的cat对象
    const cat = this.ctx.app.catClient;
    const threadCat = new cat.Cat(true);
    //创建一个transaction实例
    const trans = threadCat.newTransaction('TestTran', 'DDD');
    //添加数据
    trans.addData('key', 'value');
    trans.logEvent('EventTransaction', 'E1111');
    const subTrans = a.newTransaction('TestSubTran', 'GGGGG');
    subTrans.addData('subKey', 'subValue');
    trans.setStatus(cat.STATUS.SUCCESS);
    setTimeout(function() {
      trans.complete();
    }, 1000);

    // Event 
    cat.logEvent('Event', 'E1');
    cat.logEvent('Event', 'E2', cat.STATUS.FAIL);
    cat.logEvent('Event', 'E3', 'failed');
    // Error
    cat.logError('ErrorInTransaction', new Error());
  }
}

module.exports = HomeController;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 个人专题目录 Dianping CAT 安装说明文档 CAT基于Java开发的实时应用监控平台,包括实时应用监控,...
    Java及SpringBoot阅读 5,348评论 0 2
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,688评论 0 10
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,792评论 0 5
  • 在实现 egg + vue 服务端渲染工程化实现之前,我们先来看看前面两篇关于Webpack构建和Egg的文章: ...
    hubcarl阅读 5,983评论 0 19
  • 今早抽到的牌是倒立的宝剑9,提示我要留意自己的潜意识了,留意自己的梦告诉了我什么。 只是,昨夜好像...
    木木碎碎念哇阅读 248评论 0 0