diff --git a/services/clsi/app/js/CompileManager.js b/services/clsi/app/js/CompileManager.js index 217afdb411..9ddb5ad4a8 100644 --- a/services/clsi/app/js/CompileManager.js +++ b/services/clsi/app/js/CompileManager.js @@ -40,6 +40,8 @@ const KNOWN_LATEXMK_RULES = new Set([ 'xelatex', ]) +const LATEX_PASSES_RULES = new Set(['latex', 'lualatex', 'xelatex', 'pdflatex']) + function getCompileName(projectId, userId) { if (userId != null) { return `${projectId}-${userId}` @@ -735,6 +737,35 @@ function _emitMetrics(request, status, stats, timings) { } } + const runs = stats.latexmk?.['latexmk-rule-times'] + let passes = 0 + if (runs != null) { + let cumulativeRuleTimeMs = 0 + for (const run of runs) { + if (LATEX_PASSES_RULES.has(run.rule)) { + passes += 1 + } + + const rule = KNOWN_LATEXMK_RULES.has(run.rule) ? run.rule : 'other' + ClsiMetrics.latexmkRuleDurationSeconds.observe( + { + group: request.compileGroup, + rule, + }, + run.time_ms / 1000 + ) + cumulativeRuleTimeMs += run.time_ms + } + + const totalTimeMs = stats.latexmk?.['latexmk-time']?.total + if (totalTimeMs != null) { + ClsiMetrics.latexmkRuleDurationSeconds.observe( + { group: request.compileGroup, rule: 'overhead' }, + (totalTimeMs - cumulativeRuleTimeMs) / 1000 + ) + } + } + ClsiMetrics.compilesTotal.inc({ status, engine: request.compiler, @@ -743,6 +774,7 @@ function _emitMetrics(request, status, stats, timings) { group: request.compileGroup, draft: request.draft ? 'true' : 'false', stop_on_first_error: request.stopOnFirstError ? 'true' : 'false', + passes, }) if (timings.sync != null) { @@ -763,6 +795,7 @@ function _emitMetrics(request, status, stats, timings) { engine: request.compiler, compile: request.metricsOpts.compile, group: request.compileGroup, + passes: passes === 0 ? 'none' : passes === 1 ? 'single' : 'multiple', }, timings.compile / 1000 ) @@ -781,20 +814,6 @@ function _emitMetrics(request, status, stats, timings) { if (timings.compileE2E != null) { ClsiMetrics.e2eCompileDurationSeconds.observe(timings.compileE2E / 1000) } - - const runs = stats.latexmk?.['latexmk-rule-times'] - if (runs != null) { - for (const run of runs) { - const rule = KNOWN_LATEXMK_RULES.has(run.rule) ? run.rule : 'other' - ClsiMetrics.latexmkRuleDurationSeconds.observe( - { - group: request.compileGroup, - rule, - }, - run.time_ms / 1000 - ) - } - } } module.exports = { diff --git a/services/clsi/app/js/Metrics.js b/services/clsi/app/js/Metrics.js index ea1becd541..d064c43b3e 100644 --- a/services/clsi/app/js/Metrics.js +++ b/services/clsi/app/js/Metrics.js @@ -16,6 +16,7 @@ const compilesTotal = new prom.Counter({ 'image', 'draft', 'stop_on_first_error', + 'passes', ], }) @@ -23,7 +24,7 @@ const compileDurationSeconds = new prom.Histogram({ name: 'clsi_compile_duration_seconds', help: 'Duration of the latexmkrc invocation', buckets: COMPILE_TIME_BUCKETS, - labelNames: ['status', 'engine', 'compile', 'group'], + labelNames: ['status', 'engine', 'compile', 'group', 'passes'], }) const e2eCompileDurationSeconds = new prom.Histogram({