From d88812ab042e0ce3dda24f48dee95467a32d793b Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Thu, 25 Nov 2021 20:19:40 +0800 Subject: [PATCH] =?UTF-8?q?[warehouse]=20=E6=95=B0=E6=8D=AE=E4=BB=93?= =?UTF-8?q?=E5=82=A8=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=AF=BB=E5=8F=96=E5=AD=98=E5=82=A8=E5=85=A5?= =?UTF-8?q?=E5=BA=93influxdb=20redis=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Architecture.png | Bin 0 -> 143986 bytes .../dispatch/export/KafkaDataExporter.java | 8 +- manager/pom.xml | 6 + pom.xml | 1 + warehouse/pom.xml | 68 +++++ .../com/usthe/warehouse/MetricsDataQueue.java | 42 +++ .../usthe/warehouse/WarehouseProperties.java | 259 ++++++++++++++++++ .../usthe/warehouse/WarehouseWorkerPool.java | 54 ++++ .../warehouse/entrance/KafkaDataConsume.java | 81 ++++++ .../KafkaMetricsDataDeserializer.java | 24 ++ .../warehouse/store/InfluxdbDataStorage.java | 110 ++++++++ .../store/MetricsDataRedisCodec.java | 42 +++ .../warehouse/store/RedisDataStorage.java | 106 +++++++ .../main/resources/META-INF/spring.factories | 7 + 14 files changed, 804 insertions(+), 4 deletions(-) create mode 100644 Architecture.png create mode 100644 warehouse/pom.xml create mode 100644 warehouse/src/main/java/com/usthe/warehouse/MetricsDataQueue.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/WarehouseProperties.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/WarehouseWorkerPool.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaDataConsume.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaMetricsDataDeserializer.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/store/InfluxdbDataStorage.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/store/MetricsDataRedisCodec.java create mode 100644 warehouse/src/main/java/com/usthe/warehouse/store/RedisDataStorage.java create mode 100644 warehouse/src/main/resources/META-INF/spring.factories diff --git a/Architecture.png b/Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..acfa096481c484c287d68b5b11ec7dabf0ca5e70 GIT binary patch literal 143986 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∓SEwE*Zw5LO$rpM;$1IbkbFfz+lOs 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

Z-@NFV*Gqhn_3H3i?|{a!>{d==qR% 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 literal 0 HcmV?d00001 diff --git a/collector/server/src/main/java/com/usthe/collector/dispatch/export/KafkaDataExporter.java b/collector/server/src/main/java/com/usthe/collector/dispatch/export/KafkaDataExporter.java index a47edf2..5bb8f8d 100644 --- a/collector/server/src/main/java/com/usthe/collector/dispatch/export/KafkaDataExporter.java +++ b/collector/server/src/main/java/com/usthe/collector/dispatch/export/KafkaDataExporter.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.LongSerializer; import org.apache.kafka.common.serialization.StringSerializer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -25,17 +26,16 @@ import java.util.Properties; @Slf4j public class KafkaDataExporter { - KafkaProducer kafkaProducer; + KafkaProducer kafkaProducer; DispatchProperties.ExportProperties.KafkaProperties kafkaProperties; public KafkaDataExporter(DispatchProperties dispatchProperties) { try { kafkaProperties = dispatchProperties.getExport().getKafka(); Properties properties = new Properties(); properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getServers()); - properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class); properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaMetricsDataSerializer.class); kafkaProducer = new KafkaProducer<>(properties); - kafkaProducer.send(new ProducerRecord<>(kafkaProperties.getTopic(), CollectRep.MetricsData.newBuilder().setApp("dddd").build())); } catch (Exception e) { log.error(e.getMessage(), e); } @@ -47,7 +47,7 @@ public class KafkaDataExporter { */ public void send(CollectRep.MetricsData metricsData) { if (kafkaProducer != null) { - kafkaProducer.send(new ProducerRecord<>(kafkaProperties.getTopic(), metricsData)); + kafkaProducer.send(new ProducerRecord<>(kafkaProperties.getTopic(), metricsData.getId(), metricsData)); } else { log.error("kafkaProducer is not enable"); } diff --git a/manager/pom.xml b/manager/pom.xml index 211832f..1c66c88 100644 --- a/manager/pom.xml +++ b/manager/pom.xml @@ -29,6 +29,12 @@ scheduler 1.0-SNAPSHOT + + + com.usthe.tancloud + warehouse + 1.0-SNAPSHOT + org.springframework.boot diff --git a/pom.xml b/pom.xml index 3480b4d..508035d 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ alerter common collector + warehouse diff --git a/warehouse/pom.xml b/warehouse/pom.xml new file mode 100644 index 0000000..eb4f04d --- /dev/null +++ b/warehouse/pom.xml @@ -0,0 +1,68 @@ + + + + monitor + com.usthe.tancloud + 1.0-SNAPSHOT + + 4.0.0 + + warehouse + + + + + com.usthe.tancloud + common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + provided + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.influxdb + influxdb-client-java + 3.4.0 + + + + org.apache.kafka + kafka-clients + 3.0.0 + + + + io.lettuce + lettuce-core + provided + + + + io.springfox + springfox-boot-starter + provided + + + + org.springframework.cloud + spring-cloud-starter-openfeign + 3.0.5 + provided + + + \ No newline at end of file diff --git a/warehouse/src/main/java/com/usthe/warehouse/MetricsDataQueue.java b/warehouse/src/main/java/com/usthe/warehouse/MetricsDataQueue.java new file mode 100644 index 0000000..c7a82ee --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/MetricsDataQueue.java @@ -0,0 +1,42 @@ +package com.usthe.warehouse; + +import com.usthe.common.entity.message.CollectRep; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * 采集数据队列 + * @author tom + * @date 2021/11/24 17:58 + */ +@Component +@Slf4j +public class MetricsDataQueue { + + private final LinkedBlockingQueue dataInfluxQueue; + private final LinkedBlockingQueue dataRedisQueue; + + public MetricsDataQueue() { + dataInfluxQueue = new LinkedBlockingQueue<>(); + dataRedisQueue = new LinkedBlockingQueue<>(); + } + + public void addMetricsDataToInflux(CollectRep.MetricsData metricsData) { + dataInfluxQueue.offer(metricsData); + } + + public CollectRep.MetricsData pollInfluxMetricsData() throws InterruptedException { + return dataInfluxQueue.poll(2, TimeUnit.SECONDS); + } + + public void addMetricsDataToRedis(CollectRep.MetricsData metricsData) { + dataRedisQueue.offer(metricsData); + } + + public CollectRep.MetricsData pollRedisMetricsData() throws InterruptedException { + return dataRedisQueue.poll(2, TimeUnit.SECONDS); + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/WarehouseProperties.java b/warehouse/src/main/java/com/usthe/warehouse/WarehouseProperties.java new file mode 100644 index 0000000..4e50197 --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/WarehouseProperties.java @@ -0,0 +1,259 @@ +package com.usthe.warehouse; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 数据仓储配置属性 + * @author tom + * @date 2021/11/24 10:38 + */ +@Component +@ConfigurationProperties(prefix = "warehouse") +public class WarehouseProperties { + + /** + * 数据入口配置属性 + */ + private EntranceProperties entrance; + + /** + * 数据存储配置属性 + */ + private StoreProperties store; + + public EntranceProperties getEntrance() { + return entrance; + } + + public void setEntrance(EntranceProperties entrance) { + this.entrance = entrance; + } + + public StoreProperties getStore() { + return store; + } + + public void setStore(StoreProperties store) { + this.store = store; + } + + /** + * 数据入口配置属性 + * 入口可以是从kafka rabbitmq rocketmq等消息中间件获取数据 + */ + public static class EntranceProperties { + + /** + * kafka配置信息 + */ + private EntranceProperties.KafkaProperties kafka; + + public EntranceProperties.KafkaProperties getKafka() { + return kafka; + } + + public void setKafka(EntranceProperties.KafkaProperties kafka) { + this.kafka = kafka; + } + + public static class KafkaProperties { + /** + * kafka数据入口是否启动 + */ + private boolean enabled = true; + + /** + * kafka的连接服务器url + */ + private String servers = "127.0.0.1:9092"; + /** + * 接收数据的topic名称 + */ + private String topic; + /** + * 消费者组ID + */ + private String groupId; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getServers() { + return servers; + } + + public void setServers(String servers) { + this.servers = servers; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + } + + } + + /** + * 调度数据出口配置属性 + */ + public static class StoreProperties { + + /** + * influxdb配置信息 + */ + private InfluxdbProperties influxdb; + /** + * redis配置信息 + */ + private RedisProperties redis; + + public InfluxdbProperties getInfluxdb() { + return influxdb; + } + + public void setInfluxdb(InfluxdbProperties influxdb) { + this.influxdb = influxdb; + } + + public RedisProperties getRedis() { + return redis; + } + + public void setRedis(RedisProperties redis) { + this.redis = redis; + } + + public static class InfluxdbProperties { + /** + * influxdb数据存储是否启动 + */ + private boolean enabled = true; + /** + * influxdb的连接服务器url + */ + private String servers = "http://127.0.0.1:8086"; + /** + * 认证token + */ + private String token; + /** + * 仓库名称 + */ + private String bucket; + /** + * 组织名称 + */ + private String org; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getServers() { + return servers; + } + + public void setServers(String servers) { + this.servers = servers; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getBucket() { + return bucket; + } + + public void setBucket(String bucket) { + this.bucket = bucket; + } + + public String getOrg() { + return org; + } + + public void setOrg(String org) { + this.org = org; + } + } + + public static class RedisProperties { + /** + * redis数据存储是否启动 + */ + private boolean enabled = true; + /** + * redis 主机host + */ + private String host = "127.0.0.1"; + /** + * redis 主机端口 + */ + private Integer port = 6379; + /** + * redis 访问密码 + */ + private String password; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + } + } + +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/WarehouseWorkerPool.java b/warehouse/src/main/java/com/usthe/warehouse/WarehouseWorkerPool.java new file mode 100644 index 0000000..1175f13 --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/WarehouseWorkerPool.java @@ -0,0 +1,54 @@ +package com.usthe.warehouse; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * warehouse 工作线程池 + * @author tom + * @date 2021/11/24 18:09 + */ +@Component +@Slf4j +public class WarehouseWorkerPool { + + private ThreadPoolExecutor workerExecutor; + + public WarehouseWorkerPool() { + initWorkExecutor(); + } + + private void initWorkExecutor() { + // 线程工厂 + ThreadFactory threadFactory = new ThreadFactoryBuilder() + .setUncaughtExceptionHandler((thread, throwable) -> { + log.error("workerExecutor has uncaughtException."); + log.error(throwable.getMessage(), throwable); }) + .setDaemon(true) + .setNameFormat("warehouse-worker-%d") + .build(); + workerExecutor = new ThreadPoolExecutor(6, + 10, + 10, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + threadFactory, + new ThreadPoolExecutor.AbortPolicy()); + } + + /** + * 运行warehouse任务 + * @param runnable 任务 + * @throws RejectedExecutionException when 线程池满 + */ + public void executeJob(Runnable runnable) throws RejectedExecutionException { + workerExecutor.execute(runnable); + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaDataConsume.java b/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaDataConsume.java new file mode 100644 index 0000000..ad99bed --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaDataConsume.java @@ -0,0 +1,81 @@ +package com.usthe.warehouse.entrance; + +import com.usthe.common.entity.message.CollectRep; +import com.usthe.warehouse.MetricsDataQueue; +import com.usthe.warehouse.WarehouseProperties; +import com.usthe.warehouse.WarehouseWorkerPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; +import java.util.Collections; +import java.util.Properties; + +/** + * 从Kafka消费指标组采集数据处理 + * @author tom + * @date 2021/11/24 18:03 + */ +@Configuration +@AutoConfigureAfter(value = {WarehouseProperties.class}) +@ConditionalOnProperty(prefix = "warehouse.entrance.kafka", + name = "enabled", havingValue = "true", matchIfMissing = true) +@Slf4j +public class KafkaDataConsume implements DisposableBean { + + private KafkaConsumer consumer; + private WarehouseWorkerPool workerPool; + private MetricsDataQueue dataQueue; + public KafkaDataConsume(WarehouseProperties properties, WarehouseWorkerPool workerPool, + MetricsDataQueue dataQueue) { + this.workerPool = workerPool; + this.dataQueue = dataQueue; + initConsumer(properties); + startConsumeData(); + } + + private void startConsumeData() { + Runnable runnable = () -> { + Thread.currentThread().setName("warehouse-kafka-data-consumer"); + while (!Thread.currentThread().isInterrupted()) { + ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); + records.forEach(record -> { + dataQueue.addMetricsDataToInflux(record.value()); + dataQueue.addMetricsDataToRedis(record.value()); + }); + } + }; + workerPool.executeJob(runnable); + } + + private void initConsumer(WarehouseProperties properties) { + if (properties == null || properties.getEntrance() == null || properties.getEntrance().getKafka() == null) { + log.error("init error, please config Warehouse kafka props in application.yml"); + throw new IllegalArgumentException("please config Warehouse kafka props"); + } + WarehouseProperties.EntranceProperties.KafkaProperties kafkaProp = properties.getEntrance().getKafka(); + Properties consumerProp = new Properties(); + consumerProp.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProp.getServers()); + consumerProp.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaProp.getGroupId()); + consumerProp.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class); + consumerProp.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaMetricsDataDeserializer.class); + consumerProp.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true); + consumerProp.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000); + consumer = new KafkaConsumer<>(consumerProp); + consumer.subscribe(Collections.singleton(kafkaProp.getTopic())); + } + + @Override + public void destroy() throws Exception { + if (consumer != null) { + consumer.close(); + } + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaMetricsDataDeserializer.java b/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaMetricsDataDeserializer.java new file mode 100644 index 0000000..544265a --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/entrance/KafkaMetricsDataDeserializer.java @@ -0,0 +1,24 @@ +package com.usthe.warehouse.entrance; + +import com.usthe.common.entity.message.CollectRep; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.common.serialization.Deserializer; + +/** + * MetricsData的反序列化 + * @author tom + * @date 2021/11/24 17:29 + */ +@Slf4j +public class KafkaMetricsDataDeserializer implements Deserializer { + + @Override + public CollectRep.MetricsData deserialize(String topicName, byte[] bytes) { + try { + return CollectRep.MetricsData.parseFrom(bytes); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/store/InfluxdbDataStorage.java b/warehouse/src/main/java/com/usthe/warehouse/store/InfluxdbDataStorage.java new file mode 100644 index 0000000..073d77c --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/store/InfluxdbDataStorage.java @@ -0,0 +1,110 @@ +package com.usthe.warehouse.store; + +import com.google.protobuf.ProtocolStringList; +import com.influxdb.client.InfluxDBClient; +import com.influxdb.client.InfluxDBClientFactory; +import com.influxdb.client.WriteApi; +import com.influxdb.client.WriteOptions; +import com.influxdb.client.domain.WritePrecision; +import com.influxdb.client.write.Point; +import com.usthe.common.entity.message.CollectRep; +import com.usthe.warehouse.MetricsDataQueue; +import com.usthe.warehouse.WarehouseProperties; +import com.usthe.warehouse.WarehouseWorkerPool; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; + +import java.time.Instant; + +/** + * influxdb存储采集数据 + * @author tom + * @date 2021/11/24 18:23 + */ +@Configuration +@AutoConfigureAfter(value = {WarehouseProperties.class}) +@ConditionalOnProperty(prefix = "warehouse.store.influxdb", + name = "enabled", havingValue = "true", matchIfMissing = true) +@Slf4j +public class InfluxdbDataStorage implements DisposableBean { + + private InfluxDBClient influxClient; + private WriteApi writeApi; + private WarehouseWorkerPool workerPool; + private MetricsDataQueue dataQueue; + + public InfluxdbDataStorage (WarehouseProperties properties, WarehouseWorkerPool workerPool, + MetricsDataQueue dataQueue) { + this.workerPool = workerPool; + this.dataQueue = dataQueue; + initInfluxDbClient(properties); + startStorageData(); + } + + private void startStorageData() { + Runnable runnable = () -> { + Thread.currentThread().setName("warehouse-influxdb-data-storage"); + while (!Thread.currentThread().isInterrupted()) { + try { + CollectRep.MetricsData metricsData = dataQueue.pollInfluxMetricsData(); + if (metricsData != null) { + saveData(metricsData); + } + } catch (InterruptedException e) { + log.error(e.getMessage()); + } + } + }; + workerPool.executeJob(runnable); + workerPool.executeJob(runnable); + } + + private void initInfluxDbClient(WarehouseProperties properties) { + if (properties == null || properties.getStore() == null || properties.getStore().getInfluxdb() == null) { + log.error("init error, please config Warehouse influxdb props in application.yml"); + throw new IllegalArgumentException("please config Warehouse influxdb props"); + } + WarehouseProperties.StoreProperties.InfluxdbProperties influxdbProp = properties.getStore().getInfluxdb(); + influxClient = InfluxDBClientFactory.create(influxdbProp.getServers(), influxdbProp.getToken().toCharArray(), + influxdbProp.getOrg(), influxdbProp.getBucket()); + WriteOptions writeOptions = WriteOptions.builder() + .batchSize(1000) + .bufferLimit(1000) + .jitterInterval(1000) + .retryInterval(5000) + .build(); + writeApi = influxClient.makeWriteApi(writeOptions); + } + + + public void saveData(CollectRep.MetricsData metricsData) { + String measurement = metricsData.getApp() + "--" + metricsData.getMetrics(); + String monitorId = String.valueOf(metricsData.getId()); + Instant collectTime = Instant.ofEpochMilli(metricsData.getTime()); + ProtocolStringList fields = metricsData.getFieldsList(); + for (CollectRep.ValueRow valueRow : metricsData.getValuesList()) { + Point point = Point.measurement(measurement) + .addTag("id", monitorId) + .addTag("instance", valueRow.getInstance()) + .time(collectTime, WritePrecision.MS); + for (int index = 0; index < fields.size(); index++) { + point.addField(fields.get(index), valueRow.getColumns(index)); + } + writeApi.writePoint(point); + } + } + + + @Override + public void destroy() throws Exception { + if (writeApi != null) { + writeApi.close(); + } + if (influxClient != null) { + influxClient.close(); + } + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/store/MetricsDataRedisCodec.java b/warehouse/src/main/java/com/usthe/warehouse/store/MetricsDataRedisCodec.java new file mode 100644 index 0000000..55a94f2 --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/store/MetricsDataRedisCodec.java @@ -0,0 +1,42 @@ +package com.usthe.warehouse.store; + +import com.usthe.common.entity.message.CollectRep; +import io.lettuce.core.codec.RedisCodec; +import lombok.extern.slf4j.Slf4j; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +/** + * MetricsData redis 序列化 + * @author tom + * @date 2021/11/25 10:42 + */ +@Slf4j +public class MetricsDataRedisCodec implements RedisCodec { + + @Override + public String decodeKey(ByteBuffer byteBuffer) { + return new String(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit(), StandardCharsets.UTF_8); + } + + @Override + public CollectRep.MetricsData decodeValue(ByteBuffer byteBuffer) { + try { + return CollectRep.MetricsData.parseFrom(byteBuffer); + } catch (Exception e) { + log.error(e.getMessage()); + return null; + } + } + + @Override + public ByteBuffer encodeKey(String s) { + return ByteBuffer.wrap(s.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public ByteBuffer encodeValue(CollectRep.MetricsData metricsData) { + return ByteBuffer.wrap(metricsData.toByteArray()); + } +} diff --git a/warehouse/src/main/java/com/usthe/warehouse/store/RedisDataStorage.java b/warehouse/src/main/java/com/usthe/warehouse/store/RedisDataStorage.java new file mode 100644 index 0000000..9f1979b --- /dev/null +++ b/warehouse/src/main/java/com/usthe/warehouse/store/RedisDataStorage.java @@ -0,0 +1,106 @@ +package com.usthe.warehouse.store; + +import com.usthe.common.entity.message.CollectRep; +import com.usthe.warehouse.MetricsDataQueue; +import com.usthe.warehouse.WarehouseProperties; +import com.usthe.warehouse.WarehouseWorkerPool; +import io.lettuce.core.RedisClient; +import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulRedisConnection; +import io.lettuce.core.api.async.RedisAsyncCommands; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; + +/** + * redis存储采集实时数据 + * @author tom + * @date 2021/11/25 10:26 + */ +@Configuration +@AutoConfigureAfter(value = {WarehouseProperties.class}) +@ConditionalOnProperty(prefix = "warehouse.store.redis", + name = "enabled", havingValue = "true", matchIfMissing = true) +@Slf4j +public class RedisDataStorage implements DisposableBean { + + private RedisClient redisClient; + private StatefulRedisConnection connection; + private WarehouseWorkerPool workerPool; + private MetricsDataQueue dataQueue; + + public RedisDataStorage (WarehouseProperties properties, WarehouseWorkerPool workerPool, + MetricsDataQueue dataQueue) { + this.workerPool = workerPool; + this.dataQueue = dataQueue; + + initRedisClient(properties); + startStorageData(); + } + + private void startStorageData() { + Runnable runnable = () -> { + Thread.currentThread().setName("warehouse-redis-data-storage"); + while (!Thread.currentThread().isInterrupted()) { + try { + CollectRep.MetricsData metricsData = dataQueue.pollRedisMetricsData(); + if (metricsData != null) { + saveData(metricsData); + } + } catch (InterruptedException e) { + log.error(e.getMessage()); + } + } + }; + workerPool.executeJob(runnable); + } + + private void saveData(CollectRep.MetricsData metricsData) { + String key = String.valueOf(metricsData.getId()); + String hashKey = metricsData.getMetrics(); + if (metricsData.getValuesList().isEmpty()) { + log.info("[warehouse] redis flush metrics data {}:{} is null, ignore.", key, hashKey); + return; + } + RedisAsyncCommands commands = connection.async(); + commands.hset(key, hashKey, metricsData).thenAccept(response -> { + if (response) { + log.debug("[warehouse] redis add new data {}:{}.", key, hashKey); + } else { + log.debug("[warehouse] redis replace data {}:{}.", key, hashKey); + } + }); + } + + private void initRedisClient(WarehouseProperties properties) { + if (properties == null || properties.getStore() == null || properties.getStore().getRedis() == null) { + log.error("init error, please config Warehouse redis props in application.yml"); + throw new IllegalArgumentException("please config Warehouse redis props"); + } + WarehouseProperties.StoreProperties.RedisProperties redisProp = properties.getStore().getRedis(); + RedisURI.Builder uriBuilder = RedisURI.builder() + .withHost(redisProp.getHost()) + .withPort(redisProp.getPort()) + .withTimeout(Duration.of(10, ChronoUnit.SECONDS)); + if (redisProp.getPassword() != null && !"".equals(redisProp.getPassword())) { + uriBuilder.withPassword(redisProp.getPassword().toCharArray()); + } + redisClient = RedisClient.create(uriBuilder.build()); + connection = redisClient.connect(new MetricsDataRedisCodec()); + } + + @Override + public void destroy() throws Exception { + if (connection != null) { + connection.close(); + } + if (redisClient != null) { + redisClient.shutdown(); + } + } +} diff --git a/warehouse/src/main/resources/META-INF/spring.factories b/warehouse/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..d5af525 --- /dev/null +++ b/warehouse/src/main/resources/META-INF/spring.factories @@ -0,0 +1,7 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.usthe.warehouse.WarehouseProperties,\ +com.usthe.warehouse.MetricsDataQueue,\ +com.usthe.warehouse.WarehouseWorkerPool,\ +com.usthe.warehouse.entrance.KafkaDataConsume,\ +com.usthe.warehouse.store.InfluxdbDataStorage,\ +com.usthe.warehouse.store.RedisDataStorage \ No newline at end of file