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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 6101163  Support Envoy {AccessLog,Metrics}Service API V3 (#6116)
6101163 is described below

commit 61011635135cfe777370db59f0988d5a3c546dd2
Author: Zhenxu Ke <[email protected]>
AuthorDate: Fri Jan 1 21:48:38 2021 +0800

    Support Envoy {AccessLog,Metrics}Service API V3 (#6116)
---
 CHANGES.md                                         |   1 +
 .../envoy/AccessLogServiceGRPCHandler.java         |   5 +-
 .../envoy/AccessLogServiceGRPCHandlerV3.java       |  35 ++
 .../envoy/EnvoyMetricReceiverProvider.java         |   8 +-
 .../receiver/envoy/MetricServiceGRPCHandler.java   |   8 +-
 .../receiver/envoy/MetricServiceGRPCHandlerV3.java |  35 ++
 .../server/receiver/envoy/als/ALSHTTPAnalysis.java |   4 +-
 .../receiver/envoy/als/AbstractALSAnalyzer.java    |   6 +-
 .../envoy/als/LogEntry2MetricsAdapter.java         |  12 +-
 .../als/k8s/K8sALSServiceMeshHTTPAnalysis.java     |  10 +-
 .../envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java  |   6 +-
 .../envoy/MetricServiceGRPCHandlerTestMain.java    |   4 +-
 .../als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java |   2 +-
 .../receiver/envoy/als/mx/FieldsHelperTest.java    |   2 +-
 .../src/test/resources/envoy-ingress.msg           |   5 +-
 .../src/test/resources/envoy-ingress2sidecar.msg   |   3 +-
 .../test/resources/envoy-mesh-client-sidecar.msg   |   5 +-
 .../test/resources/envoy-mesh-server-sidecar.msg   |   5 +-
 .../src/test/resources/envoy-metric.msg            |   3 +-
 .../src/test/resources/field-helper.msg            |   3 +-
 .../src/main/proto/envoy/api/v2/core/base.proto    | 256 ------------
 .../{api/v2/core => config/core/v3}/address.proto  |  97 +++--
 .../main/proto/envoy/config/core/v3/backoff.proto  |  36 ++
 .../src/main/proto/envoy/config/core/v3/base.proto | 435 +++++++++++++++++++++
 .../main/proto/envoy/config/core/v3/http_uri.proto |  56 +++
 .../proto/envoy/config/core/v3/socket_option.proto |  56 +++
 .../data/accesslog/{v2 => v3}/accesslog.proto      |  78 +++-
 .../proto/envoy/service/accesslog/v2/als.proto     |  62 +--
 .../envoy/service/accesslog/{v2 => v3}/als.proto   |  56 ++-
 .../envoy/service/metrics/v2/metrics_service.proto |  27 +-
 .../metrics/{v2 => v3}/metrics_service.proto       |  32 +-
 .../main/proto/envoy/type/{ => v3}/percent.proto   |  26 +-
 .../proto/envoy/type/v3/semantic_version.proto     |  26 ++
 .../src/main/proto/udpa/annotations/migrate.proto  |  49 +++
 .../src/main/proto/udpa/annotations/status.proto   |  34 ++
 .../main/proto/udpa/annotations/versioning.proto   |  17 +
 .../src/main/proto/validate/validate.proto         |  48 ++-
 pom.xml                                            |   1 +
 38 files changed, 1082 insertions(+), 472 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 3ca5cc5..47939e5 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -41,6 +41,7 @@ Release Notes.
 * Fix CVE of UninstrumentedGateways in Dynamic Configuration activation.
 * Improve query performance in storage-influxdb-plugin.
 * Fix the uuid field in GRPCConfigWatcherRegister is not updated.
+* Support Envoy {AccessLog,Metrics}Service API V3.
 
 #### UI
 * Fix un-removed tags in trace query.
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
index 4b8b79d..dbc9ed3 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandler.java
@@ -19,8 +19,8 @@
 package org.apache.skywalking.oap.server.receiver.envoy;
 
 import io.envoyproxy.envoy.service.accesslog.v2.AccessLogServiceGrpc;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsResponse;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsResponse;
 import io.grpc.stub.StreamObserver;
 import java.util.ArrayList;
 import java.util.List;
@@ -67,6 +67,7 @@ public class AccessLogServiceGRPCHandler extends 
AccessLogServiceGrpc.AccessLogS
         sourceDispatcherCounter = 
metricCreator.createCounter("envoy_als_source_dispatch_count", "The count of 
envoy ALS metric received", MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE);
     }
 
+    @Override
     public StreamObserver<StreamAccessLogsMessage> streamAccessLogs(
         StreamObserver<StreamAccessLogsResponse> responseObserver) {
         return new StreamObserver<StreamAccessLogsMessage>() {
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandlerV3.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandlerV3.java
new file mode 100644
index 0000000..603b5b8
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/AccessLogServiceGRPCHandlerV3.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.receiver.envoy;
+
+import io.envoyproxy.envoy.service.accesslog.v3.AccessLogServiceGrpc;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsResponse;
+import io.grpc.stub.StreamObserver;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class AccessLogServiceGRPCHandlerV3 extends 
AccessLogServiceGrpc.AccessLogServiceImplBase {
+    private final AccessLogServiceGRPCHandler delegate;
+
+    @Override
+    public StreamObserver<StreamAccessLogsMessage> streamAccessLogs(final 
StreamObserver<StreamAccessLogsResponse> responseObserver) {
+        return delegate.streamAccessLogs(responseObserver);
+    }
+}
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
index 28a9126..bbbce0b 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverProvider.java
@@ -68,9 +68,13 @@ public class EnvoyMetricReceiverProvider extends 
ModuleProvider {
                         .getService(OALEngineLoaderService.class)
                         .load(EnvoyOALDefine.INSTANCE);
 
-            service.addHandler(new MetricServiceGRPCHandler(getManager()));
+            final MetricServiceGRPCHandler handler = new 
MetricServiceGRPCHandler(getManager());
+            service.addHandler(handler);
+            service.addHandler(new MetricServiceGRPCHandlerV3(handler));
         }
-        service.addHandler(new AccessLogServiceGRPCHandler(getManager(), 
config));
+        final AccessLogServiceGRPCHandler handler = new 
AccessLogServiceGRPCHandler(getManager(), config);
+        service.addHandler(handler);
+        service.addHandler(new AccessLogServiceGRPCHandlerV3(handler));
     }
 
     @Override
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
index 0ed9b3e..bb274cf 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java
@@ -18,10 +18,10 @@
 
 package org.apache.skywalking.oap.server.receiver.envoy;
 
-import io.envoyproxy.envoy.api.v2.core.Node;
-import io.envoyproxy.envoy.service.metrics.v2.MetricsServiceGrpc;
-import io.envoyproxy.envoy.service.metrics.v2.StreamMetricsMessage;
-import io.envoyproxy.envoy.service.metrics.v2.StreamMetricsResponse;
+import io.envoyproxy.envoy.config.core.v3.Node;
+import io.envoyproxy.envoy.service.metrics.v3.MetricsServiceGrpc;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsMessage;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsResponse;
 import io.grpc.stub.StreamObserver;
 import io.prometheus.client.Metrics;
 import java.util.List;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerV3.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerV3.java
new file mode 100644
index 0000000..e768636
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerV3.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.receiver.envoy;
+
+import io.envoyproxy.envoy.service.metrics.v3.MetricsServiceGrpc;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsMessage;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsResponse;
+import io.grpc.stub.StreamObserver;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class MetricServiceGRPCHandlerV3 extends 
MetricsServiceGrpc.MetricsServiceImplBase {
+    private final MetricServiceGRPCHandler delegate;
+
+    @Override
+    public StreamObserver<StreamMetricsMessage> streamMetrics(final 
StreamObserver<StreamMetricsResponse> responseObserver) {
+        return delegate.streamMetrics(responseObserver);
+    }
+}
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ALSHTTPAnalysis.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ALSHTTPAnalysis.java
index ae75c32..3b51aa0 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ALSHTTPAnalysis.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ALSHTTPAnalysis.java
@@ -18,8 +18,8 @@
 
 package org.apache.skywalking.oap.server.receiver.envoy.als;
 
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import java.util.List;
 import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
index 41e2a3c..462eeba 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/AbstractALSAnalyzer.java
@@ -18,9 +18,9 @@
 
 package org.apache.skywalking.oap.server.receiver.envoy.als;
 
-import io.envoyproxy.envoy.api.v2.core.Node;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.config.core.v3.Node;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
 
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/LogEntry2MetricsAdapter.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/LogEntry2MetricsAdapter.java
index 0ded78e..ba9c69d 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/LogEntry2MetricsAdapter.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/LogEntry2MetricsAdapter.java
@@ -21,12 +21,12 @@ package org.apache.skywalking.oap.server.receiver.envoy.als;
 import com.google.protobuf.Duration;
 import com.google.protobuf.Timestamp;
 import com.google.protobuf.UInt32Value;
-import io.envoyproxy.envoy.data.accesslog.v2.AccessLogCommon;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPRequestProperties;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPResponseProperties;
-import io.envoyproxy.envoy.data.accesslog.v2.ResponseFlags;
-import io.envoyproxy.envoy.data.accesslog.v2.TLSProperties;
+import io.envoyproxy.envoy.data.accesslog.v3.AccessLogCommon;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPRequestProperties;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPResponseProperties;
+import io.envoyproxy.envoy.data.accesslog.v3.ResponseFlags;
+import io.envoyproxy.envoy.data.accesslog.v3.TLSProperties;
 import java.time.Instant;
 import java.util.List;
 import java.util.Optional;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
index 357f6c7..976a790 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
@@ -18,11 +18,11 @@
 
 package org.apache.skywalking.oap.server.receiver.envoy.als.k8s;
 
-import io.envoyproxy.envoy.api.v2.core.Address;
-import io.envoyproxy.envoy.api.v2.core.SocketAddress;
-import io.envoyproxy.envoy.data.accesslog.v2.AccessLogCommon;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.config.core.v3.Address;
+import io.envoyproxy.envoy.config.core.v3.SocketAddress;
+import io.envoyproxy.envoy.data.accesslog.v3.AccessLogCommon;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
index 741a203..a31cd0b 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
@@ -20,9 +20,9 @@ package 
org.apache.skywalking.oap.server.receiver.envoy.als.mx;
 
 import com.google.protobuf.Any;
 import com.google.protobuf.TextFormat;
-import io.envoyproxy.envoy.data.accesslog.v2.AccessLogCommon;
-import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.data.accesslog.v3.AccessLogCommon;
+import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Collections;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerTestMain.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerTestMain.java
index 373f067..ff59bd3 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerTestMain.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandlerTestMain.java
@@ -20,8 +20,8 @@ package org.apache.skywalking.oap.server.receiver.envoy;
 
 import com.google.protobuf.TextFormat;
 import io.envoyproxy.envoy.service.metrics.v2.MetricsServiceGrpc;
-import io.envoyproxy.envoy.service.metrics.v2.StreamMetricsMessage;
-import io.envoyproxy.envoy.service.metrics.v2.StreamMetricsResponse;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsMessage;
+import io.envoyproxy.envoy.service.metrics.v3.StreamMetricsResponse;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
 import io.grpc.stub.StreamObserver;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
index 718996c..9832603 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.receiver.envoy.als.k8s;
 
 import com.google.protobuf.util.JsonFormat;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/FieldsHelperTest.java
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/FieldsHelperTest.java
index 40f327b..dc4c210 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/FieldsHelperTest.java
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/FieldsHelperTest.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.receiver.envoy.als.mx;
 
 import com.google.protobuf.util.JsonFormat;
-import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
+import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
 import java.io.ByteArrayInputStream;
 import java.io.InputStreamReader;
 import java.util.Arrays;
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress.msg
index 0f4917e..c17b667 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress.msg
@@ -30,8 +30,7 @@
                 "ROUTER_MODE": "sni-dnat",
                 "istio": "sidecar"
             },
-            "locality": { },
-            "buildVersion": 
"55c80965eab994e6bfa2227e3942fa89928d0d70/1.10.0-dev/Clean/RELEASE/BoringSSL"
+            "locality": { }
         },
         "logName": "als"
     },
@@ -86,4 +85,4 @@
             }
         ]
     }
-}
\ No newline at end of file
+}
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress2sidecar.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress2sidecar.msg
index b641b14..3531183 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress2sidecar.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-ingress2sidecar.msg
@@ -34,8 +34,7 @@
                     "pod-template-hash": "822879871",
                     "version": "v1"
                 },
-                "locality": { },
-                "buildVersion": 
"55c80965eab994e6bfa2227e3942fa89928d0d70/1.10.0-dev/Clean/RELEASE/BoringSSL"
+                "locality": { }
             },
             "logName": "als"
         },
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-client-sidecar.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-client-sidecar.msg
index 1049818..bb11619 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-client-sidecar.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-client-sidecar.msg
@@ -33,8 +33,7 @@
                     "pod-template-hash": "822879871",
                     "version": "v1"
                 },
-                "locality": { },
-                "buildVersion": 
"55c80965eab994e6bfa2227e3942fa89928d0d70/1.10.0-dev/Clean/RELEASE/BoringSSL"
+                "locality": { }
             },
             "logName": "als"
         },
@@ -89,4 +88,4 @@
             ]
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-server-sidecar.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-server-sidecar.msg
index d02ce2b..3555b34 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-server-sidecar.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-mesh-server-sidecar.msg
@@ -33,8 +33,7 @@
                 "pod-template-hash": "822879871",
                 "version": "v1"
             },
-            "locality": { },
-            "buildVersion": 
"55c80965eab994e6bfa2227e3942fa89928d0d70/1.10.0-dev/Clean/RELEASE/BoringSSL"
+            "locality": { }
         },
         "logName": "als"
     },
@@ -93,4 +92,4 @@
             }
         ]
     }
-}
\ No newline at end of file
+}
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-metric.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-metric.msg
index 71af087..e8a104e 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-metric.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/envoy-metric.msg
@@ -34,8 +34,7 @@ identifier {
         region: "ap-southeast-1"
         zone: "zone1"
         sub_zone: "subzone1"
-      },
-      build_version: 
"caf7ab123964cedd172a2d4cb29b2f2e05ca9156/1.10.0-dev/Clean/RELEASE/BoringSSL"
+      }
     }
 }
 envoy_metrics [
diff --git 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/field-helper.msg
 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/field-helper.msg
index 9d589e8..fe5132d 100644
--- 
a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/field-helper.msg
+++ 
b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/resources/field-helper.msg
@@ -82,8 +82,7 @@
       "locality": {
         "region": "us-central1",
         "zone": "us-central1-a"
-      },
-      "buildVersion": 
"262253d9d066f8ef7ed82fd175c28b8f95acbec0/1.15.0/Clean/RELEASE/BoringSSL"
+      }
     },
     "logName": "http_envoy_accesslog"
   }
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/base.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/base.proto
deleted file mode 100644
index 6b4e931..0000000
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/base.proto
+++ /dev/null
@@ -1,256 +0,0 @@
-syntax = "proto3";
-
-package envoy.api.v2.core;
-
-option java_outer_classname = "BaseProto";
-option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.api.v2.core";
-option go_package = "core";
-
-import "google/protobuf/any.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/wrappers.proto";
-
-import "validate/validate.proto";
-import "gogoproto/gogo.proto";
-
-import "envoy/type/percent.proto";
-
-option (gogoproto.equal_all) = true;
-option (gogoproto.stable_marshaler_all) = true;
-
-// [#protodoc-title: Common types]
-
-// Identifies location of where either Envoy runs or where upstream hosts run.
-message Locality {
-  // Region this :ref:`zone <envoy_api_field_core.Locality.zone>` belongs to.
-  string region = 1;
-
-  // Defines the local service zone where Envoy is running. Though optional, it
-  // should be set if discovery service routing is used and the discovery
-  // service exposes :ref:`zone data 
<envoy_api_field_endpoint.LocalityLbEndpoints.locality>`,
-  // either in this message or via :option:`--service-zone`. The meaning of 
zone
-  // is context dependent, e.g. `Availability Zone (AZ)
-  // 
<https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html>`_
-  // on AWS, `Zone <https://cloud.google.com/compute/docs/regions-zones/>`_ on
-  // GCP, etc.
-  string zone = 2;
-
-  // When used for locality of upstream hosts, this field further splits zone
-  // into smaller chunks of sub-zones so they can be load balanced
-  // independently.
-  string sub_zone = 3;
-}
-
-// Identifies a specific Envoy instance. The node identifier is presented to 
the
-// management server, which may use this identifier to distinguish per Envoy
-// configuration for serving.
-message Node {
-  // An opaque node identifier for the Envoy node. This also provides the local
-  // service node name. It should be set if any of the following features are
-  // used: :ref:`statsd <arch_overview_statistics>`, :ref:`CDS
-  // <config_cluster_manager_cds>`, and :ref:`HTTP tracing
-  // <arch_overview_tracing>`, either in this message or via
-  // :option:`--service-node`.
-  string id = 1;
-
-  // Defines the local service cluster name where Envoy is running. Though
-  // optional, it should be set if any of the following features are used:
-  // :ref:`statsd <arch_overview_statistics>`, :ref:`health check cluster
-  // verification 
<envoy_api_field_core.HealthCheck.HttpHealthCheck.service_name>`,
-  // :ref:`runtime override directory 
<envoy_api_msg_config.bootstrap.v2.Runtime>`,
-  // :ref:`user agent addition
-  // 
<envoy_api_field_config.filter.network.http_connection_manager.v2.HttpConnectionManager.add_user_agent>`,
-  // :ref:`HTTP global rate limiting <config_http_filters_rate_limit>`,
-  // :ref:`CDS <config_cluster_manager_cds>`, and :ref:`HTTP tracing
-  // <arch_overview_tracing>`, either in this message or via
-  // :option:`--service-cluster`.
-  string cluster = 2;
-
-  // Opaque metadata extending the node identifier. Envoy will pass this
-  // directly to the management server.
-  google.protobuf.Struct metadata = 3;
-
-  // Locality specifying where the Envoy instance is running.
-  Locality locality = 4;
-
-  // This is motivated by informing a management server during canary which
-  // version of Envoy is being tested in a heterogeneous fleet. This will be 
set
-  // by Envoy in management server RPCs.
-  string build_version = 5;
-}
-
-// Metadata provides additional inputs to filters based on matched listeners,
-// filter chains, routes and endpoints. It is structured as a map, usually from
-// filter name (in reverse DNS format) to metadata specific to the filter. 
Metadata
-// key-values for a filter are merged as connection and request handling 
occurs,
-// with later values for the same key overriding earlier values.
-//
-// An example use of metadata is providing additional values to
-// http_connection_manager in the envoy.http_connection_manager.access_log
-// namespace.
-//
-// Another example use of metadata is to per service config info in cluster 
metadata, which may get
-// consumed by multiple filters.
-//
-// For load balancing, Metadata provides a means to subset cluster endpoints.
-// Endpoints have a Metadata object associated and routes contain a Metadata
-// object to match against. There are some well defined metadata used today for
-// this purpose:
-//
-// * ``{"envoy.lb": {"canary": <bool> }}`` This indicates the canary status of 
an
-//   endpoint and is also used during header processing
-//   (x-envoy-upstream-canary) and for stats purposes.
-message Metadata {
-  // Key is the reverse DNS filter name, e.g. com.acme.widget. The envoy.*
-  // namespace is reserved for Envoy's built-in filters.
-  map<string, google.protobuf.Struct> filter_metadata = 1;
-}
-
-// Runtime derived uint32 with a default when not specified.
-message RuntimeUInt32 {
-  // Default value if runtime value is not available.
-  uint32 default_value = 2;
-
-  // Runtime key to get value for comparison. This value is used if defined.
-  string runtime_key = 3 [(validate.rules).string.min_bytes = 1];
-}
-
-// Envoy supports :ref:`upstream priority routing
-// <arch_overview_http_routing_priority>` both at the route and the virtual
-// cluster level. The current priority implementation uses different connection
-// pool and circuit breaking settings for each priority level. This means that
-// even for HTTP/2 requests, two physical connections will be used to an
-// upstream host. In the future Envoy will likely support true HTTP/2 priority
-// over a single upstream connection.
-enum RoutingPriority {
-  DEFAULT = 0;
-  HIGH = 1;
-}
-
-// HTTP request method.
-enum RequestMethod {
-  option (gogoproto.goproto_enum_prefix) = false;
-  METHOD_UNSPECIFIED = 0;
-  GET = 1;
-  HEAD = 2;
-  POST = 3;
-  PUT = 4;
-  DELETE = 5;
-  CONNECT = 6;
-  OPTIONS = 7;
-  TRACE = 8;
-}
-
-// Header name/value pair.
-message HeaderValue {
-  // Header name.
-  string key = 1 [(validate.rules).string = {min_bytes: 1, max_bytes: 16384}];
-
-  // Header value.
-  //
-  // The same :ref:`format specifier <config_access_log_format>` as used for
-  // :ref:`HTTP access logging <config_access_log>` applies here, however
-  // unknown header values are replaced with the empty string instead of `-`.
-  string value = 2 [(validate.rules).string.max_bytes = 16384];
-}
-
-// Header name/value pair plus option to control append behavior.
-message HeaderValueOption {
-  // Header name/value pair that this option applies to.
-  HeaderValue header = 1 [(validate.rules).message.required = true];
-
-  // Should the value be appended? If true (default), the value is appended to
-  // existing values.
-  google.protobuf.BoolValue append = 2;
-}
-
-// Wrapper for a set of headers.
-message HeaderMap {
-  repeated HeaderValue headers = 1;
-}
-
-// Data source consisting of either a file or an inline value.
-message DataSource {
-  oneof specifier {
-    option (validate.required) = true;
-
-    // Local filesystem data source.
-    string filename = 1 [(validate.rules).string.min_bytes = 1];
-
-    // Bytes inlined in the configuration.
-    bytes inline_bytes = 2 [(validate.rules).bytes.min_len = 1];
-
-    // String inlined in the configuration.
-    string inline_string = 3 [(validate.rules).string.min_bytes = 1];
-  }
-}
-
-// Configuration for transport socket in :ref:`listeners <config_listeners>` 
and
-// :ref:`clusters <envoy_api_msg_Cluster>`. If the configuration is
-// empty, a default transport socket implementation and configuration will be
-// chosen based on the platform and existence of tls_context.
-message TransportSocket {
-  // The name of the transport socket to instantiate. The name must match a 
supported transport
-  // socket implementation.
-  string name = 1 [(validate.rules).string.min_bytes = 1];
-
-  // Implementation specific configuration which depends on the implementation 
being instantiated.
-  // See the supported transport socket implementations for further 
documentation.
-  oneof config_type {
-    google.protobuf.Struct config = 2;
-
-    google.protobuf.Any typed_config = 3;
-  }
-}
-
-// Generic socket option message. This would be used to set socket options that
-// might not exist in upstream kernels or precompiled Envoy binaries.
-message SocketOption {
-  // An optional name to give this socket option for debugging, etc.
-  // Uniqueness is not required and no special meaning is assumed.
-  string description = 1;
-  // Corresponding to the level value passed to setsockopt, such as IPPROTO_TCP
-  int64 level = 2;
-  // The numeric name as passed to setsockopt
-  int64 name = 3;
-  oneof value {
-    option (validate.required) = true;
-
-    // Because many sockopts take an int value.
-    int64 int_value = 4;
-    // Otherwise it's a byte buffer.
-    bytes buf_value = 5;
-  }
-  enum SocketState {
-    option (gogoproto.goproto_enum_prefix) = false;
-    // Socket options are applied after socket creation but before binding the 
socket to a port
-    STATE_PREBIND = 0;
-    // Socket options are applied after binding the socket to a port but 
before calling listen()
-    STATE_BOUND = 1;
-    // Socket options are applied after calling listen()
-    STATE_LISTENING = 2;
-  }
-  // The state in which the option will be applied. When used in BindConfig
-  // STATE_PREBIND is currently the only valid value.
-  SocketState state = 6
-      [(validate.rules).message.required = true, 
(validate.rules).enum.defined_only = true];
-}
-
-// Runtime derived FractionalPercent with defaults for when the numerator or 
denominator is not
-// specified via a runtime key.
-message RuntimeFractionalPercent {
-  // Default value if the runtime value's for the numerator/denominator keys 
are not available.
-  envoy.type.FractionalPercent default_value = 1 
[(validate.rules).message.required = true];
-
-  // Runtime key for a YAML representation of a FractionalPercent.
-  string runtime_key = 2;
-}
-
-// Identifies a specific ControlPlane instance that Envoy is connected to.
-message ControlPlane {
-  // An opaque control plane identifier that uniquely identifies an instance
-  // of control plane. This can be used to identify which control plane 
instance,
-  // the Envoy is connected to.
-  string identifier = 1;
-}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/address.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/address.proto
similarity index 54%
rename from 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/address.proto
rename to 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/address.proto
index 6e76f5b..8228450 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/api/v2/core/address.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/address.proto
@@ -1,62 +1,87 @@
 syntax = "proto3";
 
-package envoy.api.v2.core;
+package envoy.config.core.v3;
 
-option java_outer_classname = "AddressProto";
-option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.api.v2.core";
-
-import "envoy/api/v2/core/base.proto";
+import "envoy/config/core/v3/socket_option.proto";
 
 import "google/protobuf/wrappers.proto";
 
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
 import "validate/validate.proto";
-import "gogoproto/gogo.proto";
 
-option (gogoproto.equal_all) = true;
+option java_package = "io.envoyproxy.envoy.config.core.v3";
+option java_outer_classname = "AddressProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
 
 // [#protodoc-title: Network addresses]
 
 message Pipe {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Pipe";
+
   // Unix Domain Socket path. On Linux, paths starting with '@' will use the
   // abstract namespace. The starting '@' is replaced by a null byte by Envoy.
   // Paths starting with '@' will result in an error in environments other than
   // Linux.
-  string path = 1 [(validate.rules).string.min_bytes = 1];
+  string path = 1 [(validate.rules).string = {min_len: 1}];
+
+  // The mode for the Pipe. Not applicable for abstract sockets.
+  uint32 mode = 2 [(validate.rules).uint32 = {lte: 511}];
 }
 
+// [#not-implemented-hide:] The address represents an envoy internal listener.
+// TODO(lambdai): Make this address available for listener and endpoint.
+// TODO(asraa): When address available, remove workaround from 
test/server/server_fuzz_test.cc:30.
+message EnvoyInternalAddress {
+  oneof address_name_specifier {
+    option (validate.required) = true;
+
+    // [#not-implemented-hide:] The :ref:`listener name 
<envoy_api_field_config.listener.v3.Listener.name>` of the destination internal 
listener.
+    string server_listener_name = 1;
+  }
+}
+
+// [#next-free-field: 7]
 message SocketAddress {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.SocketAddress";
+
   enum Protocol {
-    option (gogoproto.goproto_enum_prefix) = false;
     TCP = 0;
-    // [#not-implemented-hide:]
     UDP = 1;
   }
-  Protocol protocol = 1 [(validate.rules).enum.defined_only = true];
+
+  Protocol protocol = 1 [(validate.rules).enum = {defined_only: true}];
+
   // The address for this socket. :ref:`Listeners <config_listeners>` will bind
   // to the address. An empty address is not allowed. Specify ``0.0.0.0`` or 
``::``
   // to bind to any address. [#comment:TODO(zuercher) reinstate when 
implemented:
   // It is possible to distinguish a Listener address via the prefix/suffix 
matching
-  // in :ref:`FilterChainMatch <envoy_api_msg_listener.FilterChainMatch>`.] 
When used
-  // within an upstream :ref:`BindConfig <envoy_api_msg_core.BindConfig>`, the 
address
+  // in :ref:`FilterChainMatch 
<envoy_api_msg_config.listener.v3.FilterChainMatch>`.] When used
+  // within an upstream :ref:`BindConfig 
<envoy_api_msg_config.core.v3.BindConfig>`, the address
   // controls the source address of outbound connections. For :ref:`clusters
-  // <envoy_api_msg_Cluster>`, the cluster type determines whether the
+  // <envoy_api_msg_config.cluster.v3.Cluster>`, the cluster type determines 
whether the
   // address must be an IP (*STATIC* or *EDS* clusters) or a hostname resolved 
by DNS
   // (*STRICT_DNS* or *LOGICAL_DNS* clusters). Address resolution can be 
customized
-  // via :ref:`resolver_name 
<envoy_api_field_core.SocketAddress.resolver_name>`.
-  string address = 2 [(validate.rules).string.min_bytes = 1];
+  // via :ref:`resolver_name 
<envoy_api_field_config.core.v3.SocketAddress.resolver_name>`.
+  string address = 2 [(validate.rules).string = {min_len: 1}];
+
   oneof port_specifier {
     option (validate.required) = true;
-    uint32 port_value = 3 [(validate.rules).uint32.lte = 65535];
+
+    uint32 port_value = 3 [(validate.rules).uint32 = {lte: 65535}];
+
     // This is only valid if :ref:`resolver_name
-    // <envoy_api_field_core.SocketAddress.resolver_name>` is specified below 
and the
+    // <envoy_api_field_config.core.v3.SocketAddress.resolver_name>` is 
specified below and the
     // named resolver is capable of named port resolution.
     string named_port = 4;
   }
-  // The name of the resolver. This must have been registered with Envoy. If 
this is
-  // empty, a context dependent default applies. If address is a hostname this
-  // should be set for resolution other than DNS. If the address is a concrete
-  // IP address, no resolution will occur.
+
+  // The name of the custom resolver. This must have been registered with 
Envoy. If
+  // this is empty, a context dependent default applies. If the address is a 
concrete
+  // IP address, no resolution will occur. If address is a hostname this
+  // should be set for resolution other than DNS. Specifying a custom resolver 
with
+  // *STRICT_DNS* or *LOGICAL_DNS* will generate an error at runtime.
   string resolver_name = 5;
 
   // When binding to an IPv6 address above, this enables `IPv4 compatibility
@@ -67,27 +92,32 @@ message SocketAddress {
 }
 
 message TcpKeepalive {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.TcpKeepalive";
+
   // Maximum number of keepalive probes to send without response before 
deciding
   // the connection is dead. Default is to use the OS level configuration 
(unless
   // overridden, Linux defaults to 9.)
   google.protobuf.UInt32Value keepalive_probes = 1;
+
   // The number of seconds a connection needs to be idle before keep-alive 
probes
   // start being sent. Default is to use the OS level configuration (unless
-  // overridden, Linux defaults to 7200s (ie 2 hours.)
+  // overridden, Linux defaults to 7200s (i.e., 2 hours.)
   google.protobuf.UInt32Value keepalive_time = 2;
+
   // The number of seconds between keep-alive probes. Default is to use the OS
   // level configuration (unless overridden, Linux defaults to 75s.)
   google.protobuf.UInt32Value keepalive_interval = 3;
 }
 
 message BindConfig {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.BindConfig";
+
   // The address to bind to when creating a socket.
-  SocketAddress source_address = 1
-      [(validate.rules).message.required = true, (gogoproto.nullable) = false];
+  SocketAddress source_address = 1 [(validate.rules).message = {required: 
true}];
 
   // Whether to set the *IP_FREEBIND* option when creating the socket. When 
this
   // flag is set to true, allows the :ref:`source_address
-  // <envoy_api_field_UpstreamBindConfig.source_address>` to be an IP address
+  // <envoy_api_field_config.cluster.v3.UpstreamBindConfig.source_address>` to 
be an IP address
   // that is not configured on the system running Envoy. When this flag is set
   // to false, the option *IP_FREEBIND* is disabled on the socket. When this
   // flag is not set (default), the socket is not modified, i.e. the option is
@@ -103,19 +133,28 @@ message BindConfig {
 // used to tell Envoy where to bind/listen, connect to upstream and find
 // management servers.
 message Address {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Address";
+
   oneof address {
     option (validate.required) = true;
 
     SocketAddress socket_address = 1;
+
     Pipe pipe = 2;
+
+    // [#not-implemented-hide:]
+    EnvoyInternalAddress envoy_internal_address = 3;
   }
 }
 
 // CidrRange specifies an IP Address and a prefix length to construct
 // the subnet mask for a `CIDR <https://tools.ietf.org/html/rfc4632>`_ range.
 message CidrRange {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.CidrRange";
+
   // IPv4 or IPv6 address, e.g. ``192.0.0.0`` or ``2001:db8::``.
-  string address_prefix = 1 [(validate.rules).string.min_bytes = 1];
+  string address_prefix = 1 [(validate.rules).string = {min_len: 1}];
+
   // Length of prefix, e.g. 0, 32.
-  google.protobuf.UInt32Value prefix_len = 2 [(validate.rules).uint32.lte = 
128];
+  google.protobuf.UInt32Value prefix_len = 2 [(validate.rules).uint32 = {lte: 
128}];
 }
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/backoff.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/backoff.proto
new file mode 100644
index 0000000..55b504e
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/backoff.proto
@@ -0,0 +1,36 @@
+syntax = "proto3";
+
+package envoy.config.core.v3;
+
+import "google/protobuf/duration.proto";
+
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+import "validate/validate.proto";
+
+option java_package = "io.envoyproxy.envoy.config.core.v3";
+option java_outer_classname = "BackoffProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: Backoff Strategy]
+
+// Configuration defining a jittered exponential back off strategy.
+message BackoffStrategy {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.BackoffStrategy";
+
+  // The base interval to be used for the next back off computation. It should
+  // be greater than zero and less than or equal to :ref:`max_interval
+  // <envoy_api_field_config.core.v3.BackoffStrategy.max_interval>`.
+  google.protobuf.Duration base_interval = 1 [(validate.rules).duration = {
+    required: true
+    gte {nanos: 1000000}
+  }];
+
+  // Specifies the maximum interval between retries. This parameter is 
optional,
+  // but must be greater than or equal to the :ref:`base_interval
+  // <envoy_api_field_config.core.v3.BackoffStrategy.base_interval>` if set. 
The default
+  // is 10 times the :ref:`base_interval
+  // <envoy_api_field_config.core.v3.BackoffStrategy.base_interval>`.
+  google.protobuf.Duration max_interval = 2 [(validate.rules).duration = {gt 
{}}];
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/base.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/base.proto
new file mode 100644
index 0000000..7a53b31
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/base.proto
@@ -0,0 +1,435 @@
+syntax = "proto3";
+
+package envoy.config.core.v3;
+
+import "envoy/config/core/v3/address.proto";
+import "envoy/config/core/v3/backoff.proto";
+import "envoy/config/core/v3/http_uri.proto";
+import "envoy/type/v3/percent.proto";
+import "envoy/type/v3/semantic_version.proto";
+
+import "google/protobuf/any.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/wrappers.proto";
+
+import "udpa/annotations/migrate.proto";
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+import "validate/validate.proto";
+
+option java_package = "io.envoyproxy.envoy.config.core.v3";
+option java_outer_classname = "BaseProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: Common types]
+
+// Envoy supports :ref:`upstream priority routing
+// <arch_overview_http_routing_priority>` both at the route and the virtual
+// cluster level. The current priority implementation uses different connection
+// pool and circuit breaking settings for each priority level. This means that
+// even for HTTP/2 requests, two physical connections will be used to an
+// upstream host. In the future Envoy will likely support true HTTP/2 priority
+// over a single upstream connection.
+enum RoutingPriority {
+  DEFAULT = 0;
+  HIGH = 1;
+}
+
+// HTTP request method.
+enum RequestMethod {
+  METHOD_UNSPECIFIED = 0;
+  GET = 1;
+  HEAD = 2;
+  POST = 3;
+  PUT = 4;
+  DELETE = 5;
+  CONNECT = 6;
+  OPTIONS = 7;
+  TRACE = 8;
+  PATCH = 9;
+}
+
+// Identifies the direction of the traffic relative to the local Envoy.
+enum TrafficDirection {
+  // Default option is unspecified.
+  UNSPECIFIED = 0;
+
+  // The transport is used for incoming traffic.
+  INBOUND = 1;
+
+  // The transport is used for outgoing traffic.
+  OUTBOUND = 2;
+}
+
+// Identifies location of where either Envoy runs or where upstream hosts run.
+message Locality {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Locality";
+
+  // Region this :ref:`zone <envoy_api_field_config.core.v3.Locality.zone>` 
belongs to.
+  string region = 1;
+
+  // Defines the local service zone where Envoy is running. Though optional, it
+  // should be set if discovery service routing is used and the discovery
+  // service exposes :ref:`zone data 
<envoy_api_field_config.endpoint.v3.LocalityLbEndpoints.locality>`,
+  // either in this message or via :option:`--service-zone`. The meaning of 
zone
+  // is context dependent, e.g. `Availability Zone (AZ)
+  // 
<https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html>`_
+  // on AWS, `Zone <https://cloud.google.com/compute/docs/regions-zones/>`_ on
+  // GCP, etc.
+  string zone = 2;
+
+  // When used for locality of upstream hosts, this field further splits zone
+  // into smaller chunks of sub-zones so they can be load balanced
+  // independently.
+  string sub_zone = 3;
+}
+
+// BuildVersion combines SemVer version of extension with free-form build 
information
+// (i.e. 'alpha', 'private-build') as a set of strings.
+message BuildVersion {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.BuildVersion";
+
+  // SemVer version of extension.
+  type.v3.SemanticVersion version = 1;
+
+  // Free-form build information.
+  // Envoy defines several well known keys in the 
source/common/version/version.h file
+  google.protobuf.Struct metadata = 2;
+}
+
+// Version and identification for an Envoy extension.
+// [#next-free-field: 6]
+message Extension {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Extension";
+
+  // This is the name of the Envoy filter as specified in the Envoy
+  // configuration, e.g. envoy.filters.http.router, com.acme.widget.
+  string name = 1;
+
+  // Category of the extension.
+  // Extension category names use reverse DNS notation. For instance 
"envoy.filters.listener"
+  // for Envoy's built-in listener filters or "com.acme.filters.http" for HTTP 
filters from
+  // acme.com vendor.
+  // [#comment:TODO(yanavlasov): Link to the doc with existing envoy category 
names.]
+  string category = 2;
+
+  // [#not-implemented-hide:] Type descriptor of extension configuration proto.
+  // [#comment:TODO(yanavlasov): Link to the doc with existing configuration 
protos.]
+  // [#comment:TODO(yanavlasov): Add tests when PR #9391 lands.]
+  string type_descriptor = 3;
+
+  // The version is a property of the extension and maintained independently
+  // of other extensions and the Envoy API.
+  // This field is not set when extension did not provide version information.
+  BuildVersion version = 4;
+
+  // Indicates that the extension is present but was disabled via dynamic 
configuration.
+  bool disabled = 5;
+}
+
+// Identifies a specific Envoy instance. The node identifier is presented to 
the
+// management server, which may use this identifier to distinguish per Envoy
+// configuration for serving.
+// [#next-free-field: 12]
+message Node {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Node";
+
+  reserved 5;
+
+  reserved "build_version";
+
+  // An opaque node identifier for the Envoy node. This also provides the local
+  // service node name. It should be set if any of the following features are
+  // used: :ref:`statsd <arch_overview_statistics>`, :ref:`CDS
+  // <config_cluster_manager_cds>`, and :ref:`HTTP tracing
+  // <arch_overview_tracing>`, either in this message or via
+  // :option:`--service-node`.
+  string id = 1;
+
+  // Defines the local service cluster name where Envoy is running. Though
+  // optional, it should be set if any of the following features are used:
+  // :ref:`statsd <arch_overview_statistics>`, :ref:`health check cluster
+  // verification
+  // 
<envoy_api_field_config.core.v3.HealthCheck.HttpHealthCheck.service_name_matcher>`,
+  // :ref:`runtime override directory 
<envoy_api_msg_config.bootstrap.v3.Runtime>`,
+  // :ref:`user agent addition
+  // 
<envoy_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.add_user_agent>`,
+  // :ref:`HTTP global rate limiting <config_http_filters_rate_limit>`,
+  // :ref:`CDS <config_cluster_manager_cds>`, and :ref:`HTTP tracing
+  // <arch_overview_tracing>`, either in this message or via
+  // :option:`--service-cluster`.
+  string cluster = 2;
+
+  // Opaque metadata extending the node identifier. Envoy will pass this
+  // directly to the management server.
+  google.protobuf.Struct metadata = 3;
+
+  // Locality specifying where the Envoy instance is running.
+  Locality locality = 4;
+
+  // Free-form string that identifies the entity requesting config.
+  // E.g. "envoy" or "grpc"
+  string user_agent_name = 6;
+
+  oneof user_agent_version_type {
+    // Free-form string that identifies the version of the entity requesting 
config.
+    // E.g. "1.12.2" or "abcd1234", or "SpecialEnvoyBuild"
+    string user_agent_version = 7;
+
+    // Structured version of the entity requesting config.
+    BuildVersion user_agent_build_version = 8;
+  }
+
+  // List of extensions and their versions supported by the node.
+  repeated Extension extensions = 9;
+
+  // Client feature support list. These are well known features described
+  // in the Envoy API repository for a given major version of an API. Client 
features
+  // use reverse DNS naming scheme, for example `com.acme.feature`.
+  // See :ref:`the list of features <client_features>` that xDS client may
+  // support.
+  repeated string client_features = 10;
+
+  // Known listening ports on the node as a generic hint to the management 
server
+  // for filtering :ref:`listeners <config_listeners>` to be returned. For 
example,
+  // if there is a listener bound to port 80, the list can optionally contain 
the
+  // SocketAddress `(0.0.0.0,80)`. The field is optional and just a hint.
+  repeated Address listening_addresses = 11 [deprecated = true];
+}
+
+// Metadata provides additional inputs to filters based on matched listeners,
+// filter chains, routes and endpoints. It is structured as a map, usually from
+// filter name (in reverse DNS format) to metadata specific to the filter. 
Metadata
+// key-values for a filter are merged as connection and request handling 
occurs,
+// with later values for the same key overriding earlier values.
+//
+// An example use of metadata is providing additional values to
+// http_connection_manager in the envoy.http_connection_manager.access_log
+// namespace.
+//
+// Another example use of metadata is to per service config info in cluster 
metadata, which may get
+// consumed by multiple filters.
+//
+// For load balancing, Metadata provides a means to subset cluster endpoints.
+// Endpoints have a Metadata object associated and routes contain a Metadata
+// object to match against. There are some well defined metadata used today for
+// this purpose:
+//
+// * ``{"envoy.lb": {"canary": <bool> }}`` This indicates the canary status of 
an
+//   endpoint and is also used during header processing
+//   (x-envoy-upstream-canary) and for stats purposes.
+// [#next-major-version: move to type/metadata/v2]
+message Metadata {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.Metadata";
+
+  // Key is the reverse DNS filter name, e.g. com.acme.widget. The envoy.*
+  // namespace is reserved for Envoy's built-in filters.
+  map<string, google.protobuf.Struct> filter_metadata = 1;
+}
+
+// Runtime derived uint32 with a default when not specified.
+message RuntimeUInt32 {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.RuntimeUInt32";
+
+  // Default value if runtime value is not available.
+  uint32 default_value = 2;
+
+  // Runtime key to get value for comparison. This value is used if defined.
+  string runtime_key = 3 [(validate.rules).string = {min_len: 1}];
+}
+
+// Runtime derived percentage with a default when not specified.
+message RuntimePercent {
+  // Default value if runtime value is not available.
+  type.v3.Percent default_value = 1;
+
+  // Runtime key to get value for comparison. This value is used if defined.
+  string runtime_key = 2 [(validate.rules).string = {min_len: 1}];
+}
+
+// Runtime derived double with a default when not specified.
+message RuntimeDouble {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.RuntimeDouble";
+
+  // Default value if runtime value is not available.
+  double default_value = 1;
+
+  // Runtime key to get value for comparison. This value is used if defined.
+  string runtime_key = 2 [(validate.rules).string = {min_len: 1}];
+}
+
+// Runtime derived bool with a default when not specified.
+message RuntimeFeatureFlag {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.api.v2.core.RuntimeFeatureFlag";
+
+  // Default value if runtime value is not available.
+  google.protobuf.BoolValue default_value = 1 [(validate.rules).message = 
{required: true}];
+
+  // Runtime key to get value for comparison. This value is used if defined. 
The boolean value must
+  // be represented via its
+  // `canonical JSON encoding 
<https://developers.google.com/protocol-buffers/docs/proto3#json>`_.
+  string runtime_key = 2 [(validate.rules).string = {min_len: 1}];
+}
+
+// Header name/value pair.
+message HeaderValue {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.HeaderValue";
+
+  // Header name.
+  string key = 1
+      [(validate.rules).string =
+           {min_len: 1 max_bytes: 16384 well_known_regex: HTTP_HEADER_NAME 
strict: false}];
+
+  // Header value.
+  //
+  // The same :ref:`format specifier <config_access_log_format>` as used for
+  // :ref:`HTTP access logging <config_access_log>` applies here, however
+  // unknown header values are replaced with the empty string instead of `-`.
+  string value = 2 [
+    (validate.rules).string = {max_bytes: 16384 well_known_regex: 
HTTP_HEADER_VALUE strict: false}
+  ];
+}
+
+// Header name/value pair plus option to control append behavior.
+message HeaderValueOption {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.api.v2.core.HeaderValueOption";
+
+  // Header name/value pair that this option applies to.
+  HeaderValue header = 1 [(validate.rules).message = {required: true}];
+
+  // Should the value be appended? If true (default), the value is appended to
+  // existing values. Otherwise it replaces any existing values.
+  google.protobuf.BoolValue append = 2;
+}
+
+// Wrapper for a set of headers.
+message HeaderMap {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.HeaderMap";
+
+  repeated HeaderValue headers = 1;
+}
+
+// A directory that is watched for changes, e.g. by inotify on Linux. 
Move/rename
+// events inside this directory trigger the watch.
+message WatchedDirectory {
+  // Directory path to watch.
+  string path = 1 [(validate.rules).string = {min_len: 1}];
+}
+
+// Data source consisting of either a file or an inline value.
+message DataSource {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.DataSource";
+
+  oneof specifier {
+    option (validate.required) = true;
+
+    // Local filesystem data source.
+    string filename = 1 [(validate.rules).string = {min_len: 1}];
+
+    // Bytes inlined in the configuration.
+    bytes inline_bytes = 2 [(validate.rules).bytes = {min_len: 1}];
+
+    // String inlined in the configuration.
+    string inline_string = 3 [(validate.rules).string = {min_len: 1}];
+  }
+}
+
+// The message specifies the retry policy of remote data source when fetching 
fails.
+message RetryPolicy {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.RetryPolicy";
+
+  // Specifies parameters that control :ref:`retry backoff strategy 
<envoy_api_msg_config.core.v3.BackoffStrategy>`.
+  // This parameter is optional, in which case the default base interval is 
1000 milliseconds. The
+  // default maximum interval is 10 times the base interval.
+  BackoffStrategy retry_back_off = 1;
+
+  // Specifies the allowed number of retries. This parameter is optional and
+  // defaults to 1.
+  google.protobuf.UInt32Value num_retries = 2
+      [(udpa.annotations.field_migrate).rename = "max_retries"];
+}
+
+// The message specifies how to fetch data from remote and how to verify it.
+message RemoteDataSource {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.RemoteDataSource";
+
+  // The HTTP URI to fetch the remote data.
+  HttpUri http_uri = 1 [(validate.rules).message = {required: true}];
+
+  // SHA256 string for verifying data.
+  string sha256 = 2 [(validate.rules).string = {min_len: 1}];
+
+  // Retry policy for fetching remote data.
+  RetryPolicy retry_policy = 3;
+}
+
+// Async data source which support async data fetch.
+message AsyncDataSource {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.AsyncDataSource";
+
+  oneof specifier {
+    option (validate.required) = true;
+
+    // Local async data source.
+    DataSource local = 1;
+
+    // Remote async data source.
+    RemoteDataSource remote = 2;
+  }
+}
+
+// Configuration for transport socket in :ref:`listeners <config_listeners>` 
and
+// :ref:`clusters <envoy_api_msg_config.cluster.v3.Cluster>`. If the 
configuration is
+// empty, a default transport socket implementation and configuration will be
+// chosen based on the platform and existence of tls_context.
+message TransportSocket {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.TransportSocket";
+
+  reserved 2;
+
+  reserved "config";
+
+  // The name of the transport socket to instantiate. The name must match a 
supported transport
+  // socket implementation.
+  string name = 1 [(validate.rules).string = {min_len: 1}];
+
+  // Implementation specific configuration which depends on the implementation 
being instantiated.
+  // See the supported transport socket implementations for further 
documentation.
+  oneof config_type {
+    google.protobuf.Any typed_config = 3;
+  }
+}
+
+// Runtime derived FractionalPercent with defaults for when the numerator or 
denominator is not
+// specified via a runtime key.
+//
+// .. note::
+//
+//   Parsing of the runtime key's data is implemented such that it may be 
represented as a
+//   :ref:`FractionalPercent <envoy_api_msg_type.v3.FractionalPercent>` proto 
represented as JSON/YAML
+//   and may also be represented as an integer with the assumption that the 
value is an integral
+//   percentage out of 100. For instance, a runtime key lookup returning the 
value "42" would parse
+//   as a `FractionalPercent` whose numerator is 42 and denominator is HUNDRED.
+message RuntimeFractionalPercent {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.api.v2.core.RuntimeFractionalPercent";
+
+  // Default value if the runtime value's for the numerator/denominator keys 
are not available.
+  type.v3.FractionalPercent default_value = 1 [(validate.rules).message = 
{required: true}];
+
+  // Runtime key for a YAML representation of a FractionalPercent.
+  string runtime_key = 2;
+}
+
+// Identifies a specific ControlPlane instance that Envoy is connected to.
+message ControlPlane {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.ControlPlane";
+
+  // An opaque control plane identifier that uniquely identifies an instance
+  // of control plane. This can be used to identify which control plane 
instance,
+  // the Envoy is connected to.
+  string identifier = 1;
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/http_uri.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/http_uri.proto
new file mode 100644
index 0000000..5d1fc23
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/http_uri.proto
@@ -0,0 +1,56 @@
+syntax = "proto3";
+
+package envoy.config.core.v3;
+
+import "google/protobuf/duration.proto";
+
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+import "validate/validate.proto";
+
+option java_package = "io.envoyproxy.envoy.config.core.v3";
+option java_outer_classname = "HttpUriProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: HTTP Service URI ]
+
+// Envoy external URI descriptor
+message HttpUri {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.HttpUri";
+
+  // The HTTP server URI. It should be a full FQDN with protocol, host and 
path.
+  //
+  // Example:
+  //
+  // .. code-block:: yaml
+  //
+  //    uri: https://www.googleapis.com/oauth2/v1/certs
+  //
+  string uri = 1 [(validate.rules).string = {min_len: 1}];
+
+  // Specify how `uri` is to be fetched. Today, this requires an explicit
+  // cluster, but in the future we may support dynamic cluster creation or
+  // inline DNS resolution. See `issue
+  // <https://github.com/envoyproxy/envoy/issues/1606>`_.
+  oneof http_upstream_type {
+    option (validate.required) = true;
+
+    // A cluster is created in the Envoy "cluster_manager" config
+    // section. This field specifies the cluster name.
+    //
+    // Example:
+    //
+    // .. code-block:: yaml
+    //
+    //    cluster: jwks_cluster
+    //
+    string cluster = 2 [(validate.rules).string = {min_len: 1}];
+  }
+
+  // Sets the maximum duration in milliseconds that a response can take to 
arrive upon request.
+  google.protobuf.Duration timeout = 3 [(validate.rules).duration = {
+    required: true
+    gte {}
+  }];
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/socket_option.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/socket_option.proto
new file mode 100644
index 0000000..b22169b
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/config/core/v3/socket_option.proto
@@ -0,0 +1,56 @@
+syntax = "proto3";
+
+package envoy.config.core.v3;
+
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+import "validate/validate.proto";
+
+option java_package = "io.envoyproxy.envoy.config.core.v3";
+option java_outer_classname = "SocketOptionProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: Socket Option ]
+
+// Generic socket option message. This would be used to set socket options that
+// might not exist in upstream kernels or precompiled Envoy binaries.
+// [#next-free-field: 7]
+message SocketOption {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.api.v2.core.SocketOption";
+
+  enum SocketState {
+    // Socket options are applied after socket creation but before binding the 
socket to a port
+    STATE_PREBIND = 0;
+
+    // Socket options are applied after binding the socket to a port but 
before calling listen()
+    STATE_BOUND = 1;
+
+    // Socket options are applied after calling listen()
+    STATE_LISTENING = 2;
+  }
+
+  // An optional name to give this socket option for debugging, etc.
+  // Uniqueness is not required and no special meaning is assumed.
+  string description = 1;
+
+  // Corresponding to the level value passed to setsockopt, such as IPPROTO_TCP
+  int64 level = 2;
+
+  // The numeric name as passed to setsockopt
+  int64 name = 3;
+
+  oneof value {
+    option (validate.required) = true;
+
+    // Because many sockopts take an int value.
+    int64 int_value = 4;
+
+    // Otherwise it's a byte buffer.
+    bytes buf_value = 5;
+  }
+
+  // The state in which the option will be applied. When used in BindConfig
+  // STATE_PREBIND is currently the only valid value.
+  SocketState state = 6 [(validate.rules).enum = {defined_only: true}];
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v2/accesslog.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v3/accesslog.proto
similarity index 83%
rename from 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v2/accesslog.proto
rename to 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v3/accesslog.proto
index ab5245a..af7edab 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v2/accesslog.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/data/accesslog/v3/accesslog.proto
@@ -1,21 +1,24 @@
 syntax = "proto3";
 
-package envoy.data.accesslog.v2;
+package envoy.data.accesslog.v3;
 
-option java_outer_classname = "AccesslogProto";
-option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.data.accesslog.v2";
-
-import "envoy/api/v2/core/address.proto";
-import "envoy/api/v2/core/base.proto";
+import "envoy/config/core/v3/address.proto";
+import "envoy/config/core/v3/base.proto";
 
 import "google/protobuf/any.proto";
 import "google/protobuf/duration.proto";
 import "google/protobuf/timestamp.proto";
 import "google/protobuf/wrappers.proto";
 
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
 import "validate/validate.proto";
 
+option java_package = "io.envoyproxy.envoy.data.accesslog.v3";
+option java_outer_classname = "AccesslogProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
 // [#protodoc-title: gRPC access logs]
 // Envoy access logs describe incoming interaction with Envoy over a fixed
 // period of time, and typically cover a single request/response exchange,
@@ -28,6 +31,9 @@ import "validate/validate.proto";
 // in their name.
 
 message TCPAccessLogEntry {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.TCPAccessLogEntry";
+
   // Common properties shared by all Envoy access logs.
   AccessLogCommon common_properties = 1;
 
@@ -36,6 +42,9 @@ message TCPAccessLogEntry {
 }
 
 message HTTPAccessLogEntry {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.HTTPAccessLogEntry";
+
   // HTTP version
   enum HTTPVersion {
     PROTOCOL_UNSPECIFIED = 0;
@@ -59,6 +68,9 @@ message HTTPAccessLogEntry {
 
 // Defines fields for a connection
 message ConnectionProperties {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.ConnectionProperties";
+
   // Number of bytes received from downstream.
   uint64 received_bytes = 1;
 
@@ -69,6 +81,9 @@ message ConnectionProperties {
 // Defines fields that are shared by all Envoy access logs.
 // [#next-free-field: 22]
 message AccessLogCommon {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.AccessLogCommon";
+
   // [#not-implemented-hide:]
   // This field indicates the rate at which this log entry was sampled.
   // Valid range is (0.0, 1.0].
@@ -77,10 +92,10 @@ message AccessLogCommon {
   // This field is the remote/origin address on which the request from the 
user was received.
   // Note: This may not be the physical peer. E.g, if the remote address is 
inferred from for
   // example the x-forwarder-for header, proxy protocol, etc.
-  envoy.api.v2.core.Address downstream_remote_address = 2;
+  config.core.v3.Address downstream_remote_address = 2;
 
   // This field is the local/destination address on which the request from the 
user was received.
-  envoy.api.v2.core.Address downstream_local_address = 3;
+  config.core.v3.Address downstream_local_address = 3;
 
   // If the connection is secure,S this field will contain TLS properties.
   TLSProperties tls_properties = 4;
@@ -129,10 +144,10 @@ message AccessLogCommon {
 
   // The upstream remote/destination address that handles this exchange. This 
does not include
   // retries.
-  envoy.api.v2.core.Address upstream_remote_address = 13;
+  config.core.v3.Address upstream_remote_address = 13;
 
   // The upstream local/origin address that handles this exchange. This does 
not include retries.
-  envoy.api.v2.core.Address upstream_local_address = 14;
+  config.core.v3.Address upstream_local_address = 14;
 
   // The upstream cluster that *upstream_remote_address* belongs to.
   string upstream_cluster = 15;
@@ -148,7 +163,7 @@ message AccessLogCommon {
   // route created from a higher level forwarding rule with some ID can place
   // that ID in this field and cross reference later. It can also be used to
   // determine if a canary endpoint was used or not.
-  envoy.api.v2.core.Metadata metadata = 17;
+  config.core.v3.Metadata metadata = 17;
 
   // If upstream connection failed due to transport socket (e.g. TLS 
handshake), provides the
   // failure reason from the transport socket. The format of this field 
depends on the configured
@@ -162,7 +177,7 @@ message AccessLogCommon {
   // This field is the downstream direct remote address on which the request 
from the user was
   // received. Note: This is always the physical peer, even if the remote 
address is inferred from
   // for example the x-forwarder-for header, proxy protocol, etc.
-  envoy.api.v2.core.Address downstream_direct_remote_address = 20;
+  config.core.v3.Address downstream_direct_remote_address = 20;
 
   // Map of filter state in stream info that have been configured to be 
logged. If the filter
   // state serialized to any message other than `google.protobuf.Any` it will 
be packed into
@@ -171,9 +186,15 @@ message AccessLogCommon {
 }
 
 // Flags indicating occurrences during request/response processing.
-// [#next-free-field: 20]
+// [#next-free-field: 24]
 message ResponseFlags {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.ResponseFlags";
+
   message Unauthorized {
+    option (udpa.annotations.versioning).previous_message_type =
+        "envoy.data.accesslog.v2.ResponseFlags.Unauthorized";
+
     // Reasons why the request was unauthorized
     enum Reason {
       REASON_UNSPECIFIED = 0;
@@ -242,11 +263,26 @@ message ResponseFlags {
 
   // Indicates there was an HTTP protocol error on the downstream request.
   bool downstream_protocol_error = 19;
+
+  // Indicates there was a max stream duration reached on the upstream request.
+  bool upstream_max_stream_duration_reached = 20;
+
+  // Indicates the response was served from a cache filter.
+  bool response_from_cache_filter = 21;
+
+  // Indicates that a filter configuration is not available.
+  bool no_filter_config_found = 22;
+
+  // Indicates that request or connection exceeded the downstream connection 
duration.
+  bool duration_timeout = 23;
 }
 
 // Properties of a negotiated TLS connection.
 // [#next-free-field: 7]
 message TLSProperties {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.TLSProperties";
+
   enum TLSVersion {
     VERSION_UNSPECIFIED = 0;
     TLSv1 = 1;
@@ -256,7 +292,13 @@ message TLSProperties {
   }
 
   message CertificateProperties {
+    option (udpa.annotations.versioning).previous_message_type =
+        "envoy.data.accesslog.v2.TLSProperties.CertificateProperties";
+
     message SubjectAltName {
+      option (udpa.annotations.versioning).previous_message_type =
+          
"envoy.data.accesslog.v2.TLSProperties.CertificateProperties.SubjectAltName";
+
       oneof san {
         string uri = 1;
 
@@ -297,8 +339,11 @@ message TLSProperties {
 
 // [#next-free-field: 14]
 message HTTPRequestProperties {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.HTTPRequestProperties";
+
   // The request method (RFC 7231/2616).
-  envoy.api.v2.core.RequestMethod request_method = 1 [(validate.rules).enum = 
{defined_only: true}];
+  config.core.v3.RequestMethod request_method = 1 [(validate.rules).enum = 
{defined_only: true}];
 
   // The scheme portion of the incoming request URI.
   string scheme = 2;
@@ -350,6 +395,9 @@ message HTTPRequestProperties {
 
 // [#next-free-field: 7]
 message HTTPResponseProperties {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.data.accesslog.v2.HTTPResponseProperties";
+
   // The HTTP response code returned by Envoy.
   google.protobuf.UInt32Value response_code = 1;
 
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
index 1ee6ccd..8c5a422 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
@@ -8,66 +8,16 @@ option java_package = 
"io.envoyproxy.envoy.service.accesslog.v2";
 option go_package = "v2";
 option java_generic_services = true;
 
-import "envoy/api/v2/core/base.proto";
-import "envoy/data/accesslog/v2/accesslog.proto";
-
-import "validate/validate.proto";
+import "envoy/service/accesslog/v3/als.proto";
 
 // [#protodoc-title: gRPC Access Log Service (ALS)]
 
 // Service for streaming access logs from Envoy to an access log server.
 service AccessLogService {
-  // Envoy will connect and send StreamAccessLogsMessage messages forever. It 
does not expect any
-  // response to be sent as nothing would be done in the case of failure. The 
server should
-  // disconnect if it expects Envoy to reconnect. In the future we may decide 
to add a different
-  // API for "critical" access logs in which Envoy will buffer access logs for 
some period of time
-  // until it gets an ACK so it could then retry. This API is designed for 
high throughput with the
-  // expectation that it might be lossy.
-  rpc StreamAccessLogs(stream StreamAccessLogsMessage) returns 
(StreamAccessLogsResponse) {
-  }
-}
-
-// Empty response for the StreamAccessLogs API. Will never be sent. See below.
-message StreamAccessLogsResponse {
-}
-
-// Stream message for the StreamAccessLogs API. Envoy will open a stream to 
the server and stream
-// access logs without ever expecting a response.
-message StreamAccessLogsMessage {
-  message Identifier {
-    // The node sending the access log messages over the stream.
-    envoy.api.v2.core.Node node = 1 [(validate.rules).message.required = true];
-
-    // The friendly name of the log configured in 
:ref:`CommonGrpcAccessLogConfig
-    // <envoy_api_msg_config.accesslog.v2.CommonGrpcAccessLogConfig>`.
-    string log_name = 2 [(validate.rules).string.min_bytes = 1];
-  }
-
-  // Identifier data that will only be sent in the first message on the 
stream. This is effectively
-  // structured metadata and is a performance optimization.
-  Identifier identifier = 1;
-
-  // Wrapper for batches of HTTP access log entries.
-  message HTTPAccessLogEntries {
-    repeated envoy.data.accesslog.v2.HTTPAccessLogEntry log_entry = 1
-        [(validate.rules).repeated .min_items = 1];
-  }
-
-  // [#not-implemented-hide:]
-  // Wrapper for batches of TCP access log entries.
-  message TCPAccessLogEntries {
-    repeated envoy.data.accesslog.v2.TCPAccessLogEntry log_entry = 1
-        [(validate.rules).repeated .min_items = 1];
-  }
-
-  // Batches of log entries of a single type. Generally speaking, a given 
stream should only
-  // ever include one type of log entry.
-  oneof log_entries {
-    option (validate.required) = true;
-
-    HTTPAccessLogEntries http_logs = 2;
-
-    // [#not-implemented-hide:]
-    TCPAccessLogEntries tcp_logs = 3;
+  // In order to simultaneously support Envoy AccessLogService V2 and V3 
without duplicating too many codes,
+  // we combine the V2 service definition and V3 message protobuf and delegate 
the V2 service handler to V3,
+  // this is only feasible when the message protobuf of V3 is compatible with 
V2 (i.e. backward compatibility).
+  // For more about AccessLogService, read envoy/service/accesslog/v3/als.proto
+  rpc StreamAccessLogs(stream 
envoy.service.accesslog.v3.StreamAccessLogsMessage) returns 
(envoy.service.accesslog.v3.StreamAccessLogsResponse) {
   }
 }
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v3/als.proto
similarity index 58%
copy from 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
copy to 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v3/als.proto
index 1ee6ccd..5421c23 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v2/als.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/accesslog/v3/als.proto
@@ -1,17 +1,19 @@
 syntax = "proto3";
 
-package envoy.service.accesslog.v2;
+package envoy.service.accesslog.v3;
 
+import "envoy/config/core/v3/base.proto";
+import "envoy/data/accesslog/v3/accesslog.proto";
+
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+import "validate/validate.proto";
+
+option java_package = "io.envoyproxy.envoy.service.accesslog.v3";
 option java_outer_classname = "AlsProto";
 option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.service.accesslog.v2";
-option go_package = "v2";
 option java_generic_services = true;
-
-import "envoy/api/v2/core/base.proto";
-import "envoy/data/accesslog/v2/accesslog.proto";
-
-import "validate/validate.proto";
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
 
 // [#protodoc-title: gRPC Access Log Service (ALS)]
 
@@ -29,37 +31,50 @@ service AccessLogService {
 
 // Empty response for the StreamAccessLogs API. Will never be sent. See below.
 message StreamAccessLogsResponse {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.service.accesslog.v2.StreamAccessLogsResponse";
 }
 
 // Stream message for the StreamAccessLogs API. Envoy will open a stream to 
the server and stream
 // access logs without ever expecting a response.
 message StreamAccessLogsMessage {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.service.accesslog.v2.StreamAccessLogsMessage";
+
   message Identifier {
+    option (udpa.annotations.versioning).previous_message_type =
+        "envoy.service.accesslog.v2.StreamAccessLogsMessage.Identifier";
+
     // The node sending the access log messages over the stream.
-    envoy.api.v2.core.Node node = 1 [(validate.rules).message.required = true];
+    config.core.v3.Node node = 1 [(validate.rules).message = {required: true}];
 
     // The friendly name of the log configured in 
:ref:`CommonGrpcAccessLogConfig
-    // <envoy_api_msg_config.accesslog.v2.CommonGrpcAccessLogConfig>`.
-    string log_name = 2 [(validate.rules).string.min_bytes = 1];
+    // 
<envoy_api_msg_extensions.access_loggers.grpc.v3.CommonGrpcAccessLogConfig>`.
+    string log_name = 2 [(validate.rules).string = {min_len: 1}];
   }
 
-  // Identifier data that will only be sent in the first message on the 
stream. This is effectively
-  // structured metadata and is a performance optimization.
-  Identifier identifier = 1;
-
   // Wrapper for batches of HTTP access log entries.
   message HTTPAccessLogEntries {
-    repeated envoy.data.accesslog.v2.HTTPAccessLogEntry log_entry = 1
-        [(validate.rules).repeated .min_items = 1];
+    option (udpa.annotations.versioning).previous_message_type =
+        
"envoy.service.accesslog.v2.StreamAccessLogsMessage.HTTPAccessLogEntries";
+
+    repeated data.accesslog.v3.HTTPAccessLogEntry log_entry = 1
+        [(validate.rules).repeated = {min_items: 1}];
   }
 
-  // [#not-implemented-hide:]
   // Wrapper for batches of TCP access log entries.
   message TCPAccessLogEntries {
-    repeated envoy.data.accesslog.v2.TCPAccessLogEntry log_entry = 1
-        [(validate.rules).repeated .min_items = 1];
+    option (udpa.annotations.versioning).previous_message_type =
+        
"envoy.service.accesslog.v2.StreamAccessLogsMessage.TCPAccessLogEntries";
+
+    repeated data.accesslog.v3.TCPAccessLogEntry log_entry = 1
+        [(validate.rules).repeated = {min_items: 1}];
   }
 
+  // Identifier data that will only be sent in the first message on the 
stream. This is effectively
+  // structured metadata and is a performance optimization.
+  Identifier identifier = 1;
+
   // Batches of log entries of a single type. Generally speaking, a given 
stream should only
   // ever include one type of log entry.
   oneof log_entries {
@@ -67,7 +82,6 @@ message StreamAccessLogsMessage {
 
     HTTPAccessLogEntries http_logs = 2;
 
-    // [#not-implemented-hide:]
     TCPAccessLogEntries tcp_logs = 3;
   }
 }
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
index 75f8ee3..9cca707 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
@@ -8,7 +8,7 @@ option java_package = "io.envoyproxy.envoy.service.metrics.v2";
 option go_package = "v2";
 option java_generic_services = true;
 
-import "envoy/api/v2/core/base.proto";
+import "envoy/service/metrics/v3/metrics_service.proto";
 
 // This line is different from the definition in 
https://github.com/envoyproxy/data-plane-api to let
 // the dependency structure clearer.
@@ -19,25 +19,10 @@ import "validate/validate.proto";
 // Service for streaming metrics to server that consumes the metrics data. It 
uses Prometheus metric
 // data model as a standard to represent metrics information.
 service MetricsService {
-  // Envoy will connect and send StreamMetricsMessage messages forever. It 
does not expect any
-  // response to be sent as nothing would be done in the case of failure.
-  rpc StreamMetrics(stream StreamMetricsMessage) returns 
(StreamMetricsResponse) {
+  // In order to simultaneously support Envoy MetricsService V2 and V3 without 
duplicating too many codes,
+  // we combine the V2 service definition and V3 message protobuf and delegate 
the V2 service handler to V3,
+  // this is only feasible when the message protobuf of V3 is compatible with 
V2 (i.e. backward compatibility).
+  // For more about MetricsService, read 
envoy/service/metrics/v3/metrics_service.proto
+  rpc StreamMetrics(stream envoy.service.metrics.v3.StreamMetricsMessage) 
returns (envoy.service.metrics.v3.StreamMetricsResponse) {
   }
 }
-
-message StreamMetricsResponse {
-}
-
-message StreamMetricsMessage {
-  message Identifier {
-    // The node sending metrics over the stream.
-    envoy.api.v2.core.Node node = 1 [(validate.rules).message.required = true];
-  }
-
-  // Identifier data effectively is a structured metadata. As a performance 
optimization this will
-  // only be sent in the first message on the stream.
-  Identifier identifier = 1;
-
-  // A list of metric entries
-  repeated io.prometheus.client.MetricFamily envoy_metrics = 2;
-}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v3/metrics_service.proto
similarity index 58%
copy from 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
copy to 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v3/metrics_service.proto
index 75f8ee3..38023f9 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v2/metrics_service.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/service/metrics/v3/metrics_service.proto
@@ -1,21 +1,23 @@
 syntax = "proto3";
 
-package envoy.service.metrics.v2;
+package envoy.service.metrics.v3;
 
-option java_outer_classname = "MetricsServiceProto";
-option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.service.metrics.v2";
-option go_package = "v2";
-option java_generic_services = true;
+import "envoy/config/core/v3/base.proto";
 
-import "envoy/api/v2/core/base.proto";
-
-// This line is different from the definition in 
https://github.com/envoyproxy/data-plane-api to let
-// the dependency structure clearer.
 import "prometheus/client_model/metrics.proto";
 
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
 import "validate/validate.proto";
 
+option java_package = "io.envoyproxy.envoy.service.metrics.v3";
+option java_outer_classname = "MetricsServiceProto";
+option java_multiple_files = true;
+option java_generic_services = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: Metrics service]
+
 // Service for streaming metrics to server that consumes the metrics data. It 
uses Prometheus metric
 // data model as a standard to represent metrics information.
 service MetricsService {
@@ -26,12 +28,20 @@ service MetricsService {
 }
 
 message StreamMetricsResponse {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.service.metrics.v2.StreamMetricsResponse";
 }
 
 message StreamMetricsMessage {
+  option (udpa.annotations.versioning).previous_message_type =
+      "envoy.service.metrics.v2.StreamMetricsMessage";
+
   message Identifier {
+    option (udpa.annotations.versioning).previous_message_type =
+        "envoy.service.metrics.v2.StreamMetricsMessage.Identifier";
+
     // The node sending metrics over the stream.
-    envoy.api.v2.core.Node node = 1 [(validate.rules).message.required = true];
+    config.core.v3.Node node = 1 [(validate.rules).message = {required: true}];
   }
 
   // Identifier data effectively is a structured metadata. As a performance 
optimization this will
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/percent.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/percent.proto
similarity index 67%
rename from 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/percent.proto
rename to 
oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/percent.proto
index 551e93b..3a89a3f 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/percent.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/percent.proto
@@ -1,21 +1,23 @@
 syntax = "proto3";
 
-package envoy.type;
-
-option java_outer_classname = "PercentProto";
-option java_multiple_files = true;
-option java_package = "io.envoyproxy.envoy.type";
+package envoy.type.v3;
 
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
 import "validate/validate.proto";
-import "gogoproto/gogo.proto";
 
-option (gogoproto.equal_all) = true;
+option java_package = "io.envoyproxy.envoy.type.v3";
+option java_outer_classname = "PercentProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
 
 // [#protodoc-title: Percent]
 
 // Identifies a percentage, in the range [0.0, 100.0].
 message Percent {
-  double value = 1 [(validate.rules).double = {gte: 0, lte: 100}];
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.type.Percent";
+
+  double value = 1 [(validate.rules).double = {lte: 100.0 gte: 0.0}];
 }
 
 // A fractional percentage is used in cases in which for performance reasons 
performing floating
@@ -25,8 +27,7 @@ message Percent {
 // * **Example**: 1/100 = 1%.
 // * **Example**: 3/10000 = 0.03%.
 message FractionalPercent {
-  // Specifies the numerator. Defaults to 0.
-  uint32 numerator = 1;
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.type.FractionalPercent";
 
   // Fraction percentages support several fixed denominator values.
   enum DenominatorType {
@@ -46,7 +47,10 @@ message FractionalPercent {
     MILLION = 2;
   }
 
+  // Specifies the numerator. Defaults to 0.
+  uint32 numerator = 1;
+
   // Specifies the denominator. If the denominator specified is less than the 
numerator, the final
   // fractional percentage is capped at 1 (100%).
-  DenominatorType denominator = 2 [(validate.rules).enum.defined_only = true];
+  DenominatorType denominator = 2 [(validate.rules).enum = {defined_only: 
true}];
 }
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/semantic_version.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/semantic_version.proto
new file mode 100644
index 0000000..a412633
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/envoy/type/v3/semantic_version.proto
@@ -0,0 +1,26 @@
+syntax = "proto3";
+
+package envoy.type.v3;
+
+import "udpa/annotations/status.proto";
+import "udpa/annotations/versioning.proto";
+
+option java_package = "io.envoyproxy.envoy.type.v3";
+option java_outer_classname = "SemanticVersionProto";
+option java_multiple_files = true;
+option (udpa.annotations.file_status).package_version_status = ACTIVE;
+
+// [#protodoc-title: Semantic Version]
+
+// Envoy uses SemVer (https://semver.org/). Major/minor versions indicate
+// expected behaviors and APIs, the patch version field is used only
+// for security fixes and can be generally ignored.
+message SemanticVersion {
+  option (udpa.annotations.versioning).previous_message_type = 
"envoy.type.SemanticVersion";
+
+  uint32 major_number = 1;
+
+  uint32 minor_number = 2;
+
+  uint32 patch = 3;
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/migrate.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/migrate.proto
new file mode 100644
index 0000000..1c42a64
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/migrate.proto
@@ -0,0 +1,49 @@
+syntax = "proto3";
+
+package udpa.annotations;
+
+import "google/protobuf/descriptor.proto";
+
+// Magic number in this file derived from top 28bit of SHA256 digest of
+// "udpa.annotation.migrate".
+
+extend google.protobuf.MessageOptions {
+  MigrateAnnotation message_migrate = 171962766;
+}
+
+extend google.protobuf.FieldOptions {
+  FieldMigrateAnnotation field_migrate = 171962766;
+}
+
+extend google.protobuf.EnumOptions {
+  MigrateAnnotation enum_migrate = 171962766;
+}
+
+extend google.protobuf.EnumValueOptions {
+  MigrateAnnotation enum_value_migrate = 171962766;
+}
+
+extend google.protobuf.FileOptions {
+  FileMigrateAnnotation file_migrate = 171962766;
+}
+
+message MigrateAnnotation {
+  // Rename the message/enum/enum value in next version.
+  string rename = 1;
+}
+
+message FieldMigrateAnnotation {
+  // Rename the field in next version.
+  string rename = 1;
+
+  // Add the field to a named oneof in next version. If this already exists, 
the
+  // field will join its siblings under the oneof, otherwise a new oneof will 
be
+  // created with the given name.
+  string oneof_promotion = 2;
+}
+
+message FileMigrateAnnotation {
+  // Move all types in the file to another package, this implies changing proto
+  // file path.
+  string move_to_package = 2;
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/status.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/status.proto
new file mode 100644
index 0000000..9832ffd
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/status.proto
@@ -0,0 +1,34 @@
+syntax = "proto3";
+
+package udpa.annotations;
+
+import "google/protobuf/descriptor.proto";
+
+// Magic number in this file derived from top 28bit of SHA256 digest of
+// "udpa.annotation.status".
+extend google.protobuf.FileOptions {
+  StatusAnnotation file_status = 222707719;
+}
+
+enum PackageVersionStatus {
+  // Unknown package version status.
+  UNKNOWN = 0;
+
+  // This version of the package is frozen.
+  FROZEN = 1;
+
+  // This version of the package is the active development version.
+  ACTIVE = 2;
+
+  // This version of the package is the candidate for the next major version. 
It
+  // is typically machine generated from the active development version.
+  NEXT_MAJOR_VERSION_CANDIDATE = 3;
+}
+
+message StatusAnnotation {
+  // The entity is work-in-progress and subject to breaking changes.
+  bool work_in_progress = 1;
+
+  // The entity belongs to a package with the given version status.
+  PackageVersionStatus package_version_status = 2;
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/versioning.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/versioning.proto
new file mode 100644
index 0000000..16f6dc3
--- /dev/null
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/udpa/annotations/versioning.proto
@@ -0,0 +1,17 @@
+syntax = "proto3";
+
+package udpa.annotations;
+
+import "google/protobuf/descriptor.proto";
+
+extend google.protobuf.MessageOptions {
+  // Magic number derived from 0x78 ('x') 0x44 ('D') 0x53 ('S')
+  VersioningAnnotation versioning = 7881811;
+}
+
+message VersioningAnnotation {
+  // Track the previous message type. E.g. this message might be
+  // udpa.foo.v3alpha.Foo and it was previously udpa.bar.v2.Bar. This
+  // information is consumed by UDPA via proto descriptors.
+  string previous_message_type = 1;
+}
diff --git 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/validate/validate.proto
 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/validate/validate.proto
index 1c5e04a..74d0a7e 100644
--- 
a/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/validate/validate.proto
+++ 
b/oap-server/server-receiver-plugin/receiver-proto/src/main/proto/validate/validate.proto
@@ -1,8 +1,8 @@
 syntax = "proto2";
 package validate;
 
-option go_package = "github.com/lyft/protoc-gen-validate/validate";
-option java_package = "com.lyft.pgv.validate";
+option go_package = "github.com/envoyproxy/protoc-gen-validate/validate";
+option java_package = "io.envoyproxy.pgv.validate";
 
 import "google/protobuf/descriptor.proto";
 import "google/protobuf/duration.proto";
@@ -12,26 +12,29 @@ import "google/protobuf/timestamp.proto";
 extend google.protobuf.MessageOptions {
     // Disabled nullifies any validation rules for this message, including any
     // message fields associated with it that do support validation.
-    optional bool disabled = 919191;
+    optional bool disabled = 1071;
+    // Ignore skips generation of validation methods for this message.
+    optional bool ignored = 1072;
 }
 
 // Validation rules applied at the oneof level
 extend google.protobuf.OneofOptions {
     // Required ensures that exactly one the field options in a oneof is set;
     // validation fails if no fields in the oneof are set.
-    optional bool required = 919191;
+    optional bool required = 1071;
 }
 
 // Validation rules applied at the field level
 extend google.protobuf.FieldOptions {
     // Rules specify the validations to be performed on this field. By default,
     // no validation is performed against a field.
-    optional FieldRules rules = 919191;
+    optional FieldRules rules = 1071;
 }
 
 // FieldRules encapsulates the rules for each type of field. Depending on the
 // field, the correct set should be used to ensure proper validations.
 message FieldRules {
+    optional MessageRules message = 17;
     oneof type {
         // Scalar Field Types
         FloatRules    float    = 1;
@@ -52,7 +55,6 @@ message FieldRules {
 
         // Complex Field Types
         EnumRules     enum     = 16;
-        MessageRules  message  = 17;
         RepeatedRules repeated = 18;
         MapRules      map      = 19;
 
@@ -502,6 +504,10 @@ message StringRules {
     // anywhere in the string.
     optional string contains = 9;
 
+    // NotContains specifies that this field cannot have the specified 
substring
+    // anywhere in the string.
+    optional string not_contains = 23;
+
     // In specifies that this field must be equal to one of the specified
     // values
     repeated string in     = 10;
@@ -540,7 +546,37 @@ message StringRules {
         // UriRef specifies that the field must be a valid URI as defined by 
RFC
         // 3986 and may be relative or absolute.
         bool uri_ref  = 18;
+
+        // Address specifies that the field must be either a valid hostname as
+        // defined by RFC 1034 (which does not support internationalized domain
+        // names or IDNs), or it can be a valid IP (v4 or v6).
+        bool address  = 21;
+
+        // Uuid specifies that the field must be a valid UUID as defined by
+        // RFC 4122
+        bool uuid     = 22;
+
+        // WellKnownRegex specifies a common well known pattern defined as a 
regex.
+        KnownRegex well_known_regex = 24;
     }
+
+  // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable
+  // strict header validation.
+  // By default, this is true, and HTTP header validations are RFC-compliant.
+  // Setting to false will enable a looser validations that only disallows
+  // \r\n\0 characters, which can be used to bypass header matching rules.
+  optional bool strict = 25 [default = true];
+}
+
+// WellKnownRegex contain some well-known patterns.
+enum KnownRegex {
+  UNKNOWN = 0;
+
+  // HTTP header name as defined by RFC 7230.
+  HTTP_HEADER_NAME = 1;
+
+  // HTTP header value as defined by RFC 7230.
+  HTTP_HEADER_VALUE = 2;
 }
 
 // BytesRules describe the constraints applied to `bytes` values
diff --git a/pom.xml b/pom.xml
index 1ecf07b..ca46d9f 100755
--- a/pom.xml
+++ b/pom.xml
@@ -503,6 +503,7 @@
                         <!-- Proto files of Istio, envoy, prometheus and 
gogoproto projects -->
                         <exclude>**/src/main/fbs/istio/**</exclude>
                         <exclude>**/src/main/proto/envoy/**</exclude>
+                        <exclude>**/src/main/proto/udpa/**</exclude>
                         
<exclude>**/src/main/proto/gogoproto/gogo.proto</exclude>
                         <exclude>**/src/main/proto/google/**</exclude>
                         <exclude>**/src/main/proto/istio/**</exclude>

Reply via email to