fix: use environmentId from heartbeat body for auto-heal
HeartbeatRequest now carries environmentId (cameleer3-common update). Auto-heal prefers the heartbeat value (most current) over the JWT claim, ensuring agents recover their correct environment immediately on the first heartbeat after server restart. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -206,19 +206,22 @@ public class AgentRegistrationController {
|
|||||||
@RequestBody(required = false) HeartbeatRequest request,
|
@RequestBody(required = false) HeartbeatRequest request,
|
||||||
HttpServletRequest httpRequest) {
|
HttpServletRequest httpRequest) {
|
||||||
Map<String, Object> capabilities = request != null ? request.getCapabilities() : null;
|
Map<String, Object> capabilities = request != null ? request.getCapabilities() : null;
|
||||||
|
String heartbeatEnv = request != null ? request.getEnvironmentId() : null;
|
||||||
boolean found = registryService.heartbeat(id, capabilities);
|
boolean found = registryService.heartbeat(id, capabilities);
|
||||||
if (!found) {
|
if (!found) {
|
||||||
// Auto-heal: re-register agent from JWT claims after server restart
|
// Auto-heal: re-register agent from heartbeat body + JWT claims after server restart
|
||||||
var jwtResult = (JwtService.JwtValidationResult) httpRequest.getAttribute(
|
var jwtResult = (JwtService.JwtValidationResult) httpRequest.getAttribute(
|
||||||
JwtAuthenticationFilter.JWT_RESULT_ATTR);
|
JwtAuthenticationFilter.JWT_RESULT_ATTR);
|
||||||
if (jwtResult != null) {
|
if (jwtResult != null) {
|
||||||
String application = jwtResult.application() != null ? jwtResult.application() : "default";
|
String application = jwtResult.application() != null ? jwtResult.application() : "default";
|
||||||
String env = jwtResult.environment() != null ? jwtResult.environment() : "default";
|
// Prefer environment from heartbeat body (most current), fall back to JWT claim
|
||||||
|
String env = heartbeatEnv != null ? heartbeatEnv
|
||||||
|
: jwtResult.environment() != null ? jwtResult.environment() : "default";
|
||||||
Map<String, Object> caps = capabilities != null ? capabilities : Map.of();
|
Map<String, Object> caps = capabilities != null ? capabilities : Map.of();
|
||||||
registryService.register(id, id, application, env, "unknown",
|
registryService.register(id, id, application, env, "unknown",
|
||||||
List.of(), caps);
|
List.of(), caps);
|
||||||
registryService.heartbeat(id);
|
registryService.heartbeat(id);
|
||||||
log.info("Auto-registered agent {} (app={}) from heartbeat after server restart", id, application);
|
log.info("Auto-registered agent {} (app={}, env={}) from heartbeat after server restart", id, application, env);
|
||||||
} else {
|
} else {
|
||||||
return ResponseEntity.notFound().build();
|
return ResponseEntity.notFound().build();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user