Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -123,17 +123,17 @@ public Mono<byte[]> getImage(String screenshotPath, String tenantId) {
}

/**
* Update the log level in the backend service
* Update a setting in the backend service (SCORE_CAP, RECOVERY_TRIES, SELECTOR_TYPE, LOG_LEVEL, …)
*
* @param logLevel The log level to set (ERROR, WARN, INFO, DEBUG, TRACE)
* @param loggerName The name of the logger to update (not used anymore, kept for compatibility)
* @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev)
* @param key Setting key expected by backend {@code /healenium/settings/update}
* @param value New value
* @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev)
* @return Mono with the response from the backend service
*/
public Mono<Map<String, String>> updateBackendLogLevel(String logLevel, String loggerName, String tenantId) {
public Mono<Map<String, Object>> updateBackendSetting(String key, String value, String tenantId) {
Map<String, String> requestBody = Map.of(
"key", "LOG_LEVEL",
"value", logLevel
"key", key,
"value", value
);

return backendCall(tenantId, () -> backendClient(tenantId)
Expand All @@ -142,17 +142,29 @@ public Mono<Map<String, String>> updateBackendLogLevel(String logLevel, String l
.uri(BACKEND_SETTINGS_UPDATE_URI)
.bodyValue(requestBody)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<Map<String, String>>() {
.bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {
})
.onErrorResume(e -> {
log.error("Error updating backend log level: {}", e.getMessage(), e);
log.error("Error updating backend setting {} = {}: {}", key, value, e.getMessage(), e);
return Mono.just(Map.of(
"status", "error",
"message", "Error updating backend log level: " + e.getMessage()
"message", "Error updating backend setting: " + e.getMessage()
));
}));
}

/**
* Update the log level in the backend service
*
* @param logLevel The log level to set (ERROR, WARN, INFO, DEBUG, TRACE)
* @param loggerName The name of the logger to update (not used anymore, kept for compatibility)
* @param tenantId Tenant UUID for Pro data-plane (may be blank in Free/dev)
* @return Mono with the response from the backend service
*/
public Mono<Map<String, Object>> updateBackendLogLevel(String logLevel, String loggerName, String tenantId) {
return updateBackendSetting("LOG_LEVEL", logLevel, tenantId);
}

/**
* Update the log level in the AI service
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,19 +107,19 @@ public Mono<Map<String, Object>> updateSingleSetting(String key, String value, S
try {
switch (key) {
case "SELECTOR_TYPE":
handleSelectorType(value, response, errors);
handleSelectorType(value, response, errors, tenantId);
return buildResponse(key, value, response, errors);

case "HEAL_ENABLED":
handleHealEnabled(Boolean.parseBoolean(value), response, errors);
return buildResponse(key, value, response, errors);

case "RECOVERY_TRIES":
handleRecoveryTries(Integer.parseInt(value), response, errors);
handleRecoveryTries(Integer.parseInt(value), response, errors, tenantId);
return buildResponse(key, value, response, errors);

case "SCORE_CAP":
handleScoreCap(Double.parseDouble(value), response, errors);
handleScoreCap(Double.parseDouble(value), response, errors, tenantId);
return buildResponse(key, value, response, errors);

case "LOG_LEVEL":
Expand All @@ -131,6 +131,7 @@ public Mono<Map<String, Object>> updateSingleSetting(String key, String value, S
"FIND_ELEMENTS_AUTO_HEALING":
response.put(MESSAGE, "Setting " + key + " is managed by backend service");
response.put(SUCCESS, true);
updateBackendSetting(key, value, tenantId);
return buildResponse(key, value, response, errors);

case "NODE_PATH_SHORTCUT",
Expand Down Expand Up @@ -180,14 +181,19 @@ private Map<String, Object> buildResponse(String key, String value, Map<String,
// ==================== Setting Handlers ====================

/**
* Handle selector type setting update
* Handle selector type setting update (proxy + playwright-proxy + backend)
*/
private void handleSelectorType(String value, Map<String, Object> response, Map<String, String> errors) {
handleSelectorType(value, response, errors, "");
}

private void handleSelectorType(String value, Map<String, Object> response, Map<String, String> errors, String tenantId) {
String validationError = validateSelectorType(value);
if (validationError == null) {
proxyConfig.updateConfigValue("selector-type", value);
response.put("selectorType", value);
updatePlaywrightProxySetting("SELECTOR_TYPE", value);
updateBackendSetting("SELECTOR_TYPE", value, tenantId);
} else {
errors.put("selectorType", validationError);
}
Expand All @@ -203,28 +209,38 @@ private void handleHealEnabled(Boolean value, Map<String, Object> response, Map<
}

/**
* Handle recovery tries setting update (shared with Playwright proxy)
* Handle recovery tries setting update (proxy + playwright-proxy + backend)
*/
private void handleRecoveryTries(Integer value, Map<String, Object> response, Map<String, String> errors) {
handleRecoveryTries(value, response, errors, "");
}

private void handleRecoveryTries(Integer value, Map<String, Object> response, Map<String, String> errors, String tenantId) {
String validationError = validateRecoveryTries(value);
if (validationError == null) {
proxyConfig.updateConfigValue("recovery-tries", value);
response.put("recoveryTries", value);
updatePlaywrightProxySetting("RECOVERY_TRIES", value.toString());
updateBackendSetting("RECOVERY_TRIES", value.toString(), tenantId);
} else {
errors.put("recoveryTries", validationError);
}
}

/**
* Handle score cap setting update (shared with Playwright proxy)
* Handle score cap setting update (proxy + playwright-proxy + backend)
*/
private void handleScoreCap(Double value, Map<String, Object> response, Map<String, String> errors) {
handleScoreCap(value, response, errors, "");
}

private void handleScoreCap(Double value, Map<String, Object> response, Map<String, String> errors, String tenantId) {
String validationError = validateScoreCap(value);
if (validationError == null) {
proxyConfig.updateConfigValue("score-cap", value);
response.put("scoreCap", value);
updatePlaywrightProxySetting("SCORE_CAP", value.toString());
updateBackendSetting("SCORE_CAP", value.toString(), tenantId);
} else {
errors.put("scoreCap", validationError);
}
Expand Down Expand Up @@ -371,14 +387,21 @@ private String validateLogLevel(String logLevel) {
* Update the log level in the backend service
*/
private void updateBackendLogLevel(String logLevel, String tenantId) {
updateBackendSetting("LOG_LEVEL", logLevel, tenantId);
}

/**
* Propagate a setting to healenium-backend asynchronously
*/
private void updateBackendSetting(String key, String value, String tenantId) {
try {
restService.updateBackendLogLevel(logLevel, "ROOT", tenantId)
restService.updateBackendSetting(key, value, tenantId)
.subscribe(
result -> log.debug("Backend log level updated successfully: {}", result),
error -> log.error("Error updating backend log level", error)
result -> log.debug("Backend setting updated successfully: {} = {}", key, value),
error -> log.warn("Could not update backend setting {} = {}: {}", key, value, error.getMessage())
);
} catch (Exception e) {
log.error("Error updating backend log level", e);
log.error("Error updating backend setting: " + key, e);
}
}

Expand Down