diff --git a/samples/azure/azure-function/Dockerfile b/samples/azure/azure-function/Dockerfile index 53316cbf0..cc5a6d5f1 100644 --- a/samples/azure/azure-function/Dockerfile +++ b/samples/azure/azure-function/Dockerfile @@ -1,10 +1,10 @@ # Find the Dockerfile at this URL # https://github.com/Azure/azure-functions-docker/blob/dev/host/4/bullseye/amd64/dotnet/dotnet-inproc/dotnet.Dockerfile -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 -FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build COPY ["src/", "data/src/"] COPY ["scripts/", "data/scripts/"] COPY ["samples/", "data/samples/"] @@ -21,3 +21,4 @@ RUN dotnet publish "samples/azure/azure-function/function.csproj" -c Release -o FROM base AS final WORKDIR /home/site/wwwroot COPY --from=publish /app/publish . +ENV ASPNETCORE_CONTENTROOT=/home/site/wwwroot diff --git a/samples/azure/azure-function/GetCarbonIntensity.cs b/samples/azure/azure-function/GetCarbonIntensity.cs index c1e2a441e..7ca8db605 100644 --- a/samples/azure/azure-function/GetCarbonIntensity.cs +++ b/samples/azure/azure-function/GetCarbonIntensity.cs @@ -1,7 +1,7 @@ using GSF.CarbonAware.Handlers; using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.WebJobs; -using Microsoft.Azure.WebJobs.Extensions.Http; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; @@ -14,17 +14,18 @@ namespace function public class GetCarbonIntensity { private readonly IEmissionsHandler _handler; + private readonly ILogger _log; - public GetCarbonIntensity(IEmissionsHandler handler) + public GetCarbonIntensity(IEmissionsHandler handler, ILogger log) { this._handler = handler; + this._log = log; } - [FunctionName("GetAverageCarbonIntensity")] + [Function("GetAverageCarbonIntensity")] public async Task Run( - [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, - ILogger log) + [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req) { //Get the startDate, endDate, and location from the request query if the values are present in the query string startDate = req.Query["startdate"]; @@ -47,7 +48,7 @@ public async Task Run( try { var result = await _handler.GetAverageCarbonIntensityAsync(location, DateTimeOffset.Parse(startDate), DateTimeOffset.Parse(endDate)); - log.LogInformation($"For location {location} Starting at: {startDate} Ending at: {endDate} the Average Emissions Rating is: {result}."); + _log.LogInformation($"For location {location} Starting at: {startDate} Ending at: {endDate} the Average Emissions Rating is: {result}."); return new OkObjectResult(result); } diff --git a/samples/azure/azure-function/GetForecast.cs b/samples/azure/azure-function/GetForecast.cs index 564a0138e..eb3536620 100644 --- a/samples/azure/azure-function/GetForecast.cs +++ b/samples/azure/azure-function/GetForecast.cs @@ -1,7 +1,7 @@ using GSF.CarbonAware.Handlers; using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.WebJobs; -using Microsoft.Azure.WebJobs.Extensions.Http; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; @@ -15,16 +15,17 @@ namespace CarbonAwareFunctions public class GetForecast { private readonly IForecastHandler _handler; + private readonly ILogger _log; - public GetForecast(IForecastHandler handler) + public GetForecast(IForecastHandler handler, ILogger log) { this._handler = handler; + this._log = log; } - [FunctionName("GetCurrentForecast")] + [Function("GetCurrentForecast")] public async Task Run( - [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, - ILogger log) + [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req) { //Get the startDate, endDate, location, and duration from the request query if the values are present in the query string startDate = req.Query["startdate"]; diff --git a/samples/azure/azure-function/Program.cs b/samples/azure/azure-function/Program.cs new file mode 100644 index 000000000..0f64de4d5 --- /dev/null +++ b/samples/azure/azure-function/Program.cs @@ -0,0 +1,24 @@ +using GSF.CarbonAware.Configuration; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; +using System.IO; + +var host = new HostBuilder() + .ConfigureFunctionsWebApplication() + .ConfigureAppConfiguration((context, builder) => { + var env = context.HostingEnvironment; + builder.AddJsonFile(Path.Combine(env.ContentRootPath, "appsettings.json"), optional: true, reloadOnChange: false) + .AddJsonFile(Path.Combine(env.ContentRootPath, $"appsettings.{env.EnvironmentName}.json"), optional: true, reloadOnChange: false) + .AddEnvironmentVariables(); + }) + .ConfigureServices((context,services) => { + services.AddApplicationInsightsTelemetryWorkerService(); + services.ConfigureFunctionsApplicationInsights(); + services.AddEmissionsServices(context.Configuration); + services.AddForecastServices(context.Configuration); + }) + .Build(); + +host.Run(); \ No newline at end of file diff --git a/samples/azure/azure-function/README.md b/samples/azure/azure-function/README.md index 0021630de..641919de4 100644 --- a/samples/azure/azure-function/README.md +++ b/samples/azure/azure-function/README.md @@ -19,29 +19,20 @@ will use. The Carbon Aware SDK is included in the function .csproj file by [creating and adding the SDK as a package](../../docs/packaging.md#included-scripts). -The [Startup.cs](./Startup.cs) file uses dependency injection to access the +The [Program.cs](./Program.cs) file uses dependency injection to access the handlers in the library. The following code initializes the C# Library: ```C# - public override void Configure(IFunctionsHostBuilder builder) - { - var configuration = builder.GetContext().Configuration; - builder.Services - .AddEmissionsServices(configuration) - .AddForecastServices(configuration); - } + // omitted + .ConfigureServices((context,services) => { + services.AddApplicationInsightsTelemetryWorkerService(); + services.ConfigureFunctionsApplicationInsights(); + services.AddEmissionsServices(context.Configuration); + services.AddForecastServices(context.Configuration); + }) + // omitted ``` -> Note as the in-process -> [Azure Function uses dependency injection](https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection) -> though via -> [Microsoft.Azure.Functions.Extensions](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions/) -> there is a version conflict of -> [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration). -> It is fixed adding a version specific project dependency (in .csproj) to the -> same version as the Carbon Aware SDK. Microsoft.Extensions.Configuration is -> backwards compatible. - ## Run Function Locally Both Azure Function apps can be diff --git a/samples/azure/azure-function/Startup.cs b/samples/azure/azure-function/Startup.cs deleted file mode 100644 index 1660065ba..000000000 --- a/samples/azure/azure-function/Startup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using GSF.CarbonAware.Configuration; -using Microsoft.Azure.Functions.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using System.IO; - -[assembly: FunctionsStartup(typeof(CarbonAwareFunctions.Startup))] - -namespace CarbonAwareFunctions -{ - public class Startup : FunctionsStartup - { - public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) - { - FunctionsHostBuilderContext context = builder.GetContext(); - - builder.ConfigurationBuilder - .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false) - .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false) - .AddEnvironmentVariables(); - } - - public override void Configure(IFunctionsHostBuilder builder) - { - var configuration = builder.GetContext().Configuration; - builder.Services - .AddEmissionsServices(configuration) - .AddForecastServices(configuration); - } - } -} \ No newline at end of file diff --git a/samples/azure/azure-function/function.csproj b/samples/azure/azure-function/function.csproj index e48592f82..4dd9facd2 100644 --- a/samples/azure/azure-function/function.csproj +++ b/samples/azure/azure-function/function.csproj @@ -1,9 +1,16 @@ - net6.0 + net8.0 v4 + Exe + + + + + + @@ -11,8 +18,6 @@ - - @@ -26,4 +31,7 @@ PreserveNewest + + +