/*
* Copyright 2013-2014 Splunk, Inc.
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
import java.util.*;
import com.splunk.logging.HttpEventCollectorErrorHandler;
import com.splunk.logging.HttpEventCollectorEventInfo;
import org.junit.Assert;
import org.junit.Test;
import java.util.logging.Logger;
public final class HttpEventCollector_JavaLoggingTest {
private String httpEventCollectorName = "JavaLoggingTest";
List<List<HttpEventCollectorEventInfo>> errors = new ArrayList<List<HttpEventCollectorEventInfo>>();
List<HttpEventCollectorErrorHandler.ServerErrorException> logEx = new ArrayList<HttpEventCollectorErrorHandler.ServerErrorException>();
/**
* sending a message via httplogging using log4j2 to splunk
*/
@Test
public void canSendEventUsingJavaLogging() throws Exception {
TestUtil.enableHttpEventCollector();
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "splunkLoggerNoOptions";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_logger_name", loggerName);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Date date = new Date();
String jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging canSendEventUsingJavaLogging}", date.toString());
Logger logger = Logger.getLogger(loggerName);
logger.info(jsonMsg);
TestUtil.verifyOneAndOnlyOneEventSentToSplunk(jsonMsg);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
}
/**
* sending a message via httplogging using log4j2 to splunk
*/
@Test
public void canSendEventUsingJavaLoggingWithOptions() throws Exception {
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "splunkLoggerWithOptions";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_host", "host.example.com");
userInputs.put("user_index", "main");
userInputs.put("user_source", "splunktest");
userInputs.put("user_sourcetype", "battlecat");
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Date date = new Date();
String jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging canSendEventUsingJavaLoggingWithOptions}", date.toString());
Logger logger = Logger.getLogger(loggerName);
logger.info(jsonMsg);
TestUtil.verifyOneAndOnlyOneEventSentToSplunk(jsonMsg);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
}
/**
* sending batched message via httplogging to splunk
*/
@Test
public void sendBatchedEventsUsingJavaLogging() throws Exception {
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "splunkBatchLogger";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_batch_interval", "0");
userInputs.put("user_batch_size_bytes", "0");
userInputs.put("user_batch_size_count", "0");
userInputs.put("user_logger_name", loggerName);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Date date = new Date();
String jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging sendBatchedEventsUsingJavaLogging}", date.toString());
Logger logger = Logger.getLogger(loggerName);
logger.info(jsonMsg);
TestUtil.verifyOneAndOnlyOneEventSentToSplunk(jsonMsg);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
}
/**
* sending batched message using java.logging with batched_size_count
*/
@Test
public void sendBatchedEventsByCount() throws Exception {
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
//clean out the events cache by setting send events immediately
String loggerName = "splunkLoggerCountCleanCache";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_logger_name", loggerName);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
String jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging sendBatchedEventsByCount}", new Date().toString());
Logger logger = Logger.getLogger(loggerName);
logger.info(jsonMsg);
loggerName = "splunkBatchLoggerCount";
userInputs.clear();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_batch_interval","0");
userInputs.put("user_batch_size_count", "5");
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_host", "host.example.com");
userInputs.put("user_source", "splunktest_BatchCount");
userInputs.put("user_sourcetype", "battlecat_BatchCount");
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
logger = Logger.getLogger(loggerName);
List<String> msgs = new ArrayList<String>();
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging1}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
System.out.println("event 1");
TestUtil.verifyNoEventSentToSplunk(msgs);
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging2}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
System.out.println("event 2");
TestUtil.verifyNoEventSentToSplunk(msgs);
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging3}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
System.out.println("event 3");
TestUtil.verifyNoEventSentToSplunk(msgs);
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging4}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
System.out.println("event 4");
TestUtil.verifyNoEventSentToSplunk(msgs);
Thread.sleep(6000);
TestUtil.verifyNoEventSentToSplunk(msgs);
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging5}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
TestUtil.verifyEventsSentToSplunk(msgs);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
}
/**
* sending batched message using java.logging with batched_size_bytes
*/
@Test
public void sendBatchedEventsByBatchsize() throws Exception {
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "splunkBatchLoggerSize";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_batch_interval","0");
userInputs.put("user_batch_size_bytes", "500");
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_host", "host.example.com");
userInputs.put("user_source", "splunktest_BatchSize");
userInputs.put("user_sourcetype", "battlecat_BatchSize");
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Logger logger = Logger.getLogger(loggerName);
List<String> msgs = new ArrayList<String>();
int size = 0;
String jsonMsg = String.format("{EventDate:%s, EventMsg:'test event for java logging size 1}", new Date().toString());
size += jsonMsg.length();
logger.info(jsonMsg);
msgs.add(jsonMsg);
jsonMsg = String.format("{EventDate:%s, EventMsg:'test event for java logging size 2}", new Date().toString());
size += jsonMsg.length();
logger.info(jsonMsg);
msgs.add(jsonMsg);
Thread.sleep(6000);
TestUtil.verifyNoEventSentToSplunk(msgs);
jsonMsg = String.format("{EventDate:%s, EventMsg:'test event for java logging size 3, adding more msg to exceed the maxsize}", new Date().toString());
while (size + jsonMsg.length() < 550) {
jsonMsg = String.format("%saaaaa", jsonMsg);
}
logger.info(jsonMsg);
msgs.add(jsonMsg);
TestUtil.verifyEventsSentToSplunk(msgs);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
}
/**
* error handling
*/
@Test
public void errorHandlingInvalidToken() throws Exception {
errors.clear();
logEx.clear();
//define error callback
HttpEventCollectorErrorHandler.onError(new HttpEventCollectorErrorHandler.ErrorCallback() {
public void error(final List<HttpEventCollectorEventInfo> data, final Exception ex) {
synchronized (errors) {
errors.add(data);
logEx.add((HttpEventCollectorErrorHandler.ServerErrorException) ex);
}
}
});
//create a token used for httpEventCollector logging, then make it becomes invalid
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "errorHandlingInvalidToken";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_httpEventCollector_token", token);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Logger logger = Logger.getLogger(loggerName);
//disable the token so that it becomes invalid
TestUtil.disableHttpEventCollector(httpEventCollectorName);
Thread.sleep(5000);
String jsonMsg = String.format("{EventDate:%s, EventMsg:'test event disabled token }", new Date().toString());
logger.info(jsonMsg);
Thread.sleep(2000);
//delete the token so that it becomes invalid
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
Thread.sleep(5000);
jsonMsg = String.format("{EventDate:%s, EventMsg:'test event deleted token}", new Date().toString());
logger.info(jsonMsg);
//wait for async process to return the error
long startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 60 * 1000)/*wait for up to 60s*/ {
if (logEx.size() >= 2)
break;
Thread.sleep(1000);
}
if (logEx == null)
Assert.fail("didn't catch errors");
System.out.println("======print logEx");
System.out.println(logEx.toString());
System.out.println("======finish print logEx");
Assert.assertEquals("Invalid token", logEx.get(1).getErrorText());
Assert.assertEquals(4, logEx.get(1).getErrorCode());
for (List<HttpEventCollectorEventInfo> infos : errors) {
for (HttpEventCollectorEventInfo info : infos) {
System.out.println(info.getMessage());
}
}
Assert.assertEquals(2, errors.size());
}
/**
* error handling
*/
@Test
public void errorHandlingDisabledHttpEventCollectorEndpoint() throws Exception {
errors.clear();
logEx.clear();
//define error callback
HttpEventCollectorErrorHandler.onError(new HttpEventCollectorErrorHandler.ErrorCallback() {
public void error(final List<HttpEventCollectorEventInfo> data, final Exception ex) {
synchronized (errors) {
errors.add(data);
logEx.add((HttpEventCollectorErrorHandler.ServerErrorException) ex);
}
}
});
//create a token used for httpEventCollector logging, then make it becomes invalid
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "disabledendpoint";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_httpEventCollector_token", token);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Logger logger = Logger.getLogger(loggerName);
//disable httpEventCollector endpoint
TestUtil.disableHttpEventCollector();
String jsonMsg = String.format("{EventDate:%s, EventMsg:'test event httpEventCollector disabled}", new Date().toString());
logger.info(jsonMsg);
//wait for async process to return the error
long startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 60 * 1000)/*wait for up to 60s*/ {
if (logEx.size() >= 1)
break;
Thread.sleep(1000);
}
if (logEx == null)
Assert.fail("didn't catch errors");
Assert.assertEquals(1, errors.size());
System.out.println(logEx.toString());
if(!logEx.toString().contains("Connection refused"))
Assert.fail(String.format("Unexpected error message '%s'", logEx.toString()));
}
/**
* sending batched message using java.logging with batched_size_count
*/
@Test
public void EventsFlushedAfterCloseLogger() throws Exception {
String msgs = queueEvents();
// Thread.sleep(9000);
// TestUtil.verifyOneAndOnlyOneEventSentToSplunk(msgs);
}
private String queueEvents() throws Exception {
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
//clean out the events cache by setting send events immediately
String loggerName = "splunkLoggerqueueEventsCleanCache";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_logger_name", loggerName);
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
String jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging}", new Date().toString());
Logger logger = Logger.getLogger(loggerName);
logger.info(jsonMsg);
loggerName = "splunkBatchLoggerCount";
userInputs.clear();
userInputs.put("user_httpEventCollector_token", token);
//userInputs.put("user_batch_interval","0");
userInputs.put("user_batch_size_count", "5");
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_host", "host.example.com");
userInputs.put("user_source", "splunktest_BatchCount");
userInputs.put("user_sourcetype", "battlecat_BatchCount");
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
logger = Logger.getLogger(loggerName);
List<String> msgs = new ArrayList<String>();
jsonMsg = String.format("{EventDate:%s, EventMsg:'this is a test event for java logging1}", new Date().toString());
logger.info(jsonMsg);
msgs.add(jsonMsg);
TestUtil.verifyNoEventSentToSplunk(msgs);
return jsonMsg;
}
/**
* verify events are index in correct order of the events were sent
*/
@Test
public void eventsIsIndexedInOrderOfSent() throws Exception {
TestUtil.enableHttpEventCollector();
String indexName="httpevents_in_order";
TestUtil.createIndex(indexName);
String token = TestUtil.createHttpEventCollectorToken(httpEventCollectorName);
String loggerName = "splunkLoggerMultipleEvents";
HashMap<String, String> userInputs = new HashMap<String, String>();
userInputs.put("user_httpEventCollector_token", token);
userInputs.put("user_logger_name", loggerName);
userInputs.put("user_index", indexName);
userInputs.put("user_send_mode", "sequential");
TestUtil.resetJavaLoggingConfiguration("logging_template.properties", "logging.properties", userInputs);
Logger logger = Logger.getLogger(loggerName);
//send multiple events and verify they are indexed in the order of sending
List<String> msgs = new ArrayList<String>();
Date date = new Date();
int totalEventsCount = 1000;
String prefix="javalogging multiple events";
for (int i = 0; i < totalEventsCount; i++) {
String jsonMsg = String.format("%s %s", prefix,i);
logger.info(jsonMsg);
msgs.add(jsonMsg);
}
TestUtil.verifyEventsSentInOrder(prefix, totalEventsCount, indexName);
TestUtil.deleteHttpEventCollectorToken(httpEventCollectorName);
System.out.println("====================== Test pass=========================");
}
}