feat(servicedefaults): add SeqOptions configuration and integrate with OpenTelemetry logging and tracing
This commit is contained in:
@@ -70,6 +70,9 @@ jobs:
|
|||||||
PLAID_CLIENT_ID: ${{ secrets.PLAID_CLIENT_ID }}
|
PLAID_CLIENT_ID: ${{ secrets.PLAID_CLIENT_ID }}
|
||||||
PLAID_SECRET: ${{ secrets.PLAID_SECRET }}
|
PLAID_SECRET: ${{ secrets.PLAID_SECRET }}
|
||||||
PLAID_WEBHOOK: ${{ secrets.PLAID_WEBHOOK }}
|
PLAID_WEBHOOK: ${{ secrets.PLAID_WEBHOOK }}
|
||||||
|
SEQ_SERVER_URL: ${{ secrets.SEQ_SERVER_URL }}
|
||||||
|
SEQ_API_KEY_HEADER: ${{ secrets.SEQ_API_KEY_HEADER }}
|
||||||
|
SEQ_API_KEY: ${{ secrets.SEQ_API_KEY }}
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.DEPLOY_HOST }}
|
host: ${{ secrets.DEPLOY_HOST }}
|
||||||
username: ${{ secrets.DEPLOY_USER }}
|
username: ${{ secrets.DEPLOY_USER }}
|
||||||
@@ -88,6 +91,9 @@ jobs:
|
|||||||
PLAID_CLIENT_ID=${PLAID_CLIENT_ID}
|
PLAID_CLIENT_ID=${PLAID_CLIENT_ID}
|
||||||
PLAID_SECRET=${PLAID_SECRET}
|
PLAID_SECRET=${PLAID_SECRET}
|
||||||
PLAID_WEBHOOK=${PLAID_WEBHOOK}
|
PLAID_WEBHOOK=${PLAID_WEBHOOK}
|
||||||
|
SEQ_SERVER_URL=${SEQ_SERVER_URL}
|
||||||
|
SEQ_API_KEY_HEADER=${SEQ_API_KEY_HEADER}
|
||||||
|
SEQ_API_KEY=${SEQ_API_KEY}
|
||||||
EOF
|
EOF
|
||||||
docker compose -f docker-compose.prod.yml pull
|
docker compose -f docker-compose.prod.yml pull
|
||||||
docker compose -f docker-compose.prod.yml up -d --remove-orphans
|
docker compose -f docker-compose.prod.yml up -d --remove-orphans
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ services:
|
|||||||
- PlaidClientOptions__ClientId=${PLAID_CLIENT_ID}
|
- PlaidClientOptions__ClientId=${PLAID_CLIENT_ID}
|
||||||
- PlaidClientOptions__Secret=${PLAID_SECRET}
|
- PlaidClientOptions__Secret=${PLAID_SECRET}
|
||||||
- PlaidClientOptions__Webhook=${PLAID_WEBHOOK}
|
- PlaidClientOptions__Webhook=${PLAID_WEBHOOK}
|
||||||
|
- SeqOptions__ServerUrl=${SEQ_SERVER_URL}
|
||||||
|
- SeqOptions__ApiKeyHeader=${SEQ_API_KEY_HEADER}
|
||||||
|
- SeqOptions__ApiKey=${SEQ_API_KEY}
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/data
|
- ./data:/data
|
||||||
- ./keys:/keys
|
- ./keys:/keys
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ services:
|
|||||||
- PlaidClientOptions__ClientId=${PLAID_CLIENT_ID}
|
- PlaidClientOptions__ClientId=${PLAID_CLIENT_ID}
|
||||||
- PlaidClientOptions__Secret=${PLAID_SECRET}
|
- PlaidClientOptions__Secret=${PLAID_SECRET}
|
||||||
- PlaidClientOptions__Webhook=${PLAID_WEBHOOK}
|
- PlaidClientOptions__Webhook=${PLAID_WEBHOOK}
|
||||||
|
- SeqOptions__ServerUrl=${SEQ_SERVER_URL}
|
||||||
|
- SeqOptions__ApiKeyHeader=${SEQ_API_KEY_HEADER}
|
||||||
|
- SeqOptions__ApiKey=${SEQ_API_KEY}
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/data
|
- ./data:/data
|
||||||
- ./keys:/keys
|
- ./keys:/keys
|
||||||
|
|||||||
@@ -23,5 +23,10 @@
|
|||||||
"ClientId": "ClientId",
|
"ClientId": "ClientId",
|
||||||
"Secret": "Secret",
|
"Secret": "Secret",
|
||||||
"Webhook": "Webhook"
|
"Webhook": "Webhook"
|
||||||
|
},
|
||||||
|
"SeqOptions": {
|
||||||
|
"ServerUrl": "ServerUrl",
|
||||||
|
"ApiKeyHeader": "ApiKeyHeader",
|
||||||
|
"ApiKey": "ApiKey"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace FiscalOS.ServiceDefaults;
|
||||||
|
|
||||||
|
internal sealed class SeqOptions
|
||||||
|
{
|
||||||
|
public string ServerUrl { get; init; } = string.Empty;
|
||||||
|
public string ApiKeyHeader { get; init; } = string.Empty;
|
||||||
|
public string ApiKey { get; init; } = string.Empty;
|
||||||
|
public bool IsEnabled => string.IsNullOrWhiteSpace(ServerUrl) is false &&
|
||||||
|
string.IsNullOrWhiteSpace(ApiKeyHeader) is false &&
|
||||||
|
string.IsNullOrWhiteSpace(ApiKey) is false;
|
||||||
|
public string LogEndpoint => $"{ServerUrl}/ingest/otlp/v1/logs";
|
||||||
|
public string TraceEndpoint => $"{ServerUrl}/ingest/otlp/v1/traces";
|
||||||
|
public string AuthHeader => $"{ApiKeyHeader}={ApiKey}";
|
||||||
|
}
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
|
using OpenTelemetry.Exporter;
|
||||||
|
using OpenTelemetry.Logs;
|
||||||
|
|
||||||
namespace FiscalOS.ServiceDefaults;
|
namespace FiscalOS.ServiceDefaults;
|
||||||
|
|
||||||
public static class ServiceDefaultsExtensions
|
public static class ServiceDefaultsExtensions
|
||||||
@@ -76,11 +81,38 @@ public static class ServiceDefaultsExtensions
|
|||||||
|
|
||||||
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
{
|
{
|
||||||
|
var seqOptions = new SeqOptions();
|
||||||
|
builder.Configuration.GetSection(nameof(SeqOptions)).Bind(seqOptions);
|
||||||
|
|
||||||
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
|
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
|
||||||
|
|
||||||
if (useOtlpExporter)
|
var otel = builder.Services.AddOpenTelemetry();
|
||||||
|
|
||||||
|
if (seqOptions.IsEnabled)
|
||||||
{
|
{
|
||||||
builder.Services.AddOpenTelemetry().UseOtlpExporter();
|
otel
|
||||||
|
.WithLogging(lb =>
|
||||||
|
{
|
||||||
|
lb.AddOtlpExporter(o =>
|
||||||
|
{
|
||||||
|
o.Protocol = OtlpExportProtocol.HttpProtobuf;
|
||||||
|
o.Endpoint = new Uri(seqOptions.LogEndpoint);
|
||||||
|
o.Headers = seqOptions.AuthHeader;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.WithTracing(tb =>
|
||||||
|
{
|
||||||
|
tb.AddOtlpExporter(o =>
|
||||||
|
{
|
||||||
|
o.Protocol = OtlpExportProtocol.HttpProtobuf;
|
||||||
|
o.Endpoint = new Uri(seqOptions.TraceEndpoint);
|
||||||
|
o.Headers = seqOptions.AuthHeader;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (useOtlpExporter)
|
||||||
|
{
|
||||||
|
otel.UseOtlpExporter();
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
|
|||||||
Reference in New Issue
Block a user