Merge pull request #7429 from JohnNiang/refactor/improve-failure-message-of-plugin

Show stack trace while failing to start plugin
pull/7441/head
John Niang 2025-05-15 12:03:49 +08:00 committed by GitHub
commit 3148fc3e31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 14 deletions

View File

@ -14,6 +14,8 @@ import static run.halo.app.plugin.PluginUtils.isDevelopmentMode;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
@ -302,25 +304,34 @@ public class PluginReconciler implements Reconciler<Request> {
return Result.requeue(Duration.ofSeconds(1));
}
PluginState pluginState;
try {
var pluginState = pluginManager.startPlugin(pluginName);
if (!PluginState.STARTED.equals(pluginState)) {
throw new IllegalStateException("""
Failed to start plugin %s(%s).\
""".formatted(pluginName, pluginState));
}
pluginState = pluginManager.startPlugin(pluginName);
} catch (Throwable e) {
log.debug("Error occurred when starting plugin {}", pluginName, e);
var writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
conditions.addAndEvictFIFO(Condition.builder()
.type(ConditionType.READY)
.status(ConditionStatus.FALSE)
.reason(ConditionReason.START_ERROR)
.message(e.getMessage())
.message(writer.toString())
.lastTransitionTime(clock.instant())
.build());
status.setPhase(Plugin.Phase.FAILED);
return Result.doNotRetry();
}
if (!PluginState.STARTED.equals(pluginState)) {
conditions.addAndEvictFIFO(Condition.builder()
.type(ConditionType.READY)
.status(ConditionStatus.FALSE)
.reason(ConditionReason.START_ERROR)
.message("Failed to start plugin " + pluginName + "(" + pluginState + ").")
.lastTransitionTime(clock.instant())
.build());
status.setPhase(Plugin.Phase.FAILED);
return Result.doNotRetry();
}
removeConditionBy(conditions, ConditionType.PROGRESSING);
status.setLastStartTime(clock.instant());

View File

@ -72,7 +72,7 @@ const modal = ref();
{{ condition.reason || "-" }}
</td>
<td class="whitespace-nowrap px-4 py-3 text-sm text-gray-500">
{{ condition.message || "-" }}
<pre>{{ condition.message || "-" }}</pre>
</td>
<td
v-tooltip="formatDatetime(condition.lastTransitionTime)"

View File

@ -117,12 +117,12 @@ const lastCondition = computed(() => {
v-if="errorAlertVisible && lastCondition"
class="w-full px-4 pb-2 sm:px-6"
>
<VAlert
type="error"
:title="lastCondition.reason"
:description="lastCondition.message"
:closable="false"
>
<VAlert type="error" :title="lastCondition.reason" :closable="false">
<template #description>
<div class="overflow-x-auto">
<pre>{{ lastCondition.message }}</pre>
</div>
</template>
<template #actions>
<VButton size="sm" @click="conditionsModalVisible = true">
{{ $t("core.plugin.detail.operations.view_conditions.button") }}