Search in sources :

Example 11 with Parameters

use of io.mantisrx.runtime.parameter.Parameters in project mantis by Netflix.

the class KafkaSourceTest method testKafkaSourceSingleConsumerHandlesMessageParseFailures.

@Test
public void testKafkaSourceSingleConsumerHandlesMessageParseFailures() throws InterruptedException {
    String testTopic = "testTopic" + topicNum.incrementAndGet();
    int numPartitions = 1;
    kafkaServer.createTopic(testTopic, numPartitions);
    int numMessages = 10;
    for (int i = 0; i < numMessages; i++) {
        ProducerRecord<String, String> keyedMessage = new ProducerRecord<>(testTopic, "{\"messageNum\":" + i + "}");
        kafkaServer.sendMessages(keyedMessage);
        ProducerRecord<String, String> invalidJsonMessage = new ProducerRecord<>(testTopic, "{\"messageNum:" + i + "}");
        kafkaServer.sendMessages(invalidJsonMessage);
    }
    KafkaSource kafkaSource = new KafkaSource(new NoopRegistry());
    Context context = mock(Context.class);
    Parameters params = ParameterTestUtils.createParameters(KafkaSourceParameters.TOPIC, testTopic, KafkaSourceParameters.PREFIX + ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest", KafkaSourceParameters.PREFIX + ConsumerConfig.GROUP_ID_CONFIG, "testKafkaConsumer-" + random.nextInt());
    when(context.getParameters()).then((Answer<Parameters>) invocation -> params);
    when(context.getWorkerInfo()).then((Answer<WorkerInfo>) invocation -> new WorkerInfo("testJobName", "testJobName-1", 1, 0, 1, MantisJobDurationType.Perpetual, "1.1.1.1"));
    when(context.getJobId()).then((Answer<String>) invocation -> "testJobName-1");
    Index index = new Index(0, 10);
    Observable<Observable<KafkaAckable>> sourceObs = kafkaSource.call(context, index);
    final CountDownLatch latch = new CountDownLatch(numMessages);
    final AtomicInteger counter = new AtomicInteger(0);
    sourceObs.flatMap(kafkaAckableObs -> kafkaAckableObs).map(kafkaAckable -> {
        Optional<Map<String, Object>> parsedEvent = kafkaAckable.getKafkaData().getParsedEvent();
        assertTrue(parsedEvent.isPresent());
        assertEquals(counter.getAndIncrement(), parsedEvent.get().get("messageNum"));
        LOGGER.info("got message on topic {} consumer Id {}", parsedEvent.get(), kafkaAckable.getKafkaData().getMantisKafkaConsumerId());
        kafkaAckable.ack();
        latch.countDown();
        return parsedEvent;
    }).subscribe();
    assertTrue("timed out waiting to get all messages from Kafka", latch.await(30, TimeUnit.SECONDS));
    kafkaServer.deleteTopic(testTopic);
}
Also used : Context(io.mantisrx.runtime.Context) NoopRegistry(com.netflix.spectator.api.NoopRegistry) Index(io.mantisrx.runtime.source.Index) KafkaSourceParameters(io.mantisrx.connector.kafka.KafkaSourceParameters) ProducerRecord(org.apache.kafka.clients.producer.ProducerRecord) BeforeClass(org.junit.BeforeClass) MantisJobDurationType(io.mantisrx.runtime.MantisJobDurationType) LoggerFactory(org.slf4j.LoggerFactory) ParameterTestUtils(io.mantisrx.connector.kafka.ParameterTestUtils) Parameters(io.mantisrx.runtime.parameter.Parameters) Random(java.util.Random) Observable(rx.Observable) Answer(org.mockito.stubbing.Answer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KafkaAckable(io.mantisrx.connector.kafka.KafkaAckable) Map(java.util.Map) AfterClass(org.junit.AfterClass) Logger(org.slf4j.Logger) TestCase.fail(junit.framework.TestCase.fail) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Assert.assertTrue(org.junit.Assert.assertTrue) Set(java.util.Set) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Context(io.mantisrx.runtime.Context) TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) ConcurrentSkipListSet(java.util.concurrent.ConcurrentSkipListSet) Ignore(org.junit.Ignore) KafkaUnit(info.batey.kafka.unit.KafkaUnit) Optional(java.util.Optional) Assert.assertEquals(org.junit.Assert.assertEquals) Mockito.mock(org.mockito.Mockito.mock) WorkerInfo(io.mantisrx.runtime.WorkerInfo) KafkaSourceParameters(io.mantisrx.connector.kafka.KafkaSourceParameters) Parameters(io.mantisrx.runtime.parameter.Parameters) Optional(java.util.Optional) WorkerInfo(io.mantisrx.runtime.WorkerInfo) Index(io.mantisrx.runtime.source.Index) CountDownLatch(java.util.concurrent.CountDownLatch) Observable(rx.Observable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) NoopRegistry(com.netflix.spectator.api.NoopRegistry) ProducerRecord(org.apache.kafka.clients.producer.ProducerRecord) Test(org.junit.Test)

Example 12 with Parameters

use of io.mantisrx.runtime.parameter.Parameters in project mantis by Netflix.

the class KafkaSourceTest method testKafkaSourceMultipleConsumersStaticPartitionAssignment.

@Test
public void testKafkaSourceMultipleConsumersStaticPartitionAssignment() throws InterruptedException {
    String testTopic = "testTopic" + topicNum.incrementAndGet();
    int numConsumers = 3;
    int numPartitions = 3;
    kafkaServer.createTopic(testTopic, numPartitions);
    int numMessages = 10;
    Set<Integer> outstandingMsgs = new ConcurrentSkipListSet<>();
    for (int i = 0; i < numMessages; i++) {
        ProducerRecord<String, String> keyedMessage = new ProducerRecord<>(testTopic, "{\"messageNum\":" + i + "}");
        kafkaServer.sendMessages(keyedMessage);
        outstandingMsgs.add(i);
    }
    KafkaSource kafkaSource = new KafkaSource(new NoopRegistry());
    Context context = mock(Context.class);
    Parameters params = ParameterTestUtils.createParameters(KafkaSourceParameters.NUM_KAFKA_CONSUMER_PER_WORKER, numConsumers, KafkaSourceParameters.TOPIC, testTopic, KafkaSourceParameters.ENABLE_STATIC_PARTITION_ASSIGN, true, KafkaSourceParameters.TOPIC_PARTITION_COUNTS, testTopic + ":" + numPartitions, KafkaSourceParameters.PREFIX + ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest", KafkaSourceParameters.PREFIX + ConsumerConfig.GROUP_ID_CONFIG, "testKafkaConsumer-" + random.nextInt());
    when(context.getParameters()).then((Answer<Parameters>) invocation -> params);
    when(context.getWorkerInfo()).then((Answer<WorkerInfo>) invocation -> new WorkerInfo("testJobName", "testJobName-1", 1, 0, 1, MantisJobDurationType.Perpetual, "1.1.1.1"));
    when(context.getJobId()).then((Answer<String>) invocation -> "testJobName-1");
    // Force all consumer instances to be created on same JVM by setting total number of workers for this job to 1
    int totalNumWorkerForJob = 1;
    Index index = new Index(0, totalNumWorkerForJob);
    Observable<Observable<KafkaAckable>> sourceObs = kafkaSource.call(context, index);
    final CountDownLatch latch = new CountDownLatch(numMessages);
    final Map<Integer, Integer> lastMessageNumByConsumerId = new ConcurrentHashMap<>();
    sourceObs.flatMap(kafkaAckableObs -> kafkaAckableObs).map(kafkaAckable -> {
        Optional<Map<String, Object>> parsedEvent = kafkaAckable.getKafkaData().getParsedEvent();
        assertTrue(parsedEvent.isPresent());
        Integer messageNum = (Integer) parsedEvent.get().get("messageNum");
        assertTrue(outstandingMsgs.contains(messageNum));
        outstandingMsgs.remove(messageNum);
        int mantisKafkaConsumerId = kafkaAckable.getKafkaData().getMantisKafkaConsumerId();
        lastMessageNumByConsumerId.putIfAbsent(mantisKafkaConsumerId, -1);
        // assert consumption of higher message numbers across consumer instances
        assertTrue(messageNum > lastMessageNumByConsumerId.get(mantisKafkaConsumerId));
        lastMessageNumByConsumerId.put(mantisKafkaConsumerId, messageNum);
        LOGGER.info("got message on topic {} consumer id {}", parsedEvent.get(), mantisKafkaConsumerId);
        kafkaAckable.ack();
        latch.countDown();
        return parsedEvent;
    }).doOnError(t -> {
        LOGGER.error("caught unexpected exception", t);
        fail("test failed due to unexpected error " + t.getMessage());
    }).subscribe();
    assertTrue("timed out waiting to get all messages from Kafka", latch.await(10, TimeUnit.SECONDS));
    assertEquals(0, outstandingMsgs.size());
    assertTrue(lastMessageNumByConsumerId.keySet().size() == numConsumers);
    lastMessageNumByConsumerId.keySet().forEach(consumerId -> {
        assertTrue(lastMessageNumByConsumerId.get(consumerId) >= 0);
    });
    kafkaServer.deleteTopic(testTopic);
}
Also used : Context(io.mantisrx.runtime.Context) NoopRegistry(com.netflix.spectator.api.NoopRegistry) Index(io.mantisrx.runtime.source.Index) KafkaSourceParameters(io.mantisrx.connector.kafka.KafkaSourceParameters) ProducerRecord(org.apache.kafka.clients.producer.ProducerRecord) BeforeClass(org.junit.BeforeClass) MantisJobDurationType(io.mantisrx.runtime.MantisJobDurationType) LoggerFactory(org.slf4j.LoggerFactory) ParameterTestUtils(io.mantisrx.connector.kafka.ParameterTestUtils) Parameters(io.mantisrx.runtime.parameter.Parameters) Random(java.util.Random) Observable(rx.Observable) Answer(org.mockito.stubbing.Answer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KafkaAckable(io.mantisrx.connector.kafka.KafkaAckable) Map(java.util.Map) AfterClass(org.junit.AfterClass) Logger(org.slf4j.Logger) TestCase.fail(junit.framework.TestCase.fail) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Assert.assertTrue(org.junit.Assert.assertTrue) Set(java.util.Set) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Context(io.mantisrx.runtime.Context) TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) ConcurrentSkipListSet(java.util.concurrent.ConcurrentSkipListSet) Ignore(org.junit.Ignore) KafkaUnit(info.batey.kafka.unit.KafkaUnit) Optional(java.util.Optional) Assert.assertEquals(org.junit.Assert.assertEquals) Mockito.mock(org.mockito.Mockito.mock) WorkerInfo(io.mantisrx.runtime.WorkerInfo) KafkaSourceParameters(io.mantisrx.connector.kafka.KafkaSourceParameters) Parameters(io.mantisrx.runtime.parameter.Parameters) ConcurrentSkipListSet(java.util.concurrent.ConcurrentSkipListSet) WorkerInfo(io.mantisrx.runtime.WorkerInfo) Index(io.mantisrx.runtime.source.Index) CountDownLatch(java.util.concurrent.CountDownLatch) Observable(rx.Observable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) NoopRegistry(com.netflix.spectator.api.NoopRegistry) ProducerRecord(org.apache.kafka.clients.producer.ProducerRecord) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Test(org.junit.Test)

Example 13 with Parameters

use of io.mantisrx.runtime.parameter.Parameters in project mantis by Netflix.

the class KafkaSink method call.

@Override
public void call(Context context, PortRequest ignore, Observable<T> dataO) {
    if (kafkaProducerAtomicRef.get() == null) {
        MantisKafkaProducerConfig mantisKafkaProducerConfig = new MantisKafkaProducerConfig(context);
        Map<String, Object> producerProperties = mantisKafkaProducerConfig.getProducerProperties();
        KafkaProducer<byte[], byte[]> kafkaProducer = new KafkaProducer<>(producerProperties);
        kafkaProducerAtomicRef.compareAndSet(null, kafkaProducer);
        logger.info("Kafka Producer initialized");
    }
    KafkaProducer<byte[], byte[]> kafkaProducer = kafkaProducerAtomicRef.get();
    Parameters parameters = context.getParameters();
    String topic = (String) parameters.get(KafkaSinkJobParameters.TOPIC);
    dataO.map(encoder::call).flatMap((dataBytes) -> Observable.from(kafkaProducer.send(new ProducerRecord<>(topic, dataBytes))).subscribeOn(Schedulers.io())).subscribe();
}
Also used : KafkaProducer(org.apache.kafka.clients.producer.KafkaProducer) ProducerRecord(org.apache.kafka.clients.producer.ProducerRecord) Logger(org.slf4j.Logger) Metadata(io.mantisrx.runtime.Metadata) LoggerFactory(org.slf4j.LoggerFactory) PortRequest(io.mantisrx.runtime.PortRequest) Parameters(io.mantisrx.runtime.parameter.Parameters) Context(io.mantisrx.runtime.Context) AtomicReference(java.util.concurrent.atomic.AtomicReference) ParameterDefinition(io.mantisrx.runtime.parameter.ParameterDefinition) Validators(io.mantisrx.runtime.parameter.validator.Validators) SelfDocumentingSink(io.mantisrx.runtime.sink.SelfDocumentingSink) ArrayList(java.util.ArrayList) Observable(rx.Observable) List(java.util.List) Func1(rx.functions.Func1) KafkaProducer(org.apache.kafka.clients.producer.KafkaProducer) Registry(com.netflix.spectator.api.Registry) Map(java.util.Map) Schedulers(rx.schedulers.Schedulers) StringParameter(io.mantisrx.runtime.parameter.type.StringParameter) Parameters(io.mantisrx.runtime.parameter.Parameters)

Example 14 with Parameters

use of io.mantisrx.runtime.parameter.Parameters in project mantis by Netflix.

the class MantisKafkaProducerConfigTest method testJobParamOverrides.

@Test
public void testJobParamOverrides() {
    Context context = mock(Context.class);
    Parameters params = ParameterTestUtils.createParameters(KafkaSinkJobParameters.PREFIX + ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    when(context.getParameters()).then((Answer<Parameters>) invocation -> params);
    MantisKafkaProducerConfig mantisKafkaProducerConfig = new MantisKafkaProducerConfig(context);
    Map<String, Object> producerProperties = mantisKafkaProducerConfig.getProducerProperties();
    assertEquals(StringSerializer.class, producerProperties.get(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG));
    assertEquals(ByteArraySerializer.class, producerProperties.get(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG));
}
Also used : Context(io.mantisrx.runtime.Context) Arrays(java.util.Arrays) ParameterTestUtils(io.mantisrx.connector.kafka.ParameterTestUtils) Parameters(io.mantisrx.runtime.parameter.Parameters) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Context(io.mantisrx.runtime.Context) Answer(org.mockito.stubbing.Answer) ByteArraySerializer(org.apache.kafka.common.serialization.ByteArraySerializer) Map(java.util.Map) StringSerializer(org.apache.kafka.common.serialization.StringSerializer) ProducerConfig(org.apache.kafka.clients.producer.ProducerConfig) Assert.assertEquals(org.junit.Assert.assertEquals) Mockito.mock(org.mockito.Mockito.mock) JmxReporter(org.apache.kafka.common.metrics.JmxReporter) Parameters(io.mantisrx.runtime.parameter.Parameters) Test(org.junit.Test)

Example 15 with Parameters

use of io.mantisrx.runtime.parameter.Parameters in project mantis by Netflix.

the class MantisKafkaProducerConfigTest method testDefaultKafkaProducerConfig.

@Test
public void testDefaultKafkaProducerConfig() {
    Context context = mock(Context.class);
    Parameters params = ParameterTestUtils.createParameters();
    when(context.getParameters()).then((Answer<Parameters>) invocation -> params);
    MantisKafkaProducerConfig mantisKafkaProducerConfig = new MantisKafkaProducerConfig(context);
    Map<String, Object> producerProperties = mantisKafkaProducerConfig.getProducerProperties();
    assertEquals(ByteArraySerializer.class, producerProperties.get(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG));
    assertEquals(ByteArraySerializer.class, producerProperties.get(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG));
    assertEquals(Arrays.asList(MantisKafkaProducerConfig.DEFAULT_BOOTSTRAP_SERVERS_CONFIG), producerProperties.get(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG));
    assertEquals(Arrays.asList(JmxReporter.class.getName()), producerProperties.get(ConsumerConfig.METRIC_REPORTER_CLASSES_CONFIG));
}
Also used : Context(io.mantisrx.runtime.Context) Arrays(java.util.Arrays) ParameterTestUtils(io.mantisrx.connector.kafka.ParameterTestUtils) Parameters(io.mantisrx.runtime.parameter.Parameters) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Context(io.mantisrx.runtime.Context) Answer(org.mockito.stubbing.Answer) ByteArraySerializer(org.apache.kafka.common.serialization.ByteArraySerializer) Map(java.util.Map) StringSerializer(org.apache.kafka.common.serialization.StringSerializer) ProducerConfig(org.apache.kafka.clients.producer.ProducerConfig) Assert.assertEquals(org.junit.Assert.assertEquals) Mockito.mock(org.mockito.Mockito.mock) JmxReporter(org.apache.kafka.common.metrics.JmxReporter) Parameters(io.mantisrx.runtime.parameter.Parameters) Test(org.junit.Test)

Aggregations

Parameters (io.mantisrx.runtime.parameter.Parameters)18 Context (io.mantisrx.runtime.Context)15 Map (java.util.Map)12 ParameterTestUtils (io.mantisrx.connector.kafka.ParameterTestUtils)11 Assert.assertEquals (org.junit.Assert.assertEquals)11 Test (org.junit.Test)11 Mockito.mock (org.mockito.Mockito.mock)11 Mockito.when (org.mockito.Mockito.when)11 Answer (org.mockito.stubbing.Answer)11 KafkaSourceParameters (io.mantisrx.connector.kafka.KafkaSourceParameters)9 ConsumerConfig (org.apache.kafka.clients.consumer.ConsumerConfig)8 WorkerInfo (io.mantisrx.runtime.WorkerInfo)7 Arrays (java.util.Arrays)7 Optional (java.util.Optional)7 Logger (org.slf4j.Logger)7 LoggerFactory (org.slf4j.LoggerFactory)7 Observable (rx.Observable)7 MantisJobDurationType (io.mantisrx.runtime.MantisJobDurationType)6 NoopRegistry (com.netflix.spectator.api.NoopRegistry)5 KafkaUnit (info.batey.kafka.unit.KafkaUnit)5