Skip to content

Commit 1ec21f0

Browse files
committed
[#13248] Add new cleanup job for Application and AgentId table
1 parent c8c5d46 commit 1ec21f0

File tree

12 files changed

+675
-11
lines changed

12 files changed

+675
-11
lines changed

batch/src/main/java/com/navercorp/pinpoint/batch/BatchModule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.navercorp.pinpoint.batch.common.StartupJobLauncher;
2323
import com.navercorp.pinpoint.batch.config.AgentCountJobConfig;
2424
import com.navercorp.pinpoint.batch.config.AgentCountJobXmlConfig;
25+
import com.navercorp.pinpoint.batch.config.CleanupAgentAndApplicationJobConfig;
2526
import com.navercorp.pinpoint.batch.config.BatchJavaConfigModule;
2627
import com.navercorp.pinpoint.batch.config.CleanupInactiveApplicationsJobConfig;
2728
import com.navercorp.pinpoint.common.server.config.CommonCacheManagerConfiguration;
@@ -64,6 +65,7 @@
6465
AgentCountJobXmlConfig.class,
6566
AgentCountJobConfig.class,
6667
CleanupInactiveApplicationsJobConfig.class,
68+
CleanupAgentAndApplicationJobConfig.class,
6769

6870
WebServiceConfig.CommonConfig.class,
6971
TraceConfiguration.TraceServiceConfiguration.class,

batch/src/main/java/com/navercorp/pinpoint/batch/common/BatchJobLauncher.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.navercorp.pinpoint.batch.common;
1818

19+
import com.navercorp.pinpoint.batch.config.CleanupAgentAndApplicationJobConfig;
20+
import com.navercorp.pinpoint.batch.util.JobParametersUtils;
1921
import org.apache.logging.log4j.LogManager;
2022
import org.apache.logging.log4j.Logger;
2123
import org.springframework.batch.core.JobParameters;
@@ -24,7 +26,6 @@
2426
import org.springframework.batch.core.launch.JobLauncher;
2527
import org.springframework.beans.factory.annotation.Qualifier;
2628

27-
import java.util.Date;
2829
import java.util.Objects;
2930

3031
/**
@@ -63,10 +64,7 @@ public void uriStatAlarmJob() {
6364
}
6465

6566
public static JobParameters createTimeParameter() {
66-
JobParametersBuilder builder = new JobParametersBuilder();
67-
Date now = new Date();
68-
builder.addDate("schedule.date", now);
69-
return builder.toJobParameters();
67+
return JobParametersUtils.newJobParametersBuilder().toJobParameters();
7068
}
7169

7270
public void agentCountJob() {
@@ -85,4 +83,18 @@ public void cleanupInactiveApplicationsJob() {
8583
}
8684
}
8785

86+
public void cleanAgentAndApplicationJob() {
87+
if (batchProperties.isCleanupAgentAndApplicationJobEnable()) {
88+
run(CleanupAgentAndApplicationJobConfig.JOB_NAME, createTimeParameter(batchProperties.isCleanupAgentAndApplicationJobDryRun()));
89+
} else {
90+
logger.debug("Skip {}, because 'agentIdCleanJobEnable' is disabled.", CleanupAgentAndApplicationJobConfig.JOB_NAME);
91+
}
92+
}
93+
94+
public static JobParameters createTimeParameter(boolean dryRun) {
95+
JobParametersBuilder builder = JobParametersUtils.newJobParametersBuilder();
96+
builder.addString("dryRun", String.valueOf(dryRun));
97+
return builder.toJobParameters();
98+
}
99+
88100
}

batch/src/main/java/com/navercorp/pinpoint/batch/common/BatchProperties.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323
import org.springframework.beans.factory.annotation.Value;
2424
import org.springframework.stereotype.Component;
2525

26-
import java.util.Arrays;
27-
import java.util.List;
28-
2926
/**
3027
* @author minwoo.jung<minwoo.jung@navercorp.com>
3128
*/
@@ -73,6 +70,21 @@ public class BatchProperties {
7370
@Value("${job.cleanup.inactive.applications.cron}")
7471
private String cleanupInactiveApplicationsJobCron;
7572

73+
@Value("${job.cleanup.inactive.agent-application.enable:false}")
74+
private boolean cleanupAgentAndApplicationJobEnable;
75+
76+
@Value("${job.cleanup.inactive.agent-application.cron:0 0 4 * * THU}")
77+
private String cleanupAgentAndApplicationJobCron;
78+
79+
@Value("${job.cleanup.inactive.agent-application.dry-run:true}")
80+
private boolean cleanupAgentAndApplicationJobDryRun;
81+
82+
@Value("${job.cleanup.inactive.agent.threshold-days:30}")
83+
private int cleanupAgentInactiveThresholdDays;
84+
85+
@Value("${job.cleanup.inactive.agent.grace-days:7}")
86+
private int cleanupAgentAndApplicationGraceDays;
87+
7688
private static final int MINIMUM_CLEANUP_INACTIVE_AGENTS_DURATION_DAYS = 7;
7789

7890
@PostConstruct
@@ -138,6 +150,22 @@ public String getCleanupInactiveApplicationsJobCron() {
138150
return cleanupInactiveApplicationsJobCron;
139151
}
140152

153+
public boolean isCleanupAgentAndApplicationJobEnable() {
154+
return cleanupAgentAndApplicationJobEnable;
155+
}
156+
157+
public String getCleanupAgentAndApplicationJobCron() {
158+
return cleanupAgentAndApplicationJobCron;
159+
}
160+
161+
public int getCleanupAgentInactiveThresholdDays() {
162+
return cleanupAgentInactiveThresholdDays;
163+
}
164+
165+
public boolean isCleanupAgentAndApplicationJobDryRun() {
166+
return cleanupAgentAndApplicationJobDryRun;
167+
}
168+
141169
public int getAgentInspectorStatTableCount() {
142170
return alarmAgentInspectorStatTableCount;
143171
}
@@ -168,4 +196,8 @@ public String toString() {
168196
", cleanupInactiveApplicationsJobCron='" + cleanupInactiveApplicationsJobCron + '\'' +
169197
'}';
170198
}
199+
200+
public int getCleanupAgentAndApplicationGraceDays() {
201+
return cleanupAgentAndApplicationGraceDays;
202+
}
171203
}

batch/src/main/java/com/navercorp/pinpoint/batch/config/BatchScheduleConfig.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
6969
}
7070
);
7171

72+
taskRegistrar.addTriggerTask(
73+
batchJobLauncher::cleanAgentAndApplicationJob,
74+
triggerContext -> {
75+
String cron = batchProperties.getCleanupAgentAndApplicationJobCron();
76+
return new CronTrigger(cron).nextExecution(triggerContext);
77+
}
78+
);
79+
7280
taskRegistrar.addTriggerTask(
7381
batchJobLauncher::uriStatAlarmJob,
7482
triggerContext -> {
@@ -81,7 +89,7 @@ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
8189
@Bean
8290
public TaskScheduler taskScheduler() {
8391
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
84-
scheduler.setPoolSize(4);
92+
scheduler.setPoolSize(5);
8593
scheduler.setThreadNamePrefix("batch-scheduler-");
8694
scheduler.initialize();
8795
return scheduler;
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
* Copyright 2026 NAVER Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.navercorp.pinpoint.batch.config;
18+
19+
import com.navercorp.pinpoint.batch.common.BatchProperties;
20+
import com.navercorp.pinpoint.batch.job.AgentIdCleanupTasklet;
21+
import com.navercorp.pinpoint.batch.job.ApplicationCleanupTasklet;
22+
import com.navercorp.pinpoint.web.applicationmap.dao.MapAgentResponseDao;
23+
import com.navercorp.pinpoint.web.dao.AgentIdDao;
24+
import com.navercorp.pinpoint.web.dao.ApplicationDao;
25+
import org.springframework.batch.core.Job;
26+
import org.springframework.batch.core.Step;
27+
import org.springframework.batch.core.StepExecutionListener;
28+
import org.springframework.batch.core.configuration.annotation.StepScope;
29+
import org.springframework.batch.core.job.builder.JobBuilder;
30+
import org.springframework.batch.core.repository.JobRepository;
31+
import org.springframework.batch.core.step.builder.StepBuilder;
32+
import org.springframework.batch.core.step.builder.TaskletStepBuilder;
33+
import org.springframework.beans.factory.annotation.Qualifier;
34+
import org.springframework.beans.factory.annotation.Value;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.transaction.PlatformTransactionManager;
38+
39+
import java.util.List;
40+
import java.util.Objects;
41+
import java.util.Optional;
42+
import java.util.Set;
43+
44+
@Configuration(proxyBeanMethods = false)
45+
public class CleanupAgentAndApplicationJobConfig {
46+
public static final String JOB_NAME = "cleanupAgentAndApplicationJob";
47+
48+
private final JobRepository jobRepository;
49+
private final PlatformTransactionManager transactionManager;
50+
51+
private final BatchProperties batchProperties;
52+
53+
public CleanupAgentAndApplicationJobConfig(JobRepository jobRepository, PlatformTransactionManager transactionManager,
54+
BatchProperties batchProperties) {
55+
this.jobRepository = Objects.requireNonNull(jobRepository, "jobRepository");
56+
this.transactionManager = Objects.requireNonNull(transactionManager, "transactionManager");
57+
this.batchProperties = Objects.requireNonNull(batchProperties, "batchProperties");
58+
}
59+
60+
@Bean
61+
public Job agentIdCleanupJob(
62+
Step agentIdCleanupStep,
63+
Step applicationCleanupStep
64+
) {
65+
return new JobBuilder(JOB_NAME, jobRepository)
66+
.start(agentIdCleanupStep)
67+
.next(applicationCleanupStep)
68+
.build();
69+
}
70+
71+
@Bean
72+
public Step agentIdCleanupStep(
73+
AgentIdCleanupTasklet agentIdCleanupTasklet,
74+
@Qualifier("cleanupStepCustomListener") Optional<StepExecutionListener> stepExecutionListeners
75+
) {
76+
TaskletStepBuilder builder = new StepBuilder("agentIdCleanupStep", jobRepository)
77+
.tasklet(agentIdCleanupTasklet, transactionManager);
78+
stepExecutionListeners.ifPresent(builder::listener);
79+
80+
return builder.build();
81+
}
82+
83+
@Bean
84+
public Step applicationCleanupStep(
85+
ApplicationCleanupTasklet applicationCleanupTasklet,
86+
@Qualifier("cleanupStepCustomListener") Optional<StepExecutionListener> stepExecutionListeners
87+
) {
88+
TaskletStepBuilder builder = new StepBuilder("applicationCleanupStep", jobRepository)
89+
.tasklet(applicationCleanupTasklet, transactionManager);
90+
stepExecutionListeners.ifPresent(builder::listener);
91+
92+
return builder.build();
93+
}
94+
95+
@Bean
96+
@StepScope
97+
public AgentIdCleanupTasklet agentIdCleanupTasklet(
98+
@Value("#{jobParameters['dryRun']}") String dryRunParameter,
99+
@Value("${job.cleanup.inactive.agent.fetch-size:1000}") int fetchSize,
100+
@Value("${job.cleanup.inactive.agent.max-iteration:100000}") int maxIteration,
101+
@Value("${job.cleanup.inactive.agent.trace-based-check-service-type-codes:1220,1400,1700}") Set<Integer> statisticsCheckServiceTypeCodes,
102+
AgentIdDao agentIdDao,
103+
MapAgentResponseDao mapAgentResponseDao
104+
) {
105+
boolean dryRun = dryRunParameter == null || Boolean.parseBoolean(dryRunParameter);
106+
return new AgentIdCleanupTasklet(
107+
agentIdDao,
108+
mapAgentResponseDao,
109+
dryRun,
110+
Math.max(batchProperties.getCleanupAgentInactiveThresholdDays(), batchProperties.getCleanupAgentAndApplicationGraceDays()),
111+
fetchSize,
112+
maxIteration,
113+
statisticsCheckServiceTypeCodes
114+
);
115+
}
116+
117+
@Bean
118+
@StepScope
119+
public ApplicationCleanupTasklet applicationCleanupTasklet(
120+
@Value("#{jobParameters['dryRun']}") String dryRunParameter,
121+
@Value("${job.cleanup.inactive.application.serviceUidList:0}") List<Integer> serviceUidList,
122+
@Value("${job.cleanup.inactive.application.agent-count-threshold:2147483647}") int agentCountThreshold,
123+
@Value("${job.cleanup.inactive.agent.trace-based-check-service-type-codes:1220,1400,1700}") Set<Integer> statisticsCheckServiceTypeCodes,
124+
ApplicationDao applicationDao,
125+
AgentIdDao agentIdDao,
126+
MapAgentResponseDao mapAgentResponseDao
127+
) {
128+
boolean dryRun = dryRunParameter == null || Boolean.parseBoolean(dryRunParameter);
129+
return new ApplicationCleanupTasklet(
130+
applicationDao,
131+
agentIdDao,
132+
mapAgentResponseDao,
133+
dryRun,
134+
serviceUidList,
135+
agentCountThreshold,
136+
batchProperties.getCleanupAgentInactiveThresholdDays(),
137+
batchProperties.getCleanupAgentAndApplicationGraceDays(),
138+
statisticsCheckServiceTypeCodes
139+
);
140+
}
141+
}
142+
143+

0 commit comments

Comments
 (0)