/** {@inheritDoc} */ @Override public EventSeries searchFeatureUsageEvents(EventQueryDefinition query) { // Referenced from RDBMS implementation, same usage. return getAuditTrail(query); }
/** {@inheritDoc} */ @Override public Map<String, MutableHitCount> getUserHitCount(EventQueryDefinition query) { return getUsageCount(query, Types.USER); }
/** {@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; }
private Map<String, MutableHitCount> getUsageCount(EventQueryDefinition query, Types type) { Map<String, MutableHitCount> hitCount = new HashMap<>(); // Get events from Redis between the time range. Set<String> events = getEventsFromRedis(query); // Loop through create the buckets. for (String event : events) { Event eventObject = marshallEvent(event); String value = getValueFromAttribute(type, eventObject); MutableHitCount mutableHitCount = hitCount.get(value); if (mutableHitCount != null) { mutableHitCount.inc(); } else { mutableHitCount = new MutableHitCount(1); } hitCount.put(value, mutableHitCount); } return hitCount; }
/** {@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(); } } }
/** {@inheritDoc} */ @Override public TimeSeriesChart getFeatureUsageHistory(EventQueryDefinition query, TimeUnit tu) { TimeSeriesChart tsc = new TimeSeriesChart(query.getFrom(), query.getTo(), tu); Set<String> events = getEventsFromRedis(query); for (String event : events) { tsc.addEvent(marshallEvent(event)); } return tsc; }
/** {@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; }
/** * 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 Map<String, MutableHitCount> getHostHitCount(EventQueryDefinition query) { return getUsageCount(query, Types.HOST); }
/** {@inheritDoc} */ @Override public Map<String, MutableHitCount> getFeatureUsageHitCount(EventQueryDefinition query) { return getUsageCount(query, Types.NAME); }
/** {@inheritDoc} */ @Override public Map<String, MutableHitCount> getSourceHitCount(EventQueryDefinition query) { return getUsageCount(query, Types.SOURCE); }