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.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
@ -302,20 +304,29 @@ public class PluginReconciler implements Reconciler<Request> {
return Result.requeue(Duration.ofSeconds(1)); return Result.requeue(Duration.ofSeconds(1));
} }
PluginState pluginState;
try { try {
var pluginState = pluginManager.startPlugin(pluginName); pluginState = pluginManager.startPlugin(pluginName);
if (!PluginState.STARTED.equals(pluginState)) {
throw new IllegalStateException("""
Failed to start plugin %s(%s).\
""".formatted(pluginName, pluginState));
}
} catch (Throwable e) { } catch (Throwable e) {
log.debug("Error occurred when starting plugin {}", pluginName, e); log.debug("Error occurred when starting plugin {}", pluginName, e);
var writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
conditions.addAndEvictFIFO(Condition.builder() conditions.addAndEvictFIFO(Condition.builder()
.type(ConditionType.READY) .type(ConditionType.READY)
.status(ConditionStatus.FALSE) .status(ConditionStatus.FALSE)
.reason(ConditionReason.START_ERROR) .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()) .lastTransitionTime(clock.instant())
.build()); .build());
status.setPhase(Plugin.Phase.FAILED); status.setPhase(Plugin.Phase.FAILED);

View File

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

View File

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