flowlint 0.3.2 → 0.3.4
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/dist/commands/init.js +1 -1
- package/dist/commands/scan.js +1 -1
- package/dist/packages/config/flowlint-config.d.ts +64 -0
- package/dist/packages/config/flowlint-config.js +103 -0
- package/dist/packages/config/flowlint-config.js.map +1 -0
- package/dist/packages/config/index.d.ts +4 -0
- package/dist/packages/config/index.js +21 -0
- package/dist/packages/config/index.js.map +1 -0
- package/dist/packages/github/client.d.ts +2 -0
- package/dist/packages/github/client.js +94 -0
- package/dist/packages/github/client.js.map +1 -0
- package/dist/packages/logger/index.d.ts +11 -0
- package/dist/packages/logger/index.js +40 -0
- package/dist/packages/logger/index.js.map +1 -0
- package/dist/packages/observability/collectors.d.ts +40 -0
- package/dist/packages/observability/collectors.js +75 -0
- package/dist/packages/observability/collectors.js.map +1 -0
- package/dist/packages/observability/index.d.ts +10 -0
- package/dist/packages/observability/index.js +35 -0
- package/dist/packages/observability/index.js.map +1 -0
- package/dist/packages/observability/metrics.d.ts +119 -0
- package/dist/packages/observability/metrics.js +194 -0
- package/dist/packages/observability/metrics.js.map +1 -0
- package/dist/packages/observability/middleware.d.ts +32 -0
- package/dist/packages/observability/middleware.js +58 -0
- package/dist/packages/observability/middleware.js.map +1 -0
- package/dist/packages/review/analysis-engine.d.ts +19 -0
- package/dist/packages/review/analysis-engine.js +111 -0
- package/dist/packages/review/analysis-engine.js.map +1 -0
- package/dist/packages/review/index.d.ts +12 -0
- package/dist/packages/review/index.js +29 -0
- package/dist/packages/review/index.js.map +1 -0
- package/dist/packages/review/parser-n8n.d.ts +2 -0
- package/dist/packages/review/parser-n8n.js +118 -0
- package/dist/packages/review/parser-n8n.js.map +1 -0
- package/dist/packages/review/providers/github.d.ts +62 -0
- package/dist/packages/review/providers/github.js +275 -0
- package/dist/packages/review/providers/github.js.map +1 -0
- package/dist/packages/review/providers.d.ts +106 -0
- package/dist/packages/review/providers.js +12 -0
- package/dist/packages/review/providers.js.map +1 -0
- package/dist/packages/review/reporter.d.ts +17 -0
- package/dist/packages/review/reporter.js +62 -0
- package/dist/packages/review/reporter.js.map +1 -0
- package/dist/packages/review/rules/index.d.ts +9 -0
- package/dist/packages/review/rules/index.js +313 -0
- package/dist/packages/review/rules/index.js.map +1 -0
- package/dist/packages/review/rules/rule-utils.d.ts +36 -0
- package/dist/packages/review/rules/rule-utils.js +75 -0
- package/dist/packages/review/rules/rule-utils.js.map +1 -0
- package/dist/packages/review/schemas/index.d.ts +17 -0
- package/dist/packages/review/schemas/index.js +139 -0
- package/dist/packages/review/schemas/index.js.map +1 -0
- package/dist/packages/review/schemas/n8n-workflow.schema.json +177 -0
- package/dist/packages/review/sniffer.d.ts +15 -0
- package/dist/packages/review/sniffer.js +47 -0
- package/dist/packages/review/sniffer.js.map +1 -0
- package/dist/packages/review/types.d.ts +38 -0
- package/dist/packages/review/types.js +3 -0
- package/dist/packages/review/types.js.map +1 -0
- package/dist/packages/review/utils/findings.d.ts +23 -0
- package/dist/packages/review/utils/findings.js +34 -0
- package/dist/packages/review/utils/findings.js.map +1 -0
- package/dist/packages/review/utils/merge.d.ts +12 -0
- package/dist/packages/review/utils/merge.js +40 -0
- package/dist/packages/review/utils/merge.js.map +1 -0
- package/dist/packages/review/utils.d.ts +60 -0
- package/dist/packages/review/utils.js +214 -0
- package/dist/packages/review/utils.js.map +1 -0
- package/dist/packages/tracing/github-tracer.d.ts +38 -0
- package/dist/packages/tracing/github-tracer.js +79 -0
- package/dist/packages/tracing/github-tracer.js.map +1 -0
- package/dist/packages/tracing/index.d.ts +81 -0
- package/dist/packages/tracing/index.js +240 -0
- package/dist/packages/tracing/index.js.map +1 -0
- package/dist/packages/tracing/tracer.d.ts +30 -0
- package/dist/packages/tracing/tracer.js +141 -0
- package/dist/packages/tracing/tracer.js.map +1 -0
- package/dist/providers/local-config-provider.js +2 -2
- package/dist/reporters/console-reporter.js +1 -1
- package/dist/reporters/json-reporter.js +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -14,7 +14,7 @@ const commander_1 = require("commander");
|
|
|
14
14
|
const fs_1 = __importDefault(require("fs"));
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
16
|
const yaml_1 = __importDefault(require("yaml"));
|
|
17
|
-
const flowlint_config_1 = require(
|
|
17
|
+
const flowlint_config_1 = require("./packages/config/flowlint-config");
|
|
18
18
|
exports.initCommand = new commander_1.Command('init')
|
|
19
19
|
.description('Create a .flowlint.yml configuration file')
|
|
20
20
|
.action(async () => {
|
package/dist/commands/scan.js
CHANGED
|
@@ -19,7 +19,7 @@ const local_file_source_1 = require("../providers/local-file-source");
|
|
|
19
19
|
const local_config_provider_1 = require("../providers/local-config-provider");
|
|
20
20
|
const console_reporter_1 = require("../reporters/console-reporter");
|
|
21
21
|
const json_reporter_1 = require("../reporters/json-reporter");
|
|
22
|
-
const review_1 = require(
|
|
22
|
+
const review_1 = require("./packages/review");
|
|
23
23
|
exports.scanCommand = new commander_1.Command('scan')
|
|
24
24
|
.description('Scan workflow files for issues')
|
|
25
25
|
.argument('[path]', 'Directory to scan', '.')
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Octokit } from 'octokit';
|
|
2
|
+
export type FlowLintConfig = typeof defaultConfig;
|
|
3
|
+
export declare const defaultConfig: {
|
|
4
|
+
files: {
|
|
5
|
+
include: string[];
|
|
6
|
+
ignore: string[];
|
|
7
|
+
};
|
|
8
|
+
report: {
|
|
9
|
+
annotations: boolean;
|
|
10
|
+
summary_limit: number;
|
|
11
|
+
};
|
|
12
|
+
rules: {
|
|
13
|
+
rate_limit_retry: {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
max_concurrency: number;
|
|
16
|
+
default_retry: {
|
|
17
|
+
count: number;
|
|
18
|
+
strategy: string;
|
|
19
|
+
base_ms: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
error_handling: {
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
forbid_continue_on_fail: boolean;
|
|
25
|
+
};
|
|
26
|
+
idempotency: {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
key_field_candidates: string[];
|
|
29
|
+
};
|
|
30
|
+
secrets: {
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
denylist_regex: string[];
|
|
33
|
+
};
|
|
34
|
+
dead_ends: {
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
};
|
|
37
|
+
long_running: {
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
max_iterations: number;
|
|
40
|
+
timeout_ms: number;
|
|
41
|
+
};
|
|
42
|
+
unused_data: {
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
};
|
|
45
|
+
unhandled_error_path: {
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
};
|
|
48
|
+
alert_log_enforcement: {
|
|
49
|
+
enabled: boolean;
|
|
50
|
+
};
|
|
51
|
+
deprecated_nodes: {
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
};
|
|
54
|
+
naming_convention: {
|
|
55
|
+
enabled: boolean;
|
|
56
|
+
generic_names: string[];
|
|
57
|
+
};
|
|
58
|
+
config_literals: {
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
denylist_regex: string[];
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export declare function loadConfig(gh: Octokit, repoFull: string, sha: string): Promise<FlowLintConfig>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.defaultConfig = void 0;
|
|
7
|
+
exports.loadConfig = loadConfig;
|
|
8
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
9
|
+
exports.defaultConfig = {
|
|
10
|
+
files: {
|
|
11
|
+
include: ['**/*.n8n.json', '**/workflows/*.json', '**/workflows/**/*.json', '**/*.n8n.yaml', '**/*.json'],
|
|
12
|
+
ignore: [
|
|
13
|
+
'samples/**',
|
|
14
|
+
'**/*.spec.json',
|
|
15
|
+
'node_modules/**',
|
|
16
|
+
'package*.json',
|
|
17
|
+
'tsconfig*.json',
|
|
18
|
+
'.flowlint.yml',
|
|
19
|
+
'.github/**',
|
|
20
|
+
'.husky/**',
|
|
21
|
+
'.vscode/**',
|
|
22
|
+
'infra/**',
|
|
23
|
+
'*.config.js',
|
|
24
|
+
'*.config.ts',
|
|
25
|
+
'**/*.lock',
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
report: { annotations: true, summary_limit: 25 },
|
|
29
|
+
rules: {
|
|
30
|
+
rate_limit_retry: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
max_concurrency: 5,
|
|
33
|
+
default_retry: { count: 3, strategy: 'exponential', base_ms: 500 },
|
|
34
|
+
},
|
|
35
|
+
error_handling: { enabled: true, forbid_continue_on_fail: true },
|
|
36
|
+
idempotency: { enabled: true, key_field_candidates: ['eventId', 'messageId'] },
|
|
37
|
+
secrets: { enabled: true, denylist_regex: ['(?i)api[_-]?key', 'Bearer '] },
|
|
38
|
+
dead_ends: { enabled: true },
|
|
39
|
+
long_running: { enabled: true, max_iterations: 1000, timeout_ms: 300000 },
|
|
40
|
+
unused_data: { enabled: true },
|
|
41
|
+
unhandled_error_path: { enabled: true },
|
|
42
|
+
alert_log_enforcement: { enabled: true },
|
|
43
|
+
deprecated_nodes: { enabled: true },
|
|
44
|
+
naming_convention: {
|
|
45
|
+
enabled: true,
|
|
46
|
+
generic_names: ['http request', 'set', 'if', 'merge', 'switch', 'no-op', 'start'],
|
|
47
|
+
},
|
|
48
|
+
config_literals: {
|
|
49
|
+
enabled: true,
|
|
50
|
+
denylist_regex: [
|
|
51
|
+
'(?i)\\b(dev|development)\\b',
|
|
52
|
+
'(?i)\\b(stag|staging)\\b',
|
|
53
|
+
'(?i)\\b(prod|production)\\b',
|
|
54
|
+
'(?i)\\b(test|testing)\\b',
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
async function loadConfig(gh, repoFull, sha) {
|
|
60
|
+
const [owner, repo] = repoFull.split('/');
|
|
61
|
+
try {
|
|
62
|
+
const { data } = await gh.request('GET /repos/{owner}/{repo}/contents/{path}', {
|
|
63
|
+
owner,
|
|
64
|
+
repo,
|
|
65
|
+
path: '.flowlint.yml',
|
|
66
|
+
ref: sha,
|
|
67
|
+
});
|
|
68
|
+
if (!('content' in data))
|
|
69
|
+
return exports.defaultConfig;
|
|
70
|
+
const content = Buffer.from(data.content, 'base64').toString('utf8');
|
|
71
|
+
const parsed = yaml_1.default.parse(content) || {};
|
|
72
|
+
return deepMerge(exports.defaultConfig, parsed);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return exports.defaultConfig;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function deepMerge(base, override) {
|
|
79
|
+
const baseCopy = JSON.parse(JSON.stringify(base));
|
|
80
|
+
if (!override)
|
|
81
|
+
return baseCopy;
|
|
82
|
+
return mergeInto(baseCopy, override);
|
|
83
|
+
}
|
|
84
|
+
function mergeInto(target, source) {
|
|
85
|
+
for (const [key, value] of Object.entries(source)) {
|
|
86
|
+
if (value === undefined || value === null)
|
|
87
|
+
continue;
|
|
88
|
+
if (Array.isArray(value)) {
|
|
89
|
+
target[key] = value;
|
|
90
|
+
}
|
|
91
|
+
else if (typeof value === 'object') {
|
|
92
|
+
if (typeof target[key] !== 'object' || target[key] === null) {
|
|
93
|
+
target[key] = {};
|
|
94
|
+
}
|
|
95
|
+
mergeInto(target[key], value);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
target[key] = value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return target;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=flowlint-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowlint-config.js","sourceRoot":"","sources":["../../../packages/config/flowlint-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Config package exports
|
|
19
|
+
*/
|
|
20
|
+
__exportStar(require("./flowlint-config"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,oDAAkC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getInstallationClient = getInstallationClient;
|
|
4
|
+
const octokit_1 = require("octokit");
|
|
5
|
+
const plugin_paginate_rest_1 = require("@octokit/plugin-paginate-rest");
|
|
6
|
+
const auth_app_1 = require("@octokit/auth-app");
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const observability_1 = require("../observability");
|
|
9
|
+
const appId = Number(process.env.APP_ID || 0);
|
|
10
|
+
const privateKeyBase64 = process.env.APP_PRIVATE_KEY_PEM_BASE64;
|
|
11
|
+
const privateKey = privateKeyBase64 ? Buffer.from(privateKeyBase64, 'base64').toString('utf8') : undefined;
|
|
12
|
+
if (!privateKey) {
|
|
13
|
+
logger_1.logger.warn('APP_PRIVATE_KEY_PEM_BASE64 is not set; GitHub auth will fail at runtime.');
|
|
14
|
+
}
|
|
15
|
+
// Octokit v4+ already includes retry and throttling plugins by default
|
|
16
|
+
const PaginatedOctokit = octokit_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest);
|
|
17
|
+
async function getInstallationClient(installationId) {
|
|
18
|
+
if (!privateKey) {
|
|
19
|
+
throw new Error('APP_PRIVATE_KEY_PEM_BASE64 is required to authenticate with GitHub.');
|
|
20
|
+
}
|
|
21
|
+
if (!appId) {
|
|
22
|
+
throw new Error('APP_ID is required to authenticate with GitHub.');
|
|
23
|
+
}
|
|
24
|
+
const client = new PaginatedOctokit({
|
|
25
|
+
authStrategy: auth_app_1.createAppAuth,
|
|
26
|
+
auth: {
|
|
27
|
+
appId,
|
|
28
|
+
privateKey,
|
|
29
|
+
installationId,
|
|
30
|
+
},
|
|
31
|
+
request: {
|
|
32
|
+
timeout: 30000, // 30 second timeout for all requests
|
|
33
|
+
hook: (request, options) => {
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
const method = options.method?.toUpperCase() || 'UNKNOWN';
|
|
36
|
+
const endpoint = options.url || 'unknown';
|
|
37
|
+
return request(options)
|
|
38
|
+
.then((response) => {
|
|
39
|
+
// Track successful API calls
|
|
40
|
+
const status = response.status.toString();
|
|
41
|
+
observability_1.githubApiCallsCounter.labels(method, status, endpoint).inc();
|
|
42
|
+
logger_1.logger.debug({
|
|
43
|
+
method,
|
|
44
|
+
endpoint,
|
|
45
|
+
status,
|
|
46
|
+
duration: Date.now() - startTime,
|
|
47
|
+
}, 'GitHub API call succeeded');
|
|
48
|
+
return response;
|
|
49
|
+
})
|
|
50
|
+
.catch((error) => {
|
|
51
|
+
// Track failed API calls
|
|
52
|
+
const status = error.status?.toString() || 'error';
|
|
53
|
+
observability_1.githubApiCallsCounter.labels(method, status, endpoint).inc();
|
|
54
|
+
logger_1.logger.warn({
|
|
55
|
+
method,
|
|
56
|
+
endpoint,
|
|
57
|
+
status,
|
|
58
|
+
duration: Date.now() - startTime,
|
|
59
|
+
error: error.message,
|
|
60
|
+
}, 'GitHub API call failed');
|
|
61
|
+
throw error;
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
retry: {
|
|
66
|
+
enabled: true,
|
|
67
|
+
// Retry on network errors, 5xx, and rate limit errors
|
|
68
|
+
retries: 3,
|
|
69
|
+
doNotRetry: [400, 401, 403, 404, 422], // Don't retry client errors
|
|
70
|
+
},
|
|
71
|
+
throttle: {
|
|
72
|
+
onRateLimit: (retryAfter, options, octokit) => {
|
|
73
|
+
logger_1.logger.warn({
|
|
74
|
+
method: options.method,
|
|
75
|
+
url: options.url,
|
|
76
|
+
retryAfter,
|
|
77
|
+
}, 'GitHub rate limit hit, retrying');
|
|
78
|
+
// Retry once after rate limit
|
|
79
|
+
return retryAfter < 60;
|
|
80
|
+
},
|
|
81
|
+
onSecondaryRateLimit: (retryAfter, options, octokit) => {
|
|
82
|
+
logger_1.logger.warn({
|
|
83
|
+
method: options.method,
|
|
84
|
+
url: options.url,
|
|
85
|
+
retryAfter,
|
|
86
|
+
}, 'GitHub secondary rate limit hit');
|
|
87
|
+
// Don't retry on secondary rate limits (abuse detection)
|
|
88
|
+
return false;
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
return client;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../packages/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
export declare const logger: pino.Logger<never, boolean>;
|
|
3
|
+
/**
|
|
4
|
+
* Create a child logger with additional context.
|
|
5
|
+
* Use this to add correlation IDs, request IDs, or other contextual metadata.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createChildLogger(context: Record<string, unknown>): pino.Logger<never, boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a logger with correlation ID for tracking requests across API → Queue → Worker.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createCorrelatedLogger(correlationId: string, additionalContext?: Record<string, unknown>): pino.Logger<never, boolean>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logger = void 0;
|
|
7
|
+
exports.createChildLogger = createChildLogger;
|
|
8
|
+
exports.createCorrelatedLogger = createCorrelatedLogger;
|
|
9
|
+
const pino_1 = __importDefault(require("pino"));
|
|
10
|
+
// Create base logger with environment-aware configuration
|
|
11
|
+
exports.logger = (0, pino_1.default)({
|
|
12
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
13
|
+
transport: process.env.NODE_ENV === 'development'
|
|
14
|
+
? {
|
|
15
|
+
target: 'pino-pretty',
|
|
16
|
+
options: {
|
|
17
|
+
colorize: true,
|
|
18
|
+
translateTime: 'HH:MM:ss',
|
|
19
|
+
ignore: 'pid,hostname',
|
|
20
|
+
},
|
|
21
|
+
}
|
|
22
|
+
: undefined,
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Create a child logger with additional context.
|
|
26
|
+
* Use this to add correlation IDs, request IDs, or other contextual metadata.
|
|
27
|
+
*/
|
|
28
|
+
function createChildLogger(context) {
|
|
29
|
+
return exports.logger.child(context);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a logger with correlation ID for tracking requests across API → Queue → Worker.
|
|
33
|
+
*/
|
|
34
|
+
function createCorrelatedLogger(correlationId, additionalContext) {
|
|
35
|
+
return exports.logger.child({
|
|
36
|
+
correlationId,
|
|
37
|
+
...additionalContext,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/logger/index.ts"],"names":[],"mappings":";;;;;;AAsBA,8CAEC;AAKD,wDAKC;AAlCD,gDAAwB;AAExB,0DAA0D;AAC7C,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;QACpC,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,UAAU;gBACzB,MAAM,EAAE,cAAc;aACvB;SACF;QACH,CAAC,CAAC,SAAS;CAChB,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAgC;IAChE,OAAO,cAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,aAAqB,EAAE,iBAA2C;IACvG,OAAO,cAAM,CAAC,KAAK,CAAC;QAClB,aAAa;QACb,GAAG,iBAAiB;KACrB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metric Collectors for FlowLint
|
|
3
|
+
*
|
|
4
|
+
* This module implements periodic metric collectors that query external systems
|
|
5
|
+
* (e.g., BullMQ queue) and update gauge metrics.
|
|
6
|
+
*
|
|
7
|
+
* @module packages/observability/collectors
|
|
8
|
+
*/
|
|
9
|
+
import { Queue } from 'bullmq';
|
|
10
|
+
/**
|
|
11
|
+
* Queue Metrics Collector
|
|
12
|
+
*
|
|
13
|
+
* Periodically queries BullMQ queue for depth by state and updates Prometheus gauges.
|
|
14
|
+
* Runs every 10 seconds to provide near-real-time queue visibility.
|
|
15
|
+
*
|
|
16
|
+
* @param queue - BullMQ queue instance
|
|
17
|
+
* @returns Interval timer (for cleanup)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* import { Queue } from 'bullmq';
|
|
21
|
+
* import { startQueueMetricsCollector } from './packages/observability/collectors';
|
|
22
|
+
*
|
|
23
|
+
* const queue = new Queue('pr-review', { connection: redis });
|
|
24
|
+
* const collectorInterval = startQueueMetricsCollector(queue);
|
|
25
|
+
*
|
|
26
|
+
* // Later, to stop collector:
|
|
27
|
+
* clearInterval(collectorInterval);
|
|
28
|
+
*/
|
|
29
|
+
export declare function startQueueMetricsCollector(queue: Queue<any>): NodeJS.Timeout;
|
|
30
|
+
/**
|
|
31
|
+
* Stop queue metrics collector
|
|
32
|
+
*
|
|
33
|
+
* Clears the interval timer to stop metric collection.
|
|
34
|
+
*
|
|
35
|
+
* @param interval - Interval timer from startQueueMetricsCollector
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* stopQueueMetricsCollector(collectorInterval);
|
|
39
|
+
*/
|
|
40
|
+
export declare function stopQueueMetricsCollector(interval: NodeJS.Timeout): void;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Metric Collectors for FlowLint
|
|
4
|
+
*
|
|
5
|
+
* This module implements periodic metric collectors that query external systems
|
|
6
|
+
* (e.g., BullMQ queue) and update gauge metrics.
|
|
7
|
+
*
|
|
8
|
+
* @module packages/observability/collectors
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.startQueueMetricsCollector = startQueueMetricsCollector;
|
|
12
|
+
exports.stopQueueMetricsCollector = stopQueueMetricsCollector;
|
|
13
|
+
const metrics_1 = require("./metrics");
|
|
14
|
+
const logger_1 = require("../logger");
|
|
15
|
+
const logger = (0, logger_1.createChildLogger)({ component: 'observability:collectors' });
|
|
16
|
+
/**
|
|
17
|
+
* Queue Metrics Collector
|
|
18
|
+
*
|
|
19
|
+
* Periodically queries BullMQ queue for depth by state and updates Prometheus gauges.
|
|
20
|
+
* Runs every 10 seconds to provide near-real-time queue visibility.
|
|
21
|
+
*
|
|
22
|
+
* @param queue - BullMQ queue instance
|
|
23
|
+
* @returns Interval timer (for cleanup)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* import { Queue } from 'bullmq';
|
|
27
|
+
* import { startQueueMetricsCollector } from './packages/observability/collectors';
|
|
28
|
+
*
|
|
29
|
+
* const queue = new Queue('pr-review', { connection: redis });
|
|
30
|
+
* const collectorInterval = startQueueMetricsCollector(queue);
|
|
31
|
+
*
|
|
32
|
+
* // Later, to stop collector:
|
|
33
|
+
* clearInterval(collectorInterval);
|
|
34
|
+
*/
|
|
35
|
+
function startQueueMetricsCollector(queue) {
|
|
36
|
+
logger.info('Starting queue metrics collector (10s interval)');
|
|
37
|
+
const updateQueueMetrics = async () => {
|
|
38
|
+
try {
|
|
39
|
+
// Get job counts from BullMQ queue
|
|
40
|
+
// getJobCounts() returns: { waiting, active, completed, failed, delayed, paused }
|
|
41
|
+
const counts = await queue.getJobCounts();
|
|
42
|
+
// Update gauges for each state
|
|
43
|
+
metrics_1.queueDepthGauge.set({ state: 'waiting' }, counts.waiting || 0);
|
|
44
|
+
metrics_1.queueDepthGauge.set({ state: 'active' }, counts.active || 0);
|
|
45
|
+
metrics_1.queueDepthGauge.set({ state: 'failed' }, counts.failed || 0);
|
|
46
|
+
metrics_1.queueDepthGauge.set({ state: 'delayed' }, counts.delayed || 0);
|
|
47
|
+
metrics_1.queueDepthGauge.set({ state: 'paused' }, counts.paused || 0);
|
|
48
|
+
logger.debug({ counts }, 'Queue metrics updated');
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// Don't crash if queue is temporarily unavailable
|
|
52
|
+
logger.warn({ error }, 'Failed to update queue metrics');
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
// Initial update (don't wait 10 seconds for first metrics)
|
|
56
|
+
updateQueueMetrics();
|
|
57
|
+
// Update every 10 seconds
|
|
58
|
+
const interval = setInterval(updateQueueMetrics, 10000);
|
|
59
|
+
return interval;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Stop queue metrics collector
|
|
63
|
+
*
|
|
64
|
+
* Clears the interval timer to stop metric collection.
|
|
65
|
+
*
|
|
66
|
+
* @param interval - Interval timer from startQueueMetricsCollector
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* stopQueueMetricsCollector(collectorInterval);
|
|
70
|
+
*/
|
|
71
|
+
function stopQueueMetricsCollector(interval) {
|
|
72
|
+
logger.info('Stopping queue metrics collector');
|
|
73
|
+
clearInterval(interval);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=collectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../../packages/observability/collectors.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA2BH,gEA8BC;AAYD,8DAGC;AArED,uCAA4C;AAC5C,sCAA8C;AAE9C,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,0BAA0B,CAAC,KAAiB;IAC1D,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAE/D,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;QACpC,IAAI,CAAC;YACH,mCAAmC;YACnC,kFAAkF;YAClF,MAAM,MAAM,GAAG,MAAO,KAAa,CAAC,YAAY,EAAE,CAAC;YAEnD,+BAA+B;YAC/B,yBAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAC/D,yBAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC7D,yBAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC7D,yBAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAC/D,yBAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kDAAkD;YAClD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IAEF,2DAA2D;IAC3D,kBAAkB,EAAE,CAAC;IAErB,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAExD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,yBAAyB,CAAC,QAAwB;IAChE,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowLint Observability Package
|
|
3
|
+
*
|
|
4
|
+
* Provides Prometheus metrics collection and exposure for FlowLint.
|
|
5
|
+
*
|
|
6
|
+
* @module packages/observability
|
|
7
|
+
*/
|
|
8
|
+
export { register, webhookCounter, jobsQueuedCounter, jobsCompletedCounter, jobDurationHistogram, queueDepthGauge, githubApiCallsCounter, findingsGeneratedCounter, redisOpsCounter, httpRequestDuration, getMetrics, getContentType, clearMetrics, getMetric } from './metrics';
|
|
9
|
+
export { metricsMiddleware, metricsErrorHandler } from './middleware';
|
|
10
|
+
export { startQueueMetricsCollector, stopQueueMetricsCollector } from './collectors';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FlowLint Observability Package
|
|
4
|
+
*
|
|
5
|
+
* Provides Prometheus metrics collection and exposure for FlowLint.
|
|
6
|
+
*
|
|
7
|
+
* @module packages/observability
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.stopQueueMetricsCollector = exports.startQueueMetricsCollector = exports.metricsErrorHandler = exports.metricsMiddleware = exports.getMetric = exports.clearMetrics = exports.getContentType = exports.getMetrics = exports.httpRequestDuration = exports.redisOpsCounter = exports.findingsGeneratedCounter = exports.githubApiCallsCounter = exports.queueDepthGauge = exports.jobDurationHistogram = exports.jobsCompletedCounter = exports.jobsQueuedCounter = exports.webhookCounter = exports.register = void 0;
|
|
11
|
+
// Export all metrics
|
|
12
|
+
var metrics_1 = require("./metrics");
|
|
13
|
+
Object.defineProperty(exports, "register", { enumerable: true, get: function () { return metrics_1.register; } });
|
|
14
|
+
Object.defineProperty(exports, "webhookCounter", { enumerable: true, get: function () { return metrics_1.webhookCounter; } });
|
|
15
|
+
Object.defineProperty(exports, "jobsQueuedCounter", { enumerable: true, get: function () { return metrics_1.jobsQueuedCounter; } });
|
|
16
|
+
Object.defineProperty(exports, "jobsCompletedCounter", { enumerable: true, get: function () { return metrics_1.jobsCompletedCounter; } });
|
|
17
|
+
Object.defineProperty(exports, "jobDurationHistogram", { enumerable: true, get: function () { return metrics_1.jobDurationHistogram; } });
|
|
18
|
+
Object.defineProperty(exports, "queueDepthGauge", { enumerable: true, get: function () { return metrics_1.queueDepthGauge; } });
|
|
19
|
+
Object.defineProperty(exports, "githubApiCallsCounter", { enumerable: true, get: function () { return metrics_1.githubApiCallsCounter; } });
|
|
20
|
+
Object.defineProperty(exports, "findingsGeneratedCounter", { enumerable: true, get: function () { return metrics_1.findingsGeneratedCounter; } });
|
|
21
|
+
Object.defineProperty(exports, "redisOpsCounter", { enumerable: true, get: function () { return metrics_1.redisOpsCounter; } });
|
|
22
|
+
Object.defineProperty(exports, "httpRequestDuration", { enumerable: true, get: function () { return metrics_1.httpRequestDuration; } });
|
|
23
|
+
Object.defineProperty(exports, "getMetrics", { enumerable: true, get: function () { return metrics_1.getMetrics; } });
|
|
24
|
+
Object.defineProperty(exports, "getContentType", { enumerable: true, get: function () { return metrics_1.getContentType; } });
|
|
25
|
+
Object.defineProperty(exports, "clearMetrics", { enumerable: true, get: function () { return metrics_1.clearMetrics; } });
|
|
26
|
+
Object.defineProperty(exports, "getMetric", { enumerable: true, get: function () { return metrics_1.getMetric; } });
|
|
27
|
+
// Export middleware
|
|
28
|
+
var middleware_1 = require("./middleware");
|
|
29
|
+
Object.defineProperty(exports, "metricsMiddleware", { enumerable: true, get: function () { return middleware_1.metricsMiddleware; } });
|
|
30
|
+
Object.defineProperty(exports, "metricsErrorHandler", { enumerable: true, get: function () { return middleware_1.metricsErrorHandler; } });
|
|
31
|
+
// Export collectors
|
|
32
|
+
var collectors_1 = require("./collectors");
|
|
33
|
+
Object.defineProperty(exports, "startQueueMetricsCollector", { enumerable: true, get: function () { return collectors_1.startQueueMetricsCollector; } });
|
|
34
|
+
Object.defineProperty(exports, "stopQueueMetricsCollector", { enumerable: true, get: function () { return collectors_1.stopQueueMetricsCollector; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/observability/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,qBAAqB;AACrB,qCAemB;AAdjB,mGAAA,QAAQ,OAAA;AACR,yGAAA,cAAc,OAAA;AACd,4GAAA,iBAAiB,OAAA;AACjB,+GAAA,oBAAoB,OAAA;AACpB,+GAAA,oBAAoB,OAAA;AACpB,0GAAA,eAAe,OAAA;AACf,gHAAA,qBAAqB,OAAA;AACrB,mHAAA,wBAAwB,OAAA;AACxB,0GAAA,eAAe,OAAA;AACf,8GAAA,mBAAmB,OAAA;AACnB,qGAAA,UAAU,OAAA;AACV,yGAAA,cAAc,OAAA;AACd,uGAAA,YAAY,OAAA;AACZ,oGAAA,SAAS,OAAA;AAGX,oBAAoB;AACpB,2CAAsE;AAA7D,+GAAA,iBAAiB,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAE/C,oBAAoB;AACpB,2CAAqF;AAA5E,wHAAA,0BAA0B,OAAA;AAAE,uHAAA,yBAAyB,OAAA"}
|