|
36 | 36 | import com.uid2.shared.health.PodTerminationMonitor; |
37 | 37 | import io.micrometer.core.instrument.Gauge; |
38 | 38 | import io.micrometer.core.instrument.Meter; |
| 39 | +import io.micrometer.core.instrument.Timer; |
39 | 40 | import io.micrometer.core.instrument.MeterRegistry; |
40 | 41 | import io.micrometer.core.instrument.Metrics; |
41 | 42 | import io.micrometer.core.instrument.config.MeterFilter; |
|
68 | 69 | public class Main { |
69 | 70 | private static final Logger LOGGER = LoggerFactory.getLogger(Main.class); |
70 | 71 |
|
| 72 | + // Startup timing field |
71 | 73 | private static volatile Instant startupBeginTime; |
72 | 74 |
|
73 | 75 | private final JsonObject config; |
@@ -246,28 +248,29 @@ private KeyManager getKeyManager() { |
246 | 248 | return new KeyManager(this.keysetKeyStore, this.keysetProvider); |
247 | 249 | } |
248 | 250 |
|
| 251 | + /** |
| 252 | + * Calculate startup duration following established codebase patterns. |
| 253 | + * @return Duration from startup begin to completion, or null if timing data is invalid |
| 254 | + */ |
249 | 255 | private static Duration getStartupDuration() { |
250 | | - return startupBeginTime != null ? Duration.between(startupBeginTime, Instant.now()) : null; |
| 256 | + if (startupBeginTime == null) { |
| 257 | + return null; |
| 258 | + } |
| 259 | + return Duration.between(startupBeginTime, Instant.now()); |
251 | 260 | } |
252 | 261 |
|
253 | 262 | public static void recordStartupComplete() { |
254 | | - final Duration startupDuration = getStartupDuration(); |
255 | | - final String version = Optional.ofNullable(System.getenv("IMAGE_VERSION")).orElse("unknown"); |
256 | | - final double durationSeconds = startupDuration != null ? startupDuration.toMillis() / 1000.0 : -1.0; |
257 | | - |
258 | | - Gauge.builder("uid2_operator_startup_duration_seconds", () -> durationSeconds) |
259 | | - .description("Time taken for operator to start up and begin serving requests") |
260 | | - .tags("version", version) |
261 | | - .register(globalRegistry); |
262 | | - |
263 | | - if (startupDuration != null) { |
264 | | - LOGGER.info("Operator startup completed in {} seconds", String.format("%.3f", durationSeconds)); |
265 | | - } else { |
266 | | - LOGGER.warn("Operator startup completed but timing measurement failed"); |
267 | | - } |
| 263 | + final Duration d = getStartupDuration(); |
| 264 | + if (d == null) return; |
| 265 | + Timer |
| 266 | + .builder("uid2_operator_startup_duration") |
| 267 | + .register(globalRegistry) |
| 268 | + .record(d); |
| 269 | + LOGGER.info("Operator startup completed in {} seconds", String.format("%.3f", d.toMillis() / 1000.0)); |
268 | 270 | } |
269 | 271 |
|
270 | 272 | public static void main(String[] args) throws Exception { |
| 273 | + // Record startup begin time following established patterns |
271 | 274 | startupBeginTime = Instant.now(); |
272 | 275 |
|
273 | 276 | java.security.Security.setProperty("networkaddress.cache.ttl" , "60"); |
|
0 commit comments