feat: add index build state as readiness check indicator (#6700)

#### What type of PR is this?
/kind improvement
/area core
/milestone 2.20.x

#### What this PR does / why we need it:
将索引构建状态添加到就绪检测的指标中

#### Which issue(s) this PR fixes:
Fixes #6632

#### Does this PR introduce a user-facing change?
```release-note
将索引构建状态添加到就绪检测的指标中以优化就绪时访问出现索引不可用的问题
```
pull/6703/head^2
guqing 2024-09-28 19:05:41 +08:00 committed by GitHub
parent a53aa786e1
commit ca9adfc9d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 38 additions and 0 deletions

View File

@ -19,6 +19,8 @@ import java.util.function.Predicate;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.availability.AvailabilityChangeEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.dao.DataIntegrityViolationException;
@ -30,6 +32,7 @@ import org.springframework.transaction.reactive.TransactionalOperator;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.retry.Retry;
import run.halo.app.extension.availability.IndexBuildState;
import run.halo.app.extension.exception.ExtensionNotFoundException;
import run.halo.app.extension.index.DefaultExtensionIterator;
import run.halo.app.extension.index.ExtensionIterator;
@ -443,6 +446,7 @@ public class ReactiveExtensionClientImpl implements ReactiveExtensionClient {
private final ExtensionConverter converter;
private final ReactiveExtensionStoreClient client;
private final SchemeWatcherManager schemeWatcherManager;
private final ApplicationEventPublisher eventPublisher;
@NonNull
private ExtensionIterator<Extension> createExtensionIterator(Scheme scheme) {
@ -459,6 +463,8 @@ public class ReactiveExtensionClientImpl implements ReactiveExtensionClient {
@EventListener(ContextRefreshedEvent.class)
public void startBuildingIndex() {
AvailabilityChangeEvent.publish(eventPublisher, this, IndexBuildState.BUILDING);
final long startTimeMs = System.currentTimeMillis();
log.info("Start building index for all extensions, please wait...");
schemeManager.schemes()
@ -474,6 +480,8 @@ public class ReactiveExtensionClientImpl implements ReactiveExtensionClient {
indexerFactory.removeIndexer(scheme);
}
});
AvailabilityChangeEvent.publish(eventPublisher, this, IndexBuildState.BUILT);
log.info("Successfully built index in {}ms, Preparing to lunch application...",
System.currentTimeMillis() - startTimeMs);
}

View File

@ -0,0 +1,8 @@
package run.halo.app.extension.availability;
import org.springframework.boot.availability.AvailabilityState;
public enum IndexBuildState implements AvailabilityState {
BUILDING,
BUILT;
}

View File

@ -0,0 +1,22 @@
package run.halo.app.extension.availability;
import org.springframework.boot.actuate.availability.AvailabilityStateHealthIndicator;
import org.springframework.boot.actuate.health.Status;
import org.springframework.boot.availability.ApplicationAvailability;
import org.springframework.stereotype.Component;
@Component
public class IndexBuildStateHealthIndicator extends AvailabilityStateHealthIndicator {
/**
* Create a {@link IndexBuildStateHealthIndicator} instance by {@link ApplicationAvailability}.
* Mapping {@link IndexBuildState} to {@link Status}.
*
* @see IndexBuildState
*/
public IndexBuildStateHealthIndicator(ApplicationAvailability availability) {
super(availability, IndexBuildState.class, (statusMappings) -> {
statusMappings.add(IndexBuildState.BUILT, Status.UP);
statusMappings.add(IndexBuildState.BUILDING, Status.OUT_OF_SERVICE);
});
}
}