Skip to content

Commit b88f9c2

Browse files
committed
fix(surrealdb): improve surrealdb healthchecks
1 parent 0c0afa1 commit b88f9c2

File tree

2 files changed

+50
-41
lines changed

2 files changed

+50
-41
lines changed

src/CommunityToolkit.Aspire.Hosting.SurrealDb/SurrealDbBuilderExtensions.cs

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public static IResourceBuilder<SurrealDbServerResource> AddSurrealServer(
8181
: SurrealDbContainerImageTags.Tag;
8282

8383
var surrealServer = new SurrealDbServerResource(name, userName?.Resource, passwordParameter);
84-
84+
8585
return builder.AddResource(surrealServer)
8686
.WithEndpoint(port: port, targetPort: SurrealDbPort, name: SurrealDbServerResource.PrimaryEndpointName)
8787
.WithImage(SurrealDbContainerImageTags.Image, imageTag)
@@ -106,33 +106,44 @@ public static IResourceBuilder<SurrealDbServerResource> AddSurrealServer(
106106
throw new DistributedApplicationException($"ResourceReadyEvent was published for the '{surrealServer.Name}' resource but the connection string was null.");
107107
}
108108

109-
var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
110-
await using var surrealClient = new SurrealDbClient(options);
109+
await EnsuresNsDbCreated(builder, connectionString, surrealServer, @event.Services, ct);
110+
});
111+
}
112+
113+
private static async Task EnsuresNsDbCreated(
114+
IDistributedApplicationBuilder builder,
115+
string connectionString,
116+
SurrealDbServerResource surrealServer,
117+
IServiceProvider services,
118+
CancellationToken ct
119+
)
120+
{
121+
var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
122+
await using var surrealClient = new SurrealDbClient(options);
111123

112-
foreach (var nsResourceName in surrealServer.Namespaces.Keys)
113-
{
114-
if (builder.Resources.FirstOrDefault(n =>
115-
string.Equals(n.Name, nsResourceName, StringComparison.OrdinalIgnoreCase)) is
116-
SurrealDbNamespaceResource surrealDbNamespace)
117-
{
118-
await CreateNamespaceAsync(surrealClient, surrealDbNamespace, @event.Services, ct)
119-
.ConfigureAwait(false);
124+
foreach (var nsResourceName in surrealServer.Namespaces.Keys)
125+
{
126+
if (builder.Resources.FirstOrDefault(n =>
127+
string.Equals(n.Name, nsResourceName, StringComparison.OrdinalIgnoreCase)) is
128+
SurrealDbNamespaceResource surrealDbNamespace)
129+
{
130+
await CreateNamespaceAsync(surrealClient, surrealDbNamespace, services, ct)
131+
.ConfigureAwait(false);
120132

121-
await surrealClient.Use(surrealDbNamespace.NamespaceName, null!, ct).ConfigureAwait(false);
133+
await surrealClient.Use(surrealDbNamespace.NamespaceName, null!, ct).ConfigureAwait(false);
122134

123-
foreach (var dbResourceName in surrealDbNamespace.Databases.Keys)
124-
{
125-
if (builder.Resources.FirstOrDefault(n =>
126-
string.Equals(n.Name, dbResourceName, StringComparison.OrdinalIgnoreCase)) is
127-
SurrealDbDatabaseResource surrealDbDatabase)
128-
{
129-
await CreateDatabaseAsync(surrealClient, surrealDbDatabase, @event.Services, ct)
130-
.ConfigureAwait(false);
131-
}
132-
}
133-
}
134-
}
135-
});
135+
foreach (var dbResourceName in surrealDbNamespace.Databases.Keys)
136+
{
137+
if (builder.Resources.FirstOrDefault(n =>
138+
string.Equals(n.Name, dbResourceName, StringComparison.OrdinalIgnoreCase)) is
139+
SurrealDbDatabaseResource surrealDbDatabase)
140+
{
141+
await CreateDatabaseAsync(surrealClient, surrealDbDatabase, services, ct)
142+
.ConfigureAwait(false);
143+
}
144+
}
145+
}
146+
}
136147
}
137148

138149
/// <summary>
@@ -234,24 +245,10 @@ public static IResourceBuilder<SurrealDbDatabaseResource> AddDatabase(
234245

235246
SurrealDbClient? surrealDbClient = null;
236247

237-
builder.ApplicationBuilder.Eventing.Subscribe<ConnectionStringAvailableEvent>(surrealServerDatabase, async (@event, ct) =>
238-
{
239-
var connectionString = await surrealServerDatabase.ConnectionStringExpression.GetValueAsync(ct).ConfigureAwait(false);
240-
if (connectionString is null)
241-
{
242-
throw new DistributedApplicationException($"ConnectionStringAvailableEvent was published for the '{surrealServerDatabase}' resource but the connection string was null.");
243-
}
244-
245-
var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
246-
surrealDbClient = new SurrealDbClient(options);
247-
});
248-
249248
string namespaceName = builder.Resource.Name;
250249
string serverName = builder.Resource.Parent.Name;
251250

252251
string healthCheckKey = $"{serverName}_{namespaceName}_{name}_check";
253-
// TODO : Bug to be fixed
254-
//builder.ApplicationBuilder.Services.AddHealthChecks().AddSurreal(_ => surrealDbClient!, healthCheckKey);
255252
builder.ApplicationBuilder.Services.AddHealthChecks().Add(new HealthCheckRegistration(
256253
name: healthCheckKey,
257254
_ => new SurrealDbHealthCheck(surrealDbClient!),
@@ -261,7 +258,17 @@ public static IResourceBuilder<SurrealDbDatabaseResource> AddDatabase(
261258
);
262259

263260
return builder.ApplicationBuilder.AddResource(surrealServerDatabase)
264-
.WithHealthCheck(healthCheckKey);
261+
.WithHealthCheck(healthCheckKey)
262+
.OnConnectionStringAvailable(async (_, _, ct) => {
263+
var connectionString = await surrealServerDatabase.ConnectionStringExpression.GetValueAsync(ct).ConfigureAwait(false);
264+
if (connectionString is null)
265+
{
266+
throw new DistributedApplicationException($"ConnectionStringAvailableEvent was published for the '{surrealServerDatabase}' resource but the connection string was null.");
267+
}
268+
269+
var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
270+
surrealDbClient = new SurrealDbClient(options);
271+
});
265272
}
266273

267274
/// <summary>

src/CommunityToolkit.Aspire.SurrealDb/SurrealDbHealthCheck.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context
2222
try
2323
{
2424
bool isHealthy = await _surrealdbClient.Health(cancellationToken).ConfigureAwait(false);
25-
25+
var response = await _surrealdbClient.RawQuery("RETURN 1", cancellationToken: cancellationToken).ConfigureAwait(false);
26+
response.EnsureAllOks();
27+
2628
return isHealthy
2729
? HealthCheckResult.Healthy()
2830
: new HealthCheckResult(context.Registration.FailureStatus);

0 commit comments

Comments
 (0)