Skip to content

Commit 465f89f

Browse files
committed
add startup timer metric and tracking
1 parent f8f3b66 commit 465f89f

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/main/java/com/uid2/operator/Main.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@
6868
public class Main {
6969
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
7070

71+
// Startup timing field
72+
private static volatile Instant startupBeginTime;
73+
7174
private final JsonObject config;
7275
private final Vertx vertx;
7376
private final ApplicationVersion appVersion;
@@ -244,7 +247,43 @@ private KeyManager getKeyManager() {
244247
return new KeyManager(this.keysetKeyStore, this.keysetProvider);
245248
}
246249

250+
/**
251+
* Calculate startup duration following established codebase patterns.
252+
* @return Duration from startup begin to completion, or null if timing data is invalid
253+
*/
254+
private static Duration getStartupDuration() {
255+
if (startupBeginTime == null) {
256+
return null;
257+
}
258+
return Duration.between(startupBeginTime, Instant.now());
259+
}
260+
261+
/**
262+
* Record startup completion and register startup duration metric.
263+
* Called when the HTTP server successfully starts listening.
264+
*/
265+
public static void recordStartupComplete() {
266+
final Duration startupDuration = getStartupDuration();
267+
268+
// Register startup duration metric following existing pattern
269+
final String version = Optional.ofNullable(System.getenv("IMAGE_VERSION")).orElse("unknown");
270+
final double durationSeconds = startupDuration != null ? startupDuration.toMillis() / 1000.0 : -1.0;
271+
272+
Gauge.builder("uid2_operator_startup_duration_seconds", () -> durationSeconds)
273+
.description("Time taken for operator to start up and begin serving requests")
274+
.tags("version", version)
275+
.register(globalRegistry);
276+
277+
if (startupDuration != null) {
278+
LOGGER.info("UID2 Operator startup completed in {:.3f} seconds", durationSeconds);
279+
} else {
280+
LOGGER.warn("UID2 Operator startup completed but timing measurement failed");
281+
}
282+
}
283+
247284
public static void main(String[] args) throws Exception {
285+
// Record startup begin time following established patterns
286+
startupBeginTime = Instant.now();
248287

249288
java.security.Security.setProperty("networkaddress.cache.ttl" , "60");
250289

src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.uid2.operator.Const;
6+
import com.uid2.operator.Main;
67
import com.uid2.operator.model.*;
78
import com.uid2.operator.model.IdentityScope;
89
import com.uid2.operator.monitoring.IStatsCollectorQueue;
@@ -219,6 +220,8 @@ public void start(Promise<Void> startPromise) throws Exception {
219220
.listen(port, result -> {
220221
if (result.succeeded()) {
221222
this.healthComponent.setHealthStatus(true);
223+
// Record startup completion now that HTTP server is ready
224+
Main.recordStartupComplete();
222225
startPromise.complete();
223226
} else {
224227
this.healthComponent.setHealthStatus(false, result.cause().getMessage());

0 commit comments

Comments
 (0)