Search in sources :

Example 1 with LookupDataAdapter

use of org.graylog2.plugin.lookup.LookupDataAdapter in project graylog2-server by Graylog2.

the class LookupTableService method handleAdapterUpdate.

@Subscribe
public void handleAdapterUpdate(DataAdaptersUpdated updated) {
    scheduler.schedule(() -> {
        // first we create the new adapter instance and start it
        // then we retrieve the old one so we can safely stop it later
        // then we build a new lookup table instance with the new adapter instance
        // last we can remove the old lookup table instance and stop the original adapter
        // collect old adapter instances
        final ImmutableSet.Builder<LookupDataAdapter> existingAdapters = ImmutableSet.builder();
        // create new adapter and lookup table instances
        final Map<DataAdapterDto, LookupDataAdapter> newAdapters = createAdapters(configService.findDataAdaptersForIds(updated.ids()));
        final CountDownLatch runningLatch = new CountDownLatch(newAdapters.size());
        newAdapters.forEach((dto, adapter) -> {
            adapter.addListener(new DataAdapterListener(dto, adapter, runningLatch, existingAdapters::add), scheduler);
            adapter.startAsync();
        });
        // wait until everything is either running or failed before starting the
        awaitUninterruptibly(runningLatch);
        // when a data adapter is updated, the lookup tables that use it need to be updated as well
        final Collection<LookupTableDto> tablesToUpdate = configService.findTablesForDataAdapterIds(updated.ids());
        tablesToUpdate.forEach(this::createLookupTable);
        // stop old adapters
        existingAdapters.build().forEach(AbstractIdleService::stopAsync);
    }, 0, TimeUnit.SECONDS);
}
Also used : LookupDataAdapter(org.graylog2.plugin.lookup.LookupDataAdapter) DataAdapterDto(org.graylog2.lookup.dto.DataAdapterDto) ImmutableSet(com.google.common.collect.ImmutableSet) LookupTableDto(org.graylog2.lookup.dto.LookupTableDto) AbstractIdleService(com.google.common.util.concurrent.AbstractIdleService) CountDownLatch(java.util.concurrent.CountDownLatch) Subscribe(com.google.common.eventbus.Subscribe)

Example 2 with LookupDataAdapter

use of org.graylog2.plugin.lookup.LookupDataAdapter in project graylog2-server by Graylog2.

the class LookupTableService method createAndStartAdapters.

protected CountDownLatch createAndStartAdapters() {
    final Map<DataAdapterDto, LookupDataAdapter> adapters = createAdapters(configService.loadAllDataAdapters());
    final CountDownLatch latch = new CountDownLatch(toIntExact(adapters.size()));
    adapters.forEach((dto, adapter) -> {
        adapter.addListener(new DataAdapterListener(dto, adapter, latch), scheduler);
        adapter.startAsync();
    });
    return latch;
}
Also used : LookupDataAdapter(org.graylog2.plugin.lookup.LookupDataAdapter) DataAdapterDto(org.graylog2.lookup.dto.DataAdapterDto) CountDownLatch(java.util.concurrent.CountDownLatch)

Example 3 with LookupDataAdapter

use of org.graylog2.plugin.lookup.LookupDataAdapter in project graylog2-server by Graylog2.

the class LookupTableService method createAdapter.

protected LookupDataAdapter createAdapter(DataAdapterDto dto) {
    try {
        final LookupDataAdapter.Factory2 factory2 = adapterFactories2.get(dto.config().type());
        final LookupDataAdapter.Factory factory = adapterFactories.get(dto.config().type());
        final LookupDataAdapter adapter;
        if (factory2 != null) {
            adapter = factory2.create(dto);
        } else if (factory != null) {
            adapter = factory.create(dto.id(), dto.name(), dto.config());
        } else {
            LOG.warn("Unable to load data adapter {} of type {}, missing a factory. Is a required plugin missing?", dto.name(), dto.config().type());
            // TODO system notification
            return null;
        }
        addListeners(adapter, dto);
        return adapter;
    } catch (Exception e) {
        LOG.error("Couldn't create adapter <{}/{}>", dto.name(), dto.id(), e);
        return null;
    }
}
Also used : LookupDataAdapter(org.graylog2.plugin.lookup.LookupDataAdapter)

Example 4 with LookupDataAdapter

use of org.graylog2.plugin.lookup.LookupDataAdapter in project graylog2-server by Graylog2.

the class LookupTableService method createLookupTable.

private LookupTable createLookupTable(LookupTableDto dto) {
    final LookupCache cache = idToCache.get(dto.cacheId());
    if (cache == null) {
        LOG.warn("Lookup table {} is referencing a missing cache {}, check if it started properly.", dto.name(), dto.cacheId());
        return null;
    }
    final LookupDataAdapter adapter = idToAdapter.get(dto.dataAdapterId());
    if (adapter == null) {
        LOG.warn("Lookup table {} is referencing a missing data adapter {}, check if it started properly.", dto.name(), dto.dataAdapterId());
        return null;
    }
    final LookupDefaultSingleValue defaultSingleValue;
    try {
        defaultSingleValue = LookupDefaultSingleValue.create(dto.defaultSingleValue(), dto.defaultSingleValueType());
    } catch (Exception e) {
        LOG.error("Could not create default single value object for lookup table {}/{}: {}", dto.name(), dto.id(), e.getMessage());
        return null;
    }
    final LookupDefaultMultiValue defaultMultiValue;
    try {
        defaultMultiValue = LookupDefaultMultiValue.create(dto.defaultMultiValue(), dto.defaultMultiValueType());
    } catch (Exception e) {
        LOG.error("Could not create default multi value object for lookup table {}/{}: {}", dto.name(), dto.id(), e.getMessage());
        return null;
    }
    final LookupTable table = LookupTable.builder().id(dto.id()).name(dto.name()).description(dto.description()).title(dto.title()).cache(cache).dataAdapter(adapter).defaultSingleValue(defaultSingleValue).defaultMultiValue(defaultMultiValue).build();
    final LookupCache newCache = table.cache();
    final LookupDataAdapter newAdapter = table.dataAdapter();
    LOG.info("Starting lookup table {}/{} [@{}] using cache {}/{} [@{}], data adapter {}/{} [@{}]", table.name(), table.id(), objectId(table), newCache.name(), newCache.id(), objectId(newCache), newAdapter.name(), newAdapter.id(), objectId(newAdapter));
    final LookupTable previous = liveTables.put(dto.name(), table);
    if (previous != null) {
        LOG.info("Replaced previous lookup table {} [@{}]", previous.name(), objectId(previous));
    }
    return table;
}
Also used : LookupDataAdapter(org.graylog2.plugin.lookup.LookupDataAdapter) LookupCache(org.graylog2.plugin.lookup.LookupCache)

Example 5 with LookupDataAdapter

use of org.graylog2.plugin.lookup.LookupDataAdapter in project graylog2-server by Graylog2.

the class LookupTableService method addListeners.

protected void addListeners(LookupDataAdapter adapter, DataAdapterDto dto) {
    adapter.addListener(new LoggingServiceListener("Data Adapter", String.format(Locale.ENGLISH, "%s/%s [@%s]", dto.name(), dto.id(), objectId(adapter)), LOG), scheduler);
    // Each adapter needs to be added to the refresh scheduler
    adapter.addListener(adapterRefreshService.newServiceListener(adapter), scheduler);
}
Also used : LoggingServiceListener(org.graylog2.utilities.LoggingServiceListener)

Aggregations

LookupDataAdapter (org.graylog2.plugin.lookup.LookupDataAdapter)4 CountDownLatch (java.util.concurrent.CountDownLatch)2 DataAdapterDto (org.graylog2.lookup.dto.DataAdapterDto)2 ImmutableSet (com.google.common.collect.ImmutableSet)1 Subscribe (com.google.common.eventbus.Subscribe)1 AbstractIdleService (com.google.common.util.concurrent.AbstractIdleService)1 LookupTableDto (org.graylog2.lookup.dto.LookupTableDto)1 LookupCache (org.graylog2.plugin.lookup.LookupCache)1 LoggingServiceListener (org.graylog2.utilities.LoggingServiceListener)1