From aa721a7b438a579dcaba3308cd0365a0f0e423a9 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 2 Apr 2020 16:36:54 +0200 Subject: [PATCH] GH-456 Fix Azure logging Added static delegate context which holds target context and is also refreshed with new context on each request Resolves #456 --- .../azure/AzureSpringBootRequestHandler.java | 37 ++++++++++-- .../AzureSpringBootRequestHandlerTests.java | 15 +++-- .../function-sample-azure/pom.xml | 2 +- .../src/main/java/example/Config.java | 58 +++---------------- ...{FooHandler.java => UppercaseHandler.java} | 8 +-- .../src/test/java/example/MapTests.java | 14 ++--- 6 files changed, 59 insertions(+), 75 deletions(-) rename spring-cloud-function-samples/function-sample-azure/src/main/java/example/{FooHandler.java => UppercaseHandler.java} (82%) diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java index c88cd372b..ff2bc67c0 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java @@ -18,6 +18,7 @@ package org.springframework.cloud.function.adapter.azure; import java.util.Collection; import java.util.function.Function; +import java.util.logging.Logger; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.OutputBinding; @@ -40,6 +41,8 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA private String functionName; + private final static ExecutionContextDelegate EXECUTION_CTX_DELEGATE = new ExecutionContextDelegate(); + public AzureSpringBootRequestHandler(Class configurationClass) { super(configurationClass); } @@ -60,6 +63,7 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA @SuppressWarnings("unchecked") public O handleRequest(I input, ExecutionContext context) { + EXECUTION_CTX_DELEGATE.targetContext = context; String name = ""; try { if (context != null) { @@ -73,7 +77,7 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA * see https://github.com/spring-cloud/spring-cloud-function/issues/425 */ if (thisInitializer == null || !thisInitializer.functionName.equals(name)) { - initialize(context); + initialize(EXECUTION_CTX_DELEGATE); this.functionName = name; thisInitializer = this; return (O) thisInitializer.handleRequest(input, context); @@ -118,10 +122,6 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA return Flux.just(input); } -// @SuppressWarnings("unchecked") -// protected O convertOutput(I input, Object output) { -// return (O) output; -// } protected boolean isSingleInput(Function function, Object input) { if (!(input instanceof Collection)) { @@ -145,4 +145,31 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA return ((Collection) output).size() <= 1; } + private static class ExecutionContextDelegate implements ExecutionContext { + + ExecutionContext targetContext; + + @Override + public Logger getLogger() { + if (targetContext == null || targetContext.getLogger() == null) { + return Logger.getAnonymousLogger(); + } + return targetContext.getLogger(); + } + + @Override + public String getInvocationId() { + return targetContext.getInvocationId(); + } + + @Override + public String getFunctionName() { + return targetContext.getFunctionName(); + } + + @Override + public String toString() { + return "ExecutionContextDelegate over: " + this.targetContext; + } + } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java index b79e441ae..e0853f298 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java @@ -232,13 +232,20 @@ public class AzureSpringBootRequestHandlerTests { protected static class MultiConfig { @Bean - public Function uppercase() { - return foo -> new Bar(foo.getValue().toUpperCase()); + public Function uppercase(ExecutionContext context) { + + return foo -> { + context.getLogger().info("Executing uppercase function"); + return new Bar(foo.getValue().toUpperCase()); + }; } @Bean - public Function lowercase() { - return bar -> new Foo(bar.getValue().toLowerCase()); + public Function lowercase(ExecutionContext context) { + return bar -> { + context.getLogger().info("Executing lowercase function"); + return new Foo(bar.getValue().toLowerCase()); + }; } } diff --git a/spring-cloud-function-samples/function-sample-azure/pom.xml b/spring-cloud-function-samples/function-sample-azure/pom.xml index b1be2133b..0fb68540f 100644 --- a/spring-cloud-function-samples/function-sample-azure/pom.xml +++ b/spring-cloud-function-samples/function-sample-azure/pom.xml @@ -54,7 +54,7 @@ org.springframework.cloud spring-cloud-function-dependencies - 3.0.1.BUILD-SNAPSHOT + 3.0.4.BUILD-SNAPSHOT pom import diff --git a/spring-cloud-function-samples/function-sample-azure/src/main/java/example/Config.java b/spring-cloud-function-samples/function-sample-azure/src/main/java/example/Config.java index d516e1c0b..57c856b65 100644 --- a/spring-cloud-function-samples/function-sample-azure/src/main/java/example/Config.java +++ b/spring-cloud-function-samples/function-sample-azure/src/main/java/example/Config.java @@ -22,6 +22,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import com.microsoft.azure.functions.ExecutionContext; + @SpringBootApplication public class Config { @@ -30,58 +32,12 @@ public class Config { } @Bean - public Function uppercase() { - return foo -> new Bar(foo.getValue().toUpperCase()); + public Function uppercase(ExecutionContext context) { + return value -> { + context.getLogger().info("Uppercasing " + value); + return value.toUpperCase(); + }; } } -class Foo { - - private String value; - - Foo() { - } - - Foo(String value) { - this.value = value; - } - - public String lowercase() { - return this.value.toLowerCase(); - } - - public String uppercase() { - return this.value.toUpperCase(); - } - - public String getValue() { - return this.value; - } - - public void setValue(String value) { - this.value = value; - } - -} - -class Bar { - - private String value; - - Bar() { - } - - Bar(String value) { - this.value = value; - } - - public String getValue() { - return this.value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/spring-cloud-function-samples/function-sample-azure/src/main/java/example/FooHandler.java b/spring-cloud-function-samples/function-sample-azure/src/main/java/example/UppercaseHandler.java similarity index 82% rename from spring-cloud-function-samples/function-sample-azure/src/main/java/example/FooHandler.java rename to spring-cloud-function-samples/function-sample-azure/src/main/java/example/UppercaseHandler.java index aba291911..888dcabbc 100644 --- a/spring-cloud-function-samples/function-sample-azure/src/main/java/example/FooHandler.java +++ b/spring-cloud-function-samples/function-sample-azure/src/main/java/example/UppercaseHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,11 +30,11 @@ import org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHa /** * @author Soby Chacko */ -public class FooHandler extends AzureSpringBootRequestHandler { +public class UppercaseHandler extends AzureSpringBootRequestHandler { @FunctionName("uppercase") - public Bar execute(@HttpTrigger(name = "req", methods = {HttpMethod.GET, - HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage> request, + public String execute(@HttpTrigger(name = "req", methods = {HttpMethod.GET, + HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage> request, ExecutionContext context) { return handleRequest(request.getBody().get(), context); } diff --git a/spring-cloud-function-samples/function-sample-azure/src/test/java/example/MapTests.java b/spring-cloud-function-samples/function-sample-azure/src/test/java/example/MapTests.java index 26579e577..f932df4ce 100644 --- a/spring-cloud-function-samples/function-sample-azure/src/test/java/example/MapTests.java +++ b/spring-cloud-function-samples/function-sample-azure/src/test/java/example/MapTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,19 +28,13 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class MapTests { - @Test - public void test() { - Bar result = new Config().uppercase().apply(new Foo("foo")); - assertThat(result.getValue()).isEqualTo("FOO"); - } - @Test public void start() throws Exception { - AzureSpringBootRequestHandler handler = new AzureSpringBootRequestHandler<>( + AzureSpringBootRequestHandler handler = new AzureSpringBootRequestHandler<>( Config.class); - Bar result = handler.handleRequest(new Foo("foo"), null); + String result = handler.handleRequest("foo", null); handler.close(); - assertThat(result.getValue()).isEqualTo("FOO"); + assertThat(result).isEqualTo("FOO"); } }