diff --git a/packages/dotnet/ReadMe/ConfigValues.cs b/packages/dotnet/ReadMe/ConfigValues.cs index ccd2b753de..e11cbd1d52 100644 --- a/packages/dotnet/ReadMe/ConfigValues.cs +++ b/packages/dotnet/ReadMe/ConfigValues.cs @@ -27,5 +27,7 @@ public class Options public int bufferLength { get; set; } = 1; public string baseLogUrl { get; set; } = "https://example.readme.com"; + + public bool fireAndForget { get; set; } = true; } } diff --git a/packages/dotnet/ReadMe/HarJsonTranslationLogics/HarJsonBuilder.cs b/packages/dotnet/ReadMe/HarJsonTranslationLogics/HarJsonBuilder.cs index 32a0d105aa..56b701e01c 100644 --- a/packages/dotnet/ReadMe/HarJsonTranslationLogics/HarJsonBuilder.cs +++ b/packages/dotnet/ReadMe/HarJsonTranslationLogics/HarJsonBuilder.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; using ReadMe.HarJsonObjectModels; namespace ReadMe.HarJsonTranslationLogics @@ -28,7 +27,7 @@ public HarJsonBuilder(RequestDelegate next, HttpContext context, IConfiguration this.configValues = configValues; } - public async Task BuildHar() + internal async Task BuildHar() { Root harObj = new Root(); harObj._id = Guid.NewGuid().ToString(); @@ -37,8 +36,7 @@ public async Task BuildHar() harObj.clientIPAddress = this.context.Connection.RemoteIpAddress.ToString(); harObj.group = this.BuildGroup(); harObj.request = new RequestMain(await this.BuildLog()); - string harJsonObj = JsonConvert.SerializeObject(new List() { harObj }); - return harJsonObj; + return harObj; } private Group BuildGroup() diff --git a/packages/dotnet/ReadMe/HarJsonTranslationLogics/ReadmeApiCaller.cs b/packages/dotnet/ReadMe/HarJsonTranslationLogics/ReadmeApiCaller.cs index 001e77ee93..fb0aa33fe7 100644 --- a/packages/dotnet/ReadMe/HarJsonTranslationLogics/ReadmeApiCaller.cs +++ b/packages/dotnet/ReadMe/HarJsonTranslationLogics/ReadmeApiCaller.cs @@ -7,16 +7,16 @@ namespace ReadMe.HarJsonTranslationLogics { class ReadMeApiCaller { - private readonly string harJsonObject; + private readonly string harJsonObjects; private readonly string apiKey; - public ReadMeApiCaller(string harJsonObject, string apiKey) + public ReadMeApiCaller(string harJsonObjects, string apiKey) { - this.harJsonObject = harJsonObject; + this.harJsonObjects = harJsonObjects; this.apiKey = apiKey; } - public void SendHarObjToReadMeApi() + public void SendHarObjToReadMeApi(bool fireAndForget) { try { @@ -25,8 +25,15 @@ public void SendHarObjToReadMeApi() request.AddHeader("Content-Type", "application/json"); string apiKey = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(this.apiKey + ":")); request.AddHeader("Authorization", apiKey); - request.AddParameter("application/json", this.harJsonObject, ParameterType.RequestBody); - client.ExecuteAsync(request); + request.AddParameter("application/json", this.harJsonObjects, ParameterType.RequestBody); + if (fireAndForget) + { + client.ExecuteAsync(request); + } + else + { + client.Execute(request); + } } catch (Exception) { diff --git a/packages/dotnet/ReadMe/Metrics.cs b/packages/dotnet/ReadMe/Metrics.cs index 6bf275b585..b42849b0e9 100644 --- a/packages/dotnet/ReadMe/Metrics.cs +++ b/packages/dotnet/ReadMe/Metrics.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; +using Newtonsoft.Json; using ReadMe.HarJsonObjectModels; using ReadMe.HarJsonTranslationLogics; @@ -11,12 +12,14 @@ public class Metrics { private readonly RequestDelegate next; private readonly IConfiguration configuration; + private readonly List harQueue; private Group group; public Metrics(RequestDelegate next, IConfiguration configuration) { this.next = next; this.configuration = configuration; + this.harQueue = new List(); } public async Task InvokeAsync(HttpContext context) @@ -44,9 +47,18 @@ public async Task InvokeAsync(HttpContext context) context.Request.EnableBuffering(); HarJsonBuilder harJsonBuilder = new HarJsonBuilder(this.next, context, this.configuration, configValues); - string harJsonObj = await harJsonBuilder.BuildHar(); - ReadMeApiCaller readmeApiCaller = new ReadMeApiCaller(harJsonObj, configValues.apiKey); - readmeApiCaller.SendHarObjToReadMeApi(); + var harObj = await harJsonBuilder.BuildHar(); + lock (this.harQueue) + { + this.harQueue.Add(harObj); + if (this.harQueue.Count >= configValues.options.bufferLength) + { + string serializaedHars = JsonConvert.SerializeObject(this.harQueue); + ReadMeApiCaller readmeApiCaller = new ReadMeApiCaller(serializaedHars, configValues.apiKey); + readmeApiCaller.SendHarObjToReadMeApi(configValues.options.fireAndForget); + this.harQueue.Clear(); + } + } } else { @@ -114,6 +126,11 @@ private ConfigValues GetConfigValues() optionsObj.baseLogUrl = options.GetSection("baseLogUrl").Value; } + if (options.GetSection("fireAndForget").Value != null) + { + optionsObj.fireAndForget = bool.Parse(options.GetSection("fireAndForget").Value); + } + configValues.options = optionsObj; return configValues; } diff --git a/packages/python/examples/metrics_django/requirements.txt b/packages/python/examples/metrics_django/requirements.txt index 3ea3ae4eaf..7192895118 100644 --- a/packages/python/examples/metrics_django/requirements.txt +++ b/packages/python/examples/metrics_django/requirements.txt @@ -2,7 +2,7 @@ asgiref==3.8.1 certifi==2024.7.4 chardet==5.2.0 click==8.1.7 -Django==4.2.16 +Django==4.2.17 Flask==3.0.3 idna==3.7 itsdangerous==2.2.0