From 8d22aade89973e43dfed96e936fab8f4608aa9cf Mon Sep 17 00:00:00 2001 From: Dhanendra Sahu <60607841+dhanendra06@users.noreply.github.com> Date: Thu, 2 Apr 2026 13:41:45 +0530 Subject: [PATCH 1/9] Fix the auditmanager for high load (#247) (#249) Signed-off-by: Dhanendra Sahu --- .../builder/AuditRequestBuilder.java | 5 +- .../kernel/auditmanager/entity/BaseAudit.java | 13 ++- .../auditmanager/impl/AuditHandlerImpl.java | 24 +--- .../auditmanager/queue/AuditBatchWriter.java | 110 ++++++++++++++++++ .../auditmanager/queue/AuditQueueService.java | 57 +++++++++ .../AuditManagerBootApplication.java | 2 + .../service/impl/AuditManagerServiceImpl.java | 4 +- 7 files changed, 192 insertions(+), 23 deletions(-) create mode 100644 kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java create mode 100644 kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java index e70d9290..024632b6 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java @@ -2,6 +2,8 @@ import java.time.LocalDateTime; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import io.mosip.kernel.auditmanager.request.AuditRequestDto; @@ -9,12 +11,13 @@ /** * The Audit request builder class is used to create new {@link AuditRequestDto} * with all required fields - * + * * @author Dharmesh Khandelwal * @since 1.0.0 * */ @Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) public class AuditRequestBuilder { /** diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java index e1e27460..97bb8131 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java @@ -8,6 +8,7 @@ import jakarta.persistence.MappedSuperclass; import lombok.AllArgsConstructor; import lombok.Data; +import org.springframework.data.domain.Persistable; /** * Base class for {@link Audit} with {@link #uuid} and {@link #createdAt} @@ -19,7 +20,7 @@ @Data @AllArgsConstructor @MappedSuperclass -public class BaseAudit { +public class BaseAudit implements Persistable { /** * Field for immutable universally unique identifier (UUID) @@ -39,4 +40,14 @@ public BaseAudit() { createdAt = LocalDateTime.now(); } + @Override + public String getId() { + return uuid; + } + + @Override + public boolean isNew() { + return true; + } + } diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java index 01a900e5..86f35fff 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java @@ -1,16 +1,13 @@ package io.mosip.kernel.auditmanager.impl; -import io.mosip.kernel.core.logger.spi.Logger; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import io.mosip.kernel.auditmanager.entity.Audit; -import io.mosip.kernel.auditmanager.repository.AuditRepository; +import io.mosip.kernel.auditmanager.queue.AuditQueueService; import io.mosip.kernel.auditmanager.request.AuditRequestDto; import io.mosip.kernel.auditmanager.util.AuditUtils; import io.mosip.kernel.core.auditmanager.spi.AuditHandler; -import org.springframework.transaction.annotation.Transactional; /** * Implementation of {@link AuditHandler} with function to write @@ -23,31 +20,20 @@ @Service public class AuditHandlerImpl implements AuditHandler { - /** - * Field for {@link AuditRepository} having data access operations related to - * audit - */ @Autowired - private AuditRepository auditRepository; + private AuditQueueService auditQueueService; /* * (non-Javadoc) - * + * * @see * io.mosip.kernel.core.audit.handler.AuditHandler#writeAudit(io.mosip.kernel. * core.audit.dto.AuditRequest) */ @Override - @Transactional public boolean addAudit(AuditRequestDto auditRequest) { - try { - AuditUtils.validateAuditRequestDto(auditRequest); - Audit event = getAuditEntity(auditRequest); - auditRepository.save(event); - return true; - } catch (DataAccessException ex) { - return false; - } + AuditUtils.validateAuditRequestDto(auditRequest); + return auditQueueService.enqueue(auditRequest); } diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java new file mode 100644 index 00000000..ec4f9962 --- /dev/null +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java @@ -0,0 +1,110 @@ +package io.mosip.kernel.auditmanager.queue; + +import io.mosip.kernel.auditmanager.entity.Audit; +import io.mosip.kernel.auditmanager.impl.AuditHandlerImpl; +import io.mosip.kernel.auditmanager.repository.AuditRepository; +import io.mosip.kernel.auditmanager.request.AuditRequestDto; +import jakarta.annotation.PreDestroy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DataAccessException; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Scheduled batch writer that drains the {@link AuditQueueService} and persists + * records in bulk using {@code saveAll()}, reducing DB round-trips under load. + * + *

Retry strategy: exponential back-off (1s, 2s, 4s) up to + * {@code mosip.kernel.auditmanager.batch.retry-attempts} times before giving up. + * + *

Graceful shutdown: {@link #flushOnShutdown()} drains remaining queue entries + * so no audit records are silently lost when the pod terminates. + * + * @since 1.3.0 + */ +@Component +public class AuditBatchWriter { + + private static final Logger log = LoggerFactory.getLogger(AuditBatchWriter.class); + + @Autowired + private AuditQueueService queueService; + + @Autowired + private AuditRepository auditRepository; + + @Autowired + private AuditHandlerImpl auditHandler; + + @Value("${mosip.kernel.auditmanager.batch.size:100}") + private int batchSize; + + @Value("${mosip.kernel.auditmanager.batch.retry-attempts:3}") + private int retryAttempts; + + /** + * Runs every {@code flush-interval-ms} milliseconds (default 100ms). + * Uses {@code fixedDelay} so the next run starts only after the current one + * finishes, preventing concurrent writes to the DB. + */ + @Scheduled(fixedDelayString = "${mosip.kernel.auditmanager.batch.flush-interval-ms:100}") + public void flushBatch() { + List batch = new ArrayList<>(batchSize); + int drained = queueService.drainTo(batch, batchSize); + if (drained == 0) { + return; + } + writeBatchWithRetry(batch); + } + + /** + * Called by the JVM shutdown hook (via Spring context close). + * Flushes whatever remains in the queue so in-flight audits are not lost. + */ + @PreDestroy + public void flushOnShutdown() { + log.info("Shutdown signal received — flushing remaining audit queue entries..."); + List remaining = new ArrayList<>(); + queueService.drainTo(remaining, Integer.MAX_VALUE); + if (!remaining.isEmpty()) { + log.info("Writing {} remaining audit records before shutdown", remaining.size()); + writeBatchWithRetry(remaining); + } + } + + private void writeBatchWithRetry(List batch) { + for (int attempt = 0; attempt < retryAttempts; attempt++) { + try { + List entities = batch.stream() + .map(auditHandler::getAuditEntity) + .collect(Collectors.toList()); + auditRepository.saveAll(entities); + log.debug("Persisted batch of {} audit records", entities.size()); + return; + } catch (DataAccessException ex) { + if (attempt < retryAttempts - 1) { + long backoffMs = (long) Math.pow(2, attempt) * 1000; + log.warn("Batch write failed (attempt {}/{}), retrying in {}ms: {}", + attempt + 1, retryAttempts, backoffMs, ex.getMessage()); + try { + Thread.sleep(backoffMs); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + log.error("Retry interrupted — {} audit records may be lost", batch.size()); + return; + } + } else { + log.error("Batch write failed after {} attempts — {} audit records lost", + retryAttempts, batch.size(), ex); + } + } + } + } +} diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java new file mode 100644 index 00000000..1c6f0c4b --- /dev/null +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java @@ -0,0 +1,57 @@ +package io.mosip.kernel.auditmanager.queue; + +import io.mosip.kernel.auditmanager.request.AuditRequestDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * Thread-safe in-memory queue that decouples HTTP request threads from DB writes. + * Producers call {@link #enqueue} and return immediately; a background batch + * writer drains this queue on a fixed schedule. + * + * @since 1.3.0 + */ +@Component +public class AuditQueueService { + + private static final Logger log = LoggerFactory.getLogger(AuditQueueService.class); + + private final LinkedBlockingQueue queue; + private final int capacity; + + public AuditQueueService( + @Value("${mosip.kernel.auditmanager.queue.capacity:50000}") int capacity) { + this.capacity = capacity; + this.queue = new LinkedBlockingQueue<>(capacity); + } + + /** + * Non-blocking enqueue. Returns {@code false} and logs a warning if the queue + * is full, allowing callers to degrade gracefully instead of blocking. + */ + public boolean enqueue(AuditRequestDto auditRequest) { + boolean accepted = queue.offer(auditRequest); + if (!accepted) { + log.warn("Audit queue is full (capacity={}). Dropping audit event: eventId={}", + capacity, auditRequest.getEventId()); + } + return accepted; + } + + /** + * Drains up to {@code maxElements} entries into the provided list. + * Thread-safe; safe to call from a single scheduler thread. + */ + public int drainTo(List target, int maxElements) { + return queue.drainTo(target, maxElements); + } + + public int size() { + return queue.size(); + } +} diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java index e771319e..bf298063 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java @@ -2,6 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; /** * Audit manager application @@ -12,6 +13,7 @@ */ @SpringBootApplication(scanBasePackages = { "io.mosip.kernel.auditmanager.*","${mosip.auth.adapter.impl.basepackage}" ,"io.mosip.kernel.core.logger.config"}) +@EnableScheduling public class AuditManagerBootApplication { /** diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java index 5cce13e1..bcd4a12f 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java @@ -35,8 +35,8 @@ public class AuditManagerServiceImpl implements AuditManagerService { @Override public AuditResponseDto addAudit(AuditRequestDto auditRequestDto) { AuditResponseDto auditResponseDto = new AuditResponseDto(); - auditHandler.addAudit(auditRequestDto); - auditResponseDto.setStatus(true); + boolean status = auditHandler.addAudit(auditRequestDto); + auditResponseDto.setStatus(status); return auditResponseDto; } From 640513971550b9e513f7d24aa965c754357ac57d Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Sat, 4 Apr 2026 15:49:57 +0530 Subject: [PATCH 2/9] Perform optimization for JVM argument [MOSIP-44752] (#250) * Perform optimization for JVM arguments ID-Repo [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> * Updated commons versions in pom Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --------- Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- deploy/install.sh | 2 +- helm/auditmanager/Chart.yaml | 2 +- helm/auditmanager/values.yaml | 21 ++++++++++++++----- kernel/kernel-auditmanager-api/pom.xml | 4 ++-- kernel/kernel-auditmanager-service/Dockerfile | 4 +--- .../configure_start.sh | 12 +++++++++++ kernel/kernel-auditmanager-service/pom.xml | 12 +++++------ kernel/pom.xml | 2 +- 8 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 kernel/kernel-auditmanager-service/configure_start.sh diff --git a/deploy/install.sh b/deploy/install.sh index 9bf61305..55f06f4d 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -7,7 +7,7 @@ if [ $# -ge 1 ] ; then fi NS=kernel -CHART_VERSION=1.3.0 +CHART_VERSION=1.3.1-develop echo Create $NS namespace kubectl create ns $NS diff --git a/helm/auditmanager/Chart.yaml b/helm/auditmanager/Chart.yaml index 9180ecb2..1f9afdd7 100644 --- a/helm/auditmanager/Chart.yaml +++ b/helm/auditmanager/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: auditmanager description: A Helm chart for MOSIP Auditmanager module type: application -version: 1.3.0 +version: 1.3.1-develop appVersion: "" dependencies: - name: common diff --git a/helm/auditmanager/values.yaml b/helm/auditmanager/values.yaml index 5f7f16c9..0a0247c5 100644 --- a/helm/auditmanager/values.yaml +++ b/helm/auditmanager/values.yaml @@ -46,8 +46,8 @@ service: externalTrafficPolicy: Cluster image: registry: docker.io - repository: mosipid/kernel-auditmanager-service - tag: 1.3.0 + repository: mosipqa/kernel-auditmanager-service + tag: 1.3.x ## Specify a imagePullPolicy ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images @@ -116,12 +116,23 @@ resources: cpu: 2000m memory: 5000Mi requests: - cpu: 1000m - memory: 3000Mi + cpu: 2000m + memory: 5000Mi additionalResources: ## Specify any JAVA_OPTS string here. These typically will be specified in conjunction with above resources ## Example: java_opts: "-Xms500M -Xmx500M" - javaOpts: "-Xms2250M -Xmx3750M" + javaOpts: >- + -XX:+UseZGC -XX:+ZGenerational -XX:+ZProactive + -XX:ZCollectionInterval=3 -XX:+ZUncommit -XX:ZUncommitDelay=60 + -XX:ConcGCThreads=2 -Xms3000m -Xmx3000m + -XX:SoftMaxHeapSize=2500m -XX:+AlwaysPreTouch + -XX:ActiveProcessorCount=2 -XX:+UseContainerSupport + -XX:MaxMetaspaceSize=400m -XX:MetaspaceSize=100m + -XX:ReservedCodeCacheSize=150m -XX:InitialCodeCacheSize=37m + -XX:+UseCodeCacheFlushing -XX:+TieredCompilation + -XX:TieredStopAtLevel=4 -XX:SoftRefLRUPolicyMSPerMB=50 + -XX:+DisableExplicitGC -XX:+ExitOnOutOfMemoryError + -Djava.security.egd=file:/dev/./urandom ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container ## Clamav container already runs as 'mosip' user, so we may not need to enable this containerSecurityContext: diff --git a/kernel/kernel-auditmanager-api/pom.xml b/kernel/kernel-auditmanager-api/pom.xml index c8729037..666eba99 100644 --- a/kernel/kernel-auditmanager-api/pom.xml +++ b/kernel/kernel-auditmanager-api/pom.xml @@ -7,7 +7,7 @@ io.mosip.kernel kernel-auditmanager-api - 1.3.0 + 1.3.1-SNAPSHOT UTF-8 @@ -22,7 +22,7 @@ 2.3 0.7.0 - 1.3.0 + 1.3.1-SNAPSHOT 0.8.11 **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,"**/proxy/**","**/AuditManagerBootApplication.java diff --git a/kernel/kernel-auditmanager-service/Dockerfile b/kernel/kernel-auditmanager-service/Dockerfile index 1fbf9b2b..bda47891 100644 --- a/kernel/kernel-auditmanager-service/Dockerfile +++ b/kernel/kernel-auditmanager-service/Dockerfile @@ -80,6 +80,4 @@ USER ${container_user_uid}:${container_user_gid} EXPOSE 8081 # the command to run when the container starts -CMD wget -q --show-progress "${iam_adapter_url_env}" -O "${loader_path_env}"/kernel-auth-adapter.jar; \ - java -XX:+ExplicitGCInvokesConcurrent -XX:+UseZGC -XX:+ZGenerational -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseCompressedOops \ - -Dloader.path="${loader_path_env}" -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" -jar kernel-auditmanager-service.jar ; \ +CMD java -Dloader.path="${loader_path_env}" -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" -jar kernel-auditmanager-service.jar ; \ diff --git a/kernel/kernel-auditmanager-service/configure_start.sh b/kernel/kernel-auditmanager-service/configure_start.sh new file mode 100644 index 00000000..240963a8 --- /dev/null +++ b/kernel/kernel-auditmanager-service/configure_start.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +#installs the pre-requisites. +set -e + +echo "Downloading pre-requisites install scripts" + +wget -q --show-progress "${iam_adapter_url_env}" -O "${loader_path_env}"/kernel-auth-adapter.jar; \ + +echo "Installating pre-requisites completed." + +exec "$@" \ No newline at end of file diff --git a/kernel/kernel-auditmanager-service/pom.xml b/kernel/kernel-auditmanager-service/pom.xml index 31c71469..878b0fa1 100644 --- a/kernel/kernel-auditmanager-service/pom.xml +++ b/kernel/kernel-auditmanager-service/pom.xml @@ -5,7 +5,7 @@ io.mosip.kernel kernel-auditmanager-service - 1.3.0 + 1.3.1-SNAPSHOT UTF-8 @@ -21,12 +21,12 @@ 0.7.0 - 1.3.0 - 1.3.0 - 1.3.0 - 1.3.0 + 1.3.1-SNAPSHOT + 1.3.1-SNAPSHOT + 1.3.1-SNAPSHOT + 1.3.1-SNAPSHOT 1.3.0 - 1.3.0 + 1.3.1-SNAPSHOT **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,"**/proxy/**","**/AuditManagerBootApplication.java" **/dto/**,**/entity/**,**/config/** diff --git a/kernel/pom.xml b/kernel/pom.xml index 89de5ab0..41aadcba 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - 1.3.0 + 1.3.1-SNAPSHOT io.mosip.kernel audit-manager pom From 094b38d00c977fa88c59ff7288ed8e8b73e1f83e Mon Sep 17 00:00:00 2001 From: kameshsr <47484458+kameshsr@users.noreply.github.com> Date: Sat, 4 Apr 2026 17:27:02 +0530 Subject: [PATCH 3/9] MOSIP-44821 Modify Java options for heap size and GC threads (#252) Updated Java options for memory settings in values.yaml. Signed-off-by: kameshsr <47484458+kameshsr@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- helm/auditmanager/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/auditmanager/values.yaml b/helm/auditmanager/values.yaml index 0a0247c5..a8556497 100644 --- a/helm/auditmanager/values.yaml +++ b/helm/auditmanager/values.yaml @@ -124,8 +124,8 @@ additionalResources: javaOpts: >- -XX:+UseZGC -XX:+ZGenerational -XX:+ZProactive -XX:ZCollectionInterval=3 -XX:+ZUncommit -XX:ZUncommitDelay=60 - -XX:ConcGCThreads=2 -Xms3000m -Xmx3000m - -XX:SoftMaxHeapSize=2500m -XX:+AlwaysPreTouch + -XX:ConcGCThreads=2 -Xms3250m -Xmx3250m + -XX:SoftMaxHeapSize=2950m -XX:+AlwaysPreTouch -XX:ActiveProcessorCount=2 -XX:+UseContainerSupport -XX:MaxMetaspaceSize=400m -XX:MetaspaceSize=100m -XX:ReservedCodeCacheSize=150m -XX:InitialCodeCacheSize=37m From 6672a920b1756c4c1217bef87e8940cfc38734f3 Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 6 Apr 2026 12:22:59 +0530 Subject: [PATCH 4/9] Docker configure_start.sh correction [MOSIP-44752] (#253) Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- kernel/kernel-auditmanager-service/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/kernel-auditmanager-service/Dockerfile b/kernel/kernel-auditmanager-service/Dockerfile index bda47891..77c0bae9 100644 --- a/kernel/kernel-auditmanager-service/Dockerfile +++ b/kernel/kernel-auditmanager-service/Dockerfile @@ -73,11 +73,15 @@ COPY ./target/kernel-auditmanager-service-*.jar /home/${container_user}/kernel-a # set working directory for the user WORKDIR /home/${container_user} +ADD configure_start.sh configure_start.sh + # select container user for all tasks USER ${container_user_uid}:${container_user_gid} # can expose required port EXPOSE 8081 +ENTRYPOINT [ "./configure_start.sh" ] + # the command to run when the container starts CMD java -Dloader.path="${loader_path_env}" -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" -jar kernel-auditmanager-service.jar ; \ From 9ca2b0259022c33265b205141468b2d9485cacd0 Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:45:26 +0530 Subject: [PATCH 5/9] Docker configure_start.sh correction [MOSIP-44752] (#254) * Docker configure_start.sh correction [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> * Docker configure_start.sh correction [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --------- Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- kernel/kernel-auditmanager-service/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel/kernel-auditmanager-service/Dockerfile b/kernel/kernel-auditmanager-service/Dockerfile index 77c0bae9..84733517 100644 --- a/kernel/kernel-auditmanager-service/Dockerfile +++ b/kernel/kernel-auditmanager-service/Dockerfile @@ -73,7 +73,12 @@ COPY ./target/kernel-auditmanager-service-*.jar /home/${container_user}/kernel-a # set working directory for the user WORKDIR /home/${container_user} -ADD configure_start.sh configure_start.sh +COPY configure_start.sh ${work_dir}/configure_start.sh + +# change permissions of file inside working dir +RUN sed -i 's/\r$//' ${work_dir}/configure_start.sh \ + && chmod +x ${work_dir}/configure_start.sh \ + && chown -R ${container_user}:${container_user} ${work_dir} # select container user for all tasks USER ${container_user_uid}:${container_user_gid} @@ -81,7 +86,7 @@ USER ${container_user_uid}:${container_user_gid} # can expose required port EXPOSE 8081 -ENTRYPOINT [ "./configure_start.sh" ] +ENTRYPOINT ["sh", "configure_start.sh"] # the command to run when the container starts CMD java -Dloader.path="${loader_path_env}" -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" -jar kernel-auditmanager-service.jar ; \ From 2e882d9ac4c22ac49af1ca3bc782400c9169aaf4 Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:55:29 +0530 Subject: [PATCH 6/9] Perform optimization for JVM argument [MOSIP-44752] (#255) Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- helm/auditmanager/values.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helm/auditmanager/values.yaml b/helm/auditmanager/values.yaml index a8556497..2665f204 100644 --- a/helm/auditmanager/values.yaml +++ b/helm/auditmanager/values.yaml @@ -116,15 +116,15 @@ resources: cpu: 2000m memory: 5000Mi requests: - cpu: 2000m - memory: 5000Mi + cpu: 1000m + memory: 2500Mi additionalResources: ## Specify any JAVA_OPTS string here. These typically will be specified in conjunction with above resources ## Example: java_opts: "-Xms500M -Xmx500M" javaOpts: >- -XX:+UseZGC -XX:+ZGenerational -XX:+ZProactive -XX:ZCollectionInterval=3 -XX:+ZUncommit -XX:ZUncommitDelay=60 - -XX:ConcGCThreads=2 -Xms3250m -Xmx3250m + -XX:ConcGCThreads=2 -Xms1900m -Xmx3250m -XX:SoftMaxHeapSize=2950m -XX:+AlwaysPreTouch -XX:ActiveProcessorCount=2 -XX:+UseContainerSupport -XX:MaxMetaspaceSize=400m -XX:MetaspaceSize=100m From 0fa63a78c77558f14dd029f1cbf768342a3f7092 Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:03:56 +0530 Subject: [PATCH 7/9] Perform optimization for JVM argument [MOSIP-44752] (#256) * Perform optimization for JVM argument [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> * Perform optimization for JVM argument [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --------- Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- helm/auditmanager/values.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/helm/auditmanager/values.yaml b/helm/auditmanager/values.yaml index 2665f204..d58cb5f0 100644 --- a/helm/auditmanager/values.yaml +++ b/helm/auditmanager/values.yaml @@ -124,11 +124,10 @@ additionalResources: javaOpts: >- -XX:+UseZGC -XX:+ZGenerational -XX:+ZProactive -XX:ZCollectionInterval=3 -XX:+ZUncommit -XX:ZUncommitDelay=60 - -XX:ConcGCThreads=2 -Xms1900m -Xmx3250m - -XX:SoftMaxHeapSize=2950m -XX:+AlwaysPreTouch + -XX:ConcGCThreads=2 -Xms3200m -Xmx3200m + -XX:SoftMaxHeapSize=2600m -XX:+AlwaysPreTouch -XX:ActiveProcessorCount=2 -XX:+UseContainerSupport - -XX:MaxMetaspaceSize=400m -XX:MetaspaceSize=100m - -XX:ReservedCodeCacheSize=150m -XX:InitialCodeCacheSize=37m + -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=192m -XX:+UseCodeCacheFlushing -XX:+TieredCompilation -XX:TieredStopAtLevel=4 -XX:SoftRefLRUPolicyMSPerMB=50 -XX:+DisableExplicitGC -XX:+ExitOnOutOfMemoryError From ab10640abcd5b653ea4dd5ace28867117f6469e2 Mon Sep 17 00:00:00 2001 From: Gokulraj C <110164849+GOKULRAJ136@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:42:45 +0530 Subject: [PATCH 8/9] Corrected Xms value [MOSIP-44752] (#257) * Perform optimization for JVM argument [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> * Perform optimization for JVM argument [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> * Corrected Xms value [MOSIP-44752] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --------- Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Signed-off-by: Dhanendra Sahu --- helm/auditmanager/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/auditmanager/values.yaml b/helm/auditmanager/values.yaml index d58cb5f0..f125d5dc 100644 --- a/helm/auditmanager/values.yaml +++ b/helm/auditmanager/values.yaml @@ -124,7 +124,7 @@ additionalResources: javaOpts: >- -XX:+UseZGC -XX:+ZGenerational -XX:+ZProactive -XX:ZCollectionInterval=3 -XX:+ZUncommit -XX:ZUncommitDelay=60 - -XX:ConcGCThreads=2 -Xms3200m -Xmx3200m + -XX:ConcGCThreads=2 -Xms1875m -Xmx3200m -XX:SoftMaxHeapSize=2600m -XX:+AlwaysPreTouch -XX:ActiveProcessorCount=2 -XX:+UseContainerSupport -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=192m From e3543f3e73c93bdc2c306d47ae2e7572a4d45ec9 Mon Sep 17 00:00:00 2001 From: Dhanendra Sahu <60607841+dhanendra06@users.noreply.github.com> Date: Tue, 12 May 2026 12:26:25 +0530 Subject: [PATCH 9/9] Revert "Fix the auditmanager for high load (#247) (#249)" This reverts commit 223f0d1eb437a3db23c3c31006c0662adab5dfba. Signed-off-by: Dhanendra Sahu --- .../builder/AuditRequestBuilder.java | 5 +- .../kernel/auditmanager/entity/BaseAudit.java | 13 +-- .../auditmanager/impl/AuditHandlerImpl.java | 24 +++- .../auditmanager/queue/AuditBatchWriter.java | 110 ------------------ .../auditmanager/queue/AuditQueueService.java | 57 --------- .../AuditManagerBootApplication.java | 2 - .../service/impl/AuditManagerServiceImpl.java | 4 +- 7 files changed, 23 insertions(+), 192 deletions(-) delete mode 100644 kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java delete mode 100644 kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java index 024632b6..e70d9290 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/builder/AuditRequestBuilder.java @@ -2,8 +2,6 @@ import java.time.LocalDateTime; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import io.mosip.kernel.auditmanager.request.AuditRequestDto; @@ -11,13 +9,12 @@ /** * The Audit request builder class is used to create new {@link AuditRequestDto} * with all required fields - * + * * @author Dharmesh Khandelwal * @since 1.0.0 * */ @Service -@Scope(BeanDefinition.SCOPE_PROTOTYPE) public class AuditRequestBuilder { /** diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java index 97bb8131..e1e27460 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/entity/BaseAudit.java @@ -8,7 +8,6 @@ import jakarta.persistence.MappedSuperclass; import lombok.AllArgsConstructor; import lombok.Data; -import org.springframework.data.domain.Persistable; /** * Base class for {@link Audit} with {@link #uuid} and {@link #createdAt} @@ -20,7 +19,7 @@ @Data @AllArgsConstructor @MappedSuperclass -public class BaseAudit implements Persistable { +public class BaseAudit { /** * Field for immutable universally unique identifier (UUID) @@ -40,14 +39,4 @@ public BaseAudit() { createdAt = LocalDateTime.now(); } - @Override - public String getId() { - return uuid; - } - - @Override - public boolean isNew() { - return true; - } - } diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java index 86f35fff..01a900e5 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/impl/AuditHandlerImpl.java @@ -1,13 +1,16 @@ package io.mosip.kernel.auditmanager.impl; +import io.mosip.kernel.core.logger.spi.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import io.mosip.kernel.auditmanager.entity.Audit; -import io.mosip.kernel.auditmanager.queue.AuditQueueService; +import io.mosip.kernel.auditmanager.repository.AuditRepository; import io.mosip.kernel.auditmanager.request.AuditRequestDto; import io.mosip.kernel.auditmanager.util.AuditUtils; import io.mosip.kernel.core.auditmanager.spi.AuditHandler; +import org.springframework.transaction.annotation.Transactional; /** * Implementation of {@link AuditHandler} with function to write @@ -20,20 +23,31 @@ @Service public class AuditHandlerImpl implements AuditHandler { + /** + * Field for {@link AuditRepository} having data access operations related to + * audit + */ @Autowired - private AuditQueueService auditQueueService; + private AuditRepository auditRepository; /* * (non-Javadoc) - * + * * @see * io.mosip.kernel.core.audit.handler.AuditHandler#writeAudit(io.mosip.kernel. * core.audit.dto.AuditRequest) */ @Override + @Transactional public boolean addAudit(AuditRequestDto auditRequest) { - AuditUtils.validateAuditRequestDto(auditRequest); - return auditQueueService.enqueue(auditRequest); + try { + AuditUtils.validateAuditRequestDto(auditRequest); + Audit event = getAuditEntity(auditRequest); + auditRepository.save(event); + return true; + } catch (DataAccessException ex) { + return false; + } } diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java deleted file mode 100644 index ec4f9962..00000000 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditBatchWriter.java +++ /dev/null @@ -1,110 +0,0 @@ -package io.mosip.kernel.auditmanager.queue; - -import io.mosip.kernel.auditmanager.entity.Audit; -import io.mosip.kernel.auditmanager.impl.AuditHandlerImpl; -import io.mosip.kernel.auditmanager.repository.AuditRepository; -import io.mosip.kernel.auditmanager.request.AuditRequestDto; -import jakarta.annotation.PreDestroy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.dao.DataAccessException; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Scheduled batch writer that drains the {@link AuditQueueService} and persists - * records in bulk using {@code saveAll()}, reducing DB round-trips under load. - * - *

Retry strategy: exponential back-off (1s, 2s, 4s) up to - * {@code mosip.kernel.auditmanager.batch.retry-attempts} times before giving up. - * - *

Graceful shutdown: {@link #flushOnShutdown()} drains remaining queue entries - * so no audit records are silently lost when the pod terminates. - * - * @since 1.3.0 - */ -@Component -public class AuditBatchWriter { - - private static final Logger log = LoggerFactory.getLogger(AuditBatchWriter.class); - - @Autowired - private AuditQueueService queueService; - - @Autowired - private AuditRepository auditRepository; - - @Autowired - private AuditHandlerImpl auditHandler; - - @Value("${mosip.kernel.auditmanager.batch.size:100}") - private int batchSize; - - @Value("${mosip.kernel.auditmanager.batch.retry-attempts:3}") - private int retryAttempts; - - /** - * Runs every {@code flush-interval-ms} milliseconds (default 100ms). - * Uses {@code fixedDelay} so the next run starts only after the current one - * finishes, preventing concurrent writes to the DB. - */ - @Scheduled(fixedDelayString = "${mosip.kernel.auditmanager.batch.flush-interval-ms:100}") - public void flushBatch() { - List batch = new ArrayList<>(batchSize); - int drained = queueService.drainTo(batch, batchSize); - if (drained == 0) { - return; - } - writeBatchWithRetry(batch); - } - - /** - * Called by the JVM shutdown hook (via Spring context close). - * Flushes whatever remains in the queue so in-flight audits are not lost. - */ - @PreDestroy - public void flushOnShutdown() { - log.info("Shutdown signal received — flushing remaining audit queue entries..."); - List remaining = new ArrayList<>(); - queueService.drainTo(remaining, Integer.MAX_VALUE); - if (!remaining.isEmpty()) { - log.info("Writing {} remaining audit records before shutdown", remaining.size()); - writeBatchWithRetry(remaining); - } - } - - private void writeBatchWithRetry(List batch) { - for (int attempt = 0; attempt < retryAttempts; attempt++) { - try { - List entities = batch.stream() - .map(auditHandler::getAuditEntity) - .collect(Collectors.toList()); - auditRepository.saveAll(entities); - log.debug("Persisted batch of {} audit records", entities.size()); - return; - } catch (DataAccessException ex) { - if (attempt < retryAttempts - 1) { - long backoffMs = (long) Math.pow(2, attempt) * 1000; - log.warn("Batch write failed (attempt {}/{}), retrying in {}ms: {}", - attempt + 1, retryAttempts, backoffMs, ex.getMessage()); - try { - Thread.sleep(backoffMs); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - log.error("Retry interrupted — {} audit records may be lost", batch.size()); - return; - } - } else { - log.error("Batch write failed after {} attempts — {} audit records lost", - retryAttempts, batch.size(), ex); - } - } - } - } -} diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java deleted file mode 100644 index 1c6f0c4b..00000000 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/queue/AuditQueueService.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.mosip.kernel.auditmanager.queue; - -import io.mosip.kernel.auditmanager.request.AuditRequestDto; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; - -/** - * Thread-safe in-memory queue that decouples HTTP request threads from DB writes. - * Producers call {@link #enqueue} and return immediately; a background batch - * writer drains this queue on a fixed schedule. - * - * @since 1.3.0 - */ -@Component -public class AuditQueueService { - - private static final Logger log = LoggerFactory.getLogger(AuditQueueService.class); - - private final LinkedBlockingQueue queue; - private final int capacity; - - public AuditQueueService( - @Value("${mosip.kernel.auditmanager.queue.capacity:50000}") int capacity) { - this.capacity = capacity; - this.queue = new LinkedBlockingQueue<>(capacity); - } - - /** - * Non-blocking enqueue. Returns {@code false} and logs a warning if the queue - * is full, allowing callers to degrade gracefully instead of blocking. - */ - public boolean enqueue(AuditRequestDto auditRequest) { - boolean accepted = queue.offer(auditRequest); - if (!accepted) { - log.warn("Audit queue is full (capacity={}). Dropping audit event: eventId={}", - capacity, auditRequest.getEventId()); - } - return accepted; - } - - /** - * Drains up to {@code maxElements} entries into the provided list. - * Thread-safe; safe to call from a single scheduler thread. - */ - public int drainTo(List target, int maxElements) { - return queue.drainTo(target, maxElements); - } - - public int size() { - return queue.size(); - } -} diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java index bf298063..e771319e 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java @@ -2,7 +2,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.annotation.EnableScheduling; /** * Audit manager application @@ -13,7 +12,6 @@ */ @SpringBootApplication(scanBasePackages = { "io.mosip.kernel.auditmanager.*","${mosip.auth.adapter.impl.basepackage}" ,"io.mosip.kernel.core.logger.config"}) -@EnableScheduling public class AuditManagerBootApplication { /** diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java index bcd4a12f..5cce13e1 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/service/impl/AuditManagerServiceImpl.java @@ -35,8 +35,8 @@ public class AuditManagerServiceImpl implements AuditManagerService { @Override public AuditResponseDto addAudit(AuditRequestDto auditRequestDto) { AuditResponseDto auditResponseDto = new AuditResponseDto(); - boolean status = auditHandler.addAudit(auditRequestDto); - auditResponseDto.setStatus(status); + auditHandler.addAudit(auditRequestDto); + auditResponseDto.setStatus(true); return auditResponseDto; }