// Copyright 2016 Google 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.
//
////////////////////////////////////////////////////////////////////////////////
package com.google.pubsub.clients.kafka;
import com.beust.jcommander.JCommander;
import com.google.common.collect.ImmutableMap;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.protobuf.util.Durations;
import com.google.pubsub.clients.common.LoadTestRunner;
import com.google.pubsub.clients.common.MetricsHandler;
import com.google.pubsub.clients.common.Task;
import com.google.pubsub.clients.common.Task.RunResult;
import com.google.pubsub.flic.common.LoadtestProto.StartRequest;
import java.util.Collections;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
/**
* Runs a task that consumes messages utilizing Kafka's implementation of the Consumer<K,V>
* interface.
*/
class KafkaSubscriberTask extends Task {
private final long pollLength;
private final KafkaConsumer<String, String> subscriber;
private KafkaSubscriberTask(StartRequest request) {
super(request, "kafka", MetricsHandler.MetricName.END_TO_END_LATENCY);
this.pollLength = Durations.toMillis(request.getKafkaOptions().getPollDuration());
Properties props = new Properties();
props.putAll(ImmutableMap.of(
"key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer",
"value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer",
"group.id", "SUBSCRIBER_ID",
"enable.auto.commit", "true",
"session.timeout.ms", "30000"
));
props.put("bootstrap.servers", request.getKafkaOptions().getBroker());
subscriber = new KafkaConsumer<>(props);
subscriber.subscribe(Collections.singletonList(request.getTopic()));
}
public static void main(String[] args) throws Exception {
LoadTestRunner.Options options = new LoadTestRunner.Options();
new JCommander(options, args);
LoadTestRunner.run(options, KafkaSubscriberTask::new);
}
@Override
public ListenableFuture<RunResult> doRun() {
RunResult result = new RunResult();
ConsumerRecords<String, String> records = subscriber.poll(pollLength);
long now = System.currentTimeMillis();
records.forEach(record -> result.latencies.add(now - record.timestamp()));
return Futures.immediateFuture(result);
}
}