package com.scopely.infrastructure.kinesis; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.kinesis.connectors.KinesisConnectorConfiguration; import com.amazonaws.services.kinesis.connectors.KinesisConnectorExecutorBase; import com.amazonaws.services.kinesis.connectors.KinesisConnectorRecordProcessorFactory; import com.amazonaws.services.s3.AmazonS3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Locale; import java.util.Properties; import java.util.UUID; public class KinesisRecorder extends KinesisConnectorExecutorBase<byte[], byte[]> { private static final Logger LOGGER = LoggerFactory.getLogger(KinesisRecorder.class); private final KinesisConnectorConfiguration connectorConfiguration; private final AmazonS3 s3; public KinesisRecorder(VcrConfiguration vcrConfiguration, AmazonS3 s3, AWSCredentialsProvider credentialsProvider) { this.s3 = s3; Properties properties = new Properties(); properties.setProperty(KinesisConnectorConfiguration.PROP_APP_NAME, String.format(Locale.US, "kinesis-recorder-%s", vcrConfiguration.sourceStream)); properties.setProperty(KinesisConnectorConfiguration.PROP_KINESIS_INPUT_STREAM, vcrConfiguration.sourceStream); properties.setProperty(KinesisConnectorConfiguration.PROP_S3_BUCKET, vcrConfiguration.bucket); properties.setProperty(KinesisConnectorConfiguration.PROP_BUFFER_BYTE_SIZE_LIMIT, String.valueOf(vcrConfiguration.bufferSizeBytes)); properties.setProperty(KinesisConnectorConfiguration.PROP_BUFFER_MILLISECONDS_LIMIT, String.valueOf(vcrConfiguration.bufferTimeMillis)); properties.setProperty(KinesisConnectorConfiguration.PROP_WORKER_ID, createWorkerId()); // Check everything if (!s3.doesBucketExist(vcrConfiguration.bucket)) { throw new IllegalArgumentException("Requested bucket " + vcrConfiguration.bucket + " does not exist."); } connectorConfiguration = new KinesisConnectorConfiguration(properties, credentialsProvider); initialize(connectorConfiguration); } @Override public KinesisConnectorRecordProcessorFactory<byte[], byte[]> getKinesisConnectorRecordProcessorFactory() { return new KinesisConnectorRecordProcessorFactory<>(new S3RecorderPipeline(s3), connectorConfiguration); } public void stop() { worker.shutdown(); } protected static String createWorkerId() { String workerId = String.format("localhost:%s", UUID.randomUUID()); try { workerId = InetAddress.getLocalHost().getCanonicalHostName() + ":" + UUID.randomUUID(); } catch (UnknownHostException e) { LOGGER.warn("Couldn't generate proper worker id - couldn't resolve host", e); } return workerId; } }