title | description | ms.date | uid |
---|---|---|---|
.NET Aspire Seq integration |
Learn how to use the .NET Aspire Seq integration to add OpenTelemetry Protocol (OTLP) exporters that send logs and traces to a Seq Server. |
08/12/2024 |
logging/seq-integration |
[!INCLUDE includes-hosting-and-client]
Seq is a self-hosted search and analysis server that handles structured application logs and trace files. It includes a JSON event store and a simple query language that make it easy to use. You can use the .NET Aspire Seq integration to send OpenTelemetry Protocol (OTLP) data to Seq. The integration supports persistent logs and traces across application restarts.
During development, .NET Aspire runs and connects to the datalust/seq
container image.
The Seq hosting integration models the server as the xref:Aspire.Hosting.ApplicationModel.SeqResource type. To access this type and the API, add the 📦 Aspire.Hosting.Seq NuGet package in the app host project.
dotnet add package Aspire.Hosting.Seq
<PackageReference Include="Aspire.Hosting.Seq"
Version="*" />
For more information, see dotnet add package or Manage package dependencies in .NET applications.
In your app host project, call xref:Aspire.Hosting.SeqBuilderExtensions.AddSeq* to add and return a Seq resource builder.
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent)
.WithEnvironment("ACCEPT_EULA", "Y");
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
// After adding all resources, run the app...
Note
The Seq container may be slow to start, so it's best to use a persistent lifetime to avoid unnecessary restarts. For more information, see Container resource lifetime.
You must accept the Seq EULA for Seq to start. To accept the agreement in code, pass the environment variable ACCEPT_EULA
to the Seq container, and set its value to Y
. The above code passes this variable in the chained call to xref:Aspire.Hosting.ResourceBuilderExtensions.WithEnvironment*.
Seq shouldn't be part of the .NET Aspire deployment manifest, hence the chained call to xref:Aspire.Hosting.ResourceBuilderExtensions.ExcludeFromManifest*. It's recommended you set up a secure production Seq server outside of .NET Aspire for your production environment.
Register Seq with a data directory in your app host project to retain Seq's data and configuration across application restarts:
var seq = builder.AddSeq("seq", seqDataDirectory: "./seqdata")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
The directory specified must already exist.
To add a data volume to the Seq resource, call the xref:Aspire.Hosting.SeqBuilderExtensions.WithDataVolume* method on the Seq resource:
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.WithDataVolume()
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
The data volume is used to persist the Seq data outside the lifecycle of its container. The data volume is mounted at the /data
path in the Seq container and when a name
parameter isn't provided, the name is generated at random. For more information on data volumes and details on why they're preferred over bind mounts, see Docker docs: Volumes.
To add a data bind mount to the Seq resource, call the xref:Aspire.Hosting.SeqBuilderExtensions.WithDataBindMount* method:
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.WithDataBindMount(source: @"C:\Data")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
[!INCLUDE data-bind-mount-vs-volumes]
Data bind mounts rely on the host machine's filesystem to persist the Seq data across container restarts. The data bind mount is mounted at the C:\Data
on Windows (or /Data
on Unix) path on the host machine in the Seq container. For more information on data bind mounts, see Docker docs: Bind mounts.
To get started with the .NET Aspire Seq client integration, install the 📦 Aspire.Seq NuGet package in the client-consuming project, that is, the project for the application that uses the Seq client.
dotnet add package Aspire.Seq
<PackageReference Include="Aspire.Seq"
Version="*" />
In the :::no-loc text="Program.cs"::: file of your client-consuming project, call the xref:Microsoft.Extensions.Hosting.AspireSeqExtensions.AddSeqEndpoint* extension method to register OpenTelemetry Protocol exporters to send logs and traces to Seq and the .NET Aspire Dashboard. The method takes a connection name parameter.
builder.AddSeqEndpoint(connectionName: "seq");
Tip
The connectionName
parameter must match the name used when adding the Seq resource in the app host project. In other words, when you call AddSeq
and provide a name of seq
that same name should be used when calling AddSeqEndpoint
. For more information, see Add a Seq resource.
The .NET Aspire Seq integration provides multiple options to configure the connection to Seq based on the requirements and conventions of your project.
The .NET Aspire Seq integration supports xref:Microsoft.Extensions.Configuration?displayProperty=fullName. It loads the xref:Aspire.Seq.SeqSettings from configuration by using the Aspire:Seq
key. The following snippet is an example of an :::no-loc text="appsettings.json"::: file that configures some of the options:
{
"Aspire": {
"Seq": {
"DisableHealthChecks": true,
"ServerUrl": "http://localhost:5341"
}
}
}
For the complete Seq client integration JSON schema, see Aspire.Seq/ConfigurationSchema.json.
Also you can pass the Action<SeqSettings> configureSettings
delegate to set up some or all the options inline, for example to disable health checks from code:
builder.AddSeqEndpoint("seq", static settings =>
{
settings.DisableHealthChecks = true;
settings.ServerUrl = "http://localhost:5341"
});
[!INCLUDE client-integration-health-checks]
The .NET Aspire Seq integration handles the following:
- Adds the health check when xref:Aspire.Seq.SeqSettings.DisableHealthChecks?displayProperty=nameWithType is
false
, which attempts to connect to the Seq server's/health
endpoint. - Integrates with the
/health
HTTP endpoint, which specifies all registered health checks must pass for app to be considered ready to accept traffic.
[!INCLUDE integration-observability-and-telemetry]
The .NET Aspire Seq integration uses the following log categories:
Seq
The .NET Aspire Seq integration doesn't emit tracing activities and or metrics because it's a telemetry sink, not a telemetry source.