blob: e69b6525ef2e31eb33bc26aa05ebf335880aa033 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.metron.parsers;
import org.apache.commons.io.IOUtils;
import org.apache.metron.parsers.interfaces.MessageParserResult;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
public class MultiLineGrokParserTest {
/**
* Test that if a byte[] with multiple lines of log is passed in
* it will be parsed into the correct number of messages.
*/
@Test
@SuppressWarnings("unchecked")
public void testLegacyInterfaceReturnsMultiline() {
Map<String, Object> parserConfig = new HashMap<>();
parserConfig.put("grokPath", getGrokPath());
parserConfig.put("patternLabel", getGrokPatternLabel());
parserConfig.put("timestampField", getTimestampField());
parserConfig.put("dateFormat", getDateFormat());
parserConfig.put("timeFields", getTimeFields());
parserConfig.put("multiLine", getMultiLine());
GrokParser grokParser = new GrokParser();
grokParser.configure(parserConfig);
grokParser.init();
JSONParser jsonParser = new JSONParser();
Map<String, String> testData = getTestData();
for (Map.Entry<String, String> e : testData.entrySet()) {
byte[] rawMessage = e.getKey().getBytes(StandardCharsets.UTF_8);
Optional<MessageParserResult<JSONObject>> resultOptional = grokParser.parseOptionalResult(rawMessage);
assertNotNull(resultOptional);
assertTrue(resultOptional.isPresent());
List<JSONObject> parsedList = resultOptional.get().getMessages();
assertEquals(10, parsedList.size());
}
}
/**
* Test that if a byte[] with multiple lines of log is passed in
* it will be parsed into the correct number of messages using the
* parseOptionalResult call.
*/
@Test
@SuppressWarnings("unchecked")
public void testOptionalResultReturnsMultiline() {
Map<String, Object> parserConfig = new HashMap<>();
parserConfig.put("grokPath", getGrokPath());
parserConfig.put("patternLabel", getGrokPatternLabel());
parserConfig.put("timestampField", getTimestampField());
parserConfig.put("dateFormat", getDateFormat());
parserConfig.put("timeFields", getTimeFields());
parserConfig.put("multiLine", getMultiLine());
GrokParser grokParser = new GrokParser();
grokParser.configure(parserConfig);
grokParser.init();
JSONParser jsonParser = new JSONParser();
Map<String, String> testData = getTestData();
for (Map.Entry<String, String> e : testData.entrySet()) {
byte[] rawMessage = e.getKey().getBytes(StandardCharsets.UTF_8);
Optional<MessageParserResult<JSONObject>> resultOptional = grokParser.parseOptionalResult(rawMessage);
assertTrue(resultOptional.isPresent());
Optional<Throwable> throwableOptional = resultOptional.get().getMasterThrowable();
List<JSONObject> resultList = resultOptional.get().getMessages();
Map<Object,Throwable> errorMap = resultOptional.get().getMessageThrowables();
assertFalse(throwableOptional.isPresent());
assertEquals(0, errorMap.size());
assertEquals(10, resultList.size());
}
}
@SuppressWarnings("unchecked")
public Map getTestData() {
Map testData = new HashMap<String, String>();
String input;
try (FileInputStream stream = new FileInputStream(new File("src/test/resources/logData/multi_elb_log.txt"))) {
input = IOUtils.toString(stream);
} catch (IOException ioe) {
throw new IllegalStateException("failed to open file", ioe);
}
// not checking values, just that we get the right number of messages
testData.put(input, "");
return testData;
}
public String getMultiLine() { return "true";}
public String getGrokPath() {
return "../../metron-integration-test/src/main/sample/patterns/test";
}
public String getGrokPatternLabel() {
return "ELBACCESSLOGS";
}
public List<String> getTimeFields() {
return new ArrayList<String>() {{
add("timestamp");
}};
}
public String getDateFormat() {
return "yyyy-MM-dd'T'HH:mm:ss.S'Z'";
}
public String getTimestampField() {
return "timestamp";
}
}