Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
dotnet-version: 9.x

- name: Restore nuget packages cache
uses: actions/cache@v4
Expand Down
3 changes: 2 additions & 1 deletion backend/src/Application/Application.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand All @@ -19,6 +19,7 @@
<PackageReference Include="HotChocolate.AspNetCore" Version="13.8.1" />
<PackageReference Include="HotChocolate.AspNetCore.Authorization" Version="13.8.1" />
<PackageReference Include="HotChocolate.Data" Version="13.8.1" />
<PackageReference Include="HotChocolate.Diagnostics" Version="13.8.1" />
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.7.2" />
Expand Down
3 changes: 2 additions & 1 deletion backend/src/Application/DependencyInjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,8 @@ private static IServiceCollection AddHotChocolate(this IServiceCollection servic
.AddType<PropertyValidationError>()
.AddFiltering()
.AddSorting()
.AddProjections();
.AddProjections()
.AddInstrumentation();

var executingAssembly = Assembly.GetExecutingAssembly();

Expand Down
60 changes: 59 additions & 1 deletion backend/src/WebAPI/DependencyInjection.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
using Application.Options;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Serilog;
using WebAPI.Options;
using WebAPI.Telemetry;

namespace WebAPI;

public static class DependencyInjection
{
public static IServiceCollection AddWebApiServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddApplicationMonitoring(configuration);
services.AddHealthChecks(configuration);

return services;
}

Expand All @@ -27,4 +33,56 @@ private static IServiceCollection AddHealthChecks(this IServiceCollection servic

return services;
}

private static IServiceCollection AddApplicationMonitoring(this IServiceCollection services,
IConfiguration configuration)
{
var productInfo = configuration
.GetSection(ProductInfo.SectionName)
.Get<ProductInfo>() ?? new ProductInfo();

services.AddSerilog(config =>
{
config.ReadFrom.Configuration(configuration);
config.WriteTo.Console();
config.WriteTo.OpenTelemetry(options =>
{
options.ResourceAttributes = new Dictionary<string, object>
{
{ Attributes.ServiceName, productInfo.Name },
{ Attributes.ServiceVersion, productInfo.Version },
{ Attributes.ServiceInstanceId, Program.InstanceId }
};
});
});

services.AddOpenTelemetry()
.ConfigureResource(resource =>
{
resource.AddService(
productInfo.Name,
serviceVersion: productInfo.Version,
serviceInstanceId: Program.InstanceId.ToString()
);
})
.WithTracing(tracing =>
{
tracing.AddSource(productInfo.Name)
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddHotChocolateInstrumentation()
.AddOtlpExporter();
})
.WithMetrics(metrics =>
{
metrics.AddMeter(productInfo.Name)
.AddRuntimeInstrumentation()
.AddProcessInstrumentation()
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddOtlpExporter();
});

return services;
}
}
12 changes: 12 additions & 0 deletions backend/src/WebAPI/Options/ProductInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Reflection;

namespace WebAPI.Options
{
public class ProductInfo
{
public const string SectionName = "ProductInfo";

public string Name { get; set; } = Assembly.GetExecutingAssembly().GetName().Name!;
public string Version { get; set; } = Assembly.GetExecutingAssembly().GetName().Version?.ToString()!;
}
}
15 changes: 9 additions & 6 deletions backend/src/WebAPI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,8 @@
{
var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog((context, configuration) =>
configuration.ReadFrom.Configuration(context.Configuration)
);

builder.Services.AddApplicationServices(builder.Configuration);
builder.Services.AddWebApiServices(builder.Configuration);
builder.Services.AddApplicationServices(builder.Configuration);

var app = builder.Build();

Expand All @@ -28,7 +24,9 @@
app.MapEndpoints();

await app.InitializeDatabase();


Log.Information("Application initialized successfully");

app.Run();
}
catch (Exception e)
Expand All @@ -38,4 +36,9 @@
finally
{
Log.CloseAndFlush();
}

public partial class Program
{
public static readonly Guid InstanceId = Guid.NewGuid();
}
9 changes: 9 additions & 0 deletions backend/src/WebAPI/Telemetry/Attributes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace WebAPI.Telemetry
{
public static class Attributes
{
public const string ServiceName = "service.name";
public const string ServiceVersion = "service.version";
public const string ServiceInstanceId = "service.instance.id";
}
}
16 changes: 11 additions & 5 deletions backend/src/WebAPI/WebAPI.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
Expand All @@ -20,10 +20,16 @@
<PackageReference Include="AspNetCore.HealthChecks.MongoDb" Version="8.0.0" />
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="8.0.0" />
<PackageReference Include="HotChocolate.AspNetCore" Version="13.8.1" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Process" Version="1.12.0-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.OpenTelemetry" Version="4.2.0" />
</ItemGroup>

<ItemGroup>
Expand Down
1 change: 0 additions & 1 deletion backend/src/WebAPI/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft.AspNetCore": "Warning",
"MongoDB.Command": "Debug"
}
}
Expand Down
17 changes: 5 additions & 12 deletions backend/src/WebAPI/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"AllowedHosts": "*",
"ProductInfo": {
"Name": "PTSDetect API"
},
"IdentityOptions": {
"RequireUniqueEmail": true,
"RequiredPasswordLength": 8
Expand Down Expand Up @@ -45,20 +48,10 @@
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft.AspNetCore": "Warning"
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/log.txt"
}
}
],
"Enrich": [
"FromLogContext"
]
Expand Down
7 changes: 6 additions & 1 deletion frontend/.dockerignore
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
node_modules
node_modules
dist
.env
.env.example
.vscode
.git
17 changes: 13 additions & 4 deletions frontend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
# Use a specific node version
FROM node:18-alpine

# Build arguments
ARG VITE_GRAPHQL_URI

# Set working directory
WORKDIR /app

COPY package.json ./
# Copy package.json and lock files
COPY package.json pnpm-lock.yaml ./

RUN npm install
# Install dependencies using pnpm (as indicated by pnpm-lock.yaml)
RUN npm install -g pnpm && pnpm install --frozen-lockfile

# Copy the rest of the application code
COPY . .

RUN npm run build
# Build the application
RUN pnpm run build

# Expose the application port
EXPOSE 5173

CMD [ "npm", "run", "preview" ]
CMD [ "pnpm", "preview" ]