Skip to content

Commit 09facb9

Browse files
Merge branch 'master' into otel-metrics
2 parents 4469d94 + c9a8215 commit 09facb9

File tree

13 files changed

+103
-42
lines changed

13 files changed

+103
-42
lines changed

.github/workflows/build-containers.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
with:
3939
version: ${{ env.MinVerVersion }}
4040
- name: Set up Docker Buildx
41-
uses: docker/setup-buildx-action@v3.7.1
41+
uses: docker/setup-buildx-action@v3.8.0
4242
- name: Log in to GitHub container registry
4343
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
4444
- name: Build & inspect image

.github/workflows/push-container-images.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ jobs:
5353
password: ${{ secrets.DOCKERHUB_TOKEN }}
5454
repository: particular/servicecontrol
5555
readme-filepath: ./src/ServiceControl/Container-README.md
56+
short-description: Gather status, performance and monitoring data for multiple endpoints from a single location.
5657
- name: Update Docker Hub Description - Audit
5758
if: ${{ steps.validate.outputs.latest == 'true' }}
5859
uses: peter-evans/[email protected]
@@ -61,6 +62,7 @@ jobs:
6162
password: ${{ secrets.DOCKERHUB_TOKEN }}
6263
repository: particular/servicecontrol-audit
6364
readme-filepath: ./src/ServiceControl.Audit/Container-README.md
65+
short-description: Provide valuable information about the message flow through a system.
6466
- name: Update Docker Hub Description - Monitoring
6567
if: ${{ steps.validate.outputs.latest == 'true' }}
6668
uses: peter-evans/[email protected]
@@ -69,6 +71,7 @@ jobs:
6971
password: ${{ secrets.DOCKERHUB_TOKEN }}
7072
repository: particular/servicecontrol-monitoring
7173
readme-filepath: ./src/ServiceControl.Monitoring/Container-README.md
74+
short-description: Track the health of a distributed system.
7275
- name: Update Docker Hub Description - RavenDB
7376
if: ${{ steps.validate.outputs.latest == 'true' }}
7477
uses: peter-evans/[email protected]
@@ -77,3 +80,4 @@ jobs:
7780
password: ${{ secrets.DOCKERHUB_TOKEN }}
7881
repository: particular/servicecontrol-ravendb
7982
readme-filepath: ./src/ServiceControl.RavenDB/Container-README.md
83+
short-description: The default storage for ServiceControl instances.

README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ ServiceControl, ServiceControl.Audit, and ServiceControl.Monitoring can be run/d
1010

1111
- Edit the `app.config` file of the instance type that needs to be run/debugged to select which transport and persistence to use.
1212
- The configuration file contains commented settings for each supported transport and persistence. It also provides some guidance on additional required settings for specific persisters.
13+
- ServiceControl works with a RavenDB persistence
14+
- ServiceControl.Audit can work with RavenDB or an InMemory persistence
1315
- Run or debug the project as usual
1416

1517
A video demo showing how to set it up is available on the Particular YouTube channel:
@@ -27,10 +29,6 @@ It's also possible to [locally test containers built from PRs in GitHub Containe
2729
If the instance is executed for the first time, it must set up the required infrastructure. To do so, once the instance is configured to use the selected transport and persister, run it in setup mode. This can be done by using the `Setup {instance name}` launch profile that is defined in
2830
the `launchSettings.json` file of each instance. When started in setup mode, the instance will start as usual, execute the setup process, and exit. At this point the instance can be run normally by using the non-setup launch profile.
2931

30-
### Run Instances on Learning transport
31-
32-
To help with local testing, the Learning transport has been added to the list of available transports when setting up a new instance in SCMU. For it to become available, an environment variable `ServiceControl_IncludeLearningTransport` needs to be created with a value of `true`.
33-
3432
## Secrets
3533

3634
Testing using the [CI workflow](/.github/workflows/ci.yml) depends on the following secrets, which must be defined for both Actions and Dependabot secrets. The Particular values for these secrets are stored in the secure note named **ServiceControl Repo Secrets**.
@@ -83,4 +81,4 @@ Steps:
8381
-ErrorQueue errormq `
8482
-ErrorRetentionPeriod 10:00:00:00 `
8583
-Acknowledgements RabbitMQBrokerVersion310
86-
```
84+
```

src/Directory.Packages.props

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
2828
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
2929
<PackageVersion Include="Mindscape.Raygun4Net.NetCore" Version="11.2.1" />
30-
<PackageVersion Include="NLog.Extensions.Logging" Version="5.3.15" />
31-
<PackageVersion Include="NServiceBus" Version="9.2.3" />
32-
<PackageVersion Include="NServiceBus.AcceptanceTesting" Version="9.2.3" />
30+
<PackageVersion Include="NLog.Extensions.Logging" Version="5.4.0" />
31+
<PackageVersion Include="NServiceBus" Version="9.2.4" />
32+
<PackageVersion Include="NServiceBus.AcceptanceTesting" Version="9.2.4" />
3333
<PackageVersion Include="NServiceBus.AmazonSQS" Version="7.1.1" />
3434
<PackageVersion Include="NServiceBus.CustomChecks" Version="5.0.1" />
3535
<PackageVersion Include="NServiceBus.Extensions.Hosting" Version="3.0.1" />
@@ -49,7 +49,7 @@
4949
<PackageVersion Include="NuGet.Versioning" Version="6.12.1" />
5050
<PackageVersion Include="NUnit" Version="4.3.2" />
5151
<PackageVersion Include="NUnit.Analyzers" Version="4.6.0" />
52-
<PackageVersion Include="NUnit3TestAdapter" Version="4.6.0" />
52+
<PackageVersion Include="NUnit3TestAdapter" Version="5.0.0" />
5353
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
5454
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
5555
<PackageVersion Include="Particular.Approvals" Version="2.0.1" />
@@ -87,6 +87,6 @@
8787
<ItemGroup>
8888
<GlobalPackageReference Include="Microsoft.Build.Artifacts" Version="6.1.48" />
8989
<GlobalPackageReference Include="Microsoft.Build.CopyOnWrite" Version="1.0.334" />
90-
<GlobalPackageReference Include="Particular.Packaging" Version="4.2.0" />
90+
<GlobalPackageReference Include="Particular.Packaging" Version="4.2.2" />
9191
</ItemGroup>
9292
</Project>

src/ServiceControl.Audit.Persistence.RavenDB/RavenExternalPersistenceLifecycle.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
namespace ServiceControl.Audit.Persistence.RavenDB
44
{
55
using System;
6-
using System.IO;
7-
using System.Reflection;
8-
using System.Security.Cryptography.X509Certificates;
96
using System.Threading;
107
using System.Threading.Tasks;
118
using Raven.Client.Documents;
@@ -38,21 +35,11 @@ public async Task Initialize(CancellationToken cancellationToken = default)
3835
{
3936
await initializeSemaphore.WaitAsync(cancellationToken);
4037

41-
// Look for raven-client-certificate.pfx in same directory as application code
42-
var applicationDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? string.Empty;
43-
var certificatePath = Path.Combine(applicationDirectory, "raven-client-certificate.pfx");
44-
X509Certificate2? certificate = null;
45-
46-
if (File.Exists(certificatePath))
47-
{
48-
certificate = new X509Certificate2(certificatePath);
49-
}
50-
5138
var store = new DocumentStore
5239
{
5340
Database = configuration.Name,
5441
Urls = [configuration.ServerConfiguration.ConnectionString],
55-
Certificate = certificate,
42+
Certificate = RavenClientCertificate.FindClientCertificate(configuration.ServerConfiguration),
5643
Conventions = new DocumentConventions
5744
{
5845
SaveEnumsAsIntegers = true

src/ServiceControl.Audit.Persistence.RavenDB/RavenPersistenceConfiguration.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public class RavenPersistenceConfiguration : IPersistenceConfiguration
1212
public const string DatabaseNameKey = "RavenDB/DatabaseName";
1313
public const string DatabasePathKey = "DbPath";
1414
public const string ConnectionStringKey = "RavenDB/ConnectionString";
15+
public const string ClientCertificatePathKey = "RavenDB/ClientCertificatePath";
16+
public const string ClientCertificateBase64Key = "RavenDB/ClientCertificateBase64";
17+
public const string ClientCertificatePasswordKey = "RavenDB/ClientCertificatePassword";
1518
public const string DatabaseMaintenancePortKey = "DatabaseMaintenancePort";
1619
public const string ExpirationProcessTimerInSecondsKey = "ExpirationProcessTimerInSeconds";
1720
public const string LogPathKey = "LogPath";
@@ -24,6 +27,9 @@ public class RavenPersistenceConfiguration : IPersistenceConfiguration
2427
DatabaseNameKey,
2528
DatabasePathKey,
2629
ConnectionStringKey,
30+
ClientCertificatePathKey,
31+
ClientCertificateBase64Key,
32+
ClientCertificatePasswordKey,
2733
DatabaseMaintenancePortKey,
2834
ExpirationProcessTimerInSecondsKey,
2935
LogPathKey,
@@ -59,6 +65,19 @@ internal static DatabaseConfiguration GetDatabaseConfiguration(PersistenceSettin
5965
}
6066

6167
serverConfiguration = new ServerConfiguration(connectionString);
68+
69+
if (settings.PersisterSpecificSettings.TryGetValue(ClientCertificatePathKey, out var clientCertificatePath))
70+
{
71+
serverConfiguration.ClientCertificatePath = clientCertificatePath;
72+
}
73+
if (settings.PersisterSpecificSettings.TryGetValue(ClientCertificateBase64Key, out var clientCertificateBase64))
74+
{
75+
serverConfiguration.ClientCertificateBase64 = clientCertificateBase64;
76+
}
77+
if (settings.PersisterSpecificSettings.TryGetValue(ClientCertificatePasswordKey, out var clientCertificatePassword))
78+
{
79+
serverConfiguration.ClientCertificatePassword = clientCertificatePassword;
80+
}
6281
}
6382
else
6483
{

src/ServiceControl.Audit.Persistence.RavenDB/ServerConfiguration.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
namespace ServiceControl.Audit.Persistence.RavenDB
22
{
3-
public class ServerConfiguration
3+
using ServiceControl.RavenDB;
4+
5+
public class ServerConfiguration : IRavenClientCertificateInfo
46
{
57
public ServerConfiguration(string connectionString)
68
{
@@ -18,6 +20,9 @@ public ServerConfiguration(string dbPath, string serverUrl, string logPath, stri
1820
}
1921

2022
public string ConnectionString { get; }
23+
public string ClientCertificatePath { get; set; }
24+
public string ClientCertificateBase64 { get; set; }
25+
public string ClientCertificatePassword { get; set; }
2126
public bool UseEmbeddedServer { get; }
2227
public string DbPath { get; internal set; } //Setter for ATT only
2328
public string ServerUrl { get; }

src/ServiceControl.Infrastructure/LoggingConfigurator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static void ConfigureLogging(LoggingSettings loggingSettings)
2222
}
2323

2424
var nlogConfig = new LoggingConfiguration();
25-
var simpleLayout = new SimpleLayout("${longdate}|${threadid}|${level}|${logger}|${message}${onexception:|${exception:format=tostring}}");
25+
var simpleLayout = new SimpleLayout("${longdate}|${processtime}|${threadid}|${level}|${logger}|${message}${onexception:|${exception:format=tostring}}");
2626

2727
var fileTarget = new FileTarget
2828
{

src/ServiceControl.Persistence.RavenDB/RavenBootstrapper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ static class RavenBootstrapper
77
public const string DatabaseMaintenancePortKey = "DatabaseMaintenancePort";
88
public const string ExpirationProcessTimerInSecondsKey = "ExpirationProcessTimerInSeconds";
99
public const string ConnectionStringKey = "RavenDB/ConnectionString";
10+
public const string ClientCertificatePathKey = "RavenDB/ClientCertificatePath";
11+
public const string ClientCertificateBase64Key = "RavenDB/ClientCertificateBase64";
12+
public const string ClientCertificatePasswordKey = "RavenDB/ClientCertificatePassword";
1013
public const string MinimumStorageLeftRequiredForIngestionKey = "MinimumStorageLeftRequiredForIngestion";
1114
public const string DatabaseNameKey = "RavenDB/DatabaseName";
1215
public const string LogsPathKey = "LogPath";

src/ServiceControl.Persistence.RavenDB/RavenExternalPersistenceLifecycle.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
namespace ServiceControl.Persistence.RavenDB
44
{
55
using System;
6-
using System.IO;
7-
using System.Reflection;
8-
using System.Security.Cryptography.X509Certificates;
96
using System.Threading;
107
using System.Threading.Tasks;
118
using Raven.Client.Documents;
@@ -38,21 +35,11 @@ public async Task Initialize(CancellationToken cancellationToken)
3835
{
3936
await initializeSemaphore.WaitAsync(cancellationToken);
4037

41-
// Look for raven-client-certificate.pfx in same directory as application code
42-
var applicationDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? string.Empty;
43-
var certificatePath = Path.Combine(applicationDirectory, "raven-client-certificate.pfx");
44-
X509Certificate2? certificate = null;
45-
46-
if (File.Exists(certificatePath))
47-
{
48-
certificate = new X509Certificate2(certificatePath);
49-
}
50-
5138
var store = new DocumentStore
5239
{
5340
Database = settings.DatabaseName,
5441
Urls = [settings.ConnectionString],
55-
Certificate = certificate,
42+
Certificate = RavenClientCertificate.FindClientCertificate(settings),
5643
Conventions = new DocumentConventions
5744
{
5845
SaveEnumsAsIntegers = true

0 commit comments

Comments
 (0)