Skip to content

Ability to disable logevent for test or inject object mapper instance #275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
asmith-r7 opened this issue Feb 10, 2021 · 4 comments
Closed
Assignees
Labels
feature-request New feature or request

Comments

@asmith-r7
Copy link

asmith-r7 commented Feb 10, 2021

Is your feature request related to a problem? Please describe.

During testing, I've been passing a mock s3Event to the handler, this causes powertools logging to attempt to deserialize this but jackson throws an exception as it can't for a mock which leads to huge stack traces in the test logs.

Failed logging event of type class com.amazonaws.services.lambda.runtime.events.S3Event$MockitoMock$957278562 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.mockito.internal.junit.DefaultStubbingLookupListener and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.amazonaws.services.lambda.runtime.events.S3Event$MockitoMock$957278562["records"]->java.util.ImmutableCollections$List12[0]->com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification$S3EventNotificationRecord$MockitoMock$1268202659["s3"]->com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification$S3Entity$MockitoMock$1728425648["bucket"]->com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification$S3BucketEntity$MockitoMock$103719884["mockitoInterceptor"]->org.mockito.internal.creation.bytebuddy.MockMethodInterceptor["mockHandler"]->org.mockito.internal.handler.InvocationNotifierHandler["mockSettings"]->org.mockito.internal.creation.settings.CreationSettings["stubbingLookupListeners"]->java.util.concurrent.CopyOnWriteArrayList[0]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:404) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4094) ~[jackson-databind-2.10.1.jar:2.10.1] at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3404) ~[jackson-databind-2.10.1.jar:2.10.1] at software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspect.asJson(LambdaLoggingAspect.java:192) ~[powertools-logging-1.2.0.jar:?] at software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspect.logEvent(LambdaLoggingAspect.java:152) ~[powertools-logging-1.2.0.jar:?] at software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspect.around(LambdaLoggingAspect.java:95) ~[powertools-logging-1.2.0.jar:?]

Describe the solution you'd like

If there was some way to turn off the logging when testing, or perhaps more simply, if I could pass in my own objectMapper instance, I could configure it to be able to deserialize the mock.

@pankajagrawal16
Copy link
Contributor

pankajagrawal16 commented Feb 10, 2021

Hi @asmith-r7

I understand the problem you are facing. Perhaps rite now you might have to pass a valid event to make it work.

At this point, I am thinking perhaps we can let users override the default object mapper instance via an environment variable instead of having something to toggle the logging behavior.

So having something like an api defaultObjectMapper which can be used to override default one if needed by clients.

Thoughts?

@pankajagrawal16 pankajagrawal16 added the feature-request New feature or request label Feb 10, 2021
@asmith-r7
Copy link
Author

Hi, thanks for the response. I was able to work around the problem by doing as you suggested. I remember the last time I had looked into creating an S3Event from a json file I had ran into problems but it looks like since then a testing library was released and it solves the problem 🎉 :
https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-tests

The only disadvantage to this approach was using a mock made it really easy to dynamically change the keys etc in the event being passed in but that library seems to rely on supplying a JSON file each time.

I still could see exposing the object mapper being a good idea though.

@pankajagrawal16
Copy link
Contributor

Hi, thanks for the response. I was able to work around the problem by doing as you suggested. I remember the last time I had looked into creating an S3Event from a json file I had ran into problems but it looks like since then a testing library was released and it solves the problem 🎉 :
https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-tests

The only disadvantage to this approach was using a mock made it really easy to dynamically change the keys etc in the event being passed in but that library seems to rely on supplying a JSON file each time.

I still could see exposing the object mapper being a good idea though.

Great to hear that you got it working now with valid event object. In a way its good to unit test things with a valid event object to avoid getting surprises in staging or production environment. But, I do understand mocks can be convenient for iterating faster.

I will leave this issue open for now and probably expose an api to let clients override object mapper as well which can probably compliment RFC #66 as well.

@pankajagrawal16
Copy link
Contributor

Available in 1.3.0 now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature-request New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants