Beispiel #1
0
 private Map<String, ZonedDateTime> findTimestamps(ElasticsearchMessage message) {
   final TypeConstraint<ZonedDateTime> timestampConstraint =
       TypeConstraint.ofClass(ZonedDateTime.class);
   return message
       .toMap()
       .entrySet()
       .stream()
       .filter(entry -> timestampConstraint.canCast(entry.getValue()))
       .collect(
           Collectors.<Map.Entry<String, Object>, String, ZonedDateTime>toMap(
               entry -> entry.getKey(), entry -> timestampConstraint.cast(entry.getValue())));
 }
Beispiel #2
0
 @Override
 public void accept(ElasticsearchMessage message) {
   try {
     List<ElasticsearchIndex> indices = message.getIndices();
     if (indices.isEmpty()) {
       if (LOGGER.isTraceEnabled()) {
         LOGGER.trace(
             String.format(
                 "No index found for message %s. Storing under default index %s",
                 message, defaultIndex.toString()));
       }
       storeMessageToIndex(message, defaultIndex);
     } else {
       indices.stream().forEach(index -> storeMessageToIndex(message, index));
     }
   } catch (ConcurrentModificationException e) {
     LOGGER.error("Error storing message", e);
   }
 }
Beispiel #3
0
  /**
   * Adds an index request to store a single message to a single index.
   *
   * @param message The message to index.
   * @param index The index of the message.
   * @param metrics The metrics to record the storage in.
   */
  private void storeMessageToIndex(ElasticsearchMessage message, ElasticsearchIndex index) {
    /*
     * Implementation note: Elasticsearch is not happy about the ZonedDateTime toString format, so we need to format
     * the timestamp using a time zone offset instead.
     */
    Map<String, Object> sourceMap = message.toMap();
    Map<String, String> formattedTimestamps = formatTimestamps(findTimestamps(message));
    if (!formattedTimestamps.containsKey(ElasticsearchMessage.DEFAULT_TIMESTAMP_FIELD)) {
      formattedTimestamps.put(
          ElasticsearchMessage.DEFAULT_TIMESTAMP_FIELD, formatTimestamp(ZonedDateTime.now()));
    }

    sourceMap.putAll(formattedTimestamps);

    IndexRequest request = new IndexRequest(index.toString(), documentType).source(sourceMap);
    processor.add(request);
    if (LOGGER.isTraceEnabled()) {
      LOGGER.trace(String.format("Added message to %s with data: %s", index, sourceMap));
    }
  }