Skip to content

Commit f2e0a0c

Browse files
committed
added first metric support
1 parent 50113f4 commit f2e0a0c

File tree

6 files changed

+198
-125
lines changed

6 files changed

+198
-125
lines changed

core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
import org.sterl.spring.persistent_tasks.trigger.event.TriggerAddedEvent;
2626
import org.sterl.spring.persistent_tasks.trigger.model.TriggerEntity;
2727

28+
import io.micrometer.core.instrument.Gauge;
29+
import io.micrometer.core.instrument.MeterRegistry;
30+
import io.micrometer.core.instrument.Tags;
31+
import io.micrometer.core.instrument.binder.BaseUnits;
2832
import jakarta.annotation.PostConstruct;
2933
import jakarta.annotation.PreDestroy;
3034
import lombok.Getter;
@@ -51,11 +55,27 @@ public class SchedulerService {
5155
private final RunOrQueueComponent runOrQueue;
5256

5357
private final TransactionTemplate trx;
58+
59+
private final MeterRegistry meterRegistry;
5460

5561
@PostConstruct
5662
public void start() {
5763
taskExecutor.start();
5864
editSchedulerStatus.checkinToRegistry(name, 0, taskExecutor.getMaxThreads());
65+
66+
Gauge.builder("persistent_tasks.scheduler." + name,
67+
taskExecutor,
68+
e -> e.countRunning())
69+
.tags(Tags.of("thread", "running"))
70+
.baseUnit(BaseUnits.TASKS)
71+
.register(meterRegistry);
72+
73+
Gauge.builder("persistent_tasks.scheduler." + name,
74+
taskExecutor,
75+
e -> e.getMaxThreads())
76+
.tags(Tags.of("thread", "max"))
77+
.baseUnit(BaseUnits.TASKS)
78+
.register(meterRegistry);
5979
}
6080

6181
public void setMaxThreads(int value) {

core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/component/EditSchedulerStatusComponent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public SchedulerEntity checkinToRegistry(String name, int runningTasks, int maxT
3535
result.setTasksSlotCount(maxTasks);
3636

3737
result.setLastPing(OffsetDateTime.now());
38+
3839
log.debug("Ping {}", result);
3940
return schedulerRepository.save(result);
4041
}

core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/config/SchedulerConfig.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.sterl.spring.persistent_tasks.scheduler.component.TaskExecutorComponent;
1818
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
1919

20+
import io.micrometer.core.instrument.MeterRegistry;
2021
import lombok.extern.slf4j.Slf4j;
2122

2223
/**
@@ -48,6 +49,7 @@ default String name() {
4849
@Bean(name = "schedulerService", initMethod = "start", destroyMethod = "stop")
4950
SchedulerService schedulerService(
5051
TriggerService triggerService,
52+
MeterRegistry meterRegistry,
5153
@Value("${spring.persistent-tasks.max-threads:10}") int maxThreads,
5254
EditSchedulerStatusComponent editSchedulerStatus,
5355
Optional<SchedulerCustomizer> customizer,
@@ -57,11 +59,16 @@ SchedulerService schedulerService(
5759
final var name = customizer.get().name();
5860
final var maxShutdownWaitTime = Duration.ofSeconds(10);
5961

60-
return newSchedulerService(name, triggerService, editSchedulerStatus, maxThreads, maxShutdownWaitTime, trx);
62+
return newSchedulerService(name, meterRegistry, triggerService, editSchedulerStatus, maxThreads, maxShutdownWaitTime, trx);
6163
}
6264

63-
public static SchedulerService newSchedulerService(final String name, TriggerService triggerService,
64-
EditSchedulerStatusComponent editSchedulerStatus, int maxThreads, final Duration maxShutdownWaitTime,
65+
public static SchedulerService newSchedulerService(
66+
String name,
67+
MeterRegistry meterRegistry,
68+
TriggerService triggerService,
69+
EditSchedulerStatusComponent editSchedulerStatus,
70+
int maxThreads,
71+
Duration maxShutdownWaitTime,
6572
TransactionTemplate trx) {
6673

6774
final var taskExecutor = new TaskExecutorComponent(name, triggerService, maxThreads);
@@ -74,6 +81,7 @@ public static SchedulerService newSchedulerService(final String name, TriggerSer
7481
taskExecutor,
7582
editSchedulerStatus,
7683
runOrQueue,
77-
trx);
84+
trx,
85+
meterRegistry);
7886
}
7987
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.sterl.spring.persistent_tasks.trigger.interceptor;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
import java.util.concurrent.TimeUnit;
6+
7+
import org.springframework.context.event.EventListener;
8+
import org.springframework.stereotype.Component;
9+
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
10+
import org.sterl.spring.persistent_tasks.trigger.event.TriggerCanceledEvent;
11+
import org.sterl.spring.persistent_tasks.trigger.event.TriggerFailedEvent;
12+
import org.sterl.spring.persistent_tasks.trigger.event.TriggerSuccessEvent;
13+
14+
import io.micrometer.core.instrument.MeterRegistry;
15+
import io.micrometer.core.instrument.Tags;
16+
import io.micrometer.core.instrument.Timer;
17+
import lombok.RequiredArgsConstructor;
18+
import lombok.extern.slf4j.Slf4j;
19+
20+
@RequiredArgsConstructor
21+
@Component
22+
@Slf4j
23+
public class TriggerMetricInterceptor {
24+
25+
private final MeterRegistry meterRegistry;
26+
private final Map<String, Timer> cache = new ConcurrentHashMap<>();
27+
28+
@EventListener
29+
public void onFailed(TriggerFailedEvent data) {
30+
recordTime(data.key().getTaskName(),
31+
data.status(),
32+
data.getData().getRunningDurationInMs());
33+
}
34+
@EventListener
35+
public void onSuccess(TriggerSuccessEvent data) {
36+
recordTime(data.key().getTaskName(),
37+
data.status(),
38+
data.getData().getRunningDurationInMs());
39+
40+
}
41+
@EventListener
42+
public void onSuccess(TriggerCanceledEvent data) {
43+
recordTime(data.key().getTaskName(),
44+
data.status(),
45+
data.getData().getRunningDurationInMs());
46+
}
47+
48+
private void recordTime(String name, TriggerStatus status, Long timeMs) {
49+
if (timeMs == null) return;
50+
final var key = name + status;
51+
52+
try {
53+
var timer = cache.get(key);
54+
if (timer == null) {
55+
timer = Timer.builder("persistent_tasks.task." + name)
56+
.tags(Tags.of("status", status.name()))
57+
.register(meterRegistry);
58+
cache.put(key, timer);
59+
}
60+
timer.record(timeMs, TimeUnit.MICROSECONDS);
61+
} catch (Exception e) {
62+
log.error("Failed to update timer for {}", name, e);
63+
}
64+
}
65+
}
66+

core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.sterl.spring.sample_app.SampleApp;
3434
import org.sterl.test.hibernate_asserts.HibernateAsserts;
3535

36+
import io.micrometer.core.instrument.MeterRegistry;
3637
import jakarta.persistence.EntityManager;
3738
import lombok.RequiredArgsConstructor;
3839

@@ -91,20 +92,24 @@ HibernateAsserts hibernateAsserts(EntityManager entityManager) {
9192
@Primary
9293
@Bean("schedulerA")
9394
@SuppressWarnings("resource")
94-
SchedulerService schedulerA(TriggerService triggerService, EditSchedulerStatusComponent editSchedulerStatus,
95+
SchedulerService schedulerA(TriggerService triggerService,
96+
MeterRegistry meterRegistry,
97+
EditSchedulerStatusComponent editSchedulerStatus,
9598
TransactionTemplate trx) throws UnknownHostException {
9699

97100
final var name = "schedulerA";
98-
return SchedulerConfig.newSchedulerService(name, triggerService, editSchedulerStatus, 10, Duration.ZERO, trx);
101+
return SchedulerConfig.newSchedulerService(name, meterRegistry, triggerService, editSchedulerStatus, 10, Duration.ZERO, trx);
99102
}
100103

101104
@Bean
102105
@SuppressWarnings("resource")
103-
SchedulerService schedulerB(TriggerService triggerService, EditSchedulerStatusComponent editSchedulerStatus,
106+
SchedulerService schedulerB(TriggerService triggerService,
107+
MeterRegistry meterRegistry,
108+
EditSchedulerStatusComponent editSchedulerStatus,
104109
TransactionTemplate trx) throws UnknownHostException {
105110

106111
final var name = "schedulerB";
107-
return SchedulerConfig.newSchedulerService(name, triggerService, editSchedulerStatus, 20, Duration.ZERO, trx);
112+
return SchedulerConfig.newSchedulerService(name, meterRegistry, triggerService, editSchedulerStatus, 20, Duration.ZERO, trx);
108113
}
109114

110115
/**

0 commit comments

Comments
 (0)