Support generate plugin configuration (#73)

diff --git a/docs/en/setup/plugins/client_grpc-client.md b/docs/en/setup/plugins/client_grpc-client.md
index 240e22a..3b33e48 100755
--- a/docs/en/setup/plugins/client_grpc-client.md
+++ b/docs/en/setup/plugins/client_grpc-client.md
@@ -27,3 +27,29 @@
 # How frequently to check the connection(second)
 check_period: 5
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| server_addr | string | The gRPC server address |
+| kubernetes_config | *resolvers.KubernetesConfig | The kubernetes config to lookup addresses |
+| kubernetes_config.api_server | string | The kubernetes API server address, If not define means using in kubernetes mode to connect |
+| kubernetes_config.basic_auth | *resolvers.BasicAuth | The HTTP basic authentication credentials for the targets. |
+| kubernetes_config.basic_auth.username | string |  |
+| kubernetes_config.basic_auth.password | resolvers.Secret |  |
+| kubernetes_config.basic_auth.password_file | string |  |
+| kubernetes_config.bearer_token | resolvers.Secret | The bearer token for the targets. |
+| kubernetes_config.bearer_token_file | string | The bearer token file for the targets. |
+| kubernetes_config.proxy_url | resolvers.URL | HTTP proxy server to use to connect to the targets. |
+| kubernetes_config.tls_config | resolvers.TLSConfig | TLSConfig to use to connect to the targets. |
+| kubernetes_config.namespaces | []string | Support to lookup namespaces |
+| kubernetes_config.kind | string | The kind of api |
+| kubernetes_config.selector | resolvers.Selector | The kind selector |
+| kubernetes_config.extra_port | resolvers.ExtraPort | How to get the address exported port |
+| enable_TLS | bool | Enable TLS connect to server |
+| client_pem_path | string | The file path of client.pem. The config only works when opening the TLS switch. |
+| client_key_path | string | The file path of client.key. The config only works when opening the TLS switch. |
+| ca_pem_path | string | The file path oca.pem. The config only works when opening the TLS switch. |
+| insecure_skip_verify | bool | Controls whether a client verifies the server's certificate chain and host name. |
+| authentication | string | The auth value when send request |
+| check_period | int | How frequently to check the connection(second) |
+
diff --git a/docs/en/setup/plugins/client_kafka-client.md b/docs/en/setup/plugins/client_kafka-client.md
index 39150b3..1a4b50f 100755
--- a/docs/en/setup/plugins/client_kafka-client.md
+++ b/docs/en/setup/plugins/client_kafka-client.md
@@ -51,3 +51,23 @@
 # InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name.
 insecure_skip_verify: true
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| brokers | string | The Kafka broker addresses (default `localhost:9092`). |
+| version | string | The version should follow this pattern, which is `major.minor.veryMinor.patch`. |
+| enable_TLS | bool | The TLS switch (default false). |
+| client_pem_path | string | The file path of client.pem. The config only works when opening the TLS switch. |
+| client_key_path | string | The file path of client.key. The config only works when opening the TLS switch. |
+| ca_pem_path | string | The file path oca.pem. The config only works when opening the TLS switch. |
+| required_acks | int16 | 0 means NoResponse, 1 means WaitForLocal and -1 means WaitForAll (default 1). |
+| producer_max_retry | int | The producer max retry times (default 3). |
+| meta_max_retry | int | The meta max retry times (default 3). |
+| retry_backoff | int | How long to wait for the cluster to settle between retries (default 100ms). |
+| max_message_bytes | int | The max message bytes. |
+| idempotent_writes | bool | Ensure that exactly one copy of each message is written when is true. |
+| client_id | string | A user-provided string sent with every request to the brokers. |
+| compression_codec | int | Represents the various compression codecs recognized by Kafka in messages. |
+| refresh_period | int | How frequently to refresh the cluster metadata. |
+| insecure_skip_verify | bool | Controls whether a client verifies the server's certificate chain and host name. |
+
diff --git a/docs/en/setup/plugins/fallbacker_none-fallbacker.md b/docs/en/setup/plugins/fallbacker_none-fallbacker.md
index b425422..1f46550 100755
--- a/docs/en/setup/plugins/fallbacker_none-fallbacker.md
+++ b/docs/en/setup/plugins/fallbacker_none-fallbacker.md
@@ -3,3 +3,7 @@
 The fallbacker would do nothing when facing failure data.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/fallbacker_timer-fallbacker.md b/docs/en/setup/plugins/fallbacker_timer-fallbacker.md
index f78bd8c..e4bf39e 100755
--- a/docs/en/setup/plugins/fallbacker_timer-fallbacker.md
+++ b/docs/en/setup/plugins/fallbacker_timer-fallbacker.md
@@ -12,3 +12,10 @@
 # with exponential increasing larger than it.(Time unit is millisecond.)
 max_backoff: 5000
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| max_attempts | int |  |
+| exponential_backoff | int |  |
+| max_backoff | int |  |
+
diff --git a/docs/en/setup/plugins/fetcher_prometheus-metrics-fetcher.md b/docs/en/setup/plugins/fetcher_prometheus-metrics-fetcher.md
index a334e2c..bce387d 100755
--- a/docs/en/setup/plugins/fetcher_prometheus-metrics-fetcher.md
+++ b/docs/en/setup/plugins/fetcher_prometheus-metrics-fetcher.md
@@ -34,3 +34,8 @@
     - role: pod
       label: "app=prometheus"
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| scrape_configs | []*prometheus.scrapeConfig | config is the top level configuratScrapeConfigsMapion of prometheus |
+
diff --git a/docs/en/setup/plugins/forwarder_nativecds-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativecds-grpc-forwarder.md
index ec63c27..57c1b11 100755
--- a/docs/en/setup/plugins/forwarder_nativecds-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativecds-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native Configuration Discovery Service protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativeevent-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativeevent-grpc-forwarder.md
index ace06e8..2dcd0f2 100755
--- a/docs/en/setup/plugins/forwarder_nativeevent-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativeevent-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native event protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativejvm-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativejvm-grpc-forwarder.md
index 5999157..09f9c9a 100755
--- a/docs/en/setup/plugins/forwarder_nativejvm-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativejvm-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native Configuration Discovery Service protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativelog-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativelog-grpc-forwarder.md
index 14350ed..309ab77 100755
--- a/docs/en/setup/plugins/forwarder_nativelog-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativelog-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native log protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativelog-kafka-forwarder.md b/docs/en/setup/plugins/forwarder_nativelog-kafka-forwarder.md
index a7cf6fe..941e9da 100755
--- a/docs/en/setup/plugins/forwarder_nativelog-kafka-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativelog-kafka-forwarder.md
@@ -6,3 +6,8 @@
 # The remote topic. 
 topic: "log-topic"
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| topic | string | The forwarder topic. |
+
diff --git a/docs/en/setup/plugins/forwarder_nativemanagement-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativemanagement-grpc-forwarder.md
index 640d92e..a01c653 100755
--- a/docs/en/setup/plugins/forwarder_nativemanagement-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativemanagement-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native mangement protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativemeter-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativemeter-grpc-forwarder.md
index 3a8d083..78a4c37 100755
--- a/docs/en/setup/plugins/forwarder_nativemeter-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativemeter-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization meter grpc forwarder with the SkyWalking meter protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativeprofile-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativeprofile-grpc-forwarder.md
index 6830322..56b4343 100755
--- a/docs/en/setup/plugins/forwarder_nativeprofile-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativeprofile-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native log protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/forwarder_nativetracing-grpc-forwarder.md b/docs/en/setup/plugins/forwarder_nativetracing-grpc-forwarder.md
index eb45ef3..6f986ec 100755
--- a/docs/en/setup/plugins/forwarder_nativetracing-grpc-forwarder.md
+++ b/docs/en/setup/plugins/forwarder_nativetracing-grpc-forwarder.md
@@ -3,3 +3,7 @@
 This is a synchronization grpc forwarder with the SkyWalking native tracing protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/queue_memory-queue.md b/docs/en/setup/plugins/queue_memory-queue.md
index 2d77288..224debe 100755
--- a/docs/en/setup/plugins/queue_memory-queue.md
+++ b/docs/en/setup/plugins/queue_memory-queue.md
@@ -6,3 +6,8 @@
 # The maximum buffer event size.
 event_buffer_size: 5000
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| event_buffer_size | int | configThe maximum buffer event size. |
+
diff --git a/docs/en/setup/plugins/queue_mmap-queue.md b/docs/en/setup/plugins/queue_mmap-queue.md
index d1d3fd0..2c7d7fc 100755
--- a/docs/en/setup/plugins/queue_mmap-queue.md
+++ b/docs/en/setup/plugins/queue_mmap-queue.md
@@ -16,3 +16,13 @@
 # The max size of the input event. Default value is 20k.
 max_event_size: 20480
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| segment_size | int | The size of each segment. The unit is byte. |
+| max_in_mem_segments | int32 | The max num of segments in memory. |
+| queue_capacity_segments | int | The capacity of Queue = segment_size * queue_capacity_segments. |
+| flush_period | int | The period flush time. The unit is ms. |
+| flush_ceiling_num | int | The max number in one flush time. |
+| max_event_size | int | The max size of the input event. |
+
diff --git a/docs/en/setup/plugins/queue_none-queue.md b/docs/en/setup/plugins/queue_none-queue.md
index 98b6a73..890df50 100755
--- a/docs/en/setup/plugins/queue_none-queue.md
+++ b/docs/en/setup/plugins/queue_none-queue.md
@@ -3,3 +3,7 @@
 This is an empty queue for direct connection protocols, such as SkyWalking native configuration discovery service protocol.
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativecds-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativecds-receiver.md
index 4d9ea6b..68b7313 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativecds-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativecds-receiver.md
@@ -5,3 +5,7 @@
  - [nativecds-grpc-forwarder](forwarder_nativecds-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativeevent-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativeevent-receiver.md
index 5e40bf1..caacd67 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativeevent-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativeevent-receiver.md
@@ -5,3 +5,7 @@
  - [nativeevent-grpc-forwarder](forwarder_nativeevent-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativejvm-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativejvm-receiver.md
index 66fda0a..0f75649 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativejvm-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativejvm-receiver.md
@@ -5,3 +5,7 @@
  - [nativejvm-grpc-forwarder](forwarder_nativejvm-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativelog-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativelog-receiver.md
index 9bc2ab9..47572e8 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativelog-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativelog-receiver.md
@@ -5,3 +5,7 @@
  - [nativelog-grpc-forwarder](forwarder_nativelog-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativemanagement-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativemanagement-receiver.md
index 41ce73b..a0b4253 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativemanagement-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativemanagement-receiver.md
@@ -5,3 +5,7 @@
  - [nativemanagement-grpc-forwarder](forwarder_nativemanagement-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativemeter-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativemeter-receiver.md
index 037ce15..d565a09 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativemeter-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativemeter-receiver.md
@@ -5,3 +5,7 @@
  - [nativemeter-grpc-forwarder](forwarder_nativemeter-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativeprofile-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativeprofile-receiver.md
index 6e5ab28..f932292 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativeprofile-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativeprofile-receiver.md
@@ -5,3 +5,7 @@
  - [nativeprofile-grpc-forwarder](forwarder_nativeprofile-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_grpc-nativetracing-receiver.md b/docs/en/setup/plugins/receiver_grpc-nativetracing-receiver.md
index c33c8ce..f4914c7 100755
--- a/docs/en/setup/plugins/receiver_grpc-nativetracing-receiver.md
+++ b/docs/en/setup/plugins/receiver_grpc-nativetracing-receiver.md
@@ -5,3 +5,7 @@
  - [nativetracing-grpc-forwarder](forwarder_nativetracing-grpc-forwarder.md)
 ## DefaultConfig
 ```yaml```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+
diff --git a/docs/en/setup/plugins/receiver_http-nativelog-receiver.md b/docs/en/setup/plugins/receiver_http-nativelog-receiver.md
index ef93c2e..55b6a1c 100755
--- a/docs/en/setup/plugins/receiver_http-nativelog-receiver.md
+++ b/docs/en/setup/plugins/receiver_http-nativelog-receiver.md
@@ -10,3 +10,9 @@
 # The request timeout seconds.
 timeout: 5
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| uri | string | config |
+| timeout | int |  |
+
diff --git a/docs/en/setup/plugins/server_grpc-server.md b/docs/en/setup/plugins/server_grpc-server.md
index 3681be4..4885f94 100755
--- a/docs/en/setup/plugins/server_grpc-server.md
+++ b/docs/en/setup/plugins/server_grpc-server.md
@@ -16,3 +16,13 @@
 # The TLS key file path.
 tls_key_file: ""
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| address | string | The address of grpc server. |
+| network | string | The network of grpc. |
+| max_recv_msg_size | int | The max size of the received log. |
+| max_concurrent_streams | uint32 | The max concurrent stream channels. |
+| tls_cert_file | string | The TLS cert file path. |
+| tls_key_file | string | The TLS key file path. |
+
diff --git a/docs/en/setup/plugins/server_http-server.md b/docs/en/setup/plugins/server_http-server.md
index e2b3ab0..1a7d5ee 100755
--- a/docs/en/setup/plugins/server_http-server.md
+++ b/docs/en/setup/plugins/server_http-server.md
@@ -6,3 +6,8 @@
 # The http server address.
 address: ":12800"
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| address | string |  |
+
diff --git a/docs/en/setup/plugins/server_prometheus-server.md b/docs/en/setup/plugins/server_prometheus-server.md
index db187ce..eda50f2 100755
--- a/docs/en/setup/plugins/server_prometheus-server.md
+++ b/docs/en/setup/plugins/server_prometheus-server.md
@@ -8,3 +8,9 @@
 # The prometheus server metrics endpoint.
 endpoint: "/metrics"
 ```
+## Configuration
+|Name|Type|Description|
+|----|----|-----------|
+| address | string | The prometheus server address. |
+| endpoint | string | The prometheus server metrics endpoint. |
+
diff --git a/go.mod b/go.mod
index de1c0c9..49a9ad4 100644
--- a/go.mod
+++ b/go.mod
@@ -18,6 +18,8 @@
 	github.com/stretchr/testify v1.6.1
 	github.com/urfave/cli/v2 v2.3.0
 	go.uber.org/automaxprocs v1.4.0
+	golang.org/x/mod v0.4.2
+	golang.org/x/tools v0.1.6 // indirect
 	google.golang.org/grpc v1.38.0
 	google.golang.org/protobuf v1.27.0
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
diff --git a/go.sum b/go.sum
index bef5dff..f925a98 100644
--- a/go.sum
+++ b/go.sum
@@ -826,6 +826,7 @@
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
@@ -911,8 +912,9 @@
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -953,8 +955,9 @@
 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M=
 golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -971,8 +974,9 @@
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200930132711-30421366ff76 h1:JnxiSYT3Nm0BT2a8CyvYyM6cnrWpidecD1UuSYbhKm0=
 golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1032,8 +1036,10 @@
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201008064518-c1f3e3309c71/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs=
 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1041,8 +1047,9 @@
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1113,8 +1120,9 @@
 golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201008025239-9df69603baec h1:RY2OghEV/7X1MLaecgm1mwFd3sGvUddm5pGVSxQvX0c=
 golang.org/x/tools v0.0.0-20201008025239-9df69603baec/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
+golang.org/x/tools v0.1.6 h1:SIasE1FVIQOWz2GEAHFOmoW7xchJcqlucjSULTL0Ag4=
+golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/internal/satellite/tools/generate_plugin_doc.go b/internal/satellite/tools/generate_plugin_doc.go
index 85442f3..12444e2 100644
--- a/internal/satellite/tools/generate_plugin_doc.go
+++ b/internal/satellite/tools/generate_plugin_doc.go
@@ -19,19 +19,24 @@
 
 import (
 	"fmt"
+	"go/ast"
+	"go/doc"
+	"go/parser"
+	"go/token"
 	"io/ioutil"
 	"os"
 	"reflect"
 	"sort"
 	"strings"
 
+	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins"
 	fetcher_api "github.com/apache/skywalking-satellite/plugins/fetcher/api"
 	forwarder_api "github.com/apache/skywalking-satellite/plugins/forwarder/api"
 	receiver_api "github.com/apache/skywalking-satellite/plugins/receiver/api"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/log"
-	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/plugins"
+	"golang.org/x/mod/modfile"
 )
 
 const (
@@ -41,6 +46,8 @@
 	yamlQuoteStart = "```yaml"
 	yamlQuoteEnd   = "```"
 	markdownSuffix = ".md"
+
+	commentPrefix = "/ "
 )
 
 func GeneratePluginDoc(outputRootPath, menuFilePath, pluginFilePath string) error {
@@ -119,30 +126,184 @@
 
 func generatePluginListDoc(docDir string, categories []reflect.Type) error {
 	fileName := docDir + "/" + "plugin-list" + markdownSuffix
-	doc := topLevel + "Plugin List" + lf
+	docStr := topLevel + "Plugin List" + lf
 	for _, category := range categories {
-		doc += "- " + category.Name() + lf
+		docStr += "- " + category.Name() + lf
 		pluginList := getPluginsByCategory(category)
 		for _, pluginName := range pluginList {
-			doc += "	- [" + pluginName + "](./" + getPluginDocFileName(category, pluginName) + ")" + lf
+			docStr += "	- [" + pluginName + "](./" + getPluginDocFileName(category, pluginName) + ")" + lf
 			if err := generatePluginDoc(docDir, category, pluginName); err != nil {
 				return err
 			}
 		}
 	}
-	return writeDoc([]byte(doc), fileName)
+	return writeDoc([]byte(docStr), fileName)
 }
 
 func generatePluginDoc(docDir string, category reflect.Type, pluginName string) error {
 	docFileName := docDir + "/" + getPluginDocFileName(category, pluginName)
 	p := plugin.Get(category, plugin.Config{plugin.NameField: pluginName})
-	doc := topLevel + category.Name() + "/" + pluginName + lf
-	doc += secondLevel + "Description" + lf
-	doc += p.Description() + lf
-	doc += generateSupportForwarders(category, p)
-	doc += secondLevel + "DefaultConfig" + lf
-	doc += yamlQuoteStart + p.DefaultConfig() + yamlQuoteEnd + lf
-	return writeDoc([]byte(doc), docFileName)
+	docRes := topLevel + category.Name() + "/" + pluginName + lf
+	docRes += secondLevel + "Description" + lf
+	docRes += p.Description() + lf
+	docRes += generateSupportForwarders(category, p)
+	docRes += secondLevel + "DefaultConfig" + lf
+	docRes += yamlQuoteStart + p.DefaultConfig() + yamlQuoteEnd + lf
+	docRes += secondLevel + "Configuration" + lf
+	docRes += generateConfiguration(category, p) + lf
+	return writeDoc([]byte(docRes), docFileName)
+}
+
+func GetModuleName() string {
+	goModBytes, err := ioutil.ReadFile("go.mod")
+	if err != nil {
+		return ""
+	}
+
+	modName := modfile.ModulePath(goModBytes)
+	return modName
+}
+
+func generateConfiguration(category reflect.Type, p plugin.Plugin) string {
+	var content = ""
+
+	content += "|Name|Type|Description|" + lf
+	content += "|----|----|-----------|" + lf
+
+	configurations := getConfigurations(category, reflect.TypeOf(p).Elem())
+	eachConfigurationItem(configurations, "", func(name, dataType, desc string) {
+		content += fmt.Sprintf("| %s | %s | %s |%s", name, dataType, desc, lf)
+	})
+
+	return content
+}
+
+func eachConfigurationItem(items []*pluginConfigurationItem, parentName string, consumer func(name, dataType, desc string)) {
+	for _, conf := range items {
+		consumer(parentName+conf.name, conf.dataType, conf.description)
+		eachConfigurationItem(conf.children, parentName+conf.name+".", consumer)
+	}
+}
+
+type pluginConfigurationItem struct {
+	name        string
+	description string
+	dataType    string
+	children    []*pluginConfigurationItem
+}
+
+type pluginChildrenFinder struct {
+	childType reflect.Type
+	squash    bool
+}
+
+func getConfigurations(category, p reflect.Type) []*pluginConfigurationItem {
+	pluginDir := strings.TrimPrefix(p.PkgPath(), GetModuleName())
+	fset := token.NewFileSet()
+
+	d, err := parser.ParseDir(fset, "."+pluginDir, nil, parser.ParseComments)
+	if err != nil {
+		log.Logger.Warnf("failed to generate plugin [%s] configuration, error: %v", category.Name()+"/"+p.Name(), err)
+		return make([]*pluginConfigurationItem, 0)
+	}
+
+	result := make([]*pluginConfigurationItem, 0)
+	for _, f := range d {
+		pack := doc.New(f, "./", 0)
+		for _, t := range pack.Types {
+			if t.Name != p.Name() {
+				continue
+			}
+
+			for _, spec := range t.Decl.Specs {
+				typeSpec, ok := spec.(*ast.TypeSpec)
+				if !ok {
+					continue
+				}
+				structType, ok := typeSpec.Type.(*ast.StructType)
+				if !ok {
+					continue
+				}
+
+				for _, field := range structType.Fields.List {
+					item, childFinder := parsePluginConfigurationItem(field, p)
+					if childFinder != nil {
+						configurations := getConfigurations(category, childFinder.childType)
+						if childFinder.squash {
+							result = append(result, configurations...)
+						} else if item != nil {
+							item.children = configurations
+						}
+					}
+					if item != nil {
+						result = append(result, item)
+					}
+				}
+			}
+		}
+	}
+	return result
+}
+
+// parse field to configuration item
+func parsePluginConfigurationItem(field *ast.Field, pType reflect.Type) (*pluginConfigurationItem, *pluginChildrenFinder) {
+	if field.Names == nil || field.Tag == nil {
+		return nil, nil
+	}
+
+	var fieldName = ""
+	for _, n := range field.Names {
+		fieldName += n.Name
+	}
+
+	pluginField, find := pType.FieldByName(fieldName)
+	if !find {
+		return nil, nil
+	}
+	mapStructureValue := pluginField.Tag.Get("mapstructure")
+	var confName string
+	var childrenFinder *pluginChildrenFinder
+	if index := strings.Index(mapStructureValue, ","); index != -1 {
+		if strings.Contains(mapStructureValue[index+1:], "squash") {
+			if pluginField.Type.Kind() == reflect.Struct {
+				return nil, &pluginChildrenFinder{childType: pluginField.Type, squash: true}
+			}
+			log.Logger.Warnf("Could not identity plugin field: %v", pluginField)
+			return nil, nil
+		}
+		confName = mapStructureValue[:index]
+	} else if len(mapStructureValue) > 0 {
+		confName = mapStructureValue
+	} else {
+		confName = fieldName
+	}
+
+	var dataType = pluginField.Type.String()
+	switch pluginField.Type.Kind() {
+	case reflect.Struct:
+	case reflect.Ptr:
+		if pluginField.Type.Elem().PkgPath() != "" {
+			childrenFinder = &pluginChildrenFinder{childType: pluginField.Type.Elem()}
+		}
+	}
+
+	return &pluginConfigurationItem{
+		name:        confName,
+		dataType:    dataType,
+		description: buildPluginDescription(field),
+	}, childrenFinder
+}
+
+func buildPluginDescription(field *ast.Field) string {
+	var comments = ""
+	for _, group := range []*ast.CommentGroup{field.Doc, field.Comment} {
+		if group != nil {
+			for _, comment := range group.List {
+				comments += strings.TrimLeft(comment.Text, commentPrefix)
+			}
+		}
+	}
+	return comments
 }
 
 func generateSupportForwarders(category reflect.Type, p plugin.Plugin) string {
@@ -176,8 +337,8 @@
 	return strings.ToLower(category.Name() + "_" + pluginName + markdownSuffix)
 }
 
-func writeDoc(doc []byte, docFileName string) error {
-	if err := ioutil.WriteFile(docFileName, doc, os.ModePerm); err != nil {
+func writeDoc(docBytes []byte, docFileName string) error {
+	if err := ioutil.WriteFile(docFileName, docBytes, os.ModePerm); err != nil {
 		return fmt.Errorf("cannot init the plugin doc: %v", err)
 	}
 	return nil
diff --git a/plugins/client/grpc/client.go b/plugins/client/grpc/client.go
index 0431a27..22e72fd 100644
--- a/plugins/client/grpc/client.go
+++ b/plugins/client/grpc/client.go
@@ -37,7 +37,7 @@
 	config.CommonFields
 	// server finder config
 	ServerFinderConfig resolvers.ServerFinderConfig `mapstructure:",squash"`
-	// config
+
 	EnableTLS          bool   `mapstructure:"enable_TLS"`           // Enable TLS connect to server
 	ClientPemPath      string `mapstructure:"client_pem_path"`      // The file path of client.pem. The config only works when opening the TLS switch.
 	ClientKeyPath      string `mapstructure:"client_key_path"`      // The file path of client.key. The config only works when opening the TLS switch.
diff --git a/plugins/client/kafka/client.go b/plugins/client/kafka/client.go
index 63c0362..827192a 100644
--- a/plugins/client/kafka/client.go
+++ b/plugins/client/kafka/client.go
@@ -33,7 +33,6 @@
 
 type Client struct {
 	config.CommonFields
-	// config
 	Brokers            string `mapstructure:"brokers"`              // The Kafka broker addresses (default `localhost:9092`).
 	Version            string `mapstructure:"version"`              // The version should follow this pattern, which is `major.minor.veryMinor.patch`.
 	EnableTLS          bool   `mapstructure:"enable_TLS"`           // The TLS switch (default false).
diff --git a/plugins/queue/mmap/queue.go b/plugins/queue/mmap/queue.go
index 3d21340..d7b0c2e 100644
--- a/plugins/queue/mmap/queue.go
+++ b/plugins/queue/mmap/queue.go
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+//go:build !windows
 // +build !windows
 
 package mmap
@@ -53,7 +54,6 @@
 // Queue is a memory mapped queue to store the input data.
 type Queue struct {
 	config.CommonFields
-	// config
 	SegmentSize           int   `mapstructure:"segment_size"`            // The size of each segment. The unit is byte.
 	MaxInMemSegments      int32 `mapstructure:"max_in_mem_segments"`     // The max num of segments in memory.
 	QueueCapacitySegments int   `mapstructure:"queue_capacity_segments"` // The capacity of Queue = segment_size * queue_capacity_segments.
diff --git a/test/e2e/case/native-protocols/expected/service.yml b/test/e2e/case/native-protocols/expected/service.yml
index 129f9d3..e299d8b 100644
--- a/test/e2e/case/native-protocols/expected/service.yml
+++ b/test/e2e/case/native-protocols/expected/service.yml
@@ -13,9 +13,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+{{- range . }}
+{{- if eq .name "e2e-service-provider" }}
 - id: {{ b64enc "e2e-service-provider" }}.1
   name: e2e-service-provider
   group: ""
+{{- end }}
+{{- if eq .name "e2e-service-consumer" }}
 - id: {{ b64enc "e2e-service-consumer" }}.1
   name: e2e-service-consumer
-  group: ""
\ No newline at end of file
+  group: ""
+{{- end }}
+{{- end }}
\ No newline at end of file