package com.lambdaworks.redis;
import static com.google.code.tempusfugit.temporal.Duration.seconds;
import static com.google.code.tempusfugit.temporal.Timeout.timeout;
import static com.lambdaworks.redis.AbstractRedisClientTest.client;
import static org.assertj.core.api.Assertions.assertThat;
import com.lambdaworks.redis.api.sync.RedisCommands;
import com.lambdaworks.redis.metrics.CommandLatencyId;
import com.lambdaworks.redis.metrics.CommandMetrics;
import org.junit.*;
import org.springframework.test.util.ReflectionTestUtils;
import com.google.code.tempusfugit.temporal.Condition;
import com.google.code.tempusfugit.temporal.WaitFor;
import com.lambdaworks.redis.api.StatefulRedisConnection;
import com.lambdaworks.redis.event.Event;
import com.lambdaworks.redis.event.EventBus;
import com.lambdaworks.redis.event.metrics.CommandLatencyEvent;
import com.lambdaworks.redis.event.metrics.MetricEventPublisher;
import rx.Subscription;
import rx.functions.Func1;
import rx.observers.TestSubscriber;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author Mark Paluch
*/
public class ClientMetricsTest extends AbstractTest {
private RedisCommands<String, String> redis;
@BeforeClass
public static void setupClient() {
client = RedisClient.create(RedisURI.Builder.redis(host, port).build());
}
@Before
public void before() throws Exception {
redis = client.connect().sync();
}
@AfterClass
public static void afterClass() {
FastShutdown.shutdown(client);
}
@Test
public void testMetricsEvent() throws Exception {
EventBus eventBus = client.getResources().eventBus();
MetricEventPublisher publisher = (MetricEventPublisher) ReflectionTestUtils.getField(client.getResources(),
"metricEventPublisher");
publisher.emitMetricsEvent();
TestSubscriber<CommandLatencyEvent> subscriber = new TestSubscriber<CommandLatencyEvent>();
Subscription subscription = eventBus.get().filter(redisEvent -> redisEvent instanceof CommandLatencyEvent).cast(CommandLatencyEvent.class).subscribe(subscriber);
generateTestData();
publisher.emitMetricsEvent();
WaitFor.waitOrTimeout(() -> !subscriber.getOnNextEvents().isEmpty(), timeout(seconds(5)));
subscription.unsubscribe();
subscriber.assertValueCount(1);
}
@Test
public void testMetrics() throws Exception {
EventBus eventBus = client.getResources().eventBus();
MetricEventPublisher publisher = (MetricEventPublisher) ReflectionTestUtils.getField(client.getResources(),
"metricEventPublisher");
publisher.emitMetricsEvent();
TestSubscriber<CommandLatencyEvent> subscriber = new TestSubscriber<CommandLatencyEvent>();
Subscription subscription = eventBus.get().filter(redisEvent -> redisEvent instanceof CommandLatencyEvent).cast(CommandLatencyEvent.class).subscribe(subscriber);
generateTestData();
publisher.emitMetricsEvent();
WaitFor.waitOrTimeout(() -> !subscriber.getOnNextEvents().isEmpty(), timeout(seconds(5)));
subscription.unsubscribe();
subscriber.assertValueCount(1);
CommandLatencyEvent event = subscriber.getOnNextEvents().get(0);
Set<CommandLatencyId> ids = event.getLatencies().keySet();
CommandMetrics commandMetrics = event.getLatencies().get(ids.iterator().next());
assertThat(commandMetrics.getCompletion().getMin()).isBetween(0L, TimeUnit.MILLISECONDS.toMicros(100));
assertThat(commandMetrics.getCompletion().getMax()).isBetween(0L, TimeUnit.MILLISECONDS.toMicros(200));
assertThat(commandMetrics.getFirstResponse().getMin()).isBetween(0L, TimeUnit.MILLISECONDS.toMicros(100));
assertThat(commandMetrics.getFirstResponse().getMax()).isBetween(0L, TimeUnit.MILLISECONDS.toMicros(200));
}
private void generateTestData() {
redis.set(key, value);
redis.set(key, value);
redis.set(key, value);
redis.set(key, value);
redis.set(key, value);
redis.set(key, value);
redis.get(key);
redis.get(key);
redis.get(key);
redis.get(key);
redis.get(key);
}
}