use of com.wavefront.agent.handlers.HandlerKey in project java by wavefrontHQ.
the class HttpEndToEndTest method testEndToEndEvents.
@Test
public void testEndToEndEvents() throws Exception {
AtomicInteger successfulSteps = new AtomicInteger(0);
AtomicInteger testCounter = new AtomicInteger(0);
long time = Clock.now() / 1000;
proxyPort = findAvailablePort(2898);
String buffer = File.createTempFile("proxyTestBuffer", null).getPath();
proxy = new PushAgent();
proxy.proxyConfig.server = "http://localhost:" + backendPort + "/api/";
proxy.proxyConfig.flushThreads = 1;
proxy.proxyConfig.flushThreadsEvents = 1;
proxy.proxyConfig.pushListenerPorts = String.valueOf(proxyPort);
proxy.proxyConfig.pushFlushInterval = 10000;
proxy.proxyConfig.pushRateLimitEvents = 100;
proxy.proxyConfig.bufferFile = buffer;
proxy.start(new String[] {});
waitUntilListenerIsOnline(proxyPort);
if (!(proxy.senderTaskFactory instanceof SenderTaskFactoryImpl))
fail();
if (!(proxy.queueingFactory instanceof QueueingFactoryImpl))
fail();
String payloadEvents = "@Event " + time + " \"Event name for testing\" host=host1 host=host2 tag=tag1 " + "severity=INFO multi=bar multi=baz\n" + "@Event " + time + " \"Another test event\" host=host3";
String expectedEvent1 = "{\"name\":\"Event name for testing\",\"startTime\":" + (time * 1000) + ",\"endTime\":" + (time * 1000 + 1) + ",\"annotations\":{\"severity\":\"INFO\"}," + "\"dimensions\":{\"multi\":[\"bar\",\"baz\"]},\"hosts\":[\"host1\",\"host2\"]," + "\"tags\":[\"tag1\"]}";
String expectedEvent2 = "{\"name\":\"Another test event\",\"startTime\":" + (time * 1000) + ",\"endTime\":" + (time * 1000 + 1) + ",\"annotations\":{},\"dimensions\":null," + "\"hosts\":[\"host3\"],\"tags\":null}";
server.update(req -> {
String content = req.content().toString(CharsetUtil.UTF_8);
URI uri;
try {
uri = new URI(req.uri());
} catch (Exception e) {
throw new RuntimeException(e);
}
String path = uri.getPath();
logger.fine("Content received: " + content);
assertEquals(HttpMethod.POST, req.method());
assertEquals("/api/v2/wfproxy/event", path);
switch(testCounter.incrementAndGet()) {
case 1:
assertEquals("[" + expectedEvent1 + "," + expectedEvent2 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE, "");
case 2:
assertEquals("[" + expectedEvent1 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.OK, "");
case 3:
assertEquals("[" + expectedEvent2 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.OK, "");
case 4:
assertEquals("[" + expectedEvent1 + "," + expectedEvent2 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.valueOf(407), "");
case 5:
assertEquals("[" + expectedEvent1 + "," + expectedEvent2 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.INTERNAL_SERVER_ERROR, "");
case 6:
assertEquals("[" + expectedEvent1 + "," + expectedEvent2 + "]", content);
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.OK, "");
}
logger.warning("Too many requests");
// this will force the assert to fail
successfulSteps.incrementAndGet();
return makeResponse(HttpResponseStatus.OK, "");
});
gzippedHttpPost("http://localhost:" + proxyPort + "/", payloadEvents);
HandlerKey key = HandlerKey.of(ReportableEntityType.EVENT, String.valueOf(proxyPort));
((SenderTaskFactoryImpl) proxy.senderTaskFactory).flushNow(key);
((QueueingFactoryImpl) proxy.queueingFactory).flushNow(key);
gzippedHttpPost("http://localhost:" + proxyPort + "/", payloadEvents);
((SenderTaskFactoryImpl) proxy.senderTaskFactory).flushNow(key);
for (int i = 0; i < 2; i++) ((QueueingFactoryImpl) proxy.queueingFactory).flushNow(key);
assertEquals(6, successfulSteps.getAndSet(0));
}
use of com.wavefront.agent.handlers.HandlerKey in project java by wavefrontHQ.
the class QueueingFactoryImpl method getQueueController.
@SuppressWarnings("unchecked")
@Override
public <T extends DataSubmissionTask<T>> QueueController<T> getQueueController(@Nonnull HandlerKey handlerKey, int numThreads) {
ScheduledExecutorService executor = executors.computeIfAbsent(handlerKey, x -> Executors.newScheduledThreadPool(numThreads, new NamedThreadFactory("queueProcessor-" + handlerKey.getEntityType() + "-" + handlerKey.getHandle())));
List<QueueProcessor<T>> queueProcessors = IntStream.range(0, numThreads).mapToObj(i -> (QueueProcessor<T>) getQueueProcessor(handlerKey, executor, i)).collect(Collectors.toList());
return (QueueController<T>) queueControllers.computeIfAbsent(handlerKey, x -> new QueueController<>(handlerKey, queueProcessors, backlogSize -> entityPropsFactory.get(handlerKey.getEntityType()).reportBacklogSize(handlerKey.getHandle(), backlogSize)));
}
use of com.wavefront.agent.handlers.HandlerKey in project java by wavefrontHQ.
the class QueueExporterTest method testQueueExporter.
@Test
public void testQueueExporter() throws Exception {
File file = new File(File.createTempFile("proxyTestConverter", null).getPath() + ".queue");
file.deleteOnExit();
String bufferFile = file.getAbsolutePath();
TaskQueueFactory taskQueueFactory = new TaskQueueFactoryImpl(bufferFile, false, false, 128);
EntityPropertiesFactory entityPropFactory = new DefaultEntityPropertiesFactoryForTesting();
QueueExporter qe = new QueueExporter(bufferFile, "2878", bufferFile + "-output", false, taskQueueFactory, entityPropFactory);
BufferedWriter mockedWriter = EasyMock.createMock(BufferedWriter.class);
reset(mockedWriter);
HandlerKey key = HandlerKey.of(ReportableEntityType.POINT, "2878");
TaskQueue<LineDelimitedDataSubmissionTask> queue = taskQueueFactory.getTaskQueue(key, 0);
queue.clear();
UUID proxyId = UUID.randomUUID();
LineDelimitedDataSubmissionTask task = new LineDelimitedDataSubmissionTask(null, proxyId, new DefaultEntityPropertiesForTesting(), queue, "wavefront", ReportableEntityType.POINT, "2878", ImmutableList.of("item1", "item2", "item3"), () -> 12345L);
task.enqueue(QueueingReason.RETRY);
LineDelimitedDataSubmissionTask task2 = new LineDelimitedDataSubmissionTask(null, proxyId, new DefaultEntityPropertiesForTesting(), queue, "wavefront", ReportableEntityType.POINT, "2878", ImmutableList.of("item4", "item5"), () -> 12345L);
task2.enqueue(QueueingReason.RETRY);
mockedWriter.write("item1");
mockedWriter.newLine();
mockedWriter.write("item2");
mockedWriter.newLine();
mockedWriter.write("item3");
mockedWriter.newLine();
mockedWriter.write("item4");
mockedWriter.newLine();
mockedWriter.write("item5");
mockedWriter.newLine();
TaskQueue<EventDataSubmissionTask> queue2 = taskQueueFactory.getTaskQueue(HandlerKey.of(ReportableEntityType.EVENT, "2888"), 0);
queue2.clear();
EventDataSubmissionTask eventTask = new EventDataSubmissionTask(null, proxyId, new DefaultEntityPropertiesForTesting(), queue2, "2888", ImmutableList.of(new Event(ReportEvent.newBuilder().setStartTime(123456789L * 1000).setEndTime(123456789L * 1000 + 1).setName("Event name for testing").setHosts(ImmutableList.of("host1", "host2")).setDimensions(ImmutableMap.of("multi", ImmutableList.of("bar", "baz"))).setAnnotations(ImmutableMap.of("severity", "INFO")).setTags(ImmutableList.of("tag1")).build()), new Event(ReportEvent.newBuilder().setStartTime(123456789L * 1000).setEndTime(123456789L * 1000 + 1).setName("Event name for testing").setHosts(ImmutableList.of("host1", "host2")).setAnnotations(ImmutableMap.of("severity", "INFO")).build())), () -> 12345L);
eventTask.enqueue(QueueingReason.RETRY);
mockedWriter.write("@Event 123456789000 123456789001 \"Event name for testing\" " + "\"host\"=\"host1\" \"host\"=\"host2\" \"severity\"=\"INFO\" \"multi\"=\"bar\" " + "\"multi\"=\"baz\" \"tag\"=\"tag1\"");
mockedWriter.newLine();
mockedWriter.write("@Event 123456789000 123456789001 \"Event name for testing\" " + "\"host\"=\"host1\" \"host\"=\"host2\" \"severity\"=\"INFO\"");
mockedWriter.newLine();
TaskQueue<SourceTagSubmissionTask> queue3 = taskQueueFactory.getTaskQueue(HandlerKey.of(ReportableEntityType.SOURCE_TAG, "2898"), 0);
queue3.clear();
SourceTagSubmissionTask sourceTagTask = new SourceTagSubmissionTask(null, new DefaultEntityPropertiesForTesting(), queue3, "2898", new SourceTag(ReportSourceTag.newBuilder().setOperation(SourceOperationType.SOURCE_TAG).setAction(SourceTagAction.SAVE).setSource("testSource").setAnnotations(ImmutableList.of("newtag1", "newtag2")).build()), () -> 12345L);
sourceTagTask.enqueue(QueueingReason.RETRY);
mockedWriter.write("@SourceTag action=save source=\"testSource\" \"newtag1\" \"newtag2\"");
mockedWriter.newLine();
expectLastCall().once();
replay(mockedWriter);
assertEquals(2, queue.size());
qe.processQueue(queue, mockedWriter);
assertEquals(0, queue.size());
assertEquals(1, queue2.size());
qe.processQueue(queue2, mockedWriter);
assertEquals(0, queue2.size());
assertEquals(1, queue3.size());
qe.processQueue(queue3, mockedWriter);
assertEquals(0, queue3.size());
verify(mockedWriter);
List<String> files = ConcurrentShardedQueueFile.listFiles(bufferFile, ".spool").stream().map(x -> x.replace(bufferFile + ".", "")).collect(Collectors.toList());
assertEquals(3, files.size());
assertTrue(files.contains("points.2878.0.spool_0000"));
assertTrue(files.contains("events.2888.0.spool_0000"));
assertTrue(files.contains("sourceTags.2898.0.spool_0000"));
HandlerKey k1 = HandlerKey.of(ReportableEntityType.POINT, "2878");
HandlerKey k2 = HandlerKey.of(ReportableEntityType.EVENT, "2888");
HandlerKey k3 = HandlerKey.of(ReportableEntityType.SOURCE_TAG, "2898");
files = ConcurrentShardedQueueFile.listFiles(bufferFile, ".spool");
Set<HandlerKey> hk = QueueExporter.getValidHandlerKeys(files, "all");
assertEquals(3, hk.size());
assertTrue(hk.contains(k1));
assertTrue(hk.contains(k2));
assertTrue(hk.contains(k3));
hk = QueueExporter.getValidHandlerKeys(files, "2878, 2898");
assertEquals(2, hk.size());
assertTrue(hk.contains(k1));
assertTrue(hk.contains(k3));
hk = QueueExporter.getValidHandlerKeys(files, "2888");
assertEquals(1, hk.size());
assertTrue(hk.contains(k2));
}
use of com.wavefront.agent.handlers.HandlerKey in project java by wavefrontHQ.
the class PushAgent method startDeltaCounterListener.
@VisibleForTesting
protected void startDeltaCounterListener(String strPort, SharedGraphiteHostAnnotator hostAnnotator, SenderTaskFactory senderTaskFactory, SpanSampler sampler) {
final int port = Integer.parseInt(strPort);
registerPrefixFilter(strPort);
registerTimestampFilter(strPort);
if (proxyConfig.isHttpHealthCheckAllPorts())
healthCheckManager.enableHealthcheck(port);
if (this.deltaCounterHandlerFactory == null) {
this.deltaCounterHandlerFactory = new ReportableEntityHandlerFactory() {
private final Map<String, ReportableEntityHandler<?, ?>> handlers = new ConcurrentHashMap<>();
@Override
public <T, U> ReportableEntityHandler<T, U> getHandler(HandlerKey handlerKey) {
// noinspection unchecked
return (ReportableEntityHandler<T, U>) handlers.computeIfAbsent(handlerKey.getHandle(), k -> new DeltaCounterAccumulationHandlerImpl(handlerKey, proxyConfig.getPushBlockedSamples(), senderTaskFactory.createSenderTasks(handlerKey), validationConfiguration, proxyConfig.getDeltaCountersAggregationIntervalSeconds(), rate -> entityProps.get(ReportableEntityType.POINT).reportReceivedRate(handlerKey.getHandle(), rate), blockedPointsLogger, VALID_POINTS_LOGGER));
}
@Override
public void shutdown(@Nonnull String handle) {
if (handlers.containsKey(handle)) {
handlers.values().forEach(ReportableEntityHandler::shutdown);
}
}
};
}
shutdownTasks.add(() -> deltaCounterHandlerFactory.shutdown(strPort));
WavefrontPortUnificationHandler wavefrontPortUnificationHandler = new WavefrontPortUnificationHandler(strPort, tokenAuthenticator, healthCheckManager, decoderSupplier.get(), deltaCounterHandlerFactory, hostAnnotator, preprocessors.get(strPort), () -> false, () -> false, () -> false, sampler);
startAsManagedThread(port, new TcpIngester(createInitializer(wavefrontPortUnificationHandler, port, proxyConfig.getPushListenerMaxReceivedLength(), proxyConfig.getPushListenerHttpBufferSize(), proxyConfig.getListenerIdleConnectionTimeout(), getSslContext(strPort), getCorsConfig(strPort)), port).withChildChannelOptions(childChannelOptions), "listener-deltaCounter-" + port);
}
use of com.wavefront.agent.handlers.HandlerKey in project java by wavefrontHQ.
the class InteractiveLogsTester method interactiveTest.
/**
* Read one line of stdin and print a message to stdout.
*/
@Override
public boolean interactiveTest() throws ConfigurationException {
final AtomicBoolean reported = new AtomicBoolean(false);
ReportableEntityHandlerFactory factory = new ReportableEntityHandlerFactory() {
@SuppressWarnings("unchecked")
@Override
public <T, U> ReportableEntityHandler<T, U> getHandler(HandlerKey handlerKey) {
return (ReportableEntityHandler<T, U>) new ReportableEntityHandler<ReportPoint, String>() {
@Override
public void report(ReportPoint reportPoint) {
reported.set(true);
System.out.println(ReportPointSerializer.pointToString(reportPoint));
}
@Override
public void block(ReportPoint reportPoint) {
System.out.println("Blocked: " + reportPoint);
}
@Override
public void block(@Nullable ReportPoint reportPoint, @Nullable String message) {
System.out.println("Blocked: " + reportPoint);
}
@Override
public void reject(@Nullable ReportPoint reportPoint, @Nullable String message) {
System.out.println("Rejected: " + reportPoint);
}
@Override
public void reject(@Nonnull String t, @Nullable String message) {
System.out.println("Rejected: " + t);
}
@Override
public void shutdown() {
}
};
}
@Override
public void shutdown(@Nonnull String handle) {
}
};
LogsIngester logsIngester = new LogsIngester(factory, logsIngestionConfigSupplier, prefix);
String line = stdin.nextLine();
logsIngester.ingestLog(new LogsMessage() {
@Override
public String getLogLine() {
return line;
}
@Override
public String hostOrDefault(String fallbackHost) {
try {
return InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
return "localhost";
}
}
});
logsIngester.flush();
if (!reported.get()) {
System.out.println("Input matched no groks.");
}
return stdin.hasNext();
}
Aggregations