/** {@inheritDoc} */ public boolean saveEvent(Event evt) { if (evt == null) { throw new IllegalArgumentException("Event cannot be null nor empty"); } Jedis jedis = null; try { jedis = getJedis(); long timeStamp = evt.getTimestamp(); String hashId = this.getHashKey(evt.getTimestamp(), evt.getAction()); evt.setUuid(String.valueOf(timeStamp)); jedis.zadd(hashId, timeStamp, objectMapper.writeValueAsString(evt)); return true; } catch (JsonProcessingException e) { // We do not returned false, it will be retried 3 times for nothing, faile immediately throw new IllegalArgumentException("Cannot save event : invalid object", e); } finally { if (jedis != null) { jedis.close(); } } }
/** * Method that reads the raw event stream from Redis. * * @param query - The query object containing details about the query. * @return Set containing raw events. */ private Set<String> getEventsFromRedis(EventQueryDefinition query) { Jedis jedis = null; Set<String> events = null; try { jedis = getJedis(); String hashKey = getHashKey(query.getFrom(), null); events = jedis.zrangeByScore(hashKey, query.getFrom(), query.getTo(), 0, UPPER_LIMIT); } finally { if (jedis != null) { jedis.close(); } } return events; }
/** {@inheritDoc} */ @Override public Event getEventByUUID(String uuid, Long timestamp) { Util.assertHasLength(new String[]{uuid}); Event redisEvent = null; Jedis jedis = null; try { jedis = getJedis(); String hashKey = getHashKey(timestamp, null); // Check for the event within 100ms time range passed, hoping there won't be more than 10 for this. Set<String> events = jedis.zrangeByScore(hashKey, timestamp - 100L, timestamp + 100L, 0, 10); // Loop through the result set and match the timestamp passed in. for (String evt : events) { Event event = marshallEvent(evt); if (timestamp == event.getTimestamp()) { return event; } } } finally { if (jedis != null) { jedis.close(); } } return redisEvent; }
/** {@inheritDoc} */ @Override public EventSeries getAuditTrail(EventQueryDefinition query) { Jedis jedis = null; EventSeries eventSeries = new EventSeries(); try { jedis = getJedis(); String hashKey = getHashKey(query.getFrom(), EventConstants.ACTION_CHECK_OK); Set<String> events = jedis.zrangeByScore(hashKey, query.getFrom(), query.getTo(), 0, 100); // FIXME: Server side pagination model isn't present? This could be a lot of data. for (String event : events) { eventSeries.add(marshallEvent(event)); } } finally { if (jedis != null) { jedis.close(); } } return eventSeries; }