monora-ai 2.1.0 → 2.1.3
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 +333 -159
- package/dist/aims_governance.d.ts +238 -0
- package/dist/aims_governance.d.ts.map +1 -0
- package/dist/aims_governance.js +922 -0
- package/dist/alerts.d.ts +16 -0
- package/dist/alerts.d.ts.map +1 -1
- package/dist/alerts.js +16 -0
- package/dist/api.d.ts +6 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +6 -0
- package/dist/assessment.d.ts +85 -0
- package/dist/assessment.d.ts.map +1 -1
- package/dist/assessment.js +506 -13
- package/dist/attribution.d.ts +44 -3
- package/dist/attribution.d.ts.map +1 -1
- package/dist/attribution.js +197 -10
- package/dist/autodetect.d.ts +68 -0
- package/dist/autodetect.d.ts.map +1 -1
- package/dist/autodetect.js +639 -0
- package/dist/bias.d.ts +130 -0
- package/dist/bias.d.ts.map +1 -0
- package/dist/bias.js +223 -0
- package/dist/cli/diagnostics.d.ts +5 -1
- package/dist/cli/diagnostics.d.ts.map +1 -1
- package/dist/cli/diagnostics.js +23 -6
- package/dist/cli/doctor.d.ts +25 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +381 -0
- package/dist/cli/fix.d.ts +16 -0
- package/dist/cli/fix.d.ts.map +1 -0
- package/dist/cli/fix.js +284 -0
- package/dist/cli/init.d.ts +57 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +205 -0
- package/dist/cli.js +1550 -176
- package/dist/complianceTargets.d.ts +111 -0
- package/dist/complianceTargets.d.ts.map +1 -0
- package/dist/complianceTargets.js +521 -0
- package/dist/config.d.ts +261 -16
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +381 -32
- package/dist/config_migrations.d.ts.map +1 -1
- package/dist/config_migrations.js +38 -1
- package/dist/config_schema.d.ts +2490 -1035
- package/dist/config_schema.d.ts.map +1 -1
- package/dist/config_schema.js +233 -64
- package/dist/context.d.ts +34 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +118 -7
- package/dist/control_backbone.d.ts +122 -0
- package/dist/control_backbone.d.ts.map +1 -0
- package/dist/control_backbone.js +698 -0
- package/dist/data-governance.d.ts +187 -0
- package/dist/data-governance.d.ts.map +1 -0
- package/dist/data-governance.js +424 -0
- package/dist/dataResidency.d.ts +44 -0
- package/dist/dataResidency.d.ts.map +1 -0
- package/dist/dataResidency.js +203 -0
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +17 -5
- package/dist/evidence_store.d.ts +103 -0
- package/dist/evidence_store.d.ts.map +1 -0
- package/dist/evidence_store.js +459 -0
- package/dist/executiveSummary.d.ts +15 -0
- package/dist/executiveSummary.d.ts.map +1 -1
- package/dist/executiveSummary.js +135 -22
- package/dist/identity.d.ts +143 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/impact-assessment.d.ts +350 -0
- package/dist/impact-assessment.d.ts.map +1 -0
- package/dist/impact-assessment.js +580 -0
- package/dist/index.d.ts +20 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +247 -5
- package/dist/instrumentation.d.ts +1 -1
- package/dist/instrumentation.d.ts.map +1 -1
- package/dist/instrumentation.js +123 -22
- package/dist/integrations/anthropic.d.ts +3 -0
- package/dist/integrations/anthropic.d.ts.map +1 -1
- package/dist/integrations/anthropic.js +282 -80
- package/dist/integrations/governance.d.ts +33 -0
- package/dist/integrations/governance.d.ts.map +1 -0
- package/dist/integrations/governance.js +208 -0
- package/dist/integrations/langchain.d.ts +4 -0
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +362 -142
- package/dist/integrations/openai.d.ts +9 -0
- package/dist/integrations/openai.d.ts.map +1 -1
- package/dist/integrations/openai.js +673 -73
- package/dist/iso42001_consolidation.d.ts +16 -0
- package/dist/iso42001_consolidation.d.ts.map +1 -0
- package/dist/iso42001_consolidation.js +413 -0
- package/dist/iso42001_workflows.d.ts +263 -0
- package/dist/iso42001_workflows.d.ts.map +1 -0
- package/dist/iso42001_workflows.js +781 -0
- package/dist/lifecycle.d.ts +299 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +624 -0
- package/dist/lineage.d.ts +2 -2
- package/dist/lineage.d.ts.map +1 -1
- package/dist/lineage.js +9 -16
- package/dist/middleware/express.d.ts.map +1 -1
- package/dist/middleware/express.js +18 -3
- package/dist/middleware/nextjs.js +2 -2
- package/dist/model.d.ts +143 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +371 -0
- package/dist/onboarding.d.ts +42 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +1022 -0
- package/dist/oversight.d.ts +264 -0
- package/dist/oversight.d.ts.map +1 -0
- package/dist/oversight.js +497 -0
- package/dist/presets.js +7 -7
- package/dist/quotas.d.ts +171 -0
- package/dist/quotas.d.ts.map +1 -0
- package/dist/quotas.js +259 -0
- package/dist/register.d.ts +13 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +99 -0
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -0
- package/dist/registryData.json +43 -6
- package/dist/report.d.ts +2 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +189 -2
- package/dist/reporting.d.ts +125 -0
- package/dist/reporting.d.ts.map +1 -1
- package/dist/reporting.js +192 -2
- package/dist/resources.d.ts +285 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +643 -0
- package/dist/risk.d.ts +120 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +220 -0
- package/dist/runtime.d.ts +73 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +415 -18
- package/dist/schemaInference.d.ts +92 -0
- package/dist/schemaInference.d.ts.map +1 -0
- package/dist/schemaInference.js +466 -0
- package/dist/schema_validation.js +2 -2
- package/dist/schemas/config.schema.json +118 -4
- package/dist/security_report.js +4 -4
- package/dist/signing.d.ts +1 -1
- package/dist/signing.d.ts.map +1 -1
- package/dist/signing.js +4 -0
- package/dist/sinks/file.d.ts +19 -1
- package/dist/sinks/file.d.ts.map +1 -1
- package/dist/sinks/file.js +82 -13
- package/dist/sinks/https.d.ts +10 -0
- package/dist/sinks/https.d.ts.map +1 -1
- package/dist/sinks/https.js +76 -16
- package/dist/sinks/stdout.d.ts +1 -0
- package/dist/sinks/stdout.d.ts.map +1 -1
- package/dist/sinks/stdout.js +12 -1
- package/dist/spec.d.ts +159 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +391 -0
- package/dist/stakeholders.d.ts +199 -0
- package/dist/stakeholders.d.ts.map +1 -0
- package/dist/stakeholders.js +398 -0
- package/dist/standards.d.ts.map +1 -1
- package/dist/standards.js +160 -2
- package/dist/standards_ingest.d.ts.map +1 -1
- package/dist/standards_ingest.js +1 -4
- package/dist/telemetry.d.ts +16 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +77 -14
- package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
- package/dist/traced_emitter.d.ts.map +1 -1
- package/dist/traced_emitter.js +19 -9
- package/dist/trust_package.d.ts +19 -1
- package/dist/trust_package.d.ts.map +1 -1
- package/dist/trust_package.js +89 -2
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +9 -2
- package/dist/wal.d.ts.map +1 -1
- package/dist/wal.js +2 -1
- package/package.json +14 -1
- package/scripts/postinstall.js +105 -210
- package/templates/controls/iso42001_control_catalog.json +1443 -0
package/dist/standards.js
CHANGED
|
@@ -243,6 +243,150 @@ function buildCoverageSummary(claims) {
|
|
|
243
243
|
}
|
|
244
244
|
return summary;
|
|
245
245
|
}
|
|
246
|
+
function claimSeverity(options) {
|
|
247
|
+
const { status, checks, insufficientReasons } = options;
|
|
248
|
+
if (status === 'corroborated') {
|
|
249
|
+
return 'none';
|
|
250
|
+
}
|
|
251
|
+
const failedTypes = new Set(checks
|
|
252
|
+
.filter((check) => check && check.status === 'failed')
|
|
253
|
+
.map((check) => String(check.type)));
|
|
254
|
+
if (status === 'disproved') {
|
|
255
|
+
if (failedTypes.has('hash_chain_status') || failedTypes.has('signatures_status')) {
|
|
256
|
+
return 'critical';
|
|
257
|
+
}
|
|
258
|
+
if (failedTypes.has('policy_violations_max') ||
|
|
259
|
+
failedTypes.has('forbidden_models_max') ||
|
|
260
|
+
failedTypes.has('config_required')) {
|
|
261
|
+
return 'high';
|
|
262
|
+
}
|
|
263
|
+
return 'medium';
|
|
264
|
+
}
|
|
265
|
+
const reasonCodes = new Set(insufficientReasons
|
|
266
|
+
.filter((reason) => reason && typeof reason === 'object' && reason.code)
|
|
267
|
+
.map((reason) => String(reason.code)));
|
|
268
|
+
if (reasonCodes.has('missing_required_excerpts')) {
|
|
269
|
+
return 'high';
|
|
270
|
+
}
|
|
271
|
+
if (reasonCodes.has('unverified_excerpts') || reasonCodes.has('check_skipped')) {
|
|
272
|
+
return 'medium';
|
|
273
|
+
}
|
|
274
|
+
return 'low';
|
|
275
|
+
}
|
|
276
|
+
function claimRemediation(options) {
|
|
277
|
+
const { status, checks, insufficientReasons } = options;
|
|
278
|
+
if (status === 'corroborated') {
|
|
279
|
+
return { summary: 'No action required.', actions: [] };
|
|
280
|
+
}
|
|
281
|
+
const actions = [];
|
|
282
|
+
for (const check of checks) {
|
|
283
|
+
if (!check || check.status !== 'failed') {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const checkType = String(check.type || '');
|
|
287
|
+
if (checkType === 'policy_violations_max') {
|
|
288
|
+
actions.push('Resolve policy violations and reduce violation count below threshold.');
|
|
289
|
+
}
|
|
290
|
+
else if (checkType === 'unknown_models_max') {
|
|
291
|
+
actions.push('Register unknown models in the registry or block their usage.');
|
|
292
|
+
}
|
|
293
|
+
else if (checkType === 'forbidden_models_max') {
|
|
294
|
+
actions.push('Remove blocked/forbidden models from runtime traffic.');
|
|
295
|
+
}
|
|
296
|
+
else if (checkType === 'hash_chain_status') {
|
|
297
|
+
actions.push('Fix hash-chain integrity issues and re-verify emitted events.');
|
|
298
|
+
}
|
|
299
|
+
else if (checkType === 'signatures_status') {
|
|
300
|
+
actions.push('Enable valid signing keys and verify event signatures.');
|
|
301
|
+
}
|
|
302
|
+
else if (checkType === 'sequence_gaps_max') {
|
|
303
|
+
actions.push('Investigate event sequence gaps and restore event continuity.');
|
|
304
|
+
}
|
|
305
|
+
else if (checkType === 'errors_max') {
|
|
306
|
+
actions.push('Reduce runtime errors and capture complete error diagnostics.');
|
|
307
|
+
}
|
|
308
|
+
else if (checkType === 'config_required') {
|
|
309
|
+
const pathLabel = check.details?.path;
|
|
310
|
+
const expected = check.details?.expected;
|
|
311
|
+
actions.push(`Set required config '${pathLabel}' to '${expected}' and redeploy.`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (const reason of insufficientReasons) {
|
|
315
|
+
const code = String(reason?.code || '');
|
|
316
|
+
if (code === 'missing_required_excerpts') {
|
|
317
|
+
actions.push('Attach required report excerpts for this claim.');
|
|
318
|
+
}
|
|
319
|
+
else if (code === 'unverified_excerpts') {
|
|
320
|
+
actions.push('Provide excerpt hashes/report linkage so evidence can be verified.');
|
|
321
|
+
}
|
|
322
|
+
else if (code === 'check_skipped') {
|
|
323
|
+
actions.push('Provide missing config/evidence inputs so skipped checks can execute.');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const deduped = Array.from(new Set(actions));
|
|
327
|
+
const summary = deduped.length > 0
|
|
328
|
+
? deduped[0]
|
|
329
|
+
: 'Investigate missing or failing evidence and rerun standards evaluation.';
|
|
330
|
+
return { summary, actions: deduped.slice(0, 8) };
|
|
331
|
+
}
|
|
332
|
+
function buildFindingsSummary(claims) {
|
|
333
|
+
const severityLevels = ['critical', 'high', 'medium', 'low', 'none'];
|
|
334
|
+
const totals = Object.fromEntries(severityLevels.map((level) => [level, 0]));
|
|
335
|
+
const byStandard = {};
|
|
336
|
+
const statusBreakdown = {
|
|
337
|
+
corroborated: 0,
|
|
338
|
+
disproved: 0,
|
|
339
|
+
insufficient_evidence: 0,
|
|
340
|
+
};
|
|
341
|
+
const remediationRecommendations = [];
|
|
342
|
+
for (const claim of claims) {
|
|
343
|
+
const standard = String(claim.standard || 'unspecified');
|
|
344
|
+
let severity = String(claim.severity || 'none');
|
|
345
|
+
const status = String(claim.status || 'insufficient_evidence');
|
|
346
|
+
if (!(severity in totals)) {
|
|
347
|
+
severity = 'low';
|
|
348
|
+
}
|
|
349
|
+
totals[severity] += 1;
|
|
350
|
+
statusBreakdown[status] = (statusBreakdown[status] || 0) + 1;
|
|
351
|
+
if (!byStandard[standard]) {
|
|
352
|
+
byStandard[standard] = Object.fromEntries(severityLevels.map((level) => [level, 0]));
|
|
353
|
+
}
|
|
354
|
+
byStandard[standard][severity] = (byStandard[standard][severity] || 0) + 1;
|
|
355
|
+
const remediation = claim.remediation && typeof claim.remediation === 'object'
|
|
356
|
+
? claim.remediation
|
|
357
|
+
: {};
|
|
358
|
+
if (typeof remediation.summary === 'string' && remediation.summary.length > 0) {
|
|
359
|
+
remediationRecommendations.push({
|
|
360
|
+
claim_id: claim.id,
|
|
361
|
+
standard,
|
|
362
|
+
severity,
|
|
363
|
+
summary: remediation.summary,
|
|
364
|
+
actions: Array.isArray(remediation.actions) ? remediation.actions.slice(0, 3) : [],
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const severityRank = {
|
|
369
|
+
critical: 0,
|
|
370
|
+
high: 1,
|
|
371
|
+
medium: 2,
|
|
372
|
+
low: 3,
|
|
373
|
+
none: 4,
|
|
374
|
+
};
|
|
375
|
+
remediationRecommendations.sort((a, b) => {
|
|
376
|
+
const left = severityRank[String(a.severity)] ?? 5;
|
|
377
|
+
const right = severityRank[String(b.severity)] ?? 5;
|
|
378
|
+
if (left !== right) {
|
|
379
|
+
return left - right;
|
|
380
|
+
}
|
|
381
|
+
return String(a.claim_id || '').localeCompare(String(b.claim_id || ''));
|
|
382
|
+
});
|
|
383
|
+
return {
|
|
384
|
+
totals,
|
|
385
|
+
by_standard: byStandard,
|
|
386
|
+
status_breakdown: statusBreakdown,
|
|
387
|
+
remediation_recommendations: remediationRecommendations.slice(0, 20),
|
|
388
|
+
};
|
|
389
|
+
}
|
|
246
390
|
function checkHashChain(events, config) {
|
|
247
391
|
const immutability = (config || {}).immutability || {};
|
|
248
392
|
const scope = immutability.scope || 'per_trace';
|
|
@@ -383,7 +527,7 @@ function buildCallInventory(events, maxCalls) {
|
|
|
383
527
|
return { by_event_type: byType, llm_call_samples: calls };
|
|
384
528
|
}
|
|
385
529
|
function buildModelInventory(events, config) {
|
|
386
|
-
const report = (0, report_1.buildReport)(events, (config || {}).policies);
|
|
530
|
+
const report = (0, report_1.buildReport)(events, (config || {}).policies, (config || {}).registry);
|
|
387
531
|
const byModel = report.by_model || {};
|
|
388
532
|
const registry = new registry_1.ModelRegistry((config || {}).registry || {});
|
|
389
533
|
const inventory = [];
|
|
@@ -815,6 +959,16 @@ function evaluateClaims(claims, evidence, config, events, verifiedExcerpts, exce
|
|
|
815
959
|
else if (claimSkipped) {
|
|
816
960
|
overallStatus = 'insufficient_evidence';
|
|
817
961
|
}
|
|
962
|
+
const severity = claimSeverity({
|
|
963
|
+
status: overallStatus,
|
|
964
|
+
checks: checkResults,
|
|
965
|
+
insufficientReasons,
|
|
966
|
+
});
|
|
967
|
+
const remediation = claimRemediation({
|
|
968
|
+
status: overallStatus,
|
|
969
|
+
checks: checkResults,
|
|
970
|
+
insufficientReasons,
|
|
971
|
+
});
|
|
818
972
|
const evidenceIds = Array.from(new Set(checkResults.flatMap((check) => check.evidence_event_ids || [])));
|
|
819
973
|
const eventGraph = evidenceIds.length > 0 ? buildEventGraph(events, evidenceIds) : {
|
|
820
974
|
nodes: [],
|
|
@@ -830,6 +984,8 @@ function evaluateClaims(claims, evidence, config, events, verifiedExcerpts, exce
|
|
|
830
984
|
section: claim.section,
|
|
831
985
|
statement: claim.statement,
|
|
832
986
|
status: overallStatus,
|
|
987
|
+
severity,
|
|
988
|
+
remediation,
|
|
833
989
|
checks: checkResults,
|
|
834
990
|
evidence_event_ids: evidenceIds,
|
|
835
991
|
causal_paths: evidenceIds.length > 0 ? buildCausalPaths(events, evidenceIds) : {},
|
|
@@ -846,7 +1002,7 @@ function buildStandardsReport(options) {
|
|
|
846
1002
|
const { events, config, reportPath, claimsPath, maxCalls = 25 } = options;
|
|
847
1003
|
const { metadata, claims, excerpts, reportSource } = loadClaims(reportPath, claimsPath);
|
|
848
1004
|
validateClaims(claims);
|
|
849
|
-
const report = (0, report_1.buildReport)(events, (config || {}).policies);
|
|
1005
|
+
const report = (0, report_1.buildReport)(events, (config || {}).policies, (config || {}).registry);
|
|
850
1006
|
const evidence = report.evidence || {};
|
|
851
1007
|
evidence.unknown_models_used = report.model_compliance?.unknown_models_used || [];
|
|
852
1008
|
evidence.forbidden_models_blocked = report.model_compliance?.forbidden_models_blocked || [];
|
|
@@ -859,6 +1015,7 @@ function buildStandardsReport(options) {
|
|
|
859
1015
|
const { normalized: normalizedExcerpts, verified, issues } = normalizeExcerpts(excerpts, resolvedReportSource);
|
|
860
1016
|
const evaluatedClaims = evaluateClaims(claims, evidence, config, events, verified, issues);
|
|
861
1017
|
const coverageSummary = buildCoverageSummary(evaluatedClaims);
|
|
1018
|
+
const findingsSummary = buildFindingsSummary(evaluatedClaims);
|
|
862
1019
|
const excerptsSummary = {
|
|
863
1020
|
total: normalizedExcerpts.length,
|
|
864
1021
|
verified: Object.keys(verified).length,
|
|
@@ -882,5 +1039,6 @@ function buildStandardsReport(options) {
|
|
|
882
1039
|
evidence,
|
|
883
1040
|
claims: evaluatedClaims,
|
|
884
1041
|
coverage_summary: coverageSummary,
|
|
1042
|
+
findings_summary: findingsSummary,
|
|
885
1043
|
};
|
|
886
1044
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards_ingest.d.ts","sourceRoot":"","sources":["../src/standards_ingest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standards_ingest.d.ts","sourceRoot":"","sources":["../src/standards_ingest.ts"],"names":[],"mappings":"AAkIA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAyB/B;AA6CD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AA4BD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA4D7B;AAoPD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACxC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAU/B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAW/B"}
|
package/dist/standards_ingest.js
CHANGED
|
@@ -129,10 +129,7 @@ function extractPdfOcr(reportPath) {
|
|
|
129
129
|
}
|
|
130
130
|
finally {
|
|
131
131
|
try {
|
|
132
|
-
|
|
133
|
-
fs.unlinkSync(path.join(tempDir, entry));
|
|
134
|
-
}
|
|
135
|
-
fs.rmdirSync(tempDir);
|
|
132
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
136
133
|
}
|
|
137
134
|
catch {
|
|
138
135
|
// best-effort cleanup
|
package/dist/telemetry.d.ts
CHANGED
|
@@ -60,6 +60,19 @@ export declare class MinimalBackend extends MetricsBackend {
|
|
|
60
60
|
observe(_name: string, _value: number, _labels?: Record<string, string>): void;
|
|
61
61
|
close(): Promise<void>;
|
|
62
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* In-memory backend that records all metrics for debugging/testing.
|
|
65
|
+
*/
|
|
66
|
+
export declare class MemoryBackend extends MetricsBackend {
|
|
67
|
+
private counters;
|
|
68
|
+
private gauges;
|
|
69
|
+
private histograms;
|
|
70
|
+
private formatKey;
|
|
71
|
+
increment(name: string, value?: number, labels?: Record<string, string>): void;
|
|
72
|
+
gauge(name: string, value: number, labels?: Record<string, string>): void;
|
|
73
|
+
observe(name: string, value: number, labels?: Record<string, string>): void;
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
}
|
|
63
76
|
/**
|
|
64
77
|
* Prometheus metrics backend.
|
|
65
78
|
*
|
|
@@ -67,6 +80,7 @@ export declare class MinimalBackend extends MetricsBackend {
|
|
|
67
80
|
*/
|
|
68
81
|
export declare class PrometheusBackend extends MetricsBackend {
|
|
69
82
|
private metrics;
|
|
83
|
+
private registry;
|
|
70
84
|
private pushGateway?;
|
|
71
85
|
private jobName;
|
|
72
86
|
private server?;
|
|
@@ -107,11 +121,11 @@ export declare class StatsdBackend extends MetricsBackend {
|
|
|
107
121
|
*/
|
|
108
122
|
export interface TelemetryConfig {
|
|
109
123
|
enabled?: boolean;
|
|
110
|
-
backend?: 'minimal' | 'prometheus' | 'statsd';
|
|
124
|
+
backend?: 'none' | 'minimal' | 'memory' | 'prometheus' | 'statsd';
|
|
111
125
|
prometheus?: {
|
|
112
126
|
port?: number;
|
|
113
127
|
start_server?: boolean;
|
|
114
|
-
push_gateway?: string;
|
|
128
|
+
push_gateway?: string | null;
|
|
115
129
|
job_name?: string;
|
|
116
130
|
};
|
|
117
131
|
statsd?: {
|
package/dist/telemetry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,QAAA,IAAI,oBAAoB,SAAQ,CAAC;AAajC,QAAA,IAAI,gBAAgB,SAAQ,CAAC;AAU7B,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AAElD;;GAEG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAwH3D,CAAC;AAEF;;GAEG;AACH,8BAAsB,cAAc;IAClC,QAAQ,CAAC,SAAS,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,OAAO,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,KAAK,CACH,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAIZ;IAEH,OAAO,CAAC,SAAS;IASjB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IASP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQzE,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IAEnD,OAAO,CAAC,OAAO,CAA+B;
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,QAAA,IAAI,oBAAoB,SAAQ,CAAC;AAajC,QAAA,IAAI,gBAAgB,SAAQ,CAAC;AAU7B,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AAElD;;GAEG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAwH3D,CAAC;AAEF;;GAEG;AACH,8BAAsB,cAAc;IAClC,QAAQ,CAAC,SAAS,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,OAAO,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,KAAK,CACH,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAIZ;IAEH,OAAO,CAAC,SAAS;IASjB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IASP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQzE,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,UAAU,CAAoC;IAEtD,OAAO,CAAC,SAAS;IASjB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IAMP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKzE,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IAOD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IAEnD,OAAO,CAAC,OAAO,CAA+B;IAE9C,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,MAAM,CAAC,CAAM;gBAET,OAAO,GAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb;IAkDN,OAAO,CAAC,eAAe;IA6CvB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IAWP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAWzE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAWrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,WAAW;IA0BnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B;AAED;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAE/C,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,GAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ;IA0BN,OAAO,CAAC,UAAU;IASlB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IAKP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKzE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;IAClE,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAA;KAAE;IAKpD,OAAO,CAAC,WAAW;IA0CnB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IAIP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIzE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAI3E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK;IAIrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAC,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAmB;gBAGnC,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOjC,KAAK,IAAI,KAAK;IAKd,IAAI,IAAI,IAAI;CAMb;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAM5B;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAQlD;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAkB,GAAG,IAAI,CAK/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAkB,GAAG,IAAI,CAKjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAkB,GACxB,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAItD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpD;AAWD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAS7E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI3D"}
|
package/dist/telemetry.js
CHANGED
|
@@ -39,7 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.Timer = exports.MetricsCollector = exports.StatsdBackend = exports.PrometheusBackend = exports.MinimalBackend = exports.NoopBackend = exports.MetricsBackend = exports.MONORA_METRICS = exports.MetricType = exports.STATSD_AVAILABLE = exports.PROMETHEUS_AVAILABLE = void 0;
|
|
42
|
+
exports.Timer = exports.MetricsCollector = exports.StatsdBackend = exports.PrometheusBackend = exports.MemoryBackend = exports.MinimalBackend = exports.NoopBackend = exports.MetricsBackend = exports.MONORA_METRICS = exports.MetricType = exports.STATSD_AVAILABLE = exports.PROMETHEUS_AVAILABLE = void 0;
|
|
43
43
|
exports.getMetricsCollector = getMetricsCollector;
|
|
44
44
|
exports.initMetrics = initMetrics;
|
|
45
45
|
exports.closeMetrics = closeMetrics;
|
|
@@ -284,6 +284,44 @@ class MinimalBackend extends MetricsBackend {
|
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
exports.MinimalBackend = MinimalBackend;
|
|
287
|
+
/**
|
|
288
|
+
* In-memory backend that records all metrics for debugging/testing.
|
|
289
|
+
*/
|
|
290
|
+
class MemoryBackend extends MetricsBackend {
|
|
291
|
+
constructor() {
|
|
292
|
+
super(...arguments);
|
|
293
|
+
this.counters = new Map();
|
|
294
|
+
this.gauges = new Map();
|
|
295
|
+
this.histograms = new Map();
|
|
296
|
+
}
|
|
297
|
+
formatKey(name, labels) {
|
|
298
|
+
if (!labels || Object.keys(labels).length === 0) {
|
|
299
|
+
return name;
|
|
300
|
+
}
|
|
301
|
+
const entries = Object.entries(labels).sort(([a], [b]) => a.localeCompare(b));
|
|
302
|
+
const suffix = entries.map(([key, value]) => `${key}=${value}`).join(',');
|
|
303
|
+
return `${name}|${suffix}`;
|
|
304
|
+
}
|
|
305
|
+
increment(name, value = 1, labels) {
|
|
306
|
+
const key = this.formatKey(name, labels);
|
|
307
|
+
const current = this.counters.get(key) || 0;
|
|
308
|
+
this.counters.set(key, current + value);
|
|
309
|
+
}
|
|
310
|
+
gauge(name, value, labels) {
|
|
311
|
+
const key = this.formatKey(name, labels);
|
|
312
|
+
this.gauges.set(key, value);
|
|
313
|
+
}
|
|
314
|
+
observe(name, value, labels) {
|
|
315
|
+
const key = this.formatKey(name, labels);
|
|
316
|
+
const current = this.histograms.get(key) || [];
|
|
317
|
+
current.push(value);
|
|
318
|
+
this.histograms.set(key, current);
|
|
319
|
+
}
|
|
320
|
+
async close() {
|
|
321
|
+
// No-op
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
exports.MemoryBackend = MemoryBackend;
|
|
287
325
|
/**
|
|
288
326
|
* Prometheus metrics backend.
|
|
289
327
|
*
|
|
@@ -300,8 +338,9 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
300
338
|
}
|
|
301
339
|
this.pushGateway = options.pushGateway;
|
|
302
340
|
this.jobName = options.jobName || 'monora';
|
|
341
|
+
this.registry = new promClient.Registry();
|
|
303
342
|
// Collect default metrics
|
|
304
|
-
promClient.collectDefaultMetrics({ prefix: 'monora_' });
|
|
343
|
+
promClient.collectDefaultMetrics({ prefix: 'monora_', register: this.registry });
|
|
305
344
|
// Register Monora metrics
|
|
306
345
|
this.registerMetrics();
|
|
307
346
|
// Start HTTP server for scraping
|
|
@@ -310,25 +349,28 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
310
349
|
try {
|
|
311
350
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
312
351
|
const http = require('http');
|
|
313
|
-
|
|
352
|
+
const server = http.createServer(async (req, res) => {
|
|
314
353
|
if (req.url === '/metrics') {
|
|
315
|
-
res.setHeader('Content-Type',
|
|
316
|
-
res.end(await
|
|
354
|
+
res.setHeader('Content-Type', this.registry.contentType);
|
|
355
|
+
res.end(await this.registry.metrics());
|
|
317
356
|
}
|
|
318
357
|
else {
|
|
319
358
|
res.statusCode = 404;
|
|
320
359
|
res.end('Not found');
|
|
321
360
|
}
|
|
322
361
|
});
|
|
323
|
-
|
|
362
|
+
server.on('error', (error) => {
|
|
324
363
|
logger_1.logger.warning('Failed to start Prometheus server on port %d: %s', port, error);
|
|
364
|
+
this.server = null;
|
|
325
365
|
});
|
|
326
|
-
|
|
366
|
+
server.listen(port, () => {
|
|
367
|
+
this.server = server;
|
|
327
368
|
logger_1.logger.info('Prometheus metrics server started on port %d', port);
|
|
328
369
|
});
|
|
329
370
|
}
|
|
330
371
|
catch (error) {
|
|
331
372
|
logger_1.logger.warning('Failed to start Prometheus server on port %d: %s', port, error);
|
|
373
|
+
this.server = null;
|
|
332
374
|
}
|
|
333
375
|
}
|
|
334
376
|
}
|
|
@@ -340,6 +382,7 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
340
382
|
name,
|
|
341
383
|
help: definition.description,
|
|
342
384
|
labelNames: definition.labels || [],
|
|
385
|
+
registers: [this.registry],
|
|
343
386
|
}));
|
|
344
387
|
}
|
|
345
388
|
else if (definition.type === MetricType.GAUGE) {
|
|
@@ -347,6 +390,7 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
347
390
|
name,
|
|
348
391
|
help: definition.description,
|
|
349
392
|
labelNames: definition.labels || [],
|
|
393
|
+
registers: [this.registry],
|
|
350
394
|
}));
|
|
351
395
|
}
|
|
352
396
|
else if (definition.type === MetricType.HISTOGRAM) {
|
|
@@ -355,12 +399,13 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
355
399
|
help: definition.description,
|
|
356
400
|
labelNames: definition.labels || [],
|
|
357
401
|
buckets: definition.buckets,
|
|
402
|
+
registers: [this.registry],
|
|
358
403
|
}));
|
|
359
404
|
}
|
|
360
405
|
}
|
|
361
406
|
catch {
|
|
362
407
|
// Metric already registered
|
|
363
|
-
const existing =
|
|
408
|
+
const existing = this.registry.getSingleMetric(name);
|
|
364
409
|
if (existing) {
|
|
365
410
|
this.metrics.set(name, existing);
|
|
366
411
|
}
|
|
@@ -404,7 +449,7 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
404
449
|
if (!this.pushGateway)
|
|
405
450
|
return;
|
|
406
451
|
try {
|
|
407
|
-
const gateway = new promClient.Pushgateway(this.pushGateway);
|
|
452
|
+
const gateway = new promClient.Pushgateway(this.pushGateway, {}, this.registry);
|
|
408
453
|
await gateway.pushAdd({ jobName: this.jobName });
|
|
409
454
|
}
|
|
410
455
|
catch (error) {
|
|
@@ -443,7 +488,7 @@ class PrometheusBackend extends MetricsBackend {
|
|
|
443
488
|
if (this.server) {
|
|
444
489
|
await this.closeServer();
|
|
445
490
|
}
|
|
446
|
-
|
|
491
|
+
this.registry.clear();
|
|
447
492
|
}
|
|
448
493
|
}
|
|
449
494
|
exports.PrometheusBackend = PrometheusBackend;
|
|
@@ -492,7 +537,15 @@ class StatsdBackend extends MetricsBackend {
|
|
|
492
537
|
this.client.timing(formatted, value * 1000);
|
|
493
538
|
}
|
|
494
539
|
async close() {
|
|
495
|
-
|
|
540
|
+
await new Promise((resolve, reject) => {
|
|
541
|
+
this.client.close((error) => {
|
|
542
|
+
if (error) {
|
|
543
|
+
reject(error);
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
resolve();
|
|
547
|
+
});
|
|
548
|
+
});
|
|
496
549
|
}
|
|
497
550
|
}
|
|
498
551
|
exports.StatsdBackend = StatsdBackend;
|
|
@@ -511,16 +564,24 @@ class MetricsCollector {
|
|
|
511
564
|
}
|
|
512
565
|
const backendType = telemetryConfig.backend || 'minimal';
|
|
513
566
|
try {
|
|
514
|
-
if (backendType === '
|
|
567
|
+
if (backendType === 'none') {
|
|
568
|
+
this.backend = new NoopBackend();
|
|
569
|
+
this._enabled = false;
|
|
570
|
+
}
|
|
571
|
+
else if (backendType === 'minimal') {
|
|
515
572
|
this.backend = new MinimalBackend();
|
|
516
573
|
this._enabled = true;
|
|
517
574
|
}
|
|
575
|
+
else if (backendType === 'memory') {
|
|
576
|
+
this.backend = new MemoryBackend();
|
|
577
|
+
this._enabled = true;
|
|
578
|
+
}
|
|
518
579
|
else if (backendType === 'prometheus') {
|
|
519
580
|
const promConfig = telemetryConfig.prometheus || {};
|
|
520
581
|
this.backend = new PrometheusBackend({
|
|
521
582
|
port: promConfig.port,
|
|
522
583
|
startServer: promConfig.start_server,
|
|
523
|
-
pushGateway: promConfig.push_gateway,
|
|
584
|
+
pushGateway: promConfig.push_gateway || undefined,
|
|
524
585
|
jobName: promConfig.job_name,
|
|
525
586
|
});
|
|
526
587
|
this._enabled = true;
|
|
@@ -611,8 +672,10 @@ async function initMetrics(config) {
|
|
|
611
672
|
async function closeMetrics() {
|
|
612
673
|
if (globalCollector) {
|
|
613
674
|
const collector = globalCollector;
|
|
614
|
-
globalCollector = null;
|
|
615
675
|
await collector.close();
|
|
676
|
+
if (globalCollector === collector) {
|
|
677
|
+
globalCollector = null;
|
|
678
|
+
}
|
|
616
679
|
}
|
|
617
680
|
}
|
|
618
681
|
// Convenience functions for common metrics
|