Authored by htoooth

fix

... ... @@ -41,10 +41,17 @@ module.exports = {
sourceMap: {
domain: 'http://static-ci.yoho.cn'
},
report: {
reportApi: {
host: 'influxd.yoho.cn',
db: 'web-apm',
measurement: 'api-duration',
measurement: 'api-info',
duration: 2000,
records: 1
},
reportRoute: {
host: 'influxd.yoho.cn',
db: 'web-apm',
measurement: 'route-info',
duration: 2000,
records: 1
},
... ...
... ... @@ -11,28 +11,25 @@ class Message {
}
}
const opt = {
decodeURIComponent: decodeURIComponent
};
function parseMessage(line) {
let measurement = line.split(',', 1)[0];
let body = line.substring(measurement.length + 1);
let tokens = body.split(' ');
let [tags, fields, time] = [qs.parse(tokens[0], ',', '='), qs.parse(tokens[1], ',', '='), tokens[2]];
if (tags.route) {
try {
let [method, route] = tags.route.split(']');
route = crypto.decrypt(null, route);
tags.route = `${method}]${route}`;
} catch (e) {
logger.warn('parse message wrong ', tags.route);
}
}
let [tags, fields, time] = [qs.parse(tokens[0], ',', '=', opt), qs.parse(tokens[1], ',', '=', opt), tokens[2]];
return new Message(measurement, tags, fields, time);
}
function parse(data) {
data = data.replace(/\"([^\"]*)\"/g, (match) => {
return encodeURIComponent(match);
});
let lines = (data || '').split('\n');
let messages = lines.map(parseMessage);
... ...
... ... @@ -5,7 +5,6 @@ const MysqlSender = require('../lib/mysql-sender');
const _ = require('lodash');
const logger = global.yoho.logger;
const config = global.yoho.config;
const crypto = global.yoho.crypto;
const msg2row = require('./msg2row');
const durationType = {
... ... @@ -14,7 +13,9 @@ const durationType = {
fs: 'firstscreen'
};
const influxSender = new Sender(config.report);
const apiInfluxSender = new Sender(config.reportApi);
const routeInfluxSender = new Sender(config.reportRoute);
const slowRouterSender = new MysqlSender(config.table.slow);
const errorRouterSender = new MysqlSender(config.table.error);
... ... @@ -43,23 +44,11 @@ module.exports = (req, res, next) => {
reqID: item.rid,
uid: item.u,
udid: item.ud,
route: item.r,
path: item.pt
}
route: item.pt
},
time: new Date().getTime() * 1000000
};
if (item.r) {
try {
_.merge(data, {
tags: {
route: crypto.decrypt(item.r)
}
});
} catch (e) {
logger.warn('parse message wrong ', item.r);
}
}
sourceMapParse.parse({
fileUrl: item.sc,
line: parseInt(item.ln || 0, 10),
... ... @@ -104,29 +93,29 @@ module.exports = (req, res, next) => {
reqID: item.rid,
uid: item.u,
udid: item.ud,
route: item.r,
path: item.path
}
route: item.pt
},
time: new Date().getTime() * 1000000
};
if (item.r) {
try {
_.merge(data, {
tags: {
route: crypto.decrypt(item.r)
}
});
} catch (e) {
logger.warn('parse message wrong ', item.r);
}
}
if (durationType[item.tp]) {
if (item.type === 'api') {
apiInfluxSender({
measurement: 'api-info',
tags: {
app: item.app,
host: item.hostname,
api: item.api
},
field: {
duration: item.duration
}
});
} else if (item.type === 'route') {
const duration = _.parseInt(item.t);
if (duration < 1000 * 60 * 10) {
_.merge(data, {
measurement: 'web-client-duration',
measurement: 'route-info',
tags: {
type: durationType[item.tp]
},
... ... @@ -136,7 +125,17 @@ module.exports = (req, res, next) => {
}
});
influxSender.addMessage(data);
routeInfluxSender.addMessage({
measurement: 'route-info',
tags: {
app: item.app,
host: item.hostname,
route: item.path
},
field: {
duration: item.duration
}
});
if (duration > config.slowRoute.min || duration < config.slowRoute.max) {
slowRouterSender.addMessage(msg2row.slowRouter(data));
... ...
const _ = require('lodash');
const vars = require('./vars');
function slowRouter(m) {
return {
app: _.get(m, 'tags.app', ''),
type: _.get(m, 'tags.type', ''),
app: vars.APP_VALUE[_.get(m, 'tags.app', '')] || 1,
type: vars.TYPE_VALUE[_.get(m, 'tags.type', '')] || 1,
preq_id: _.get(m, 'fields.preqid', ''),
req_id: _.get(m, 'fields.reqID', ''),
uid: _.get(m, 'fields.uid', ''),
... ... @@ -16,8 +17,8 @@ function slowRouter(m) {
function errorRouter(m) {
return {
app: _.get(m, 'tags.app', ''),
type: _.get(m, 'tags.type', ''),
app: vars.APP_VALUE[_.get(m, 'tags.app', '')] || 1,
type: vars.TYPE_VALUE[_.get(m, 'tags.type', '')] || 1,
preq_id: _.get(m, 'tags.preqid', ''),
req_id: _.get(m, 'tags.reqID', ''),
uid: _.get(m, 'tags.uid', ''),
... ...
const APP_VALUE = {
yohobuy: 1,
yohobuywap: 2,
blk: 3,
blkwap: 4
};
const TYPE_VALUE = {
api: 1,
route: 2,
firstscreen: 3,
domready: 4,
documentload: 5
};
module.exports = {
APP_VALUE,
TYPE_VALUE
};
\ No newline at end of file
... ...