1
0
Fork 0
mirror of https://github.com/imjasonh/gcp-metrics-action synced 2026-07-22 15:42:07 +00:00

infer conclusion more better

Signed-off-by: Jason Hall <jason@chainguard.dev>
This commit is contained in:
Jason Hall 2025-11-05 16:22:16 -05:00
parent 386e00a262
commit 17b45e09f1
6 changed files with 67 additions and 158 deletions

2
dist/index.js vendored
View file

@ -366,7 +366,7 @@ function recordMetrics(meter, metrics, metricPrefix) {
});
core.debug(`Created histogram metric: ${stepDurationName}`);
// Record job-level metrics (always record, even if job not completed yet)
// Record job-level metrics (always record, even if job not fully complete)
const jobDurationHistogram = meter.createHistogram(`${metricPrefix}.job.duration`, {
description: 'Duration of workflow jobs in milliseconds',
unit: 'ms',

20
dist/post/index.js vendored
View file

@ -64,21 +64,23 @@ async function collectMetrics(octokit, context) {
});
// Calculate job duration
// Post-action runs before job is marked complete, so we estimate
// Post-action runs before job is marked complete, so estimate using current time
const jobStartedAt = job.started_at ? new Date(job.started_at) : new Date();
const jobCompletedAt = job.completed_at ? new Date(job.completed_at) : new Date();
const jobDurationMs = jobCompletedAt - jobStartedAt;
if (!job.completed_at) {
core.debug(`Job not marked complete yet, estimating duration using current time: ${jobDurationMs}ms`);
core.debug(`Job not marked complete yet, estimating duration: ${jobDurationMs}ms`);
}
// Infer job conclusion from steps if not set (post-action runs before job completes)
let jobConclusion = job.conclusion;
if (!jobConclusion || jobConclusion === 'unknown') {
const hasFailure = steps.some(s => s.conclusion === 'failure');
const hasCancelled = steps.some(s => s.conclusion === 'cancelled');
// Only look at completed steps (ignore pending/in-progress post-action steps)
const completedSteps = steps.filter(s => s.conclusion !== null);
const hasFailure = completedSteps.some(s => s.conclusion === 'failure');
const hasCancelled = completedSteps.some(s => s.conclusion === 'cancelled');
if (hasFailure) {
jobConclusion = 'failure';
@ -86,12 +88,12 @@ async function collectMetrics(octokit, context) {
} else if (hasCancelled) {
jobConclusion = 'cancelled';
core.debug('Inferred job conclusion as "cancelled" based on cancelled steps');
} else if (steps.length > 0 && steps.every(s => s.conclusion === 'success' || s.conclusion === 'skipped')) {
} else if (completedSteps.length > 0 && completedSteps.every(s => s.conclusion === 'success' || s.conclusion === 'skipped')) {
jobConclusion = 'success';
core.debug('Inferred job conclusion as "success" based on step results');
core.debug(`Inferred job conclusion as "success" based on ${completedSteps.length} completed steps`);
} else {
jobConclusion = 'unknown';
core.debug('Could not infer job conclusion from steps');
core.debug(`Could not infer job conclusion from steps (${completedSteps.length} completed steps)`);
}
}
@ -514,7 +516,7 @@ function recordMetrics(meter, metrics, metricPrefix) {
});
core.debug(`Created histogram metric: ${stepDurationName}`);
// Record job-level metrics (always record, even if job not completed yet)
// Record job-level metrics (always record, even if job not fully complete)
const jobDurationHistogram = meter.createHistogram(`${metricPrefix}.job.duration`, {
description: 'Duration of workflow jobs in milliseconds',
unit: 'ms',