Skip to content

Commit fec93a0

Browse files
committed
feat(supervisor): add prometheus metric for outbound http requests
1 parent 88ca009 commit fec93a0

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: supervisor
3+
type: improvement
4+
---
5+
6+
The supervisor now reports a Prometheus metric for its outbound HTTP requests, so failed calls to upstream services are visible for monitoring.

apps/supervisor/src/index.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
isKubernetesEnvironment,
2323
} from "@trigger.dev/core/v3/serverOnly";
2424
import { createK8sApi, createApiserverMetricsFetcher } from "./clients/kubernetes.js";
25-
import { collectDefaultMetrics, Gauge, Histogram } from "prom-client";
25+
import { collectDefaultMetrics, Counter, Gauge, Histogram } from "prom-client";
2626
import { register } from "./metrics.js";
2727
import { PodCleaner } from "./services/podCleaner.js";
2828
import { FailedPodHandler } from "./services/failedPodHandler.js";
@@ -60,6 +60,13 @@ const workloadCreateDuration = new Histogram({
6060
registers: [register],
6161
});
6262

63+
const outboundRequestsTotal = new Counter({
64+
name: "supervisor_outbound_request_total",
65+
help: "Count of outbound HTTP requests from the supervisor, by target name, method, response status, and outcome (ok, http_error, invalid_response, network_error).",
66+
labelNames: ["name", "method", "status", "outcome"],
67+
registers: [register],
68+
});
69+
6370
class ManagedSupervisor {
6471
private readonly workerSession: SupervisorSession;
6572
private readonly metricsServer?: HttpServer;
@@ -700,8 +707,15 @@ class ManagedSupervisor {
700707
});
701708

702709
if (!res.ok) {
710+
outboundRequestsTotal.inc({
711+
name: "warm_start",
712+
method: "POST",
713+
status: String(res.status),
714+
outcome: "http_error",
715+
});
703716
this.logger.error("Warm start failed", {
704717
runId: dequeuedMessage.run.id,
718+
statusCode: res.status,
705719
});
706720
return false;
707721
}
@@ -710,15 +724,34 @@ class ManagedSupervisor {
710724
const parsedData = z.object({ didWarmStart: z.boolean() }).safeParse(data);
711725

712726
if (!parsedData.success) {
727+
outboundRequestsTotal.inc({
728+
name: "warm_start",
729+
method: "POST",
730+
status: String(res.status),
731+
outcome: "invalid_response",
732+
});
713733
this.logger.error("Warm start response invalid", {
714734
runId: dequeuedMessage.run.id,
715735
data,
716736
});
717737
return false;
718738
}
719739

740+
outboundRequestsTotal.inc({
741+
name: "warm_start",
742+
method: "POST",
743+
status: String(res.status),
744+
outcome: "ok",
745+
});
746+
720747
return parsedData.data.didWarmStart;
721748
} catch (error) {
749+
outboundRequestsTotal.inc({
750+
name: "warm_start",
751+
method: "POST",
752+
status: "none",
753+
outcome: "network_error",
754+
});
722755
this.logger.error("Warm start error", {
723756
runId: dequeuedMessage.run.id,
724757
error,

0 commit comments

Comments
 (0)