@theotherwillembotha/node-red-plugincore 0.0.54 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/build/GenerateNodes.js +0 -1
- package/build/Nodes.html +23 -162
- package/build/Nodes.js +0 -2
- package/build/Plugins.js +2 -3
- package/build/core/NodeConstructor.d.ts +1 -0
- package/build/core/NodeConstructor.d.ts.map +1 -1
- package/build/core/NodeConstructor.js +20 -62
- package/build/core/NodeGenerator.d.ts.map +1 -1
- package/build/core/NodeGenerator.js +8 -11
- package/build/core/logger/LoggerDecorator.d.ts.map +1 -1
- package/build/core/logger/LoggerDecorator.js +34 -38
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +11 -7
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +1 -1
- package/build/core/logger/node/ConsoleLoggerConfigNode.js +24 -10
- package/build/core/logger/node/RestLoggerConfigNode.d.ts +22 -6
- package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +1 -1
- package/build/core/logger/node/RestLoggerConfigNode.js +93 -23
- package/build/core/logger/service/LoggerService.d.ts +59 -68
- package/build/core/logger/service/LoggerService.d.ts.map +1 -1
- package/build/core/logger/service/LoggerService.js +76 -165
- package/build/core/logger/template/LoggerTemplate.d.ts +9 -1
- package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
- package/build/core/metrics/node/CounterMetricConfigNode.js +0 -2
- package/build/core/metrics/node/GaugeMetricConfigNode.js +0 -2
- package/build/core/metrics/node/MetricsConfigNode.js +0 -1
- package/build/core/metrics/node/TimerMetricConfigNode.js +0 -2
- package/build/core/metrics/service/MetricsService.js +10 -24
- package/build/core/other/service/SettingsService.js +0 -2
- package/build/core/tagging/service/NodeTypeService.js +1 -2
- package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
- package/build/core/webhook/WebhookDecorator.js +47 -10
- package/build/core/webhook/node/WebhookServerConfigNode.js +0 -1
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts +1 -2
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
- package/build/core/webhook/service/ReverseProxyTypeService.js +1 -6
- package/build/core/webhook/service/WebhookServerService.d.ts +1 -1
- package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
- package/build/core/webhook/service/WebhookServerService.js +6 -14
- package/build/core/webhook/template/WebhookTemplate.d.ts +1 -1
- package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
- package/build/index.d.ts +1 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -2
- package/build/resources/editorLanguageExtension.js +1 -2
- package/package.json +6 -5
- package/resources/editorLanguageExtension.js +1 -2
- package/src/GenerateNodes.ts +2 -2
- package/src/core/NodeConstructor.ts +7 -14
- package/src/core/NodeGenerator.ts +2 -3
- package/src/core/logger/LoggerDecorator.ts +56 -53
- package/src/core/logger/node/ConsoleLoggerConfigNode.ts +39 -14
- package/src/core/logger/node/RestLoggerConfigNode.ts +128 -25
- package/src/core/logger/service/LoggerService.ts +103 -239
- package/src/core/logger/template/LoggerTemplate.html +2 -2
- package/src/core/logger/template/LoggerTemplate.ts +11 -1
- package/src/core/metrics/node/TimerMetricConfigNode.html +2 -2
- package/src/core/other/template/BasicTemplate.html +5 -2
- package/src/core/webhook/WebhookDecorator.ts +54 -13
- package/src/core/webhook/service/ReverseProxyTypeService.ts +1 -4
- package/src/core/webhook/service/WebhookServerService.ts +1 -6
- package/src/core/webhook/template/WebhookTemplate.html +1 -1
- package/src/core/webhook/template/WebhookTemplate.ts +1 -1
- package/src/index.ts +2 -2
- package/build/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
- package/build/core/logger/node/LokiLoggerConfigNode.d.ts +0 -20
- package/build/core/logger/node/LokiLoggerConfigNode.d.ts.map +0 -1
- package/build/core/logger/node/LokiLoggerConfigNode.html +0 -117
- package/build/core/logger/node/LokiLoggerConfigNode.js +0 -53
- package/build/core/logger/node/RestLoggerConfigNode.html +0 -183
- package/build/core/logger/service/LoggerServiceTypes.d.ts +0 -24
- package/build/core/logger/service/LoggerServiceTypes.d.ts.map +0 -1
- package/build/core/logger/service/LoggerServiceTypes.js +0 -30
- package/build/core/logger/template/LoggerTemplate.html +0 -331
- package/build/core/metrics/node/CounterMetricConfigNode.html +0 -48
- package/build/core/metrics/node/GaugeMetricConfigNode.html +0 -48
- package/build/core/metrics/node/MetricsConfigNode.html +0 -21
- package/build/core/metrics/node/TimerMetricConfigNode.html +0 -190
- package/build/core/metrics/template/CounterMetricTemplate.html +0 -40
- package/build/core/metrics/template/GaugeMetricTemplate.html +0 -39
- package/build/core/metrics/template/MetricsTemplate.html +0 -54
- package/build/core/metrics/template/TimerMetricTemplate.html +0 -39
- package/build/core/other/node/DelegatedConfigReferenceNode.html +0 -1
- package/build/core/other/template/BasicTemplate.html +0 -76
- package/build/core/other/template/SettingsTemplate.html +0 -128
- package/build/core/ui/template/ScriptEditorTemplate.html +0 -50
- package/build/core/ui/template/UIHelperTemplate.html +0 -229
- package/build/core/webhook/node/WebhookServerConfigNode.html +0 -61
- package/build/core/webhook/template/WebhookTemplate.html +0 -442
- package/documentation/LokiLoggerConfigNode.png +0 -0
- package/src/core/logger/node/LokiLoggerConfigNode.html +0 -117
- package/src/core/logger/node/LokiLoggerConfigNode.ts +0 -58
- package/src/core/logger/service/LoggerServiceTypes.ts +0 -26
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
|
|
2
2
|
import { Node } from "node-red";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import {ConfigNodeConfig } from "../../NodeConstructor"
|
|
4
|
+
import { LoggerService, LoggerConfigNode, AbstractLogger, BaseLoggerConfig, TagMap, Log } from "../service/LoggerService"
|
|
5
5
|
import { SourceUtility } from "../../NodeGenerator";
|
|
6
|
-
import { ApiKeyMechanismType, Level,
|
|
6
|
+
import { ApiKeyMechanismType, Level, RestAuthType } from "../service/LoggerService";
|
|
7
7
|
import { NodeDescription } from "../../tagging/NodeDescriptionDecorator";
|
|
8
|
+
import { LoggerTemplateConfig } from "../template/LoggerTemplate";
|
|
9
|
+
import { parseURL, URLRecord } from "whatwg-url";
|
|
10
|
+
import { HttpTransportOptions } from "winston/lib/winston/transports";
|
|
11
|
+
import { createLogger, format, transports, Logger } from "winston";
|
|
8
12
|
|
|
9
13
|
interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
|
|
10
14
|
|
|
11
15
|
id: string;
|
|
12
|
-
platform: PlatformType;
|
|
13
16
|
level:Level;
|
|
14
17
|
template:string;
|
|
15
18
|
|
|
16
19
|
rest_url: string;
|
|
20
|
+
rest_ignoresslerror:boolean;
|
|
17
21
|
rest_auth_type: RestAuthType;
|
|
18
22
|
rest_auth_basic_username:string;
|
|
19
23
|
rest_auth_basic_password:string;
|
|
@@ -31,37 +35,136 @@ interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
|
|
|
31
35
|
dependencies:[ LoggerService ],
|
|
32
36
|
tags: [ "LoggerType" ]
|
|
33
37
|
})
|
|
34
|
-
export class RestLoggerConfigNode extends
|
|
38
|
+
export class RestLoggerConfigNode extends LoggerConfigNode<RestLoggerConfigNodeConfig, RestLogger> {
|
|
35
39
|
|
|
36
|
-
private _logger!:
|
|
40
|
+
private _logger!: RestLogger;
|
|
37
41
|
|
|
38
42
|
constructor(node: Node, config: RestLoggerConfigNodeConfig){
|
|
39
43
|
super(node, config);
|
|
40
44
|
let _this = this;
|
|
41
45
|
|
|
42
46
|
// instantiate the logger.
|
|
43
|
-
let loggerConfig:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
let loggerConfig:RestLoggerConfig = {
|
|
48
|
+
id:this.id(),
|
|
49
|
+
type:"REST",
|
|
50
|
+
level:config.level,
|
|
51
|
+
template:config.template,
|
|
52
|
+
|
|
53
|
+
// additional properties.
|
|
54
|
+
url: config.rest_url,
|
|
55
|
+
ignoresslerror:config.rest_ignoresslerror,
|
|
56
|
+
auth_type: config.rest_auth_type,
|
|
57
|
+
auth_basic_username:config.rest_auth_basic_username,
|
|
58
|
+
auth_basic_password:config.rest_auth_basic_password,
|
|
59
|
+
auth_apikey_mechanism:config.rest_auth_apikey_mechanism,
|
|
60
|
+
auth_apikey_name:config.rest_auth_apikey_name,
|
|
61
|
+
auth_apikey_value:config.rest_auth_apikey_value,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
this._logger = new RestLogger(loggerConfig);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected logger():RestLogger{
|
|
68
|
+
return this._logger;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class RestLogger extends AbstractLogger<RestLoggerConfig> {
|
|
73
|
+
|
|
74
|
+
private winston:Logger;
|
|
75
|
+
|
|
76
|
+
constructor(config:RestLoggerConfig){
|
|
77
|
+
super(config);
|
|
78
|
+
|
|
79
|
+
// get the url.
|
|
80
|
+
let hosturl:URLRecord|null = parseURL(config.url);
|
|
81
|
+
if(!hosturl){
|
|
82
|
+
throw Error("could not parse url: " + config.url);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// get the options
|
|
86
|
+
let httpOptions:{[key:string]:any} = {}
|
|
87
|
+
|
|
88
|
+
// get the params.
|
|
89
|
+
let httpParams:HttpTransportOptions = {
|
|
90
|
+
host:hosturl.host?.toString(),
|
|
91
|
+
path:"/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
|
|
92
|
+
port:(hosturl.port) ? hosturl.port : undefined,
|
|
93
|
+
ssl:hosturl.scheme.toLowerCase() === "https",
|
|
94
|
+
headers: {},
|
|
95
|
+
};
|
|
96
|
+
(httpParams as any).options = httpOptions;
|
|
97
|
+
|
|
98
|
+
// add the ignore ssl error flag if need be.
|
|
99
|
+
if(config.ignoresslerror){
|
|
100
|
+
httpOptions.rejectUnauthorized = false;
|
|
59
101
|
}
|
|
60
102
|
|
|
61
|
-
|
|
103
|
+
// configure "none" authentication.
|
|
104
|
+
if(config.auth_type === RestAuthType.none){}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
// configure "basic" authentication.
|
|
108
|
+
if(config.auth_type === RestAuthType.basic){
|
|
109
|
+
httpParams.auth = {
|
|
110
|
+
username: config.auth_basic_username,
|
|
111
|
+
password: config.auth_basic_password
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// configure "apikey" authentication.
|
|
116
|
+
if(config.auth_type === RestAuthType.apikey){
|
|
117
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.header) {
|
|
118
|
+
(httpParams.headers as any)[config.auth_apikey_name] = config.auth_apikey_value;
|
|
119
|
+
}
|
|
120
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.matrixparam) {
|
|
121
|
+
httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
|
|
122
|
+
}
|
|
123
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.queryparam) {
|
|
124
|
+
httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
this.winston = createLogger({
|
|
129
|
+
level: config.level.toString().toLowerCase(),
|
|
130
|
+
format: format.json(),
|
|
131
|
+
defaultMeta: {},
|
|
132
|
+
transports: [
|
|
133
|
+
new transports.Http(httpParams),
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
protected createLogger(config: LoggerTemplateConfig): Log {
|
|
139
|
+
return new RestAppender(config, this.winston);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
class RestAppender extends Log {
|
|
144
|
+
private winston: Logger;
|
|
145
|
+
|
|
146
|
+
constructor(config:LoggerTemplateConfig, winston:Logger){
|
|
147
|
+
super(config);
|
|
148
|
+
this.winston = winston;
|
|
62
149
|
}
|
|
63
150
|
|
|
64
|
-
|
|
65
|
-
|
|
151
|
+
protected writeToLog(level:string, message: string, tags: { [key: string]: string | boolean | number; }): void {
|
|
152
|
+
this.winston.log({
|
|
153
|
+
level:level,
|
|
154
|
+
message:message,
|
|
155
|
+
labels:tags
|
|
156
|
+
});
|
|
66
157
|
}
|
|
158
|
+
|
|
67
159
|
}
|
|
160
|
+
|
|
161
|
+
interface RestLoggerConfig extends BaseLoggerConfig {
|
|
162
|
+
url: string;
|
|
163
|
+
ignoresslerror:boolean;
|
|
164
|
+
auth_type: RestAuthType;
|
|
165
|
+
auth_basic_username:string;
|
|
166
|
+
auth_basic_password:string;
|
|
167
|
+
auth_apikey_mechanism:ApiKeyMechanismType;
|
|
168
|
+
auth_apikey_name:string;
|
|
169
|
+
auth_apikey_value:string;
|
|
170
|
+
}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
import {BaseService, ServiceDescriptor } from "../../NodeConstructor";
|
|
3
|
-
import { NodeAPI, NodeAPISettingsWithData } from "node-red";
|
|
2
|
+
import {BaseService, ServiceDescriptor, ConfigNodeConfig, ConfigNode } from "../../NodeConstructor";
|
|
3
|
+
import { NodeAPI, NodeAPISettingsWithData, Node } from "node-red";
|
|
4
4
|
import Handlebars from "handlebars";
|
|
5
|
-
import {
|
|
6
|
-
import LokiTransport from "winston-loki";
|
|
7
|
-
import { URLRecord, parseURL } from 'whatwg-url';
|
|
8
|
-
import { LoggerTemplate } from "../template/LoggerTemplate";
|
|
5
|
+
import { LoggerTemplate, LoggerTemplateConfig } from "../template/LoggerTemplate";
|
|
9
6
|
var network = require('network');
|
|
10
|
-
import deepEqual from "deep-equal";
|
|
11
|
-
import { HttpTransportOptions } from "winston/lib/winston/transports";
|
|
12
|
-
import { ApiKeyMechanismType, Level, PlatformType, RestAuthType } from "./LoggerServiceTypes";
|
|
13
7
|
|
|
14
8
|
// helper for serializing json objects inside handlebars tags.
|
|
15
9
|
// you can then convert it like this: {{{json myobject}}}
|
|
@@ -17,248 +11,108 @@ Handlebars.registerHelper('json', function(context) {
|
|
|
17
11
|
return JSON.stringify(context);
|
|
18
12
|
});
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
id: string;
|
|
14
|
+
export enum Level{
|
|
15
|
+
DEBUG = "DEBUG",
|
|
16
|
+
INFO = "INFO",
|
|
17
|
+
WARNING = "WARNING",
|
|
18
|
+
ERROR = "ERROR"
|
|
26
19
|
}
|
|
27
20
|
|
|
28
|
-
export
|
|
29
|
-
|
|
21
|
+
export enum RestAuthType {
|
|
22
|
+
none="none",
|
|
23
|
+
basic="basic",
|
|
24
|
+
apikey="apikey",
|
|
30
25
|
}
|
|
31
26
|
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
private template?:HandlebarsTemplateDelegate<any>;
|
|
37
|
-
private tagMap:TagMap;
|
|
38
|
-
|
|
39
|
-
constructor(root:NewLogger<any>, config:LoggerRegistration){
|
|
40
|
-
this.root = root;
|
|
41
|
-
this.config = config;
|
|
42
|
-
this.template = (config.override && config.template) ? Handlebars.compile(config.template) : undefined;
|
|
43
|
-
this.tagMap = {
|
|
44
|
-
instance:LoggerService.instanceID,
|
|
45
|
-
flow:config.flow,
|
|
46
|
-
node:config.name,
|
|
47
|
-
type:config.type,
|
|
48
|
-
id:config.id,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public log(message:{[key:string]:any}|string){
|
|
53
|
-
// enrich the logged content with additional properties.
|
|
54
|
-
let content = {
|
|
55
|
-
currentTime: new Date().toISOString(),
|
|
56
|
-
msg: message,
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// send typ the logger.
|
|
60
|
-
this.root.log(this, content);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public serialize(content:{[key:string]:any}) {
|
|
64
|
-
return !!this.template ? this.template(content) : this.root.serialize(content);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
public getTags() {
|
|
68
|
-
return this.tagMap;
|
|
69
|
-
}
|
|
27
|
+
export enum ApiKeyMechanismType {
|
|
28
|
+
header="header",
|
|
29
|
+
queryparam="queryparam",
|
|
30
|
+
matrixparam="matrixparam",
|
|
70
31
|
}
|
|
71
32
|
|
|
72
|
-
export
|
|
73
|
-
id:string;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
33
|
+
export type TagMap = {
|
|
34
|
+
id: string;
|
|
35
|
+
node: string;
|
|
36
|
+
type: string;
|
|
37
|
+
flow: string;
|
|
38
|
+
instance: string;
|
|
77
39
|
}
|
|
78
40
|
|
|
79
|
-
export abstract class
|
|
80
|
-
private _config:
|
|
81
|
-
private template: HandlebarsTemplateDelegate<
|
|
41
|
+
export abstract class Log {
|
|
42
|
+
private _config: LoggerTemplateConfig;
|
|
43
|
+
private template: HandlebarsTemplateDelegate<any>;
|
|
44
|
+
private tags:TagMap;
|
|
82
45
|
|
|
83
|
-
constructor(config:
|
|
46
|
+
protected constructor(config:LoggerTemplateConfig){
|
|
84
47
|
this._config = config;
|
|
85
48
|
this.template = Handlebars.compile(config.template);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
// step 2, get the tags.
|
|
94
|
-
let tags = reference.getTags();
|
|
95
|
-
|
|
96
|
-
// step 3. write to the logger.
|
|
97
|
-
this.writeToLog(serializedContent, tags);
|
|
49
|
+
this.tags = {
|
|
50
|
+
id: config.id,
|
|
51
|
+
node: config.name,
|
|
52
|
+
type: config.type,
|
|
53
|
+
flow: config.flow,
|
|
54
|
+
instance: LoggerService.instanceID
|
|
98
55
|
}
|
|
99
|
-
catch(exception){
|
|
100
|
-
console.log((exception as any).message);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
public register(registration:LoggerRegistration):Log{
|
|
105
|
-
return new LogImplementation(this, registration);
|
|
106
56
|
}
|
|
107
57
|
|
|
108
|
-
|
|
109
|
-
return this.template(content);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
public config():ConfigType {
|
|
58
|
+
protected config():LoggerTemplateConfig{
|
|
113
59
|
return this._config;
|
|
114
60
|
}
|
|
115
61
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
class ConsoleLogger extends NewLogger<ConsoleLoggerConfig> {
|
|
124
|
-
|
|
125
|
-
constructor(config:ConsoleLoggerConfig){
|
|
126
|
-
super(config);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
protected writeToLog(serializedContent: string, tags: TagMap): void {
|
|
130
|
-
console.log(tags, serializedContent);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export interface LokiLoggerConfig extends BaseLoggerConfig{
|
|
135
|
-
type:PlatformType.loki;
|
|
136
|
-
host:string;
|
|
137
|
-
userid?:string;
|
|
138
|
-
authtoken?:string;
|
|
139
|
-
tenantid?:string;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
class LokiLogger extends NewLogger<LokiLoggerConfig>{
|
|
143
|
-
logger: any;
|
|
62
|
+
public log(payload:{[key:string]:any}|string):void{
|
|
63
|
+
try{
|
|
64
|
+
// step 1. serialize the payload using the template engine.
|
|
65
|
+
let message = (payload instanceof String) ? payload as string : this.template({msg:payload});
|
|
144
66
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
json: true,
|
|
151
|
-
format: format.json(),
|
|
152
|
-
headers: {
|
|
153
|
-
"X-Scope-OrgID": (config.tenantid) ? config.tenantid : undefined
|
|
154
|
-
},
|
|
155
|
-
replaceTimestamp: true,
|
|
156
|
-
onConnectionError: (err:unknown) => console.error(err),
|
|
157
|
-
basicAuth: (config.userid && config.authtoken)
|
|
158
|
-
? `${config.userid}:${config.authtoken}`
|
|
159
|
-
: undefined
|
|
67
|
+
// step 2. write to the log appender.
|
|
68
|
+
this.writeToLog(this.config().level, message, this.tags);
|
|
69
|
+
}
|
|
70
|
+
catch(e){
|
|
71
|
+
console.log(e);
|
|
160
72
|
}
|
|
161
|
-
|
|
162
|
-
this.logger = createLogger({
|
|
163
|
-
level: this.config().level.toString().toLowerCase(),
|
|
164
|
-
format: format.json(),
|
|
165
|
-
defaultMeta: {},
|
|
166
|
-
transports: [
|
|
167
|
-
new LokiTransport(transportConfig),
|
|
168
|
-
],
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
protected writeToLog(serializedContent: string, tags: TagMap): void {
|
|
173
|
-
this.logger.log({message:serializedContent, level:this.logger.level, labels:tags});
|
|
174
73
|
}
|
|
74
|
+
|
|
75
|
+
protected abstract writeToLog(level:string, message:string, tags:{[key:string]:string|boolean|number}):void;
|
|
175
76
|
}
|
|
176
77
|
|
|
177
|
-
export
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
auth_basic_username:string;
|
|
183
|
-
auth_basic_password:string;
|
|
184
|
-
auth_apikey_mechanism:ApiKeyMechanismType;
|
|
185
|
-
auth_apikey_name:string;
|
|
186
|
-
auth_apikey_value:string;
|
|
78
|
+
export type BaseLoggerConfig = {
|
|
79
|
+
id:string;
|
|
80
|
+
type:string;
|
|
81
|
+
level: Level;
|
|
82
|
+
template:string;
|
|
187
83
|
}
|
|
188
84
|
|
|
189
|
-
|
|
190
|
-
logger: any;
|
|
191
|
-
|
|
192
|
-
constructor(config:RestLoggerConfig){
|
|
193
|
-
super(config);
|
|
194
|
-
|
|
195
|
-
let hosturl:URLRecord|null = parseURL(config.url);
|
|
85
|
+
export abstract class AbstractLogger<BaseLoggerConfig>{
|
|
196
86
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
let httpParams:HttpTransportOptions = {
|
|
204
|
-
host:hosturl.host?.toString(),
|
|
205
|
-
path:"/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
|
|
206
|
-
port:(hosturl.port) ? hosturl.port : undefined,
|
|
207
|
-
ssl:hosturl.scheme.toLowerCase() === "https",
|
|
208
|
-
headers: {},
|
|
209
|
-
};
|
|
210
|
-
(httpParams as any).options = httpOptions;
|
|
211
|
-
|
|
212
|
-
if(config.ignoresslerror){
|
|
213
|
-
httpOptions.rejectUnauthorized = false;
|
|
214
|
-
}
|
|
87
|
+
private _config: BaseLoggerConfig;
|
|
88
|
+
private _appenders:{[key:string]:Log} = {};
|
|
89
|
+
|
|
90
|
+
constructor(config:BaseLoggerConfig){
|
|
91
|
+
this._config = config;
|
|
92
|
+
}
|
|
215
93
|
|
|
216
|
-
|
|
94
|
+
public config():BaseLoggerConfig{
|
|
95
|
+
return this._config;
|
|
96
|
+
}
|
|
217
97
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
98
|
+
public registerTemplate(config: LoggerTemplateConfig): Log{
|
|
99
|
+
let appender:Log = this._appenders[config.id];
|
|
100
|
+
if(appender){
|
|
101
|
+
return appender;
|
|
223
102
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
(httpParams.headers as any)[config.auth_apikey_name] = config.auth_apikey_value;
|
|
227
|
-
}
|
|
228
|
-
if(config.auth_apikey_mechanism === ApiKeyMechanismType.matrixparam) {
|
|
229
|
-
httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
|
|
230
|
-
}
|
|
231
|
-
if(config.auth_apikey_mechanism === ApiKeyMechanismType.queryparam) {
|
|
232
|
-
httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
this.logger = createLogger({
|
|
237
|
-
level: config.level.toString().toLowerCase(),
|
|
238
|
-
format: format.json(),
|
|
239
|
-
defaultMeta: {},
|
|
240
|
-
transports: [
|
|
241
|
-
new transports.Http(httpParams),
|
|
242
|
-
],
|
|
243
|
-
});
|
|
244
|
-
}
|
|
103
|
+
|
|
104
|
+
let _this = this;
|
|
245
105
|
|
|
246
|
-
|
|
247
|
-
|
|
106
|
+
this._appenders[config.id] = appender = this.createLogger(config);
|
|
107
|
+
return appender;
|
|
248
108
|
}
|
|
249
|
-
}
|
|
250
109
|
|
|
251
|
-
|
|
252
|
-
console: ConsoleLogger,
|
|
253
|
-
loki: LokiLogger,
|
|
254
|
-
rest: RestLogger
|
|
110
|
+
protected abstract createLogger(config: LoggerTemplateConfig):Log;
|
|
255
111
|
}
|
|
256
112
|
|
|
257
113
|
export class LoggerService extends BaseService {
|
|
258
114
|
|
|
259
115
|
public static instanceID:string;
|
|
260
|
-
|
|
261
|
-
private static loggers:{[key:string]:NewLogger<BaseLoggerConfig>} = {};
|
|
262
116
|
private red!: NodeAPI<NodeAPISettingsWithData>;
|
|
263
117
|
|
|
264
118
|
constructor(){
|
|
@@ -277,22 +131,6 @@ export class LoggerService extends BaseService {
|
|
|
277
131
|
|
|
278
132
|
public deinit(red: NodeAPI<NodeAPISettingsWithData>): void | Promise<void> {}
|
|
279
133
|
|
|
280
|
-
public static get <ConfigType extends BaseLoggerConfig>(config:ConfigType): NewLogger<ConfigType>{
|
|
281
|
-
|
|
282
|
-
let logger:NewLogger<ConfigType> = this.loggers[config.id] as NewLogger<ConfigType>;
|
|
283
|
-
|
|
284
|
-
if(logger){
|
|
285
|
-
if(!deepEqual(config, logger.config())){
|
|
286
|
-
this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
else{
|
|
290
|
-
this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return logger;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
134
|
static override getServiceDescriptor():ServiceDescriptor {
|
|
297
135
|
return new ServiceDescriptor(
|
|
298
136
|
"@theotherwillembotha/loggerservice",
|
|
@@ -305,12 +143,38 @@ export class LoggerService extends BaseService {
|
|
|
305
143
|
}
|
|
306
144
|
}
|
|
307
145
|
|
|
308
|
-
export type
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
146
|
+
export type LoggerConfigNodeConfig = ConfigNodeConfig & BaseLoggerConfig & {}
|
|
147
|
+
|
|
148
|
+
export abstract class LoggerConfigNode<CNC extends LoggerConfigNodeConfig, LoggerType extends AbstractLogger<BaseLoggerConfig>> extends ConfigNode<CNC> {
|
|
149
|
+
|
|
150
|
+
protected constructor(node:Node, config: CNC){
|
|
151
|
+
super(node, config);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
protected abstract logger():LoggerType;
|
|
155
|
+
|
|
156
|
+
public registerTemplate(config: LoggerTemplateConfig): Log {
|
|
157
|
+
return this.logger().registerTemplate(config);
|
|
158
|
+
}
|
|
316
159
|
}
|
|
160
|
+
|
|
161
|
+
export class DoNothingAppender extends Log{
|
|
162
|
+
|
|
163
|
+
private static instance:DoNothingAppender = new DoNothingAppender();
|
|
164
|
+
|
|
165
|
+
static get(): any {
|
|
166
|
+
return DoNothingAppender.instance;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private constructor(){
|
|
170
|
+
super({flow:"",id:"", level:"", name:"", template:"", type:""});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public log(payload:{[key:string]:any}|string):void{
|
|
174
|
+
// do nothing.
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
protected writeToLog(level:string, message: string, tags: { [key: string]: string | boolean | number; }): void {
|
|
178
|
+
// do nothing.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -59,10 +59,10 @@
|
|
|
59
59
|
.towb_editorlabel {
|
|
60
60
|
width: 120px !important;
|
|
61
61
|
}
|
|
62
|
-
.towb_editorfield {
|
|
62
|
+
input.towb_editorfield, select.towb_editorfield, textarea.towb_editorfield {
|
|
63
63
|
width: 70% !important;
|
|
64
64
|
}
|
|
65
|
-
.towb_editorfield_short {
|
|
65
|
+
input.towb_editorfield_short, select.towb_editorfield_short {
|
|
66
66
|
width: 30% !important;
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { SourceUtility } from "../../NodeGenerator";
|
|
2
2
|
import { BaseNodeConfig, Template, TemplateDescriptor } from "../../NodeConstructor"
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
// TODO: we need to prefix logger teplate properties with logtemplate_
|
|
5
|
+
export interface LoggerTemplateNodeConfig extends BaseNodeConfig{
|
|
5
6
|
logEnabled:boolean,
|
|
6
7
|
logger:string,
|
|
7
8
|
logTemplateOverrideEnabled:boolean,
|
|
8
9
|
logTemplateOverride:string;
|
|
9
10
|
}
|
|
10
11
|
|
|
12
|
+
export type LoggerTemplateConfig = {
|
|
13
|
+
id:string;
|
|
14
|
+
flow:string;
|
|
15
|
+
type:string;
|
|
16
|
+
name:string;
|
|
17
|
+
template:string;
|
|
18
|
+
level:string;
|
|
19
|
+
}
|
|
20
|
+
|
|
11
21
|
export class LoggerTemplate extends Template {
|
|
12
22
|
|
|
13
23
|
|
|
@@ -99,13 +99,13 @@
|
|
|
99
99
|
|
|
100
100
|
<div class="form-row">
|
|
101
101
|
<label class="towb_editorlabel" for="node-config-input-metricType"><i class="fa fa-bar-chart"></i> Type</label>
|
|
102
|
-
<input
|
|
102
|
+
<input type="text" id="node-config-input-metricType" />
|
|
103
103
|
</div>
|
|
104
104
|
|
|
105
105
|
<div class="metrictype metrictype_histogram">
|
|
106
106
|
<div class="form-row">
|
|
107
107
|
<label class="towb_editorlabel" for="node-config-input-buckettype"><i class="fa fa-sliders"></i> Bucket Type</label>
|
|
108
|
-
<input
|
|
108
|
+
<input type="text" id="node-config-input-buckettype" />
|
|
109
109
|
</div>
|
|
110
110
|
|
|
111
111
|
<div class="metricsconfig_buckets metricsconfig_buckets_default">
|
|
@@ -63,13 +63,16 @@
|
|
|
63
63
|
.towb_editorlabel {
|
|
64
64
|
width: 120px !important;
|
|
65
65
|
}
|
|
66
|
-
.towb_editorfield {
|
|
66
|
+
input.towb_editorfield, select.towb_editorfield, textarea.towb_editorfield {
|
|
67
67
|
width: 70% !important;
|
|
68
68
|
}
|
|
69
|
-
.towb_editorfield_short {
|
|
69
|
+
input.towb_editorfield_short, select.towb_editorfield_short {
|
|
70
70
|
width: 30% !important;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
/* Node label colour helpers — use via .setLabelStyle() in onCompose */
|
|
74
|
+
.node_label_white { fill: white; }
|
|
75
|
+
.node_label_black { fill: black; }
|
|
73
76
|
</style>
|
|
74
77
|
|
|
75
78
|
|