This is an automated email from the ASF dual-hosted git repository.

dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new cc65dcc58 [INLONG-3546][Sort] Support reporting metrics by audit-sdk 
in sort-single-tenant (#3549)
cc65dcc58 is described below

commit cc65dcc5854747bc51d7fffc90ef3a4e67c09abf
Author: TianqiWan <[email protected]>
AuthorDate: Wed Apr 6 15:28:43 2022 +0800

    [INLONG-3546][Sort] Support reporting metrics by audit-sdk in 
sort-single-tenant (#3549)
    
    Co-authored-by: tianqiwan <[email protected]>
---
 inlong-sort/sort-single-tenant/pom.xml             |  6 ++
 .../inlong/sort/singletenant/flink/Entrance.java   | 13 +++-
 .../deserialization/DeserializationFunction.java   | 70 +++++++++++++++++++---
 .../sort/singletenant/flink/utils/CommonUtils.java | 28 +++++++++
 .../singletenant/flink/DebeziumToCanalITCase.java  |  2 +-
 .../singletenant/flink/WholeDBMigrationITCase.java |  2 +-
 .../DeserializationFunctionTest.java               | 12 +++-
 7 files changed, 117 insertions(+), 16 deletions(-)

diff --git a/inlong-sort/sort-single-tenant/pom.xml 
b/inlong-sort/sort-single-tenant/pom.xml
index 4fdf859b6..d4c5c50f1 100644
--- a/inlong-sort/sort-single-tenant/pom.xml
+++ b/inlong-sort/sort-single-tenant/pom.xml
@@ -148,6 +148,12 @@
             <version>2.12.6.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.inlong</groupId>
+            <artifactId>audit-sdk</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
         <!-- test -->
         <dependency>
             <groupId>org.apache.kafka</groupId>
diff --git 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/Entrance.java
 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/Entrance.java
index a114ac901..216164aba 100644
--- 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/Entrance.java
+++ 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/Entrance.java
@@ -27,6 +27,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.flink.api.common.serialization.DeserializationSchema;
 import org.apache.flink.api.common.serialization.SerializationSchema;
 import 
org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectMapper;
@@ -85,7 +86,7 @@ public class Entrance {
         );
 
         DataStream<Row> deserializedStream =
-                buildDeserializationStream(sourceStream, 
dataFlowInfo.getSourceInfo(), config);
+                buildDeserializationStream(sourceStream, dataFlowInfo, config);
 
         DataStream<Row> transformationStream =
                 buildTransformationStream(deserializedStream, dataFlowInfo, 
config);
@@ -147,22 +148,28 @@ public class Entrance {
 
     private static DataStream<Row> buildDeserializationStream(
             DataStream<SerializedRecord> sourceStream,
-            SourceInfo sourceInfo,
+            DataFlowInfo dataFlowInfo,
             Configuration config
     ) throws IOException, ClassNotFoundException {
         final boolean orderlyOutput = 
config.getBoolean(Constants.JOB_ORDERLY_OUTPUT);
+        SourceInfo sourceInfo = dataFlowInfo.getSourceInfo();
         FieldInfo[] sourceFields = sourceInfo.getFields();
         DeserializationSchema<Row> schema = DeserializationSchemaFactory.build(
                 sourceFields, sourceInfo.getDeserializationInfo());
         FieldMappingTransformer fieldMappingTransformer = new 
FieldMappingTransformer(config, sourceFields);
 
+        Pair<String, String> inLongGroupIdAndStreamId = 
CommonUtils.getInLongGroupIdAndStreamId(dataFlowInfo);
+
         // Currently, canal and debezium deserialization schema will put a map 
at the first position
         // of the deserialized row. So the `appendAttributes` flag should be 
set false.
         DeserializationFunction function = new DeserializationFunction(
                 schema,
                 fieldMappingTransformer,
                 !(sourceInfo.getDeserializationInfo() instanceof 
DebeziumDeserializationInfo)
-                        && !(sourceInfo.getDeserializationInfo() instanceof 
CanalDeserializationInfo));
+                        && !(sourceInfo.getDeserializationInfo() instanceof 
CanalDeserializationInfo),
+                config,
+                inLongGroupIdAndStreamId.getLeft(),
+                inLongGroupIdAndStreamId.getRight());
 
         DataStream<Row> deserializedStream = sourceStream.process(function)
                 .uid(Constants.DESERIALIZATION_SCHEMA_UID)
diff --git 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunction.java
 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunction.java
index e9bec47a7..40a13c3d9 100644
--- 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunction.java
+++ 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunction.java
@@ -17,12 +17,18 @@
 
 package org.apache.inlong.sort.singletenant.flink.deserialization;
 
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import org.apache.flink.api.common.serialization.DeserializationSchema;
 import org.apache.flink.streaming.api.functions.ProcessFunction;
 import org.apache.flink.types.Row;
 import org.apache.flink.util.Collector;
+import org.apache.flink.util.Preconditions;
+import org.apache.inlong.audit.AuditImp;
 import org.apache.inlong.common.msg.InLongMsg;
+import org.apache.inlong.sort.configuration.Configuration;
+import org.apache.inlong.sort.configuration.Constants;
 import org.apache.inlong.sort.singletenant.flink.SerializedRecord;
 
 import java.util.Iterator;
@@ -37,21 +43,36 @@ public class DeserializationFunction extends 
ProcessFunction<SerializedRecord, R
 
     private final boolean appendAttributes;
 
+    private final Configuration config;
+
+    private final String inLongGroupId;
+
+    private final String inLongStreamId;
+
+    private transient AuditImp auditImp;
+
     public DeserializationFunction(
             DeserializationSchema<Row> deserializationSchema,
             FieldMappingTransformer fieldMappingTransformer,
-            boolean appendAttributes
-    ) {
+            boolean appendAttributes,
+            Configuration config,
+            String inLongGroupId,
+            String inLongStreamId) {
         this.deserializationSchema = deserializationSchema;
         this.fieldMappingTransformer = fieldMappingTransformer;
         this.appendAttributes = appendAttributes;
+        this.config = Preconditions.checkNotNull(config);
+        this.inLongGroupId = inLongGroupId;
+        this.inLongStreamId = inLongStreamId;
     }
 
-    public DeserializationFunction(
-            DeserializationSchema<Row> deserializationSchema,
-            FieldMappingTransformer fieldMappingTransformer
-    ) {
-        this(deserializationSchema, fieldMappingTransformer, true);
+    @Override
+    public void open(org.apache.flink.configuration.Configuration parameters) 
throws Exception {
+        String auditHostAndPorts = 
config.getString(Constants.METRICS_AUDIT_PROXY_HOSTS);
+        if (auditHostAndPorts != null) {
+            AuditImp.getInstance().setAuditProxy(new 
HashSet<>(Arrays.asList(auditHostAndPorts.split(","))));
+            auditImp = AuditImp.getInstance();
+        }
     }
 
     @Override
@@ -71,7 +92,21 @@ public class DeserializationFunction extends 
ProcessFunction<SerializedRecord, R
             while (iterator.hasNext()) {
 
                 byte[] bodyBytes = iterator.next();
-                if (bodyBytes == null || bodyBytes.length == 0) {
+                long bodyLength = bodyBytes == null ? 0 : bodyBytes.length;
+
+                // Currently, we can not get the number of records in source 
because they are packed in InLongMsg.
+                // So we output metrics for input here.
+                if (auditImp != null) {
+                    auditImp.add(
+                            Constants.METRIC_AUDIT_ID_FOR_INPUT,
+                            inLongGroupId,
+                            inLongStreamId,
+                            value.getTimestampMillis(),
+                            1,
+                            bodyLength);
+                }
+
+                if (bodyLength == 0) {
                     continue;
                 }
 
@@ -79,10 +114,29 @@ public class DeserializationFunction extends 
ProcessFunction<SerializedRecord, R
                     if (appendAttributes) {
                         inputRow = Row.join(Row.of(new HashMap<>()), inputRow);
                     }
+
+                    // Currently, the transformer operator and the sink 
operator do not discard data.
+                    // So we simply output metrics for output here.
+                    if (auditImp != null) {
+                        auditImp.add(
+                                Constants.METRIC_AUDIT_ID_FOR_OUTPUT,
+                                inLongGroupId,
+                                inLongStreamId,
+                                value.getTimestampMillis(),
+                                1,
+                                bodyLength);
+                    }
+
                     out.collect(fieldMappingTransformer.transform(inputRow, 
value.getTimestampMillis()));
                 }));
             }
         }
     }
 
+    @Override
+    public void close() {
+        if (auditImp != null) {
+            auditImp.sendReport();
+        }
+    }
 }
diff --git 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/utils/CommonUtils.java
 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/utils/CommonUtils.java
index eac8154a0..3094c6a67 100644
--- 
a/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/utils/CommonUtils.java
+++ 
b/inlong-sort/sort-single-tenant/src/main/java/org/apache/inlong/sort/singletenant/flink/utils/CommonUtils.java
@@ -21,7 +21,9 @@ package org.apache.inlong.sort.singletenant.flink.utils;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import org.apache.avro.Schema;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.flink.api.common.typeinfo.TypeInformation;
 import org.apache.flink.formats.common.TimestampFormat;
 import org.apache.flink.table.api.TableSchema;
@@ -30,6 +32,7 @@ import org.apache.flink.table.data.util.DataFormatConverters;
 import org.apache.flink.table.types.DataType;
 import org.apache.flink.table.types.logical.LogicalType;
 import org.apache.flink.table.types.logical.RowType;
+import org.apache.inlong.sort.configuration.Constants;
 import org.apache.inlong.sort.formats.base.TableFormatUtils;
 import org.apache.inlong.sort.formats.common.DateFormatInfo;
 import org.apache.inlong.sort.formats.common.FormatInfo;
@@ -40,6 +43,7 @@ import org.apache.inlong.sort.formats.common.TimeFormatInfo;
 import org.apache.inlong.sort.formats.common.TimestampFormatInfo;
 import org.apache.inlong.sort.formats.common.TypeInfo;
 import org.apache.inlong.sort.protocol.BuiltInFieldInfo;
+import org.apache.inlong.sort.protocol.DataFlowInfo;
 import org.apache.inlong.sort.protocol.FieldInfo;
 
 import java.io.ByteArrayInputStream;
@@ -48,6 +52,8 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
+import org.apache.inlong.sort.protocol.deserialization.DeserializationInfo;
+import 
org.apache.inlong.sort.protocol.deserialization.InLongMsgDeserializationInfo;
 
 import static 
org.apache.flink.formats.avro.typeutils.AvroSchemaConverter.convertToSchema;
 import static 
org.apache.flink.table.types.utils.LogicalTypeDataTypeConverter.toDataType;
@@ -226,4 +232,26 @@ public class CommonUtils {
         return results.toArray(new FieldInfo[0]);
     }
 
+    public static Pair<String, String> 
getInLongGroupIdAndStreamId(DataFlowInfo dataFlowInfo) {
+        String groupId = "";
+        String streamId = "";
+
+        if (dataFlowInfo != null) {
+            // Get group id
+            Map<String, Object> properties = dataFlowInfo.getProperties();
+            if (properties != null) {
+                groupId = properties.getOrDefault(Constants.INLONG_GROUP_ID, 
"").toString();
+            }
+
+            // Get stream id
+            final DeserializationInfo deserializationInfo = 
dataFlowInfo.getSourceInfo().getDeserializationInfo();
+            if (deserializationInfo instanceof InLongMsgDeserializationInfo) {
+                streamId = ((InLongMsgDeserializationInfo) 
deserializationInfo).getTid();
+            }
+
+        }
+
+        return Pair.of(groupId, streamId);
+    }
+
 }
diff --git 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/DebeziumToCanalITCase.java
 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/DebeziumToCanalITCase.java
index c81e093d9..470e99b00 100644
--- 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/DebeziumToCanalITCase.java
+++ 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/DebeziumToCanalITCase.java
@@ -106,7 +106,7 @@ public class DebeziumToCanalITCase {
                 FieldMappingTransformer fieldMappingTransformer = new 
FieldMappingTransformer(
                         new Configuration(), sourceFieldInfos);
                 DeserializationFunction function = new DeserializationFunction(
-                        deserializationSchema, fieldMappingTransformer, false);
+                        deserializationSchema, fieldMappingTransformer, false, 
new Configuration(), "", "");
                 DataStream<Row> deserializedStream = 
sourceStream.process(function);
 
                 // Transform
diff --git 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/WholeDBMigrationITCase.java
 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/WholeDBMigrationITCase.java
index 9d5ff79ac..e6ad945c5 100644
--- 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/WholeDBMigrationITCase.java
+++ 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/WholeDBMigrationITCase.java
@@ -107,7 +107,7 @@ public class WholeDBMigrationITCase {
                 FieldMappingTransformer fieldMappingTransformer = new 
FieldMappingTransformer(
                         new Configuration(), fieldInfos);
                 DeserializationFunction function = new DeserializationFunction(
-                        deserializationSchema, fieldMappingTransformer, false);
+                        deserializationSchema, fieldMappingTransformer, false, 
new Configuration(), "", "");
                 DataStream<Row> deserializedStream = 
sourceStream.process(function);
 
                 // Serialize and output
diff --git 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunctionTest.java
 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunctionTest.java
index dbe9d3e93..55c2481de 100644
--- 
a/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunctionTest.java
+++ 
b/inlong-sort/sort-single-tenant/src/test/java/org/apache/inlong/sort/singletenant/flink/deserialization/DeserializationFunctionTest.java
@@ -48,8 +48,11 @@ public class DeserializationFunctionTest {
         FieldInfo[] fieldInfos = {new FieldInfo("content", 
StringFormatInfo.INSTANCE)};
         DeserializationFunction function = new DeserializationFunction(
                 DeserializationSchemaFactory.build(fieldInfos, null),
-                new FieldMappingTransformer(new Configuration(), fieldInfos)
-        );
+                new FieldMappingTransformer(new Configuration(), fieldInfos),
+                true,
+                new Configuration(),
+                "",
+                "");
 
         ListCollector<Row> collector = new ListCollector<>();
         function.processElement(serializedRecord,null, collector);
@@ -132,7 +135,10 @@ public class DeserializationFunctionTest {
                         fieldInfos,
                         new CanalDeserializationInfo(null, null, false, 
"ISO_8601", false)),
                 new FieldMappingTransformer(new Configuration(), fieldInfos),
-                false);
+                false,
+                new Configuration(),
+                "",
+                "");
 
         ListCollector<Row> collector = new ListCollector<>();
         function.processElement(serializedRecord,null, collector);

Reply via email to