Skip to content

Commit 2cd54fc

Browse files
committed
Add nodered node timing metrics
1 parent 87a953a commit 2cd54fc

9 files changed

Lines changed: 75 additions & 11 deletions

OpenFlowNodeRED/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openflow-nodered",
3-
"version": "1.1.81",
3+
"version": "1.1.82",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {

OpenFlowNodeRED/src/Config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export class Config {
6262
Config.tls_passphrase = Config.getEnv("tls_passphrase", "");
6363

6464
Config.amqp_message_ttl = parseInt(Config.getEnv("amqp_message_ttl", "20000"));
65+
Config.prometheus_max_node_time_seconds = parseInt(Config.getEnv("prometheus_max_node_time_seconds", "300"));
6566
}
6667
public static version: string = Config.getversion();
6768
public static logpath: string = Config.getEnv("logpath", __dirname);
@@ -119,6 +120,8 @@ export class Config {
119120
// public static amqp_dlrk_prefix: string = Config.getEnv("amqp_dlrk_prefix", "dlx.");
120121
// public static amqp_dlq_prefix: string = Config.getEnv("amqp_dlq_prefix", "dlq.");
121122
public static amqp_message_ttl: number = parseInt(Config.getEnv("amqp_message_ttl", "20000"));
123+
public static prometheus_max_node_time_seconds: number = parseInt(Config.getEnv("prometheus_max_node_time_seconds", "300"));
124+
122125

123126

124127
public static baseurl(): string {

OpenFlowNodeRED/src/WebServer.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ export class WebServer {
2727
private static _logger: winston.Logger;
2828
private static app: express.Express = null;
2929

30+
public static openflow_nodered_node_count = new client.Counter({
31+
name: 'openflow_nodered_node_count',
32+
help: 'Total number of node calls',
33+
labelNames: ["nodetype"]
34+
})
35+
public static openflow_nodered_node_duration = new client.Histogram({
36+
name: 'openflow_nodered_node_duration',
37+
help: 'Duration of each node call',
38+
labelNames: ["nodetype"],
39+
buckets: [0.1, 0.3, 0.5, 0.7, 1, 3, 5, 7, 10]
40+
})
41+
42+
public static log_messages: any = {};
3043
private static settings: nodered_settings = null;
3144
static async configure(logger: winston.Logger, socket: WebSocketClient): Promise<http.Server> {
3245
this._logger = logger;
@@ -49,6 +62,10 @@ export class WebServer {
4962
register.setDefaultLabels(defaultLabels);
5063
client.collectDefaultMetrics({ register })
5164

65+
if (!NoderedUtil.IsNullUndefinded(register)) register.registerMetric(WebServer.openflow_nodered_node_count);
66+
if (!NoderedUtil.IsNullUndefinded(register)) register.registerMetric(WebServer.openflow_nodered_node_duration);
67+
68+
5269
const metricsMiddleware = promBundle({ includeMethod: true, includePath: true, promRegistry: register, autoregister: true });
5370
this.app.use(metricsMiddleware);
5471
// this.app.use(morgan('combined', { stream: (winston.stream as any).write }));
@@ -121,6 +138,50 @@ export class WebServer {
121138
else {
122139
this.settings.uiPort = Config.port;
123140
}
141+
this.settings.logging.customLogger = {
142+
level: 'debug',
143+
metrics: true,
144+
handler: function (settings) {
145+
//
146+
// Return the logging function
147+
// return function (msg) {
148+
// console.log(msg.timestamp, msg.event);
149+
// }
150+
return function (msg) {
151+
if (!NoderedUtil.IsNullEmpty(msg.msgid) && msg.event.startsWith("node.")) {
152+
msg.event = msg.event.substring(5);
153+
if (msg.event.endsWith(".receive")) {
154+
msg.event = msg.event.substring(0, msg.event.length - 8);
155+
msg.end = WebServer.openflow_nodered_node_duration.startTimer()
156+
WebServer.openflow_nodered_node_count.labels(msg.event).inc();
157+
WebServer.log_messages[msg.msgid] = msg;
158+
}
159+
if (msg.event.endsWith(".send")) {
160+
msg.event = msg.event.substring(0, msg.event.length - 5);
161+
const startmessage = WebServer.log_messages[msg.msgid];
162+
if (!NoderedUtil.IsNullUndefinded(startmessage)) {
163+
startmessage.end({ nodetype: startmessage.event });
164+
delete WebServer.log_messages[msg.msgid];
165+
}
166+
}
167+
const keys = Object.keys(WebServer.log_messages);
168+
keys.forEach(key => {
169+
const meg = WebServer.log_messages[key];
170+
var from = new Date(msg.timestamp);
171+
const now = new Date();
172+
const seconds = (now.getTime() - from.getTime()) / 1000;
173+
if (seconds > Config.prometheus_max_node_time_seconds) {
174+
console.log("Deleting message " + key + " that is more " + seconds + " seconds old");
175+
delete WebServer.log_messages[key];
176+
}
177+
});
178+
// } else {
179+
// console.log(msg);
180+
}
181+
// console.log(msg.timestamp, msg.event);
182+
}
183+
}
184+
}
124185

125186

126187

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.81
1+
1.1.82

docker-compose-toolbox.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
- "traefik.http.routers.web.rule=Host(`toolbox.openrpa.dk`)"
4646
- "traefik.http.routers.web.entrypoints=web"
4747
- "traefik.frontend.passHostHeader=true"
48-
image: "cloudhack/openflow:1.1.81"
48+
image: "cloudhack/openflow:1.1.82"
4949
container_name: "web"
5050
environment:
5151
- update_acl_based_on_groups=true
@@ -82,7 +82,7 @@ services:
8282
- "traefik.http.routers.nodered.rule=Host(`nodered1.toolbox.openrpa.dk`)"
8383
- "traefik.http.routers.nodered.entrypoints=web"
8484
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
85-
image: "cloudhack/openflownodered:1.1.81"
85+
image: "cloudhack/openflownodered:1.1.82"
8686
container_name: "nodered"
8787
environment:
8888
# - nodered_id=1

docker-compose-traefik-letsencrypt.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ services:
6969
- "traefik.http.routers.web.entrypoints=web,websecure"
7070
- "traefik.frontend.passHostHeader=true"
7171
- "traefik.http.routers.web.tls.certresolver=myresolver"
72-
image: "cloudhack/openflow:1.1.81"
72+
image: "cloudhack/openflow:1.1.82"
7373
container_name: "web"
7474
environment:
7575
- update_acl_based_on_groups=true
@@ -107,7 +107,7 @@ services:
107107
- "traefik.http.routers.nodered.entrypoints=web,websecure"
108108
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
109109
- "traefik.http.routers.nodered.tls.certresolver=myresolver"
110-
image: "cloudhack/openflownodered:1.1.81"
110+
image: "cloudhack/openflownodered:1.1.82"
111111
container_name: "nodered"
112112
environment:
113113
# - nodered_id=1

docker-compose-traefik.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
- "traefik.http.routers.web.rule=Host(`localhost.openrpa.dk`)"
4646
- "traefik.http.routers.web.entrypoints=web"
4747
- "traefik.frontend.passHostHeader=true"
48-
image: "cloudhack/openflow:1.1.81"
48+
image: "cloudhack/openflow:1.1.82"
4949
container_name: "web"
5050
environment:
5151
- update_acl_based_on_groups=true
@@ -82,7 +82,7 @@ services:
8282
- "traefik.http.routers.nodered.rule=Host(`nodered1.localhost.openrpa.dk`)"
8383
- "traefik.http.routers.nodered.entrypoints=web"
8484
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
85-
image: "cloudhack/openflownodered:1.1.81"
85+
image: "cloudhack/openflownodered:1.1.82"
8686
container_name: "nodered"
8787
environment:
8888
# - nodered_id=1

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ services:
1818
- "5672:5672"
1919
- "15672:15672"
2020
web:
21-
image: "cloudhack/openflow:1.1.81"
21+
image: "cloudhack/openflow:1.1.82"
2222
environment:
2323
- update_acl_based_on_groups=true
2424
- multi_tenant=false
@@ -52,7 +52,7 @@ services:
5252
- "80:80"
5353
- "5858:5858"
5454
nodered:
55-
image: "cloudhack/openflownodered:1.1.81"
55+
image: "cloudhack/openflownodered:1.1.82"
5656
environment:
5757
# - nodered_id=1
5858
- nodered_sa=nodered1

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openiap",
3-
"version": "1.1.81",
3+
"version": "1.1.82",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)