Skip to content

Commit a4fa69f

Browse files
authored
feat: basis opentelemetry støtte i for prosesstask (#746)
* feat: basis opentelemetry støtte i for prosesstask. * Review * Rydder versjonering
1 parent 443fe4a commit a4fa69f

File tree

6 files changed

+110
-39
lines changed

6 files changed

+110
-39
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
<sonar.projectName>fp-prosesstask</sonar.projectName>
5454
<sonar.projectKey>navikt_fp-prosesstask</sonar.projectKey>
5555

56-
<felles.version>7.4.0</felles.version>
56+
<felles.version>7.4.3</felles.version>
5757

5858
<jakarta.jakartaee-bom.version>10.0.0</jakarta.jakartaee-bom.version>
5959
<hibernate-core.version>6.6.3.Final</hibernate-core.version>

task/src/main/java/no/nav/vedtak/felles/prosesstask/impl/ProsessTaskHandlerRef.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected ProsessTaskHandler getBean() {
6565
private ProsessTask getProsessTaskAnnotation() {
6666
Class<?> clazz = getTargetClassExpectingAnnotation(ProsessTask.class);
6767
if (!clazz.isAnnotationPresent(ProsessTask.class)) {
68-
throw new IllegalStateException(clazz.getSimpleName() + " mangler annotering @ProsesTask");
68+
throw new IllegalStateException(clazz.getSimpleName() + " mangler annotering @ProsesTask");
6969
}
7070
return clazz.getAnnotation(ProsessTask.class);
7171
}

task/src/main/java/no/nav/vedtak/felles/prosesstask/impl/RunTask.java

+20-16
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import jakarta.persistence.PersistenceException;
2121
import jakarta.transaction.Transactional;
2222

23+
import no.nav.vedtak.felles.prosesstask.impl.util.OtelUtil;
24+
2325
import org.hibernate.Session;
2426
import org.hibernate.exception.JDBCConnectionException;
2527
import org.hibernate.jdbc.Work;
@@ -91,10 +93,12 @@ protected void runTaskAndUpdateStatus(Connection conn, ProsessTaskEntitet pte, P
9193
return;
9294
}
9395

94-
pickAndRun.dispatchWork(pte);
96+
OtelUtil.wrapper().span("TASK " + taskType.value(), OtelUtil.taskAttributter(pte.tilProsessTask()), () -> {
97+
pickAndRun.dispatchWork(pte);
98+
// flush for å fange andre constraint feil etc før vi markerer ferdig
99+
getEntityManager().flush();
100+
});
95101

96-
// flush for å fange andre constraint feil etc før vi markerer ferdig
97-
getEntityManager().flush();
98102

99103
if (ProsessTaskStatus.KLAR == pte.getStatus()) {
100104
var sluttStatus = pickAndRun.markerTaskFerdig(pte);
@@ -203,7 +207,7 @@ void handleTaskFeil(ProsessTaskEntitet pte, Exception e) {
203207
feilOgStatushåndterer.handleTaskFeil(retryPolicy, pte, e);
204208
}
205209

206-
void handleFatalTaskFeil(ProsessTaskEntitet pte,Feil feil, Exception e) {
210+
void handleFatalTaskFeil(ProsessTaskEntitet pte, Feil feil, Exception e) {
207211
feilOgStatushåndterer.handleFatalTaskFeil(pte, feil, e);
208212
}
209213

@@ -219,7 +223,7 @@ ProsessTaskStatus markerTaskFerdig(ProsessTaskEntitet pte) {
219223
// frigir veto etter at event handlere er fyrt
220224
vetoHåndterer.frigiVeto(pte);
221225

222-
ProsessTaskStatus nyStatus = ProsessTaskStatus.KJOERT;
226+
var nyStatus = ProsessTaskStatus.KJOERT;
223227
taskManagerRepository.oppdaterStatus(pte.getId(), nyStatus);
224228

225229
pte = refreshProsessTask(pte.getId());
@@ -230,7 +234,7 @@ ProsessTaskStatus markerTaskFerdig(ProsessTaskEntitet pte) {
230234
// markerer task som påbegynt (merk committer ikke før til slutt).
231235
void markerTaskUnderArbeid(ProsessTaskEntitet pte) {
232236
// mark row being processed with timestamp and server process id
233-
LocalDateTime now = LocalDateTime.now();
237+
var now = LocalDateTime.now();
234238
pte.setSisteKjøring(now);
235239
pte.setSisteKjøringServer(getJvmUniqueProcessName());
236240
getEntityManager().persist(pte);
@@ -240,15 +244,15 @@ void markerTaskUnderArbeid(ProsessTaskEntitet pte) {
240244
// regner ut neste kjøretid for tasks som kan repeteres (har CronExpression)
241245
void planleggNesteKjøring(ProsessTaskEntitet pte) throws SQLException {
242246
if (cronExpression != null) {
243-
String gruppe = ProsessTaskRepository.getUniktProsessTaskGruppeNavn(taskManagerRepository.getEntityManager());
244-
LocalDateTime now = LocalDateTime.now();
245-
LocalDateTime nesteKjøring = cronExpression.nextLocalDateTimeAfter(now);
247+
var gruppe = ProsessTaskRepository.getUniktProsessTaskGruppeNavn(taskManagerRepository.getEntityManager());
248+
var now = LocalDateTime.now();
249+
var nesteKjøring = cronExpression.nextLocalDateTimeAfter(now);
246250
var data = ProsessTaskDataBuilder.forTaskType(pte.getTaskType())
247251
.medNesteKjøringEtter(nesteKjøring)
248252
.medProperties(pte.getProperties())
249253
.medGruppe(gruppe)
250254
.medSekvens(pte.getSekvens());
251-
ProsessTaskEntitet nyPte = new ProsessTaskEntitet().kopierFraNy(data.build());
255+
var nyPte = new ProsessTaskEntitet().kopierFraNy(data.build());
252256

253257
getEntityManager().persist(nyPte);
254258
getEntityManager().flush();
@@ -266,7 +270,7 @@ void markerTaskUnderArbeid(ProsessTaskEntitet pte) {
266270
}
267271

268272
void dispatchWork(ProsessTaskEntitet pte) throws Exception {
269-
ProsessTaskData taskData = pte.tilProsessTask();
273+
var taskData = pte.tilProsessTask();
270274
taskInfo.getTaskDispatcher().dispatch(taskData);
271275
}
272276

@@ -277,7 +281,7 @@ private EntityManager getEntityManager() {
277281
@SuppressWarnings("rawtypes")
278282
void runTask() {
279283

280-
final PickAndRunTask pickAndRun = this;
284+
final var pickAndRun = this;
281285
/*
282286
* Bruker SQL+JDBC for å kunne benytte savepoints og inkrementell oppdatering i
283287
* transaksjonen.
@@ -286,7 +290,7 @@ class PullSingleTask implements Work {
286290
@Override
287291
public void execute(Connection conn) throws SQLException {
288292
try {
289-
Optional<ProsessTaskEntitet> pte = taskManagerRepository.finnOgLås(taskInfo);
293+
var pte = taskManagerRepository.finnOgLås(taskInfo);
290294
if (pte.isPresent()) {
291295
runTaskAndUpdateStatus(conn, pte.get(), pickAndRun);
292296
}
@@ -304,15 +308,15 @@ public void execute(Connection conn) throws SQLException {
304308

305309
}
306310

307-
PullSingleTask pullSingleTask = new PullSingleTask();
308-
EntityManager em = getEntityManager();
311+
var pullSingleTask = new PullSingleTask();
312+
var em = getEntityManager();
309313
// workaround for hibernate issue HHH-11020
310314
if (em instanceof TargetInstanceProxy tip) {
311315
em = (EntityManager) tip.weld_getTargetInstance();
312316
}
313317

314318
@SuppressWarnings("resource") // skal ikke lukke session her
315-
Session session = em.unwrap(Session.class);
319+
var session = em.unwrap(Session.class);
316320

317321
session.doWork(pullSingleTask);
318322

task/src/main/java/no/nav/vedtak/felles/prosesstask/impl/TaskManager.java

+25-20
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,24 @@
2323
import java.util.function.Function;
2424
import java.util.stream.Collectors;
2525

26+
import org.hibernate.exception.JDBCConnectionException;
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
29+
30+
import io.opentelemetry.api.trace.SpanKind;
2631
import jakarta.enterprise.context.ApplicationScoped;
2732
import jakarta.enterprise.inject.Any;
2833
import jakarta.enterprise.inject.Instance;
2934
import jakarta.enterprise.inject.spi.CDI;
3035
import jakarta.inject.Inject;
3136
import jakarta.persistence.EntityManager;
32-
33-
import org.hibernate.exception.JDBCConnectionException;
34-
import org.slf4j.Logger;
35-
import org.slf4j.LoggerFactory;
36-
3737
import no.nav.vedtak.exception.TekniskException;
3838
import no.nav.vedtak.felles.jpa.TransactionHandler;
3939
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
4040
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskDispatcher;
4141
import no.nav.vedtak.felles.prosesstask.api.TaskMonitor;
4242
import no.nav.vedtak.felles.prosesstask.api.TaskType;
43+
import no.nav.vedtak.felles.prosesstask.impl.util.OtelUtil;
4344
import no.nav.vedtak.log.metrics.Controllable;
4445

4546
/**
@@ -363,7 +364,8 @@ protected List<IdentRunnable> doWork(EntityManager entityManager) {
363364
*/
364365
@Override
365366
public Integer call() {
366-
return RequestContextHandler.doWithRequestContext(this::doPollingWithEntityManager);
367+
return OtelUtil.wrapper().span("POLL_TASKS", spanBuilder -> spanBuilder.setSpanKind(SpanKind.INTERNAL).setNoParent(),
368+
() -> RequestContextHandler.doWithRequestContext(this::doPollingWithEntityManager));
367369
}
368370

369371
public Integer doPollingWithEntityManager() {
@@ -389,7 +391,7 @@ public Integer doPollingWithEntityManager() {
389391
} catch (Exception e) {
390392
backoffRound.set(backoffInterval.length - 1); // force max delay (skal kun havne her for Exception/RuntimeException)
391393
LOG.warn("PT-996896 Kunne ikke polle database, venter til neste runde(runde={})", backoffRound.get(), e);
392-
} catch (Throwable t) {
394+
} catch (Throwable t) { // NOSONAR
393395
backoffRound.set(backoffInterval.length - 1); // force max delay (skal kun havne her for Error)
394396
LOG.error("PT-996897 Kunne ikke polle grunnet kritisk feil, venter ({}s)", getBackoffIntervalSeconds(), t);
395397
}
@@ -510,13 +512,14 @@ public Integer doWithContext() {
510512

511513
@Override
512514
public void run() {
513-
RequestContextHandler.doWithRequestContext(this::doWithContext);
514-
// neste kjører mellom 1-10 min fra nå.
515-
var min = 60L * 1000;
516-
var delay = System.currentTimeMillis() % (9 * min);
517-
pollingService.schedule(this, min + delay, TimeUnit.MILLISECONDS);
515+
OtelUtil.wrapper().span("MoveToDonePartition", spanBuilder -> spanBuilder.setSpanKind(SpanKind.INTERNAL).setNoParent(), () -> {
516+
RequestContextHandler.doWithRequestContext(this::doWithContext);
517+
// neste kjører mellom 1-10 min fra nå.
518+
var min = 60L * 1000;
519+
var delay = System.currentTimeMillis() % (9 * min);
520+
pollingService.schedule(this, min + delay, TimeUnit.MILLISECONDS);
521+
});
518522
}
519-
520523
}
521524

522525
/**
@@ -561,7 +564,8 @@ public Integer doWithContext() {
561564

562565
@Override
563566
public void run() {
564-
RequestContextHandler.doWithRequestContext(this::doWithContext);
567+
OtelUtil.wrapper().span("FreeBlockedTasks", spanBuilder -> spanBuilder.setSpanKind(SpanKind.INTERNAL).setNoParent(),
568+
() -> RequestContextHandler.doWithRequestContext(this::doWithContext));
565569
}
566570

567571
}
@@ -609,13 +613,14 @@ public Integer doWithContext() {
609613

610614
@Override
611615
public void run() {
612-
RequestContextHandler.doWithRequestContext(this::doWithContext);
613-
// neste kjører mellom 3-9 min fra nå.
614-
var min = 3L * 60 * 1000;
615-
var delay = System.currentTimeMillis() % (2 * min);
616-
pollingService.schedule(this, min + delay, TimeUnit.MILLISECONDS);
616+
OtelUtil.wrapper().span("UpdateTaskMonitor", spanBuilder -> spanBuilder.setSpanKind(SpanKind.INTERNAL), () -> {
617+
RequestContextHandler.doWithRequestContext(this::doWithContext);
618+
// neste kjører mellom 3-9 min fra nå.
619+
var min = 3L * 60 * 1000;
620+
var delay = System.currentTimeMillis() % (2 * min);
621+
pollingService.schedule(this, min + delay, TimeUnit.MILLISECONDS);
622+
});
617623
}
618-
619624
}
620625

621626
/**

task/src/main/java/no/nav/vedtak/felles/prosesstask/impl/TaskManagerRunnableTask.java

+24-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@
22

33
import java.time.LocalDateTime;
44
import java.util.function.Consumer;
5+
import java.util.function.UnaryOperator;
6+
7+
import io.opentelemetry.api.trace.Span;
8+
import io.opentelemetry.api.trace.SpanBuilder;
9+
import io.opentelemetry.api.trace.SpanContext;
10+
import io.opentelemetry.api.trace.SpanKind;
11+
import io.opentelemetry.context.Context;
12+
import no.nav.vedtak.felles.prosesstask.impl.util.OtelUtil;
513

614
import org.slf4j.MDC;
715

816
import jakarta.persistence.PersistenceException;
917
import no.nav.vedtak.felles.prosesstask.api.CallId;
1018
import no.nav.vedtak.felles.prosesstask.api.TaskType;
1119

20+
import static no.nav.vedtak.felles.prosesstask.impl.util.OtelUtil.taskAttributter;
21+
1222
class TaskManagerRunnableTask implements Runnable {
1323
private final TaskType taskType;
1424
private final RunTaskInfo taskInfo;
@@ -24,6 +34,11 @@ class TaskManagerRunnableTask implements Runnable {
2434

2535
@Override
2636
public void run() {
37+
OtelUtil.wrapper().span("RUN TASK " + taskInfo.getTaskType().value(), taskAttributter(taskInfo),
38+
this::runInSpan);
39+
}
40+
41+
private void runInSpan() {
2742
MDC.clear();
2843

2944
var runSingleTask = newRunTaskInstance();
@@ -39,7 +54,7 @@ public void run() {
3954
errorCallback = lagErrorCallback(taskInfo, callId, fatal);
4055
} catch (Exception e) {
4156
errorCallback = lagErrorCallback(taskInfo, callId, e);
42-
} catch (Throwable t) {
57+
} catch (Throwable t) { // NOSONAR
4358
errorCallback = lagErrorCallback(taskInfo, callId, t);
4459
} finally {
4560
clearLogContext();
@@ -102,4 +117,12 @@ RunTask newRunTaskInstance() {
102117
return TaskManagerGenerateRunnableTasks.CURRENT.select(RunTask.class).get();
103118
}
104119

120+
public static UnaryOperator<SpanBuilder> taskAttributter(RunTaskInfo taskInfo) {
121+
return spanBuilder -> spanBuilder
122+
.setAttribute("prosesstaskId", taskInfo.getId())
123+
.setAttribute("prosesstaskType", taskInfo.getTaskType().value())
124+
.setSpanKind(SpanKind.INTERNAL)
125+
.setNoParent();
126+
}
127+
105128
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package no.nav.vedtak.felles.prosesstask.impl.util;
2+
3+
import java.util.function.UnaryOperator;
4+
5+
import io.opentelemetry.api.GlobalOpenTelemetry;
6+
import io.opentelemetry.api.trace.SpanBuilder;
7+
import io.opentelemetry.api.trace.SpanKind;
8+
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
9+
import no.nav.vedtak.log.tracing.OtelSpanWrapper;
10+
11+
public class OtelUtil {
12+
13+
private static OtelSpanWrapper WRAPPER = new OtelSpanWrapper(GlobalOpenTelemetry.getTracer("fp-prosesstask"));
14+
15+
public static OtelSpanWrapper wrapper() {
16+
return WRAPPER;
17+
}
18+
19+
private OtelUtil() {
20+
// Sonar
21+
}
22+
23+
public static UnaryOperator<SpanBuilder> taskAttributter(ProsessTaskData data) {
24+
return spanBuilder -> {
25+
var builder = spanBuilder
26+
.setAttribute("prosesstaskId", data.getId())
27+
.setAttribute("prosesstaskType", data.taskType().value());
28+
if (data.getSaksnummer() != null) {
29+
builder = builder.setAttribute("saksnummer", data.getSaksnummer());
30+
}
31+
if (data.getBehandlingUuid() != null) {
32+
builder = builder.setAttribute("behandlingUuid", data.getBehandlingUuid().toString());
33+
} else if (data.getBehandlingId() != null) {
34+
builder = builder.setAttribute("behandlingId", data.getBehandlingId());
35+
}
36+
return builder.setSpanKind(SpanKind.INTERNAL);
37+
};
38+
}
39+
}

0 commit comments

Comments
 (0)