feat: add database endpoint for actuator (#3351)

#### What type of PR is this?
/kind feature

/milestone 2.3.x

#### What this PR does / why we need it:

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

Fixes #3263

#### Special notes for your reviewer:
测试方法:
1. 使用超级管理员登录
2. 查看接口 /actuator/info 查看是否存在 database 字段。
#### Does this PR introduce a user-facing change?


```release-note
NONE
```
pull/3344/head^2
Li 2023-02-21 11:06:10 +08:00 committed by GitHub
parent 7e09cdcbf0
commit e49baa1cf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 48 additions and 0 deletions

View File

@ -0,0 +1,48 @@
package run.halo.app.actuator;
import io.r2dbc.spi.Connection;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionMetadata;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
public class DatabaseInfoContributor implements InfoContributor {
private static final String DATABASE_INFO_KEY = "database";
private final ConnectionFactory connectionFactory;
public DatabaseInfoContributor(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
@Override
public void contribute(Info.Builder builder) {
builder.withDetail(DATABASE_INFO_KEY, contributorMap());
}
public Map<String, Object> contributorMap() {
var map = new HashMap<String, Object>();
var connectionMetadata = getConnectionMetadata().block();
if (Objects.isNull(connectionMetadata)) {
return map;
}
map.put("name", connectionMetadata.getDatabaseProductName());
map.put("version", connectionMetadata.getDatabaseVersion());
return map;
}
private Mono<ConnectionMetadata> getConnectionMetadata() {
return Mono.usingWhen(this.connectionFactory.create(),
conn -> Mono.just(conn.getMetadata()),
Connection::close,
(conn, t) -> conn.close(),
Connection::close
);
}
}