public void appendMessage(final String jobId, final JobMessage jobMessage) { writeMessageAndStatus(jobId, jobMessage.getLevel(), jobMessage.getMessage(), jobMessage.getLevel() == Level.ERROR ? ERROR : null, jobMessage.getTimestamp()); }
private void writeMessageAndStatus(final String jobId, Level messageLevel, String message, @Nullable final JobStatus jobStatus, OffsetDateTime timestamp) { // TODO: Refactor JobRepository so only a single update is required jobRepository.appendMessage(jobId, jobMessage(messageLevel, message, timestamp)); if (jobStatus != null) { jobRepository.setJobStatus(jobId, jobStatus); } }
public static JobMessage jobMessage(final Level level, final String message, final OffsetDateTime ts) { return new JobMessage(level, message, ts); }
private void assertMessageEvent(final ArgumentCaptor<JobMessage> messageCaptor, final de.otto.edison.jobs.domain.Level expectedLevel) { final JobMessage jobMessage = messageCaptor.getValue(); assertThat(jobMessage.getMessage(), is("someMessage")); assertThat(jobMessage.getLevel(), is(expectedLevel)); }
@Override public void appendMessage(String jobId, JobMessage jobMessage) { JobInfo jobInfo = jobs.get(jobId); jobs.replace(jobId, jobInfo.copy().setLastUpdated(jobMessage.getTimestamp()).addMessage(jobMessage).build()); }
@Override public void appendMessage(final String jobId, final JobMessage jobMessage) { collectionWithWriteTimeout(mongoProperties.getDefaultWriteTimeout(), TimeUnit.MILLISECONDS).updateOne(eq(ID, jobId), combine(push(JobStructure.MESSAGES.key(), encodeJobMessage(jobMessage)), set(JobStructure.LAST_UPDATED.key(), Date.from(jobMessage.getTimestamp().toInstant())))); }
public List<String> getMessages() { return job.getMessages().stream().map((jobMessage) -> "[" + formatTime(jobMessage.getTimestamp()) + "] [" + jobMessage.getLevel().getKey() + "] " + jobMessage.getMessage() ).collect(Collectors.toList()); }
public void killJob(final String jobId) { stopJob(jobId, DEAD); jobRepository.appendMessage( jobId, jobMessage(WARNING, "Job didn't receive updates for a while, considering it dead", now(clock)) ); }
private static Document encodeJobMessage(final JobMessage jm) { return new Document() {{ put(JobStructure.MSG_LEVEL.key(), jm.getLevel().name()); put(JobStructure.MSG_TS.key(), Date.from(jm.getTimestamp().toInstant())); put(JobStructure.MSG_TEXT.key(), jm.getMessage()); }}; }
private JobMessage toJobMessage(final Document document) { return jobMessage( Level.valueOf(document.get(JobStructure.MSG_LEVEL.key()).toString()), getMessage(document), toOffsetDateTime(document.getDate(JobStructure.MSG_TS.key())) ); }
private static Document encodeJobMessage(final JobMessage jm) { return new Document() {{ put(JobStructure.MSG_LEVEL.key(), jm.getLevel().name()); put(JobStructure.MSG_TS.key(), DateTimeConverters.toDate(jm.getTimestamp())); put(JobStructure.MSG_TEXT.key(), jm.getMessage()); }}; }
private JobMessage toJobMessage(final Document document) { return jobMessage( Level.valueOf(document.get(JobStructure.MSG_LEVEL.key()).toString()), getMessage(document), DateTimeConverters.toOffsetDateTime(document.getDate(JobStructure.MSG_TS.key())) ); }
@Test public void shouldAppendNonErrorMessage() { JobMessage message = JobMessage.jobMessage(Level.INFO, "This is an interesting message", OffsetDateTime.now()); // when jobService.appendMessage(JOB_ID, message); // then verify(jobRepository).appendMessage(JOB_ID, message); verify(jobRepository, never()).createOrUpdate(any(JobInfo.class)); }
private JobInfo someJobInfo(final String jobId) { return JobInfo.newJobInfo( jobId, "SOME_JOB", now(), now(), Optional.of(now()), OK, asList( jobMessage(Level.INFO, "foo", now()), jobMessage(Level.WARNING, "bar", now())), systemDefaultZone(), "localhost" ); }
private JobInfo jobInfo(final String jobId, final String type) { return JobInfo.newJobInfo( jobId, type, now(), now(), Optional.of(now()), OK, asList( jobMessage(Level.INFO, "foo", now()), jobMessage(Level.WARNING, "bar", now())), systemDefaultZone(), "localhost" ); }
@Test public void shouldMarkSkipped() { //when jobService.markSkipped(JOB_ID); // then OffsetDateTime now = OffsetDateTime.now(clock); verify(jobRepository).appendMessage(JOB_ID, jobMessage(Level.INFO, "Skipped job ..", now)); verify(jobRepository).setJobStatus(JOB_ID, JobInfo.JobStatus.SKIPPED); }
private JobInfo jobInfo(final String jobId, final String type) { return JobInfo.newJobInfo( jobId, type, now(), now(), Optional.of(now()), OK, asList( jobMessage(Level.INFO, "foo", now()), jobMessage(Level.WARNING, "bar", now())), systemDefaultZone(), "localhost" ); } }
@Override protected void append(final ILoggingEvent eventObject) { Map<String, String> mdcMap = eventObject.getMDCPropertyMap(); // TODO: check for JOB marker: if (mdcMap.containsKey("job_id") && eventObject.getMarker() != null && JobMarker.JOB.contains(eventObject.getMarker())) { String jobId = mdcMap.get("job_id"); Level level = eventObject.getLevel(); de.otto.edison.jobs.domain.Level edisonLevel = logLevelToEdisonLevel(level); String message = eventObject.getFormattedMessage(); try { final JobMessage jobMessage = jobMessage(edisonLevel, message, OffsetDateTime.now()); jobService.appendMessage(jobId, jobMessage); } catch(final RuntimeException e) { addError("Failed to persist job message (jobId=" + jobId + "): " + message, e); } } }
@Test public void shouldPersistFailedEvent() throws Exception { final StateChangeEvent event = stateChangedEvent(FAILED); subject.consumeStateChange(event); final OffsetDateTime ts = ofInstant(ofEpochMilli(event.getTimestamp()), systemDefault()); verify(jobServiceMock).appendMessage(JOB_ID, jobMessage(ERROR, "", ts)); }
@Test public void shouldMarkRestarted() { //when jobService.markRestarted(JOB_ID); // then OffsetDateTime now = OffsetDateTime.now(clock); verify(jobRepository).appendMessage(JOB_ID, jobMessage(Level.WARNING, "Restarting job ..", now)); verify(jobRepository).setJobStatus(JOB_ID, JobInfo.JobStatus.OK); }