public async Task Before(TReq lambdaEvent, MiddyNetContext context) { foreach (var parameter in ssmOptions.ParametersToGet) { if (IsParameterInCacheValid(parameter.Name)) { UpdateAdditionalContext(context, parameter.Name, ParametersCache[parameter.Name].Value); UpdateCache(parameter.Name, ParametersCache[parameter.Name].Value); } else { using (var ssmClient = ssmClientFactory()) { try { var response = await ssmClient.GetParameterAsync(new GetParameterRequest { Name = parameter.Path, WithDecryption = true }); UpdateAdditionalContext(context, parameter.Name, response.Parameter.Value); UpdateCache(parameter.Name, response.Parameter.Value); } catch (Exception ex) { context.MiddlewareExceptions.Add(ex); } } } } }
public Task Before(SNSEvent snsEvent, MiddyNetContext context) { var snsMessage = snsEvent.Records.First().Sns; var traceParentHeaderValue = string.Empty; if (snsMessage.MessageAttributes.ContainsKey(TraceParentHeaderName)) { traceParentHeaderValue = snsMessage.MessageAttributes[TraceParentHeaderName].Value; } var traceStateHeaderValue = string.Empty; if (snsMessage.MessageAttributes.ContainsKey(TraceStateHeaderName)) { traceParentHeaderValue = snsMessage.MessageAttributes[TraceStateHeaderName].Value; } var traceContext = TraceContext.Handle(traceParentHeaderValue, traceStateHeaderValue); context.Logger.EnrichWith(new LogProperty(TraceParentHeaderName, traceContext.TraceParent)); context.Logger.EnrichWith(new LogProperty(TraceStateHeaderName, traceContext.TraceState)); context.Logger.EnrichWith(new LogProperty(TraceIdHeaderName, traceContext.TraceId)); return(Task.CompletedTask); }
public async Task GetTheValueFromCacheIfItsAlreadyThere() { var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>(); ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns( Task.FromResult(new GetParameterResponse { Parameter = new Parameter { Value = Param1Value } })); var context = new MiddyNetContext(Substitute.For <ILambdaContext>()); var options = new SSMOptions { ParametersToGet = new List <SSMParameterToGet> { new SSMParameterToGet(Param1Name, Param1Path) }, CacheExpiryInMillis = 60 * 1000 }; var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, new SystemTimeProvider()); await ssmMiddleware.Before(1, context); await ssmMiddleware.Before(1, context); await ssmClient.Received(1).GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)); }
public Task Before(APIGatewayProxyRequest lambdaEvent, MiddyNetContext context) { incomingOrigin = GetOriginHeader(lambdaEvent); httpMethod = lambdaEvent.HttpMethod; return(Task.CompletedTask); }
protected override Task <int> Handle(int lambdaEvent, MiddyNetContext context) { LogLines.Add(FunctionLog); ContextLogLines.AddRange(context.AdditionalContext.Select(kv => $"{kv.Key}-{kv.Value}")); Exceptions.AddRange(context.MiddlewareExceptions); return(Task.FromResult(0)); }
private void UpdateAdditionalContext(MiddyNetContext context, string parameterName, string parameterValue) { if (context.AdditionalContext.ContainsKey(parameterName)) { context.AdditionalContext.Remove(parameterName); } context.AdditionalContext.Add(parameterName, parameterValue); }
public HttpCorsMiddlewareShould() { context = new MiddyNetContext(Substitute.For <ILambdaContext>()); request = new APIGatewayProxyRequest { HttpMethod = "GET", Headers = new Dictionary <string, string>() }; }
public Task <int> After(int lambdaResponse, MiddyNetContext context) { LogLines.Add($"{MiddlewareAfterLog}-{position}"); if (Failing) { throw new MiddlewareException(); } return(Task.FromResult(0)); }
protected override Task <string[]> Handle(int lambdaEvent, MiddyNetContext context) { if (context.MiddlewareExceptions.Any()) { return(Task.FromResult(new[] { context.MiddlewareExceptions.First().ToString() })); } var results = ParametersToGet.Select(n => context.AdditionalContext[n].ToString()).ToArray(); return(Task.FromResult(results)); }
public Task Before(int lambdaEvent, MiddyNetContext context) { LogLines.Add($"{MiddlewareBeforeLog}-{position}"); context.AdditionalContext.Add($"{ContextKeyLog}-{position}", $"{ContextLog}-{position}"); if (Failing) { throw new MiddlewareException(); } return(Task.CompletedTask); }
protected override Task <int> Handle(SNSEvent lambdaEvent, MiddyNetContext context) { var originalTraceParentHeaderValue = string.Empty; if (lambdaEvent.Records[0].Sns.MessageAttributes.ContainsKey("traceparent")) { originalTraceParentHeaderValue = lambdaEvent.Records[0].Sns.MessageAttributes["traceparent"].Value; } context.Logger.Log(LogLevel.Info, "Function called", new LogProperty("original-traceparent", originalTraceParentHeaderValue)); return(Task.FromResult(0)); }
public async Task EnrichLoggerWithTraceContext() { var logger = Substitute.For <IMiddyLogger>(); var context = new MiddyNetContext(Substitute.For <ILambdaContext>(), _ => logger); var middleware = new SNSTracingMiddleware <int>(); var snsEvent = new SNSEvent { Records = new List <SNSEvent.SNSRecord>() { new SNSEvent.SNSRecord { Sns = new SNSEvent.SNSMessage { MessageAttributes = new Dictionary <string, SNSEvent.MessageAttribute> { { "traceparent", new SNSEvent.MessageAttribute { Type = "String", Value = "traceparent header value" } }, { "tracestate", new SNSEvent.MessageAttribute { Type = "String", Value = "tracestate header value" } } } } } } }; await middleware.Before(snsEvent, context); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "traceparent")); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "tracestate")); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "trace-id")); }
public async Task EnrichLoggerWithTraceContext() { var logger = Substitute.For <IMiddyLogger>(); var context = new MiddyNetContext(Substitute.For <ILambdaContext>(), _ => logger); var middleware = new ApiGatewayTracingMiddleware <int>(); var apiGatewayEvent = new APIGatewayProxyRequest { Headers = new Dictionary <string, string> { { "traceparent", "traceparent header value" }, { "tracestate", "tracestate header value" } } }; await middleware.Before(apiGatewayEvent, context); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "traceparent")); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "tracestate")); logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "trace-id")); }
public async Task GetParametersAndSetToContextOnBeforeMethod() { var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>(); ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns( Task.FromResult(new GetParameterResponse { Parameter = new Parameter { Value = Param1Value } })); ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param2Path)).Returns( Task.FromResult(new GetParameterResponse { Parameter = new Parameter { Value = Param2Value } })); var context = new MiddyNetContext(Substitute.For <ILambdaContext>()); var options = new SSMOptions { ParametersToGet = new List <SSMParameterToGet> { new SSMParameterToGet(Param1Name, Param1Path), new SSMParameterToGet(Param2Name, Param2Path) } }; var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, new SystemTimeProvider()); await ssmMiddleware.Before(1, context); await ssmClient.Received().GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)); await ssmClient.Received().GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param2Path)); context.AdditionalContext.Should().Contain(Param1Name, Param1Value); context.AdditionalContext.Should().Contain(Param2Name, Param2Value); }
public async Task GetTheValueFromSSMIfItsCacheHasExpired() { var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>(); ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns( Task.FromResult(new GetParameterResponse { Parameter = new Parameter { Value = Param1Value } })); var now = System.DateTime.UtcNow; var timeProvider = Substitute.For <ITimeProvider>(); var context = new MiddyNetContext(Substitute.For <ILambdaContext>()); var options = new SSMOptions { ParametersToGet = new List <SSMParameterToGet> { new SSMParameterToGet(Param1Name, Param1Path) }, CacheExpiryInMillis = 60 * 1000 }; var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, timeProvider); timeProvider.UtcNow.Returns(now); await ssmMiddleware.Before(1, context); timeProvider.UtcNow.Returns(now.AddMilliseconds(70 * 1000)); await ssmMiddleware.Before(1, context); await ssmClient.Received(2).GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)); }
public Task Before(APIGatewayProxyRequest apiGatewayEvent, MiddyNetContext context) { var traceParentHeaderValue = string.Empty; if (apiGatewayEvent.Headers.ContainsKey(TraceParentHeaderName)) { traceParentHeaderValue = apiGatewayEvent.Headers[TraceParentHeaderName]; } var traceStateHeaderValue = string.Empty; if (apiGatewayEvent.Headers.ContainsKey(TraceStateHeaderName)) { traceStateHeaderValue = apiGatewayEvent.Headers[TraceStateHeaderName]; } var traceContext = TraceContext.Handle(traceParentHeaderValue, traceStateHeaderValue); context.Logger.EnrichWith(new LogProperty(TraceParentHeaderName, traceContext.TraceParent)); context.Logger.EnrichWith(new LogProperty(TraceStateHeaderName, traceContext.TraceState)); context.Logger.EnrichWith(new LogProperty(TraceIdHeaderName, traceContext.TraceId)); return(Task.CompletedTask); }
public Task <APIGatewayProxyResponse> After(APIGatewayProxyResponse lambdaResponse, MiddyNetContext context) { if (IsNullOrWhiteSpace(httpMethod)) { return(Task.FromResult(lambdaResponse)); } InitialiseHeaders(lambdaResponse); SetAllowOriginHeader(lambdaResponse); SetAllowHeadersHeader(lambdaResponse); SetAllowCredentialsHeader(lambdaResponse); SetCacheControlHeader(lambdaResponse); SetMaxAgeHeader(lambdaResponse); return(Task.FromResult(lambdaResponse)); }
public Task <TRes> After(TRes lambdaResponse, MiddyNetContext context) { return(Task.FromResult(lambdaResponse)); }
protected override Task <APIGatewayProxyResponse> Handle(APIGatewayProxyRequest lambdaEvent, MiddyNetContext context) { var result = new APIGatewayProxyResponse { StatusCode = 200, Body = "hello from test" }; return(Task.FromResult(result)); }
public Task Before(int lambdaEvent, MiddyNetContext context) { return(Task.CompletedTask); }
protected override Task <APIGatewayProxyResponse> Handle(APIGatewayProxyRequest proxyRequest, MiddyNetContext context) { var originalTraceParentHeaderValue = string.Empty; if (proxyRequest.Headers.ContainsKey("traceparent")) { originalTraceParentHeaderValue = proxyRequest.Headers["traceparent"]; } context.Logger.Log(LogLevel.Info, "Function called", new LogProperty("original-traceparent", originalTraceParentHeaderValue)); return(Task.FromResult(new APIGatewayProxyResponse { StatusCode = 200, Body = "Ok" })); }