Skip to content
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

Remove LMAX Disruptor , use queue and Quartz #14422

Merged
merged 39 commits into from
Jan 8, 2024
Merged
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
f157a29
Remove LMAX Disruptor , use queue and Quartz
mohityadav766 Dec 18, 2023
093dfd7
Merge branch 'main' into addQueue
mohityadav766 Dec 19, 2023
72a8a5f
Spotless Fix
mohityadav766 Dec 19, 2023
06c9b30
Merge branch 'main' into addQueue
mohityadav766 Dec 27, 2023
22cefe0
Spotless formatting
mohityadav766 Dec 27, 2023
edcb5ad
Review Comments
mohityadav766 Dec 31, 2023
0a279bb
Improvements
mohityadav766 Jan 1, 2024
c028984
Improvements to add Retry and DLQ
mohityadav766 Jan 1, 2024
76b9076
Spotless fix
mohityadav766 Jan 1, 2024
5e50d95
Merge branch 'main' into addQueue
mohityadav766 Jan 1, 2024
74d11ea
Update Stats
mohityadav766 Jan 2, 2024
a44cfbd
Fix stats
mohityadav766 Jan 2, 2024
e7ae4c2
Fix delete Failures
mohityadav766 Jan 2, 2024
baf3281
Fix Failing Tests
mohityadav766 Jan 2, 2024
1573165
Merge branch 'main' into addQueue
mohityadav766 Jan 3, 2024
a1af715
Fix Failing Tests
mohityadav766 Jan 3, 2024
7cc2b86
Fix Failing Tests
mohityadav766 Jan 3, 2024
40f8fb2
Merge branch 'main' into addQueue
mohityadav766 Jan 3, 2024
22b8973
Postgres Fix
mohityadav766 Jan 3, 2024
18e7c59
Fix Schema Change for Change Event Table
mohityadav766 Jan 3, 2024
d2a4186
Failing test
mohityadav766 Jan 3, 2024
0c212e1
Merge branch 'main' into addQueue
mohityadav766 Jan 3, 2024
5f3f15f
Fix Error for non ChangeDescriptions
mohityadav766 Jan 3, 2024
d3543c9
Adds Observability On Top of Event Subscription
mohityadav766 Jan 6, 2024
1f8e513
Merge branch 'main' into addQueue
mohityadav766 Jan 6, 2024
2b74ab8
Make List Separate
mohityadav766 Jan 6, 2024
950df98
Add more filters for Test Suite
mohityadav766 Jan 7, 2024
f9f09bf
Populate Default Schema Updates to Look for
mohityadav766 Jan 7, 2024
def4bd5
typo
mohityadav766 Jan 7, 2024
dc81ce6
Merge branch 'main' into addQueue
mohityadav766 Jan 7, 2024
1250c87
Add matchFieldChange and other in paramAdditionalContext
mohityadav766 Jan 7, 2024
82df4d4
Merge branch 'main' into addQueue
mohityadav766 Jan 8, 2024
54f9ede
Review Comments
mohityadav766 Jan 8, 2024
abe9b08
Spotless fix
mohityadav766 Jan 8, 2024
65068ef
Merge branch 'main' into addQueue
mohityadav766 Jan 8, 2024
7c56334
Merge issue
mohityadav766 Jan 8, 2024
c6fab7f
Update Filter as per new Syntax
mohityadav766 Jan 8, 2024
8797770
Fix Failing Test
mohityadav766 Jan 8, 2024
e07f4d6
Merge branch 'main' into addQueue
mohityadav766 Jan 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Review Comments
mohityadav766 committed Jan 8, 2024
commit 54f9ede98658fc98cdacd7baba0cc461355a03cb
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@
import static org.openmetadata.schema.entity.events.SubscriptionStatus.Status.AWAITING_RETRY;
import static org.openmetadata.schema.entity.events.SubscriptionStatus.Status.FAILED;
import static org.openmetadata.service.events.subscription.AlertUtil.getFilteredEvent;
import static org.openmetadata.service.events.subscription.AlertUtil.getInitialAlertOffsetFromDb;
import static org.openmetadata.service.events.subscription.AlertUtil.getStartingOffset;

import com.fasterxml.jackson.core.type.TypeReference;
import java.util.ArrayList;
@@ -47,13 +47,14 @@
@Slf4j
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public abstract class AbstractEventConsumer implements Consumer<ChangeEvent>, Job {
public abstract class AbstractEventConsumer
implements Alert<ChangeEvent>, Consumer<ChangeEvent>, Job {
public static final String ALERT_OFFSET_KEY = "alertOffsetKey";
public static final String ALERT_INFO_KEY = "alertInfoKey";
public static final String OFFSET_EXTENSION = "eventSubscription.Offset";
public static final String METRICS_EXTENSION = "eventSubscription.metrics";
public static final String FAILED_EVENT_EXTENSION = "eventSubscription.failedEvent";
private int offset = -1;
private long offset = -1;
private AlertMetrics alertMetrics;

@Getter @Setter private JobDetail jobDetail;
@@ -71,11 +72,8 @@ private void init(JobExecutionContext context) {
this.doInit(context);
}

protected abstract void doInit(JobExecutionContext context);

protected void sendAlert(ChangeEvent event) throws EventPublisherException {
/* This method needs to be over-ridden by specific Publisher for sending Alert */

protected void doInit(JobExecutionContext context) {
// To be implemented by the Subclass if needed
}

@Override
@@ -143,15 +141,15 @@ public void handleFailedEvent(EventPublisherException ex) {
}
}

private int loadInitialOffset(JobExecutionContext context) {
private long loadInitialOffset(JobExecutionContext context) {
EventSubscriptionOffset jobStoredOffset =
(EventSubscriptionOffset) jobDetail.getJobDataMap().get(ALERT_OFFSET_KEY);
// If the Job Data Map has the latest offset, use it
if (jobStoredOffset != null) {
return jobStoredOffset.getOffset();
} else {
EventSubscriptionOffset eventSubscriptionOffset =
getInitialAlertOffsetFromDb(eventSubscription.getId());
getStartingOffset(eventSubscription.getId());
// Update the Job Data Map with the latest offset
context.getJobDetail().getJobDataMap().put(ALERT_OFFSET_KEY, eventSubscriptionOffset);
return eventSubscriptionOffset.getOffset();
@@ -200,25 +198,22 @@ public void publishEvents(List<ChangeEvent> events) {
@Override
public void commit(JobExecutionContext jobExecutionContext) {
long currentTime = System.currentTimeMillis();
// Upsert Offset
EventSubscriptionOffset eventSubscriptionOffset =
new EventSubscriptionOffset().withOffset(offset).withTimestamp(currentTime);

// Upsert Offset to Database
Entity.getCollectionDAO()
.eventSubscriptionDAO()
.upsertSubscriberExtension(
eventSubscription.getId().toString(),
OFFSET_EXTENSION,
"eventSubscriptionOffset",
JsonUtils.pojoToJson(eventSubscriptionOffset));

// Update the Job Data Map with the latest offset
jobExecutionContext
mohityadav766 marked this conversation as resolved.
Show resolved Hide resolved
.getJobDetail()
.getJobDataMap()
.put(ALERT_OFFSET_KEY, eventSubscriptionOffset);

// Upsert Metrics to Database
// Upsert Metrics
AlertMetrics metrics =
new AlertMetrics()
.withTotalEvents(alertMetrics.getTotalEvents())
@@ -232,8 +227,6 @@ public void commit(JobExecutionContext jobExecutionContext) {
METRICS_EXTENSION,
"alertMetrics",
JsonUtils.pojoToJson(metrics));

// Update the Job Data Map with latest Metrics
jobExecutionContext.getJobDetail().getJobDataMap().put(METRICS_EXTENSION, alertMetrics);
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2021 Collate
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.openmetadata.service.apps.bundles.changeEvent;

import org.openmetadata.service.events.errors.EventPublisherException;

public interface Alert<T> {
void sendAlert(T event) throws EventPublisherException;
}
Original file line number Diff line number Diff line change
@@ -191,7 +191,7 @@ public EventSubscription getEventSubscriptionFromScheduledJob(UUID id) {
}

public boolean checkIfPublisherPublishedAllEvents(UUID subscriptionID) {
int countOfEvents = Entity.getCollectionDAO().changeEventDAO().listCount();
long countOfEvents = Entity.getCollectionDAO().changeEventDAO().getLatestOffset();
try {
JobDetail jobDetail =
alertsScheduler.getJobDetail(new JobKey(subscriptionID.toString(), ALERT_JOB_GROUP));
Original file line number Diff line number Diff line change
@@ -269,8 +269,8 @@ public static List<ChangeEvent> getFilteredEvent(
return filteredEvents;
}

public static EventSubscriptionOffset getInitialAlertOffsetFromDb(UUID eventSubscriptionId) {
int eventSubscriptionOffset;
public static EventSubscriptionOffset getStartingOffset(UUID eventSubscriptionId) {
long eventSubscriptionOffset;
String json =
mohityadav766 marked this conversation as resolved.
Show resolved Hide resolved
Entity.getCollectionDAO()
.eventSubscriptionDAO()
@@ -280,7 +280,7 @@ public static EventSubscriptionOffset getInitialAlertOffsetFromDb(UUID eventSubs
JsonUtils.readValue(json, EventSubscriptionOffset.class);
eventSubscriptionOffset = offsetFromDb.getOffset();
} else {
eventSubscriptionOffset = Entity.getCollectionDAO().changeEventDAO().listCount();
eventSubscriptionOffset = Entity.getCollectionDAO().changeEventDAO().getLatestOffset();
}
return new EventSubscriptionOffset().withOffset(eventSubscriptionOffset);
}
Original file line number Diff line number Diff line change
@@ -3197,7 +3197,7 @@ List<String> listWithoutEntityFilter(
List<String> list(@Bind("limit") long limit, @Bind("offset") long offset);

@SqlQuery("SELECT count(*) FROM change_event")
int listCount();
long getLatestOffset();
}

interface TypeEntityDAO extends EntityDAO<Type> {
Original file line number Diff line number Diff line change
@@ -8,7 +8,8 @@
"properties": {
"offset": {
"description": "Name of this Event Filter.",
"type": "integer"
"type": "integer",
"existingJavaType": "Long"
},
"timestamp": {
"description": "Update time of the job status.",

Unchanged files with check annotations Beta

// Ensure the call back notification has started
details = waitForFirstEvent(alert.getId(), webhookName, 25);
assertEquals(1, details.getEvents().size());

Check failure on line 105 in openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java

GitHub Actions / Test Report

EventSubscriptionResourceTest.post_alertActionWithEnabledStateChange(TestInfo)

Cannot invoke "org.openmetadata.service.resources.events.WebhookCallbackResource$EventDetails.getEvents()" because "details" is null
Raw output
java.lang.NullPointerException: Cannot invoke "org.openmetadata.service.resources.events.WebhookCallbackResource$EventDetails.getEvents()" because "details" is null
	at org.openmetadata.service.resources.events.EventSubscriptionResourceTest.post_alertActionWithEnabledStateChange(EventSubscriptionResourceTest.java:105)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:120)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
SubscriptionStatus successDetails =
getStatus(alert.getId(), Response.Status.OK.getStatusCode());
assertEquals(SubscriptionStatus.Status.ACTIVE, successDetails.getStatus());
genericWebhookActionRequest.withFilteringRules(rule2);
createdAlert =
updateAndCheckEntity(

Check failure on line 271 in openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java

GitHub Actions / Test Report

EventSubscriptionResourceTest.put_updateAlertUpdateFields(TestInfo)

status code: 400, reason phrase: Failed to evaluate - EL1004E: Method call: Method matchAnyEventType(java.lang.String,java.lang.String,java.lang.String) cannot be found
Raw output
org.apache.http.client.HttpResponseException: status code: 400, reason phrase: Failed to evaluate - EL1004E: Method call: Method matchAnyEventType(java.lang.String,java.lang.String,java.lang.String) cannot be found 
	at org.openmetadata.service.util.TestUtils.readResponseError(TestUtils.java:220)
	at org.openmetadata.service.util.TestUtils.readResponse(TestUtils.java:234)
	at org.openmetadata.service.util.TestUtils.put(TestUtils.java:335)
	at org.openmetadata.service.resources.EntityResourceTest.updateEntity(EntityResourceTest.java:2243)
	at org.openmetadata.service.resources.EntityResourceTest.updateAndCheckEntity(EntityResourceTest.java:2387)
	at org.openmetadata.service.resources.events.EventSubscriptionResourceTest.put_updateAlertUpdateFields(EventSubscriptionResourceTest.java:271)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:120)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
genericWebhookActionRequest,
Response.Status.OK,
ADMIN_AUTH_HEADERS,