use of org.graylog2.notifications.Notification in project graylog2-server by Graylog2.
the class NotificationFacadeTest method exportEntity.
@Test
@MongoDBFixtures("NotificationFacadeTest.json")
public void exportEntity() {
final ModelId id = ModelId.of("5d4d33753d27460ad18e0c4d");
final EntityDescriptor descriptor = EntityDescriptor.create(id, ModelTypes.NOTIFICATION_V1);
final EntityDescriptorIds entityDescriptorIds = EntityDescriptorIds.of(descriptor);
final Optional<Entity> entity = facade.exportEntity(descriptor, entityDescriptorIds);
assertThat(entity).isPresent();
final EntityV1 entityV1 = (EntityV1) entity.get();
final NotificationEntity notificationEntity = objectMapper.convertValue(entityV1.data(), NotificationEntity.class);
assertThat(notificationEntity.title().asString()).isEqualTo("title");
assertThat(notificationEntity.description().asString()).isEqualTo("description");
assertThat(notificationEntity.config().type()).isEqualTo("email-notification-v1");
}
use of org.graylog2.notifications.Notification in project graylog2-server by Graylog2.
the class EmailSender method sendEmails.
// TODO: move EmailRecipients class to events code
void sendEmails(EmailEventNotificationConfig notificationConfig, EventNotificationContext ctx, ImmutableList<MessageSummary> backlog) throws TransportConfigurationException, EmailException, ConfigurationError {
if (!emailFactory.isEmailTransportEnabled()) {
throw new TransportConfigurationException("Email transport is not enabled in server configuration file!");
}
final EmailRecipients emailRecipients = emailRecipientsFactory.create(new ArrayList<>(notificationConfig.userRecipients()), new ArrayList<>(notificationConfig.emailRecipients()));
if (emailRecipients.isEmpty()) {
LOG.debug("Cannot send emails: empty recipient list.");
return;
}
final Set<String> recipientsSet = emailRecipients.getEmailRecipients();
if (recipientsSet.size() == 0) {
final Notification notification = notificationService.buildNow().addNode(nodeId.toString()).addType(Notification.Type.GENERIC).addSeverity(Notification.Severity.NORMAL).addDetail("title", "No recipients have been defined!").addDetail("description", "To fix this, go to the notification configuration and add at least one alert recipient.");
notificationService.publishIfFirst(notification);
}
final Map<String, Object> model = getModel(ctx, backlog, notificationConfig.timeZone());
for (String email : recipientsSet) {
sendEmail(notificationConfig, email, model);
}
}
use of org.graylog2.notifications.Notification in project graylog2-server by Graylog2.
the class EventBacklogService method getMessagesForEvent.
public ImmutableList<MessageSummary> getMessagesForEvent(EventDto eventDto, long backlogSize) throws NotFoundException {
if (backlogSize <= 0) {
return ImmutableList.of();
}
final EventProcessor.Factory factory = eventProcessorFactories.get(eventDto.eventDefinitionType());
if (factory == null) {
throw new NotFoundException("Couldn't find event processor factory for type " + eventDto.eventDefinitionType());
}
final EventDefinition eventDefinition = eventDefinitionService.get(eventDto.eventDefinitionId()).orElseThrow(() -> new NotFoundException("Could not find event definintion <" + eventDto.eventDefinitionId() + ">"));
final EventProcessor eventProcessor = factory.create(eventDefinition);
final ImmutableList.Builder<MessageSummary> backlogBuilder = ImmutableList.builder();
try {
eventProcessor.sourceMessagesForEvent(Event.fromDto(eventDto), backlogBuilder::addAll, backlogSize);
} catch (EventProcessorException e) {
// TODO return this error, so it can be included in the notification message?
LOG.error("Failed to query backlog messages for Event {}", eventDto.id(), e);
}
return backlogBuilder.build();
}
use of org.graylog2.notifications.Notification in project graylog2-server by Graylog2.
the class EventNotificationHandler method handleEvents.
public void handleEvents(EventDefinition definition, List<EventWithContext> eventsWithContext) {
for (Config config : definition.notifications()) {
final Optional<JobDefinitionDto> jobDefinition = jobDefinitionService.getByConfigField(Config.FIELD_NOTIFICATION_ID, config.notificationId());
if (!jobDefinition.isPresent()) {
LOG.error("Couldn't find job definition for notification <{}>", config.notificationId());
continue;
}
final Optional<NotificationDto> notificationDto = notificationService.get(config.notificationId());
if (!notificationDto.isPresent()) {
LOG.error("Couldn't find notification definition for id <{}>", config.notificationId());
continue;
}
final EventNotificationConfig notificationConfig = notificationDto.get().config();
for (EventWithContext eventWithContext : eventsWithContext) {
final Event event = eventWithContext.event();
if (notificationGracePeriodService.inGracePeriod(definition, config.notificationId(), event)) {
continue;
}
try {
final JobTriggerDto trigger = jobTriggerService.create(JobTriggerDto.builder().jobDefinitionId(jobDefinition.get().id()).schedule(OnceJobSchedule.create()).data(notificationConfig.toJobTriggerData(event.toDto())).build());
LOG.debug("Scheduled job <{}> for notification <{}> - event <{}/{}>", trigger.id(), config.notificationId(), event.getId(), event.getMessage());
// TODO: The trigger ID needs to be added to the "triggered_tasks" list of the event
} catch (Exception e) {
LOG.error("Couldn't create job trigger for notification <{}> and event: {}", config.notificationId(), event, e);
}
}
}
}
use of org.graylog2.notifications.Notification in project graylog2-server by Graylog2.
the class HTTPEventNotification method execute.
@Override
public void execute(EventNotificationContext ctx) throws TemporaryEventNotificationException, PermanentEventNotificationException {
final HTTPEventNotificationConfig config = (HTTPEventNotificationConfig) ctx.notificationConfig();
final HttpUrl httpUrl = HttpUrl.parse(config.url());
if (httpUrl == null) {
throw new TemporaryEventNotificationException("Malformed URL: <" + config.url() + "> in notification <" + ctx.notificationId() + ">");
}
ImmutableList<MessageSummary> backlog = notificationCallbackService.getBacklogForEvent(ctx);
final EventNotificationModelData model = EventNotificationModelData.of(ctx, backlog);
if (!whitelistService.isWhitelisted(config.url())) {
if (!NotificationTestData.TEST_NOTIFICATION_ID.equals(ctx.notificationId())) {
publishSystemNotificationForWhitelistFailure(config.url(), model.eventDefinitionTitle());
}
throw new TemporaryEventNotificationException("URL <" + config.url() + "> is not whitelisted.");
}
final byte[] body;
try {
body = objectMapper.writeValueAsBytes(model);
} catch (JsonProcessingException e) {
throw new PermanentEventNotificationException("Unable to serialize notification", e);
}
final Request request = new Request.Builder().url(httpUrl).post(RequestBody.create(CONTENT_TYPE, body)).build();
LOG.debug("Requesting HTTP endpoint at <{}> in notification <{}>", config.url(), ctx.notificationId());
try (final Response r = httpClient.newCall(request).execute()) {
if (!r.isSuccessful()) {
throw new PermanentEventNotificationException("Expected successful HTTP response [2xx] but got [" + r.code() + "]. " + config.url());
}
} catch (IOException e) {
throw new PermanentEventNotificationException(e.getMessage());
}
}
Aggregations