From 4eea11aea090aeb2f234a1bb6ca46df71de07b5d Mon Sep 17 00:00:00 2001 From: Stijn Moreels <9039753+stijnmoreels@users.noreply.github.com> Date: Fri, 15 Sep 2023 06:31:16 +0200 Subject: [PATCH] chore: add net8.0 preview support (#537) * chore: add net8.0 preview support * Update ci-build.yml * Update run-docker-integration-tests.yml * Update nuget-release.yml * Update ci-build.yml * Update ci-build.yml * Update build.yml * pr-fix: update with preview version in dockerfile * pr-fix: use correct preview version in dockerfile * Upgrade dependencies * includePreviewVersions on running integration-tests * pr-fix: use default info log level * pr-fix: use net8.0 preview in gh actions * pr-fix: use isolated timer function * pr-fix: update w/ isolated tests * pr-fix: update with env vars * pr-fix: streamline w/ templates * pr-fix: streamline w/ templates * pr-fix: strip down timer function * Update run-docker-integration-tests.yml * Update run-docker-integration-tests.yml * Update run-docker-integration-tests.yml * Update run-docker-integration-tests.yml * Update run-docker-integration-tests.yml * pr-fix: register correlation accessor * pr-fix: do not call 'create logger' in host setup * pr-fix: update with storage * Update Arcus.Observability.Tests.Runtimes.AzureFunction.csproj * Update Dockerfile --------- Co-authored-by: Frederik Gheysels --- .github/workflows/code-coverage.yml | 5 +- .github/workflows/codeql-analysis.yml | 4 + build/ci-build.yml | 9 ++ build/nuget-release.yml | 3 + .../run-docker-integration-tests.yml | 5 +- build/variables/build.yml | 6 +- .../Arcus.Observability.Correlation.csproj | 6 +- ....Observability.Telemetry.AspNetCore.csproj | 6 +- ...ervability.Telemetry.AzureFunctions.csproj | 6 +- .../ILoggerHttpRequestDataExtensions.cs | 4 +- .../Arcus.Observability.Telemetry.Core.csproj | 6 +- .../Arcus.Observability.Telemetry.IoT.csproj | 6 +- ...ability.Telemetry.Serilog.Enrichers.csproj | 6 +- ...rvability.Telemetry.Serilog.Filters.csproj | 6 +- ...y.Serilog.Sinks.ApplicationInsights.csproj | 2 +- ...cus.Observability.Tests.Integration.csproj | 3 +- .../AzureFunctionsDockerTests.cs | 30 ++--- ...bility.Tests.Runtimes.AzureFunction.csproj | 22 ++- .../Dockerfile | 6 +- .../HttpOrderTrigger.cs | 36 ----- .../Program.cs | 127 ++++++++++++++++++ .../Startup.cs | 49 ------- .../TimerTriggerFunction.cs | 38 ++++++ .../host.json | 19 +-- .../Arcus.Observability.Tests.Unit.csproj | 2 +- 25 files changed, 257 insertions(+), 155 deletions(-) delete mode 100644 src/Arcus.Observability.Tests.Runtimes.AzureFunction/HttpOrderTrigger.cs create mode 100644 src/Arcus.Observability.Tests.Runtimes.AzureFunction/Program.cs delete mode 100644 src/Arcus.Observability.Tests.Runtimes.AzureFunction/Startup.cs create mode 100644 src/Arcus.Observability.Tests.Runtimes.AzureFunction/TimerTriggerFunction.cs diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 8c357e58..a7ef1c5f 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -23,7 +23,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '8.0.x' + dotnet-quality: 'preview' - name: Coverlet coverage test uses: b3b00/coverlet-action@1.2.4 with: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6f3680a8..bd693227 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -39,6 +39,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '8.0.x' + dotnet-quality: 'preview' # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/build/ci-build.yml b/build/ci-build.yml index 9c24aec9..1f972131 100644 --- a/build/ci-build.yml +++ b/build/ci-build.yml @@ -48,10 +48,17 @@ stages: inputs: packageType: 'sdk' version: '$(DotNet.Sdk.PreviousVersion)' + - task: UseDotNet@2 + displayName: 'Import .NET Core SDK ($(DotNet.Sdk.Version))' + inputs: + packageType: 'sdk' + version: '$(DotNet.Sdk.Version)' + includePreviewVersions: true - template: 'build/build-solution.yml@templates' parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' versionSuffix: '$(packageVersion)' + includePreviewVersions: true - task: CopyFiles@2 displayName: 'Copy build artifacts' inputs: @@ -86,6 +93,7 @@ stages: - template: test/run-unit-tests.yml@templates parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' + includePreviewVersions: true projectName: '$(Project).Tests.Unit' - stage: IntegrationTests @@ -111,6 +119,7 @@ stages: - template: test/run-integration-tests.yml@templates parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' + includePreviewVersions: true projectName: '$(Project).Tests.Integration' category: 'Integration' diff --git a/build/nuget-release.yml b/build/nuget-release.yml index 7e17d831..d0383111 100644 --- a/build/nuget-release.yml +++ b/build/nuget-release.yml @@ -35,6 +35,7 @@ stages: parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' version: $(Build.BuildNumber) + includePreviewVersions: true - task: UseDotNet@2 displayName: 'Import .NET Core SDK ($(DotNet.Sdk.PreviousVersion))' inputs: @@ -74,6 +75,7 @@ stages: - template: test/run-unit-tests.yml@templates parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' + includePreviewVersions: true projectName: '$(Project).Tests.Unit' - stage: IntegrationTests @@ -99,6 +101,7 @@ stages: - template: test/run-integration-tests.yml@templates parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' + includePreviewVersions: true projectName: '$(Project).Tests.Integration' category: 'Integration' diff --git a/build/templates/run-docker-integration-tests.yml b/build/templates/run-docker-integration-tests.yml index a9f451c8..5c718e27 100644 --- a/build/templates/run-docker-integration-tests.yml +++ b/build/templates/run-docker-integration-tests.yml @@ -20,6 +20,7 @@ steps: inputs: packageType: 'sdk' version: '$(DotNet.Sdk.Version)' + includePreviewVersions: true - task: Docker@1 displayName: 'Build Docker image from ${{ parameters.dockerProjectName }}' inputs: @@ -36,9 +37,11 @@ steps: ports: '${{ parameters.httpPort }}:80' envVars: | APPINSIGHTS_INSTRUMENTATIONKEY=$(ApplicationInsights.InstrumentationKey) + AzureWebJobsStorage=$(Arcus.AzureFunctions.AzureWebJobsStorage) - template: test/run-integration-tests.yml@templates parameters: dotnetSdkVersion: '$(DotNet.Sdk.Version)' + includePreviewVersions: true projectName: '$(Project).Tests.Integration' category: 'Docker' - task: Bash@3 @@ -48,4 +51,4 @@ steps: docker logs ${{ parameters.dockerProjectName }} failOnStderr: true displayName: Show ${{ parameters.dockerProjectName }} logs - condition: always() \ No newline at end of file + condition: always() diff --git a/build/variables/build.yml b/build/variables/build.yml index 166b711c..98657063 100644 --- a/build/variables/build.yml +++ b/build/variables/build.yml @@ -1,5 +1,5 @@ variables: - DotNet.Sdk.Version: '6.0.100' - DotNet.Sdk.PreviousVersion: '3.1.201' + DotNet.Sdk.Version: '8.0.x' + DotNet.Sdk.PreviousVersion: '6.0.100' Project: 'Arcus.Observability' - Vm.Image: 'ubuntu-latest' \ No newline at end of file + Vm.Image: 'ubuntu-latest' diff --git a/src/Arcus.Observability.Correlation/Arcus.Observability.Correlation.csproj b/src/Arcus.Observability.Correlation/Arcus.Observability.Correlation.csproj index f7957c08..3253a192 100644 --- a/src/Arcus.Observability.Correlation/Arcus.Observability.Correlation.csproj +++ b/src/Arcus.Observability.Correlation/Arcus.Observability.Correlation.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to use correlation in applications @@ -24,13 +24,13 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.AspNetCore/Arcus.Observability.Telemetry.AspNetCore.csproj b/src/Arcus.Observability.Telemetry.AspNetCore/Arcus.Observability.Telemetry.AspNetCore.csproj index 1a60ab76..8e5c6aae 100644 --- a/src/Arcus.Observability.Telemetry.AspNetCore/Arcus.Observability.Telemetry.AspNetCore.csproj +++ b/src/Arcus.Observability.Telemetry.AspNetCore/Arcus.Observability.Telemetry.AspNetCore.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve ASP.NET Core telemetry with Serilog in applications @@ -32,11 +32,11 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.AzureFunctions/Arcus.Observability.Telemetry.AzureFunctions.csproj b/src/Arcus.Observability.Telemetry.AzureFunctions/Arcus.Observability.Telemetry.AzureFunctions.csproj index 719fcf40..b29606c1 100644 --- a/src/Arcus.Observability.Telemetry.AzureFunctions/Arcus.Observability.Telemetry.AzureFunctions.csproj +++ b/src/Arcus.Observability.Telemetry.AzureFunctions/Arcus.Observability.Telemetry.AzureFunctions.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve telemetry with Serilog in Azure Functions applications @@ -24,13 +24,13 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.AzureFunctions/Extensions/ILoggerHttpRequestDataExtensions.cs b/src/Arcus.Observability.Telemetry.AzureFunctions/Extensions/ILoggerHttpRequestDataExtensions.cs index ee6a88f8..b43dd3f5 100644 --- a/src/Arcus.Observability.Telemetry.AzureFunctions/Extensions/ILoggerHttpRequestDataExtensions.cs +++ b/src/Arcus.Observability.Telemetry.AzureFunctions/Extensions/ILoggerHttpRequestDataExtensions.cs @@ -4,14 +4,14 @@ using Arcus.Observability.Telemetry.Core; using Arcus.Observability.Telemetry.Core.Logging; using GuardNet; -#if NET6_0 +#if !(NETSTANDARD2_1) using Microsoft.Azure.Functions.Worker.Http; #endif // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.Logging { -#if NET6_0 +#if !(NETSTANDARD2_1) /// /// Telemetry extensions on the instance to write Application Insights compatible log messages. /// diff --git a/src/Arcus.Observability.Telemetry.Core/Arcus.Observability.Telemetry.Core.csproj b/src/Arcus.Observability.Telemetry.Core/Arcus.Observability.Telemetry.Core.csproj index 32405283..d8ea9bfe 100644 --- a/src/Arcus.Observability.Telemetry.Core/Arcus.Observability.Telemetry.Core.csproj +++ b/src/Arcus.Observability.Telemetry.Core/Arcus.Observability.Telemetry.Core.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve telemetry with Serilog in applications @@ -24,12 +24,12 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.IoT/Arcus.Observability.Telemetry.IoT.csproj b/src/Arcus.Observability.Telemetry.IoT/Arcus.Observability.Telemetry.IoT.csproj index bbdd0af4..3d29293f 100644 --- a/src/Arcus.Observability.Telemetry.IoT/Arcus.Observability.Telemetry.IoT.csproj +++ b/src/Arcus.Observability.Telemetry.IoT/Arcus.Observability.Telemetry.IoT.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve IoT telemetry with Serilog in applications @@ -24,12 +24,12 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.Serilog.Enrichers/Arcus.Observability.Telemetry.Serilog.Enrichers.csproj b/src/Arcus.Observability.Telemetry.Serilog.Enrichers/Arcus.Observability.Telemetry.Serilog.Enrichers.csproj index 9df57473..907d1cc2 100644 --- a/src/Arcus.Observability.Telemetry.Serilog.Enrichers/Arcus.Observability.Telemetry.Serilog.Enrichers.csproj +++ b/src/Arcus.Observability.Telemetry.Serilog.Enrichers/Arcus.Observability.Telemetry.Serilog.Enrichers.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve telemetry with Serilog in applications @@ -24,11 +24,11 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.Serilog.Filters/Arcus.Observability.Telemetry.Serilog.Filters.csproj b/src/Arcus.Observability.Telemetry.Serilog.Filters/Arcus.Observability.Telemetry.Serilog.Filters.csproj index 06bde3cc..a007f552 100644 --- a/src/Arcus.Observability.Telemetry.Serilog.Filters/Arcus.Observability.Telemetry.Serilog.Filters.csproj +++ b/src/Arcus.Observability.Telemetry.Serilog.Filters/Arcus.Observability.Telemetry.Serilog.Filters.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to reduce telemetry with Serilog filters @@ -24,11 +24,11 @@ - + - + diff --git a/src/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights.csproj b/src/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights.csproj index 12468a7c..cd6b143f 100644 --- a/src/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights.csproj +++ b/src/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights/Arcus.Observability.Telemetry.Serilog.Sinks.ApplicationInsights.csproj @@ -1,7 +1,7 @@  - net6.0;netstandard2.1;netcoreapp3.1 + net8.0;net6.0;netstandard2.1 Arcus Arcus Provides capability to improve telemetry with Serilog that is sent to Azure Application Insights diff --git a/src/Arcus.Observability.Tests.Integration/Arcus.Observability.Tests.Integration.csproj b/src/Arcus.Observability.Tests.Integration/Arcus.Observability.Tests.Integration.csproj index da8eae2f..94e8bc08 100644 --- a/src/Arcus.Observability.Tests.Integration/Arcus.Observability.Tests.Integration.csproj +++ b/src/Arcus.Observability.Tests.Integration/Arcus.Observability.Tests.Integration.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 false @@ -13,6 +13,7 @@ + diff --git a/src/Arcus.Observability.Tests.Integration/Serilog/Sinks/ApplicationInsights/AzureFunctionsDockerTests.cs b/src/Arcus.Observability.Tests.Integration/Serilog/Sinks/ApplicationInsights/AzureFunctionsDockerTests.cs index a174edc0..4911dcb8 100644 --- a/src/Arcus.Observability.Tests.Integration/Serilog/Sinks/ApplicationInsights/AzureFunctionsDockerTests.cs +++ b/src/Arcus.Observability.Tests.Integration/Serilog/Sinks/ApplicationInsights/AzureFunctionsDockerTests.cs @@ -1,9 +1,6 @@ -using System.Net; -using System.Net.Http; +using System.Net.Http; using System.Threading.Tasks; using Microsoft.Azure.ApplicationInsights.Query.Models; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using Xunit; using Xunit.Abstractions; @@ -26,27 +23,16 @@ public AzureFunctionsDockerTests(ITestOutputHelper outputWriter) [Fact] public async Task LogRequest_WithRequestsOperationName_SinksToApplicationInsights() { - // Arrange - int httpPort = Configuration.GetValue("AzureFunctions:HttpPort"); - string? requestUri = $"http://localhost:{httpPort}/api/order"; - TestOutput.WriteLine("GET -> {0}", requestUri); - - using (HttpResponseMessage response = await HttpClient.GetAsync(requestUri)) + await RetryAssertUntilTelemetryShouldBeAvailableAsync(async client => { - TestOutput.WriteLine("{0} <- {1}", response.StatusCode, requestUri); - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - await RetryAssertUntilTelemetryShouldBeAvailableAsync(async client => + EventsRequestResult[] results = await client.GetRequestsAsync(); + AssertX.Any(results, result => { - EventsRequestResult[] results = await client.GetRequestsAsync(); - AssertX.Any(results, result => - { - Assert.Contains("order", result.Request.Url); - Assert.Equal("200", result.Request.ResultCode); - Assert.Equal(HttpMethod.Get.Method + " /api/order", result.Operation.Name); - }); + Assert.Equal("200", result.Request.ResultCode); + Assert.Equal("Timer", result.Request.Source); + Assert.Equal("Triggered", result.Operation.Name); }); - } + }); } } } diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj index e45e8726..dcbc1371 100644 --- a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj +++ b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj @@ -1,19 +1,26 @@  - net6.0 + net8.0 v4 + Exe + enable + enable /home/site/wwwroot Linux + + + + + - - - - + + + + - @@ -26,4 +33,7 @@ Never + + + diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Dockerfile b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Dockerfile index c6c02d28..7666aa86 100644 --- a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Dockerfile +++ b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Dockerfile @@ -1,10 +1,10 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/azure-functions/dotnet:4.0 AS base +FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0 AS base WORKDIR /home/site/wwwroot EXPOSE 80 -FROM mcr.microsoft.com/dotnet/sdk:6.0.100-bullseye-slim AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0.100-preview.7-alpine3.18 AS build WORKDIR /src COPY ["Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj", "Arcus.Observability.Tests.Runtimes.AzureFunction/"] RUN dotnet restore "Arcus.Observability.Tests.Runtimes.AzureFunction/Arcus.Observability.Tests.Runtimes.AzureFunction.csproj" @@ -19,4 +19,4 @@ FROM base AS final WORKDIR /home/site/wwwroot COPY --from=publish /app/publish . ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ - AzureFunctionsJobHost__Logging__Console__IsEnabled=true \ No newline at end of file + AzureFunctionsJobHost__Logging__Console__IsEnabled=true diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/HttpOrderTrigger.cs b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/HttpOrderTrigger.cs deleted file mode 100644 index dfa0a2a1..00000000 --- a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/HttpOrderTrigger.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using Arcus.Observability.Telemetry.Core; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.WebJobs; -using Microsoft.Azure.WebJobs.Extensions.Http; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace Arcus.Observability.Tests.Runtimes.AzureFunctions -{ - public class HttpOrderTrigger - { - [FunctionName("order")] - public static IActionResult Run( - [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, - ILogger log) - { - log.LogInformation("C# HTTP trigger function processed a request."); - - using (var measurement = DurationMeasurement.Start()) - { - try - { - return new OkResult(); - } - finally - { - log.LogRequest(req, responseStatusCode: 200, measurement); - } - } - } - } -} diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Program.cs b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Program.cs new file mode 100644 index 00000000..e3e043a1 --- /dev/null +++ b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Program.cs @@ -0,0 +1,127 @@ +using System.Diagnostics; +using Arcus.Observability.Correlation; +using Arcus.Observability.Telemetry.Core; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Middleware; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Configuration; +using Serilog.Events; +using ILogger = Microsoft.Extensions.Logging.ILogger; + +namespace Arcus.Observability.Tests.Runtimes.AzureFunction +{ + public class Program + { + public static void Main(string[] args) + { + var host = + Host.CreateDefaultBuilder(args) + .ConfigureFunctionsWorkerDefaults(builder => + { + builder.UseMiddleware(); + + builder.Services.AddCorrelation(_ => new ActivityCorrelationInfoAccessor()); + builder.Services.AddApplicationInsightsTelemetryWorkerService(); + builder.Services.ConfigureFunctionsApplicationInsights(); + }) + .UseSerilog((context, provider, logConfig) => + { + var config = provider.GetRequiredService(); + string instrumentationKey = config.GetValue("APPINSIGHTS_INSTRUMENTATIONKEY"); + + logConfig.MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .Enrich.WithComponentName("Timer") + .Enrich.WithCorrelationInfo(provider) + .WriteTo.AzureApplicationInsightsWithInstrumentationKey(provider, instrumentationKey); + }) + .Build(); + + host.Run(); + } + } + + /// + /// Represents an implementation that solely retrieves the correlation information from the . + /// Mostly used for places where the Application Insights is baked in and there is no way to hook in custom Arcus functionality. + /// + internal class ActivityCorrelationInfoAccessor : ICorrelationInfoAccessor + { + /// + /// Gets the current correlation information initialized in this context. + /// + public CorrelationInfo GetCorrelationInfo() + { + var activity = Activity.Current; + if (activity == null) + { + return null; + } + + if (activity.IdFormat == ActivityIdFormat.W3C) + { + string operationParentId = DetermineW3CParentId(activity); + return new CorrelationInfo( + activity.SpanId.ToHexString(), + activity.TraceId.ToHexString(), + operationParentId); + } + + return new CorrelationInfo( + activity.Id, + activity.RootId, + activity.ParentId); + } + + private static string DetermineW3CParentId(Activity activity) + { + if (activity.ParentSpanId != default) + { + return activity.ParentSpanId.ToHexString(); + } + + if (!string.IsNullOrEmpty(activity.ParentId)) + { + // W3C activity with non-W3C parent must keep parentId + return activity.ParentId; + } + + return null; + } + + /// + /// Sets the current correlation information for this context. + /// + /// The correlation model to set. + public void SetCorrelationInfo(CorrelationInfo correlationInfo) + { + throw new InvalidOperationException( + "Cannot set new correlation information in Azure Functions in-process model"); + } + } + + public class RequestTrackingMiddleware : IFunctionsWorkerMiddleware + { + public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) + { + using (var measurement = DurationMeasurement.Start()) + { + try + { + await next(context); + } + finally + { + ILogger log = context.GetLogger(); + log.LogCustomRequest("Timer", "Triggered", isSuccessful: true, measurement); + } + } + await next(context); + } + } +} \ No newline at end of file diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Startup.cs b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Startup.cs deleted file mode 100644 index 8cb877ed..00000000 --- a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/Startup.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Arcus.Observability.Tests.Runtimes.AzureFunctions; -using Microsoft.Azure.Functions.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Serilog; -using Serilog.Configuration; -using Serilog.Events; -using Serilog.Extensions.Logging; - -[assembly: FunctionsStartup(typeof(Startup))] - -namespace Arcus.Observability.Tests.Runtimes.AzureFunctions -{ - internal class Startup : FunctionsStartup - { - public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) - { - builder.ConfigurationBuilder.AddEnvironmentVariables(); - } - - public override void Configure(IFunctionsHostBuilder builder) - { - IConfiguration appConfig = builder.GetContext().Configuration; - var instrumentationKey = appConfig.GetValue("APPINSIGHTS_INSTRUMENTATIONKEY"); - - builder.Services.AddApplicationInsightsTelemetryWorkerService(); - builder.Services.AddLogging(logging => - { - logging.RemoveMicrosoftApplicationInsightsLoggerProvider(); - logging.Services.AddSingleton(provider => - { - var logConfig = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.AzureApplicationInsightsWithInstrumentationKey(provider, instrumentationKey); - - return new SerilogLoggerProvider(logConfig.CreateLogger(), dispose: true); - }); - }); - } - } -} diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/TimerTriggerFunction.cs b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/TimerTriggerFunction.cs new file mode 100644 index 00000000..3ceef929 --- /dev/null +++ b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/TimerTriggerFunction.cs @@ -0,0 +1,38 @@ +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; + +namespace Arcus.Observability.Tests.Runtimes.AzureFunction +{ + public class Function1 + { + private readonly ILogger _logger; + + public Function1(ILoggerFactory loggerFactory) + { + _logger = loggerFactory.CreateLogger(); + } + + [Function("Function1")] + public void Run([TimerTrigger("0 */5 * * * *")] MyInfo myTimer) + { + _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); + _logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}"); + } + } + + public class MyInfo + { + public MyScheduleStatus ScheduleStatus { get; set; } + + public bool IsPastDue { get; set; } + } + + public class MyScheduleStatus + { + public DateTime Last { get; set; } + + public DateTime Next { get; set; } + + public DateTime LastUpdated { get; set; } + } +} diff --git a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/host.json b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/host.json index beb2e402..f4d3eeda 100644 --- a/src/Arcus.Observability.Tests.Runtimes.AzureFunction/host.json +++ b/src/Arcus.Observability.Tests.Runtimes.AzureFunction/host.json @@ -1,11 +1,14 @@ { - "version": "2.0", - "logging": { - "applicationInsights": { - "samplingSettings": { - "isEnabled": true, - "excludedTypes": "Request" - } - } + "version": "2.0", + "logging": { + "logLevel": { + "default": "Trace" + }, + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } } + } } \ No newline at end of file diff --git a/src/Arcus.Observability.Tests.Unit/Arcus.Observability.Tests.Unit.csproj b/src/Arcus.Observability.Tests.Unit/Arcus.Observability.Tests.Unit.csproj index 83b434eb..8a09c3f3 100644 --- a/src/Arcus.Observability.Tests.Unit/Arcus.Observability.Tests.Unit.csproj +++ b/src/Arcus.Observability.Tests.Unit/Arcus.Observability.Tests.Unit.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 false false CS0618