Instrument some more metrics with prometheus

This commit is contained in:
Calvin Montgomery 2017-08-02 21:24:44 -07:00
parent 6043647cb7
commit cb6cfc8455
5 changed files with 55 additions and 1 deletions

View File

@ -2,7 +2,7 @@
"author": "Calvin Montgomery", "author": "Calvin Montgomery",
"name": "CyTube", "name": "CyTube",
"description": "Online media synchronizer and chat", "description": "Online media synchronizer and chat",
"version": "3.44.0", "version": "3.44.1",
"repository": { "repository": {
"url": "http://github.com/calzoneman/sync" "url": "http://github.com/calzoneman/sync"
}, },

View File

@ -7,6 +7,7 @@ var Flags = require("../flags");
var url = require("url"); var url = require("url");
var counters = require("../counters"); var counters = require("../counters");
import { transformImgTags } from '../camo'; import { transformImgTags } from '../camo';
import { Counter } from 'prom-client';
const SHADOW_TAG = "[shadow]"; const SHADOW_TAG = "[shadow]";
const LINK = /(\w+:\/\/(?:[^:\/\[\]\s]+|\[[0-9a-f:]+\])(?::\d+)?(?:\/[^\/\s]*)*)/ig; const LINK = /(\w+:\/\/(?:[^:\/\[\]\s]+|\[[0-9a-f:]+\])(?::\d+)?(?:\/[^\/\s]*)*)/ig;
@ -149,9 +150,14 @@ ChatModule.prototype.restrictNewAccount = function restrictNewAccount(user, data
return false; return false;
}; };
const chatIncomingCount = new Counter({
name: 'cytube_chat_incoming_count',
help: 'Number of incoming chatMsg frames'
});
ChatModule.prototype.handleChatMsg = function (user, data) { ChatModule.prototype.handleChatMsg = function (user, data) {
var self = this; var self = this;
counters.add("chat:incoming"); counters.add("chat:incoming");
chatIncomingCount.inc();
if (!this.channel || !this.channel.modules.permissions.canChat(user)) { if (!this.channel || !this.channel.modules.permissions.canChat(user)) {
return; return;
@ -281,6 +287,10 @@ ChatModule.prototype.handlePm = function (user, data) {
user.socket.emit("pm", msgobj); user.socket.emit("pm", msgobj);
}; };
const chatSentCount = new Counter({
name: 'cytube_chat_sent_count',
help: 'Number of broadcast chat messages'
});
ChatModule.prototype.processChatMsg = function (user, data) { ChatModule.prototype.processChatMsg = function (user, data) {
if (data.msg.match(Config.get("link-domain-blacklist-regex"))) { if (data.msg.match(Config.get("link-domain-blacklist-regex"))) {
this.channel.logger.log(user.displayip + " (" + user.getName() + ") was kicked for " + this.channel.logger.log(user.displayip + " (" + user.getName() + ") was kicked for " +
@ -350,6 +360,7 @@ ChatModule.prototype.processChatMsg = function (user, data) {
} }
this.sendMessage(msgobj); this.sendMessage(msgobj);
counters.add("chat:sent"); counters.add("chat:sent");
chatSentCount.inc();
}; };
ChatModule.prototype.formatMessage = function (username, data) { ChatModule.prototype.formatMessage = function (username, data) {

View File

@ -7,8 +7,17 @@ var util = require("./utilities");
import * as Metrics from './metrics/metrics'; import * as Metrics from './metrics/metrics';
import knex from 'knex'; import knex from 'knex';
import { GlobalBanDB } from './db/globalban'; import { GlobalBanDB } from './db/globalban';
import { Summary, Counter } from 'prom-client';
const LOGGER = require('@calzoneman/jsli')('database'); const LOGGER = require('@calzoneman/jsli')('database');
const queryLatency = new Summary({
name: 'cytube_db_query_latency',
help: 'DB query latency (including time spent acquiring connections)'
});
const queryCount = new Counter({
name: 'cytube_db_query_count',
help: 'DB query count'
});
let db = null; let db = null;
let globalBanDB = null; let globalBanDB = null;
@ -41,8 +50,11 @@ class Database {
runTransaction(fn) { runTransaction(fn) {
const timer = Metrics.startTimer('db:queryTime'); const timer = Metrics.startTimer('db:queryTime');
const end = queryLatency.startTimer();
return this.knex.transaction(fn).finally(() => { return this.knex.transaction(fn).finally(() => {
end();
Metrics.stopTimer(timer); Metrics.stopTimer(timer);
queryCount.inc();
}); });
} }
} }

View File

@ -13,8 +13,14 @@ var Streamable = require("cytube-mediaquery/lib/provider/streamable");
var GoogleDrive = require("cytube-mediaquery/lib/provider/googledrive"); var GoogleDrive = require("cytube-mediaquery/lib/provider/googledrive");
var TwitchVOD = require("cytube-mediaquery/lib/provider/twitch-vod"); var TwitchVOD = require("cytube-mediaquery/lib/provider/twitch-vod");
var TwitchClip = require("cytube-mediaquery/lib/provider/twitch-clip"); var TwitchClip = require("cytube-mediaquery/lib/provider/twitch-clip");
import { Counter } from 'prom-client';
const LOGGER = require('@calzoneman/jsli')('get-info'); const LOGGER = require('@calzoneman/jsli')('get-info');
const lookupCounter = new Counter({
name: 'cytube_media_lookup_count',
help: 'Count of media lookups',
labelNames: ['shortCode']
});
var urlRetrieve = function (transport, options, callback) { var urlRetrieve = function (transport, options, callback) {
var req = transport.request(options, function (res) { var req = transport.request(options, function (res) {
@ -541,6 +547,7 @@ module.exports = {
getMedia: function (id, type, callback) { getMedia: function (id, type, callback) {
if(type in this.Getters) { if(type in this.Getters) {
LOGGER.info("Looking up %s:%s", type, id); LOGGER.info("Looking up %s:%s", type, id);
lookupCounter.labels(type).inc();
this.Getters[type](id, callback); this.Getters[type](id, callback);
} else { } else {
callback("Unknown media type '" + type + "'", null); callback("Unknown media type '" + type + "'", null);

View File

@ -169,6 +169,7 @@ class IOServer {
} }
initSocketIO() { initSocketIO() {
patchSocketMetrics();
patchTypecheckedFunctions(); patchTypecheckedFunctions();
const io = this.io = sio.instance = sio(); const io = this.io = sio.instance = sio();
@ -194,6 +195,29 @@ class IOServer {
} }
} }
const incomingEventCount = new Counter({
name: 'cytube_socketio_incoming_events',
help: 'Number of received socket.io events from clients'
});
const outgoingPacketCount = new Counter({
name: 'cytube_socketio_outgoing_packets',
help: 'Number of outgoing socket.io packets to clients'
});
function patchSocketMetrics() {
const onevent = Socket.prototype.onevent;
const packet = Socket.prototype.packet;
Socket.prototype.onevent = function patchedOnevent() {
onevent.apply(this, arguments);
incomingEventCount.inc();
};
Socket.prototype.packet = function patchedPacket() {
packet.apply(this, arguments);
outgoingPacketCount.inc();
};
}
/* TODO: remove this crap */ /* TODO: remove this crap */
function patchTypecheckedFunctions() { function patchTypecheckedFunctions() {
Socket.prototype.typecheckedOn = function typecheckedOn(msg, template, cb) { Socket.prototype.typecheckedOn = function typecheckedOn(msg, template, cb) {