You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by li...@apache.org on 2020/12/28 05:22:35 UTC

[skywalking-satellite] branch telemetry created (now 118935d)

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

liujiapeng pushed a change to branch telemetry
in repository https://gitbox.apache.org/repos/asf/skywalking-satellite.git.


      at 118935d  add prometheus server and polish api

This branch includes the following new commits:

     new 118935d  add prometheus server and polish api

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking-satellite] 01/01: add prometheus server and polish api

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujiapeng pushed a commit to branch telemetry
in repository https://gitbox.apache.org/repos/asf/skywalking-satellite.git

commit 118935d5cd4d0d0c7af90a89a4e816604681ab2c
Author: Evan <ev...@outlook.com>
AuthorDate: Mon Dec 28 13:21:49 2020 +0800

    add prometheus server and polish api
---
 configs/satellite_config.yaml                      |  19 +-
 dist/LICENSE                                       |   2 +-
 .../LICENSE-prometheus-client-golang.txt}          |  47 +----
 go.mod                                             |   1 +
 go.sum                                             | 204 +++++++++++++++++++++
 .../pkg/config/common_config.go                    |  17 +-
 internal/pkg/plugin/definition.go                  |  24 ++-
 internal/pkg/plugin/plugin_test.go                 |  51 +++++-
 internal/pkg/plugin/registry.go                    |  18 +-
 internal/satellite/boot/boot.go                    |  34 ++--
 internal/satellite/config/loader.go                |  59 +++++-
 internal/satellite/config/loader_test.go           | 164 ++++++++++-------
 internal/satellite/config/satellite_config.go      |  27 +--
 internal/{pkg => satellite}/event/event.go         |   0
 internal/satellite/module/api/module.go            |   4 -
 internal/satellite/module/buffer/buffer.go         |   2 +-
 internal/satellite/module/buffer/buffer_test.go    |   2 +-
 internal/satellite/module/gatherer/api/config.go   |   4 +-
 internal/satellite/module/gatherer/api/gatherer.go |   2 +-
 internal/satellite/module/gatherer/create.go       |   4 +-
 .../satellite/module/gatherer/fetcher_gatherer.go  |  42 ++++-
 .../satellite/module/gatherer/receiver_gatherer.go |  49 +++--
 internal/satellite/module/processor/api/config.go  |   4 +-
 internal/satellite/module/processor/create.go      |   2 +-
 internal/satellite/module/processor/processor.go   |   9 +-
 internal/satellite/module/sender/api/config.go     |   4 +-
 internal/satellite/module/sender/api/sender.go     |   2 +-
 internal/satellite/module/sender/create.go         |   4 +-
 internal/satellite/module/sender/sender.go         |  50 +++--
 internal/satellite/sharing/sharing_plugins.go      |  12 ++
 internal/satellite/telemetry/telemetry.go          |  53 ++++++
 plugins/client/api/client.go                       |  11 +-
 plugins/client/{api => }/client_repository.go      |  12 +-
 plugins/fallbacker/api/fallbacker.go               |  11 +-
 .../fallbacker/{api => }/fallbacker_repository.go  |  12 +-
 plugins/fallbacker/timer/timer_fallbacker.go       |  26 ++-
 plugins/fetcher/api/fetcher.go                     |   3 +-
 plugins/filter/api/filter.go                       |   2 +-
 plugins/forwarder/api/forwarder.go                 |  15 +-
 .../forwarder/{api => }/forwarder_repository.go    |  12 +-
 plugins/init.go                                    |  10 +-
 plugins/parser/api/parser.go                       |   2 +-
 .../{server/api/server.go => queue/api/error.go}   |  13 +-
 plugins/queue/api/queue.go                         |   2 +-
 plugins/queue/mmap/queue.go                        |  10 +-
 plugins/queue/mmap/queue_opreation.go              |   6 +-
 plugins/receiver/api/receiver.go                   |  10 +-
 plugins/receiver/{api => }/receiver_repository.go  |  12 +-
 plugins/server/api/server.go                       |  14 +-
 plugins/server/prometheus/Prometheus.go            |  83 +++++++++
 plugins/server/prometheus/Prometheus_test.go       |  64 +++++++
 plugins/server/{api => }/server_repository.go      |  14 +-
 52 files changed, 938 insertions(+), 322 deletions(-)

diff --git a/configs/satellite_config.yaml b/configs/satellite_config.yaml
index 3c71121..5a1fbac 100644
--- a/configs/satellite_config.yaml
+++ b/configs/satellite_config.yaml
@@ -17,23 +17,30 @@
 
 logger:
   log_pattern: "%time [%level][%field] - %msg"
-  time_pattern: "2006-01-02 15:04:05.001"
+  time_pattern: "2006-01-02 15:04:05.000"
   level: "info"
 
+telemetry:
+  namespace: namespaces
+  service: service1
+  instance: instance1
+
 sharing:
+  common_config:
+    pipe_name: sharing
   clients:
     - plugin_name: "grpc-client"
       k: v
   servers:
     - plugin_name: "grpc-server"
       k: v
-namespaces:
+pipes:
   - common_config:
-      name: namespace1
+      pipe_name: namespace1
     gatherer:
+      server_name: "grpc-server"
       receiver:
         plugin_name: segment-receiver
-        server_name: "grpc-server"
         k: v
       queue:
         plugin_name: mmap-queue
@@ -43,7 +50,9 @@ namespaces:
         - plugin_name: filtertype1
           key: value
     sender:
-      flush_time: 200
+      fallbacker:
+        plugin_name: none-fallbacker
+      flush_time: 1000
       max_buffer_size: 100
       min_flush_events: 30
       client_name: grpc-client
diff --git a/dist/LICENSE b/dist/LICENSE
index 9cb8a3a..af6f460 100644
--- a/dist/LICENSE
+++ b/dist/LICENSE
@@ -214,7 +214,7 @@ Apache 2.0 licenses
 
 The following components are provided under the Apache License. See project link for details.
 The text of each license is the standard Apache 2.0 license.
-
+    client_golang (prometheus) v1.9.0: https://github.com/prometheus/client_golang Apache 2.0
 
 ========================================================================
 BSD licenses
diff --git a/dist/LICENSE b/dist/licenses/LICENSE-prometheus-client-golang.txt
similarity index 85%
copy from dist/LICENSE
copy to dist/licenses/LICENSE-prometheus-client-golang.txt
index 9cb8a3a..f49a4e1 100644
--- a/dist/LICENSE
+++ b/dist/licenses/LICENSE-prometheus-client-golang.txt
@@ -178,7 +178,7 @@
    APPENDIX: How to apply the Apache License to your work.
 
       To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
+      boilerplate notice, with the fields enclosed by brackets "[]"
       replaced with your own identifying information. (Don't include
       the brackets!)  The text should be enclosed in the appropriate
       comment syntax for the file format. We also recommend that a
@@ -186,7 +186,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright {yyyy} {name of copyright owner}
+   Copyright [yyyy] [name of copyright owner]
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -198,45 +198,4 @@
    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.
-
-=======================================================================
-Apache SkyWalking Satellite Subcomponents:
-
-Apache SkyWalking Satellite project contains subcomponents with separate copyright
-notices and license terms. Your use of the source code for the these
-subcomponents is subject to the terms and conditions of the following
-licenses.
-
-========================================================================
-Apache 2.0 licenses
-========================================================================
-
-The following components are provided under the Apache License. See project link for details.
-The text of each license is the standard Apache 2.0 license.
-
-
-========================================================================
-BSD licenses
-========================================================================
-
-The following components are provided under a BSD license. See project link for details.
-The text of each license is also included at licenses/LICENSE-[project].txt.
-    google (go-cmp) v0.5.4 https://github.com/google/go-cmp BSD
-    golang(protobuf) v1.4.3   https://github.com/golang/protobuf BSD
-    google(protobuf v1.25.0 https://google.golang.org/protobuf BSD
-
-========================================================================
-MIT licenses
-========================================================================
-
-The following components are provided under the MIT License. See project link for details.
-The text of each license is also included at licenses/LICENSE-[project].txt.
-
-	sirupsen (logrus) v1.7.0: https://github.com/sirupsen/logrus MIT
-	spf13 (viper) v1.7.1: https://github.com/spf13/viper MIT
-	urfave (cli) v2.3.0: https://github.com/urfave/cli MIT
-	grandecola (mmap) v0.6.0: https://github.com/grandecola/mmap MIT
-    grandecola (bigqueue) v0.4.0: https://github.com/grandecola/bigqueue MIT
-
-
+   limitations under the License.
\ No newline at end of file
diff --git a/go.mod b/go.mod
index d1ab22e..95c5280 100644
--- a/go.mod
+++ b/go.mod
@@ -8,6 +8,7 @@ require (
 	github.com/golang/protobuf v1.4.3
 	github.com/google/go-cmp v0.5.4
 	github.com/grandecola/mmap v0.6.0
+	github.com/prometheus/client_golang v1.9.0
 	github.com/sirupsen/logrus v1.7.0
 	github.com/spf13/viper v1.7.1
 	github.com/urfave/cli/v2 v2.3.0
diff --git a/go.sum b/go.sum
index 714aaf3..f71e837 100644
--- a/go.sum
+++ b/go.sum
@@ -14,51 +14,95 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
@@ -74,6 +118,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -84,24 +129,34 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/grandecola/mmap v0.6.0 h1:dYrZWLay1rDlmlsGsSIoXGQ+JMu/t2ZnKt8vT1h+1o0=
 github.com/grandecola/mmap v0.6.0/go.mod h1:q5v9jpm393rcp5PXE6biArHKc2SWJBpXjfxSRtQMtNU=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
@@ -115,6 +170,7 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX
 github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
@@ -124,26 +180,43 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
 github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -155,38 +228,96 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
+github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
+github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
@@ -194,17 +325,23 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1
 github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -212,26 +349,44 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
 github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 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=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -251,21 +406,28 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 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=
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
@@ -275,28 +437,44 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+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=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -313,17 +491,23 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
@@ -333,17 +517,24 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
 google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI=
@@ -362,19 +553,32 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
 gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
diff --git a/plugins/server/api/server.go b/internal/pkg/config/common_config.go
similarity index 74%
copy from plugins/server/api/server.go
copy to internal/pkg/config/common_config.go
index 09d3f2b..b87ee80 100644
--- a/plugins/server/api/server.go
+++ b/internal/pkg/config/common_config.go
@@ -15,14 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package config
 
-import "github.com/apache/skywalking-satellite/internal/pkg/plugin"
+const (
+	CommonFieldsName = "CommonFields"
+	TagName          = "mapstructure"
+)
 
-// Server is a plugin interface, that defines new servers, such as gRPC server and http server.
-type Server interface {
-	plugin.SharingPlugin
-
-	// Start a server to receive the input APM data.
-	Start() error
+// CommonFields defines some common filed for every modules or plugins.
+type CommonFields struct {
+	// PipeName indicates which pipe belongs to.
+	PipeName string `mapstructure:"pipe_name"`
 }
diff --git a/internal/pkg/plugin/definition.go b/internal/pkg/plugin/definition.go
index 971fd89..10a6cdd 100644
--- a/internal/pkg/plugin/definition.go
+++ b/internal/pkg/plugin/definition.go
@@ -17,6 +17,14 @@
 
 package plugin
 
+import (
+	"reflect"
+	"strings"
+)
+
+// NameField is a required field in Config.
+const NameField = "plugin_name"
+
 // Plugin defines the plugin model in Satellite.
 type Plugin interface {
 	// Name returns the name of the specific plugin.
@@ -33,6 +41,8 @@ type SharingPlugin interface {
 
 	// Prepare the sharing plugins, such as build the connection with the external services.
 	Prepare() error
+	// Start a server to receive the input APM data.
+	Start() error
 	// Close the sharing plugin.
 	Close() error
 }
@@ -40,5 +50,15 @@ type SharingPlugin interface {
 // Config is used to initialize the DefaultInitializingPlugin.
 type Config map[string]interface{}
 
-// NameField is a required field in Config.
-const NameField = "plugin_name"
+// GetPluginName returns a plugin name generated by the packages.
+func GetPluginName(p Plugin) string {
+	t := reflect.TypeOf(p)
+	if t.Kind() == reflect.Ptr {
+		t = t.Elem()
+	}
+	arr := strings.Split(t.PkgPath(), "/")
+	if len(arr) < 2 {
+		return ""
+	}
+	return arr[len(arr)-1] + "-" + arr[len(arr)-2]
+}
diff --git a/internal/pkg/plugin/plugin_test.go b/internal/pkg/plugin/plugin_test.go
index efebdba..4d88e08 100644
--- a/internal/pkg/plugin/plugin_test.go
+++ b/internal/pkg/plugin/plugin_test.go
@@ -20,14 +20,21 @@ package plugin
 import (
 	"reflect"
 	"testing"
+
+	"github.com/google/go-cmp/cmp"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 )
 
+const pluginName = "plugin-pkg"
+
 type DemoCategory interface {
 	Plugin
 	Say() string
 }
 
 type DemoPlugin struct {
+	config.CommonFields
 	Organization string `mapstructure:"organization"`
 	Project      string `mapstructure:"project"`
 }
@@ -37,7 +44,7 @@ func (d *DemoPlugin) Say() string {
 }
 
 func (d *DemoPlugin) Name() string {
-	return "demoplugin"
+	return GetPluginName(d)
 }
 
 func (d *DemoPlugin) Description() string {
@@ -51,6 +58,30 @@ project: "skywalking-satellite"
 `
 }
 
+func TestGetPluginName(t *testing.T) {
+	type args struct {
+		p Plugin
+	}
+	tests := []struct {
+		name string
+		args args
+		want string
+	}{
+		{
+			name: "check-name",
+			args: args{p: new(DemoPlugin)},
+			want: pluginName,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := GetPluginName(tt.args.p); got != tt.want {
+				t.Errorf("GetPluginName() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
 func TestPlugin(t *testing.T) {
 	tests := []struct {
 		name string
@@ -60,11 +91,15 @@ func TestPlugin(t *testing.T) {
 		{
 			name: "test1",
 			args: Config{
-				"plugin_name":  "demoplugin",
-				"organization": "CNCF",
-				"project":      "Fluentd",
+				"plugin_name":            pluginName,
+				"organization":           "CNCF",
+				"project":                "Fluentd",
+				"commonfields_pipe_name": "b",
 			},
 			want: &DemoPlugin{
+				CommonFields: config.CommonFields{
+					PipeName: "b",
+				},
 				Organization: "CNCF",
 				Project:      "Fluentd",
 			},
@@ -72,7 +107,7 @@ func TestPlugin(t *testing.T) {
 		{
 			name: "demoplugin",
 			args: Config{
-				"plugin_name": "demoplugin",
+				"plugin_name": pluginName,
 			},
 			want: &DemoPlugin{
 				Organization: "ASF",
@@ -84,11 +119,11 @@ func TestPlugin(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if i := recover(); i != nil {
-					t.Errorf("the plugin %s is not exist", "demoplugin")
+					t.Errorf("the plugin initialized err: %v", i)
 				}
 			}()
 			plugin := Get(reflect.TypeOf((*DemoCategory)(nil)).Elem(), tt.args)
-			if !reflect.DeepEqual(plugin, tt.want) {
+			if !cmp.Equal(plugin, tt.want) {
 				t.Errorf("Format() got = %v, want %v", plugin, tt.want)
 			}
 		})
@@ -97,5 +132,5 @@ func TestPlugin(t *testing.T) {
 
 func init() {
 	RegisterPluginCategory(reflect.TypeOf((*DemoCategory)(nil)).Elem())
-	RegisterPlugin(&DemoPlugin{})
+	RegisterPlugin(new(DemoPlugin))
 }
diff --git a/internal/pkg/plugin/registry.go b/internal/pkg/plugin/registry.go
index 36b0d42..4c700a3 100644
--- a/internal/pkg/plugin/registry.go
+++ b/internal/pkg/plugin/registry.go
@@ -23,6 +23,8 @@ import (
 	"strings"
 
 	"github.com/spf13/viper"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 )
 
 // the global plugin registry
@@ -47,12 +49,12 @@ func RegisterPlugin(plugin Plugin) {
 	for pCategory, pReg := range reg {
 		if v.Type().Implements(pCategory) {
 			pReg[plugin.Name()] = v
-			fmt.Printf("register %s %s successfully ", plugin.Name(), v.Type().String())
+			fmt.Printf("register %s %s successfully\n", plugin.Name(), v.Type().String())
 			success = true
 		}
 	}
 	if !success {
-		fmt.Printf("this type of %s is not supported to register : %s", plugin.Name(), v.Type().String())
+		fmt.Printf("this type of %s is not supported to register : %s\n", plugin.Name(), v.Type().String())
 	}
 }
 
@@ -100,4 +102,16 @@ func initializing(plugin Plugin, cfg Config) {
 	if err := v.Unmarshal(plugin); err != nil {
 		panic(fmt.Errorf("cannot inject  the config to the %s plugin, the error is %v", plugin.Name(), err))
 	}
+	cf := reflect.ValueOf(plugin).Elem().FieldByName(config.CommonFieldsName)
+	if !cf.IsValid() {
+		panic("%s plugin must have a field named CommonField.")
+	}
+	for i := 0; i < cf.NumField(); i++ {
+		tagVal := cf.Type().Field(i).Tag.Get("mapstructure")
+		if tagVal != "" {
+			if val := cfg[strings.ToLower(config.CommonFieldsName)+"_"+tagVal]; val != nil {
+				cf.Field(i).Set(reflect.ValueOf(val))
+			}
+		}
+	}
 }
diff --git a/internal/satellite/boot/boot.go b/internal/satellite/boot/boot.go
index bd29232..2bfeeb1 100644
--- a/internal/satellite/boot/boot.go
+++ b/internal/satellite/boot/boot.go
@@ -35,6 +35,7 @@ import (
 	"github.com/apache/skywalking-satellite/internal/satellite/module/processor"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/sender"
 	"github.com/apache/skywalking-satellite/internal/satellite/sharing"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 	"github.com/apache/skywalking-satellite/plugins"
 )
 
@@ -43,7 +44,9 @@ type ModuleContainer map[string][]api.Module
 
 // Start Satellite.
 func Start(cfg *config.SatelliteConfig) error {
+	// Init the global components.
 	log.Init(cfg.Logger)
+	telemetry.Init(cfg.Telemetry)
 	// register the supported plugin types to the registry
 	plugins.RegisterPlugins()
 	// use context to receive the external signal.
@@ -60,6 +63,8 @@ func Start(cfg *config.SatelliteConfig) error {
 		return err
 	} else if err := prepareModules(modules); err != nil {
 		return err
+	} else if err := sharing.Start(); err != nil {
+		return err
 	} else {
 		bootModules(ctx, modules)
 		return nil
@@ -79,39 +84,25 @@ func addShutdownListener(cancel context.CancelFunc) {
 // initModules init the modules and register the modules to the module container.
 func initModules(cfg *config.SatelliteConfig) (ModuleContainer, error) {
 	log.Logger.Infof("satellite is initializing...")
-	if err := initModuleConfig(cfg); err != nil {
-		return nil, err
+	for _, aCfg := range cfg.Pipes {
+		if aCfg.Gatherer == nil || aCfg.Sender == nil || aCfg.Processor == nil {
+			return nil, errors.New("gatherer, sender, and processor is required in the namespace config")
+		}
 	}
 	// container contains the modules in each namespace.
 	container := make(ModuleContainer)
-	for _, aCfg := range cfg.Namespaces {
+	for _, aCfg := range cfg.Pipes {
 		// the added sequence should follow gather, sender and processor to purpose the booting sequence.
 		var modules []api.Module
 		g := gatherer.NewGatherer(aCfg.Gatherer)
 		s := sender.NewSender(aCfg.Sender, g)
 		p := processor.NewProcessor(aCfg.Processor, s, g)
 		modules = append(modules, g, s, p)
-		container[aCfg.ModuleCommonConfig.NamespaceName] = modules
+		container[aCfg.PipeCommonConfig.PipeName] = modules
 	}
 	return container, nil
 }
 
-// initModuleConfig valid the config pattern and inject the common config to the specific module config.
-func initModuleConfig(cfg *config.SatelliteConfig) error {
-	for _, aCfg := range cfg.Namespaces {
-		if aCfg.Gatherer == nil || aCfg.Sender == nil || aCfg.Processor == nil {
-			return errors.New("gatherer, sender, and processor is required in the namespace config")
-		}
-	}
-	// inject module common config to the specific module config
-	for _, aCfg := range cfg.Namespaces {
-		aCfg.Sender.ModuleCommonConfig = *aCfg.ModuleCommonConfig
-		aCfg.Gatherer.ModuleCommonConfig = *aCfg.ModuleCommonConfig
-		aCfg.Gatherer.ModuleCommonConfig = *aCfg.ModuleCommonConfig
-	}
-	return nil
-}
-
 // prepareModules makes that all modules are in a bootable state.
 func prepareModules(container ModuleContainer) error {
 	log.Logger.Infof("satellite is prepare to start...")
@@ -134,13 +125,14 @@ func prepareModules(container ModuleContainer) error {
 // bootModules boot all modules.
 func bootModules(ctx context.Context, container ModuleContainer) {
 	log.Logger.Infof("satellite is starting...")
+
 	var wg sync.WaitGroup
 	for _, modules := range container {
+		wg.Add(len(modules))
 		for _, m := range modules {
 			m := m
 			go func() {
 				defer wg.Done()
-				wg.Add(1)
 				m.Boot(ctx)
 			}()
 		}
diff --git a/internal/satellite/config/loader.go b/internal/satellite/config/loader.go
index 1518084..21c92f8 100644
--- a/internal/satellite/config/loader.go
+++ b/internal/satellite/config/loader.go
@@ -20,12 +20,17 @@ package config
 import (
 	"bytes"
 	"fmt"
+	"reflect"
+	"strings"
 	"sync"
 
 	"io/ioutil"
 	"path/filepath"
 
 	"github.com/spf13/viper"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
 )
 
 var (
@@ -45,7 +50,7 @@ func Load(configPath string) *SatelliteConfig {
 	}
 }
 
-// load SatelliteConfig from the yaml config.
+// load SatelliteConfig from the yaml config and override the value with env config.
 func load(configPath string) (*SatelliteConfig, error) {
 	absolutePath, err := filepath.Abs(configPath)
 	if err != nil {
@@ -56,6 +61,9 @@ func load(configPath string) (*SatelliteConfig, error) {
 		return nil, err
 	}
 	v := viper.New()
+	v.AutomaticEnv()
+	v.SetEnvPrefix("satellite")
+	v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
 	v.SetConfigType("yaml")
 	cfg := SatelliteConfig{}
 	if err := v.ReadConfig(bytes.NewReader(content)); err != nil {
@@ -64,6 +72,53 @@ func load(configPath string) (*SatelliteConfig, error) {
 	if err := v.Unmarshal(&cfg); err != nil {
 		return nil, err
 	}
-
+	propagateCommonFieldsInSharing(cfg.Sharing)
+	propagateCommonFieldsInPipes(cfg.Pipes)
 	return &cfg, nil
 }
+
+// propagate the common fields to every modules and the dependency plugins.
+func propagateCommonFieldsInPipes(pipes []*PipeConfig) {
+	for _, pipe := range pipes {
+		pipe.Gatherer.CommonFields = pipe.PipeCommonConfig
+		pipe.Sender.CommonFields = pipe.PipeCommonConfig
+		pipe.Processor.CommonFields = pipe.PipeCommonConfig
+		propagateCommonFieldsInStruct(pipe.Gatherer, pipe.PipeCommonConfig)
+		propagateCommonFieldsInStruct(pipe.Sender, pipe.PipeCommonConfig)
+		propagateCommonFieldsInStruct(pipe.Processor, pipe.PipeCommonConfig)
+	}
+}
+
+// propagate the common fields to the sharing plugins.
+func propagateCommonFieldsInSharing(sharing *SharingConfig) {
+	propagateCommonFieldsInStruct(sharing, sharing.SharingCommonConfig)
+}
+
+// propagate the common fields to the fields that is one of `plugin.config` or `[]plugin.config` types.
+func propagateCommonFieldsInStruct(cfg interface{}, cf config.CommonFields) {
+	v := reflect.ValueOf(cfg)
+	if v.Kind() == reflect.Ptr {
+		v = v.Elem()
+	}
+	for i := 0; i < v.Type().NumField(); i++ {
+		fieldVal := v.Field(i).Interface()
+		if arr, ok := fieldVal.([]plugin.Config); arr != nil && ok {
+			for _, pc := range arr {
+				propagateCommonFields(pc, cf)
+			}
+		} else if pc, ok := fieldVal.(plugin.Config); pc != nil && ok {
+			propagateCommonFields(pc, cf)
+		}
+	}
+}
+
+// propagate the common fields to the `plugin.config`.
+func propagateCommonFields(pc plugin.Config, cf config.CommonFields) {
+	v := reflect.ValueOf(cf)
+	t := v.Type()
+	for i := 0; i < t.NumField(); i++ {
+		if tagVal := t.Field(i).Tag.Get(config.TagName); tagVal != "" {
+			pc[strings.ToLower(config.CommonFieldsName)+"_"+tagVal] = v.Field(i).Interface()
+		}
+	}
+}
diff --git a/internal/satellite/config/loader_test.go b/internal/satellite/config/loader_test.go
index 5d978c7..c32bca8 100644
--- a/internal/satellite/config/loader_test.go
+++ b/internal/satellite/config/loader_test.go
@@ -22,12 +22,13 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 	gatherer "github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
 	processor "github.com/apache/skywalking-satellite/internal/satellite/module/processor/api"
 	sender "github.com/apache/skywalking-satellite/internal/satellite/module/sender/api"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 )
 
 func TestLoad(t *testing.T) {
@@ -42,66 +43,7 @@ func TestLoad(t *testing.T) {
 		{
 			name: "Legal configuration",
 			args: args{configPath: "../../../configs/satellite_config.yaml"},
-			want: &SatelliteConfig{
-				Logger: &log.LoggerConfig{
-					LogPattern:  "%time [%level][%field] - %msg",
-					TimePattern: "2006-01-02 15:04:05.001",
-					Level:       "info",
-				},
-				Sharing: &SharingConfig{
-					Clients: []plugin.Config{
-						{
-							"plugin_name": "grpc-client",
-							"k":           "v",
-						},
-					},
-					Servers: []plugin.Config{
-						{
-							"plugin_name": "grpc-server",
-							"k":           "v",
-						},
-					},
-				},
-				Namespaces: []*NamespaceConfig{
-					{
-						ModuleCommonConfig: &api.ModuleCommonConfig{
-							NamespaceName: "namespace1",
-						},
-
-						Gatherer: &gatherer.GathererConfig{
-							ReceiverConfig: plugin.Config{
-								"plugin_name": "segment-receiver",
-								"server_name": "grpc-server",
-								"k":           "v",
-							},
-							QueueConfig: plugin.Config{
-								"plugin_name": "mmap-queue",
-								"key":         "value",
-							},
-						},
-						Processor: &processor.ProcessorConfig{
-							FilterConfig: []plugin.Config{
-								{
-									"plugin_name": "filtertype1",
-									"key":         "value",
-								},
-							},
-						},
-						Sender: &sender.SenderConfig{
-							MaxBufferSize:  100,
-							MinFlushEvents: 30,
-							FlushTime:      200,
-							ClientName:     "grpc-client",
-							ForwardersConfig: []plugin.Config{
-								{
-									"plugin_name": "segment-forwarder",
-									"key":         "value",
-								},
-							},
-						},
-					},
-				},
-			},
+			want: params(),
 		},
 	}
 	for _, tt := range tests {
@@ -113,14 +55,104 @@ func TestLoad(t *testing.T) {
 			doJudgeEqual(t, c.Logger, tt.want.Logger)
 			doJudgeEqual(t, c.Sharing.Servers, tt.want.Sharing.Servers)
 			doJudgeEqual(t, c.Sharing.Clients, tt.want.Sharing.Clients)
-			doJudgeEqual(t, c.Namespaces[0].ModuleCommonConfig, tt.want.Namespaces[0].ModuleCommonConfig)
-			doJudgeEqual(t, c.Namespaces[0].Gatherer, tt.want.Namespaces[0].Gatherer)
-			doJudgeEqual(t, c.Namespaces[0].Processor, tt.want.Namespaces[0].Processor)
-			doJudgeEqual(t, c.Namespaces[0].Sender, tt.want.Namespaces[0].Sender)
+			doJudgeEqual(t, c.Pipes[0].PipeCommonConfig, tt.want.Pipes[0].PipeCommonConfig)
+			doJudgeEqual(t, c.Pipes[0].Gatherer, tt.want.Pipes[0].Gatherer)
+			doJudgeEqual(t, c.Pipes[0].Processor, tt.want.Pipes[0].Processor)
+			doJudgeEqual(t, c.Pipes[0].Sender, tt.want.Pipes[0].Sender)
 		})
 	}
 }
 
+func params() *SatelliteConfig {
+	return &SatelliteConfig{
+		Logger: &log.LoggerConfig{
+			LogPattern:  "%time [%level][%field] - %msg",
+			TimePattern: "2006-01-02 15:04:05.000",
+			Level:       "info",
+		},
+		Telemetry: &telemetry.Config{
+			Namespace: "namesspace",
+			Service:   "service1",
+			Pod:       "instance1",
+		},
+		Sharing: &SharingConfig{
+			SharingCommonConfig: config.CommonFields{
+				PipeName: "sharing",
+			},
+			Clients: []plugin.Config{
+				{
+					"plugin_name":            "grpc-client",
+					"k":                      "v",
+					"commonfields_pipe_name": "sharing",
+				},
+			},
+			Servers: []plugin.Config{
+				{
+					"plugin_name":            "grpc-server",
+					"k":                      "v",
+					"commonfields_pipe_name": "sharing",
+				},
+			},
+		},
+		Pipes: []*PipeConfig{
+			{
+				PipeCommonConfig: config.CommonFields{
+					PipeName: "namespace1",
+				},
+
+				Gatherer: &gatherer.GathererConfig{
+					ServerName: "grpc-server",
+					CommonFields: config.CommonFields{
+						PipeName: "namespace1",
+					},
+					ReceiverConfig: plugin.Config{
+						"plugin_name":            "segment-receiver",
+						"k":                      "v",
+						"commonfields_pipe_name": "namespace1",
+					},
+					QueueConfig: plugin.Config{
+						"plugin_name":            "mmap-queue",
+						"key":                    "value",
+						"commonfields_pipe_name": "namespace1",
+					},
+				},
+				Processor: &processor.ProcessorConfig{
+					CommonFields: config.CommonFields{
+						PipeName: "namespace1",
+					},
+					FilterConfig: []plugin.Config{
+						{
+							"plugin_name":            "filtertype1",
+							"key":                    "value",
+							"commonfields_pipe_name": "namespace1",
+						},
+					},
+				},
+				Sender: &sender.SenderConfig{
+					CommonFields: config.CommonFields{
+						PipeName: "namespace1",
+					},
+					FallbackerConfig: plugin.Config{
+						"commonfields_pipe_name": "namespace1",
+						"plugin_name":            "none-fallbacker",
+					},
+					MaxBufferSize:  100,
+					MinFlushEvents: 30,
+					FlushTime:      1000,
+					ClientName:     "grpc-client",
+					ForwardersConfig: []plugin.Config{
+						{
+							"plugin_name":            "segment-forwarder",
+							"key":                    "value",
+							"commonfields_pipe_name": "namespace1",
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
 func doJudgeEqual(t *testing.T, a, b interface{}) {
 	if !reflect.DeepEqual(a, b) {
 		ajson, err := json.Marshal(a)
@@ -131,6 +163,6 @@ func doJudgeEqual(t *testing.T, a, b interface{}) {
 		if err != nil {
 			t.Fatalf("cannot do json format: %v", err)
 		}
-		t.Fatalf("config is not equal, got %s, want %s", ajson, bjson)
+		t.Fatalf("config is not equal, got %s,\n want %s", ajson, bjson)
 	}
 }
diff --git a/internal/satellite/config/satellite_config.go b/internal/satellite/config/satellite_config.go
index 8bf3d74..3033692 100644
--- a/internal/satellite/config/satellite_config.go
+++ b/internal/satellite/config/satellite_config.go
@@ -18,31 +18,34 @@
 package config
 
 import (
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 	gatherer "github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
 	processor "github.com/apache/skywalking-satellite/internal/satellite/module/processor/api"
 	sender "github.com/apache/skywalking-satellite/internal/satellite/module/sender/api"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 )
 
 // SatelliteConfig is to initialize Satellite.
 type SatelliteConfig struct {
-	Logger     *log.LoggerConfig  `mapstructure:"logger"`
-	Namespaces []*NamespaceConfig `mapstructure:"namespaces"`
-	Sharing    *SharingConfig     `mapstructure:"sharing"`
+	Logger    *log.LoggerConfig `mapstructure:"logger"`
+	Pipes     []*PipeConfig     `mapstructure:"pipes"`
+	Sharing   *SharingConfig    `mapstructure:"sharing"`
+	Telemetry *telemetry.Config `mapstructure:"telemetry"`
 }
 
 // SharingConfig contains some plugins,which could be shared by every namespace. That is useful to reduce resources cost.
 type SharingConfig struct {
-	Clients []plugin.Config `mapstructure:"clients"`
-	Servers []plugin.Config `mapstructure:"servers"`
+	SharingCommonConfig config.CommonFields `mapstructure:"common_config"`
+	Clients             []plugin.Config     `mapstructure:"clients"`
+	Servers             []plugin.Config     `mapstructure:"servers"`
 }
 
-// NamespaceConfig initializes the different module in different namespace.
-type NamespaceConfig struct {
-	ModuleCommonConfig *api.ModuleCommonConfig    `mapstructure:"common_config"`
-	Gatherer           *gatherer.GathererConfig   `mapstructure:"gatherer"`
-	Processor          *processor.ProcessorConfig `mapstructure:"processor"`
-	Sender             *sender.SenderConfig       `mapstructure:"sender"`
+// PipeConfig initializes the different module in different namespace.
+type PipeConfig struct {
+	PipeCommonConfig config.CommonFields        `mapstructure:"common_config"`
+	Gatherer         *gatherer.GathererConfig   `mapstructure:"gatherer"`
+	Processor        *processor.ProcessorConfig `mapstructure:"processor"`
+	Sender           *sender.SenderConfig       `mapstructure:"sender"`
 }
diff --git a/internal/pkg/event/event.go b/internal/satellite/event/event.go
similarity index 100%
rename from internal/pkg/event/event.go
rename to internal/satellite/event/event.go
diff --git a/internal/satellite/module/api/module.go b/internal/satellite/module/api/module.go
index a36232a..eee4dd5 100644
--- a/internal/satellite/module/api/module.go
+++ b/internal/satellite/module/api/module.go
@@ -34,7 +34,3 @@ type Module interface {
 	// Shutdown could do some clean job to close Module.
 	Shutdown()
 }
-
-type ModuleCommonConfig struct {
-	NamespaceName string `mapstructure:"name"`
-}
diff --git a/internal/satellite/module/buffer/buffer.go b/internal/satellite/module/buffer/buffer.go
index c2633a6..ecbdac2 100644
--- a/internal/satellite/module/buffer/buffer.go
+++ b/internal/satellite/module/buffer/buffer.go
@@ -18,8 +18,8 @@
 package buffer
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 )
 
 // BatchBuffer is a buffer to cache the input data in Sender.
diff --git a/internal/satellite/module/buffer/buffer_test.go b/internal/satellite/module/buffer/buffer_test.go
index c9f5715..953be39 100644
--- a/internal/satellite/module/buffer/buffer_test.go
+++ b/internal/satellite/module/buffer/buffer_test.go
@@ -20,8 +20,8 @@ package buffer
 import (
 	"testing"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 )
 
 func TestNewBuffer(t *testing.T) {
diff --git a/internal/satellite/module/gatherer/api/config.go b/internal/satellite/module/gatherer/api/config.go
index 9978028..9846ffe 100644
--- a/internal/satellite/module/gatherer/api/config.go
+++ b/internal/satellite/module/gatherer/api/config.go
@@ -18,14 +18,14 @@
 package api
 
 import (
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 )
 
 // GathererConfig contains all implementation fields.
 type GathererConfig struct {
 	// common config
-	api.ModuleCommonConfig
+	config.CommonFields
 	QueueConfig plugin.Config `mapstructure:"queue"` // queue plugin config
 
 	// ReceiverGatherer
diff --git a/internal/satellite/module/gatherer/api/gatherer.go b/internal/satellite/module/gatherer/api/gatherer.go
index 2216209..22913df 100644
--- a/internal/satellite/module/gatherer/api/gatherer.go
+++ b/internal/satellite/module/gatherer/api/gatherer.go
@@ -18,7 +18,7 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 	queue "github.com/apache/skywalking-satellite/plugins/queue/api"
 )
diff --git a/internal/satellite/module/gatherer/create.go b/internal/satellite/module/gatherer/create.go
index 1eab2ac..b161697 100644
--- a/internal/satellite/module/gatherer/create.go
+++ b/internal/satellite/module/gatherer/create.go
@@ -39,7 +39,7 @@ func NewGatherer(cfg *api.GathererConfig) api.Gatherer {
 
 // newFetcherGatherer crates a gatherer with the fetcher role.
 func newFetcherGatherer(cfg *api.GathererConfig) *FetcherGatherer {
-	log.Logger.Infof("fetcher gatherer module of %s namespace is being initialized", cfg.NamespaceName)
+	log.Logger.Infof("fetcher gatherer module of %s namespace is being initialized", cfg.PipeName)
 	return &FetcherGatherer{
 		config:         cfg,
 		runningQueue:   queue.GetQueue(cfg.QueueConfig),
@@ -50,7 +50,7 @@ func newFetcherGatherer(cfg *api.GathererConfig) *FetcherGatherer {
 
 // newReceiverGatherer crates a gatherer with the receiver role.
 func newReceiverGatherer(cfg *api.GathererConfig) *ReceiverGatherer {
-	log.Logger.Infof("receiver gatherer module of %s namespace is being initialized", cfg.NamespaceName)
+	log.Logger.Infof("receiver gatherer module of %s namespace is being initialized", cfg.PipeName)
 	return &ReceiverGatherer{
 		config:          cfg,
 		runningQueue:    queue.GetQueue(cfg.QueueConfig),
diff --git a/internal/satellite/module/gatherer/fetcher_gatherer.go b/internal/satellite/module/gatherer/fetcher_gatherer.go
index f218657..5a66b7b 100644
--- a/internal/satellite/module/gatherer/fetcher_gatherer.go
+++ b/internal/satellite/module/gatherer/fetcher_gatherer.go
@@ -22,9 +22,12 @@ import (
 	"sync"
 	"time"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/prometheus/client_golang/prometheus"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 	fetcher "github.com/apache/skywalking-satellite/plugins/fetcher/api"
 	queue "github.com/apache/skywalking-satellite/plugins/queue/api"
 )
@@ -39,9 +42,24 @@ type FetcherGatherer struct {
 
 	// self components
 	outputChannel chan *queue.SequenceEvent
+
+	// metrics
+	fetchCounter       *prometheus.CounterVec
+	queueOutputCounter *prometheus.CounterVec
 }
 
 func (f *FetcherGatherer) Prepare() error {
+	f.fetchCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
+		Name: "gatherer_fetch_count",
+		Help: "Total number of the receiving count in the Gatherer.",
+	}, []string{"pipe", "status"})
+	f.queueOutputCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
+		Subsystem: "fetcher",
+		Name:      "queue_output_count",
+		Help:      "Total number of the output count in the Queue of Gatherer.",
+	}, []string{"pipe", "status"})
+	telemetry.Registerer.MustRegister(f.fetchCounter)
+	telemetry.Registerer.MustRegister(f.queueOutputCounter)
 	return nil
 }
 
@@ -50,6 +68,7 @@ func (f *FetcherGatherer) Boot(ctx context.Context) {
 	wg.Add(2)
 	go func() {
 		defer wg.Done()
+		childCtx, cancel := context.WithCancel(ctx)
 		timeTicker := time.NewTicker(time.Duration(f.config.FetchInterval) * time.Millisecond)
 		for {
 			select {
@@ -57,12 +76,14 @@ func (f *FetcherGatherer) Boot(ctx context.Context) {
 				events := f.runningFetcher.Fetch()
 				for _, e := range events {
 					err := f.runningQueue.Push(e)
+					f.fetchCounter.WithLabelValues(f.config.PipeName, "all").Inc()
 					if err != nil {
-						// todo add abandonedCount metrics
-						log.Logger.Errorf("cannot put event into queue in %s namespace, %v", f.config.NamespaceName, err)
+						f.fetchCounter.WithLabelValues(f.config.PipeName, "abandoned").Inc()
+						log.Logger.Errorf("cannot put event into queue in %s namespace, %v", f.config.PipeName, err)
 					}
 				}
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				f.Shutdown()
 				return
 			}
@@ -71,17 +92,22 @@ func (f *FetcherGatherer) Boot(ctx context.Context) {
 
 	go func() {
 		defer wg.Done()
+		childCtx, cancel := context.WithCancel(ctx)
 		for {
 			select {
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				f.Shutdown()
 				return
 			default:
 				if e, err := f.runningQueue.Pop(); err == nil {
 					f.outputChannel <- e
+					f.queueOutputCounter.WithLabelValues(f.config.PipeName, "success").Inc()
+				} else if err == queue.ErrEmpty {
+					time.Sleep(time.Second)
 				} else {
+					f.queueOutputCounter.WithLabelValues(f.config.PipeName, "error").Inc()
 					log.Logger.Errorf("error in popping from the queue: %v", err)
-					time.Sleep(time.Second)
 				}
 			}
 		}
@@ -90,9 +116,9 @@ func (f *FetcherGatherer) Boot(ctx context.Context) {
 }
 
 func (f *FetcherGatherer) Shutdown() {
-	log.Logger.Infof("fetcher gatherer module of %s namespace is closing", f.config.NamespaceName)
+	log.Logger.Infof("fetcher gatherer module of %s namespace is closing", f.config.PipeName)
 	if err := f.runningQueue.Close(); err != nil {
-		log.Logger.Errorf("failure occurs when closing %s queue  in %s namespace :%v", f.runningQueue.Name(), f.config.NamespaceName, err)
+		log.Logger.Errorf("failure occurs when closing %s queue  in %s namespace :%v", f.runningQueue.Name(), f.config.PipeName, err)
 	}
 }
 
diff --git a/internal/satellite/module/gatherer/receiver_gatherer.go b/internal/satellite/module/gatherer/receiver_gatherer.go
index de812a5..59fc02d 100644
--- a/internal/satellite/module/gatherer/receiver_gatherer.go
+++ b/internal/satellite/module/gatherer/receiver_gatherer.go
@@ -22,9 +22,12 @@ import (
 	"sync"
 	"time"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/prometheus/client_golang/prometheus"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 	queue "github.com/apache/skywalking-satellite/plugins/queue/api"
 	receiver "github.com/apache/skywalking-satellite/plugins/receiver/api"
 	server "github.com/apache/skywalking-satellite/plugins/server/api"
@@ -41,15 +44,31 @@ type ReceiverGatherer struct {
 
 	// self components
 	outputChannel chan *queue.SequenceEvent
+	// metrics
+	receiveCounter     *prometheus.CounterVec
+	queueOutputCounter *prometheus.CounterVec
 }
 
 func (r *ReceiverGatherer) Prepare() error {
-	log.Logger.Infof("receiver gatherer module of %s namespace is preparing", r.config.NamespaceName)
-	r.runningReceiver.RegisterHandler(r.runningServer)
+	log.Logger.Infof("receiver gatherer module of %s namespace is preparing", r.config.PipeName)
+	r.runningReceiver.RegisterHandler(r.runningServer.GetServer())
 	if err := r.runningQueue.Initialize(); err != nil {
-		log.Logger.Infof("the %s queue of %s namespace was failed to initialize", r.runningQueue.Name(), r.config.NamespaceName)
+		log.Logger.Infof("the %s queue of %s namespace was failed to initialize", r.runningQueue.Name(), r.config.PipeName)
 		return err
 	}
+	r.receiveCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
+		Name: "gatherer_receive_count",
+		Help: "Total number of the receiving count in the Gatherer.",
+	}, []string{"pipe", "status"})
+	r.queueOutputCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
+		Subsystem: "receiver",
+		Name:      "queue_output_count",
+		Help:      "Total number of the output count in the Queue of Gatherer.",
+	}, []string{"pipe", "status"})
+	telemetry.Registerer.MustRegister(r.receiveCounter)
+	log.Logger.Infof("register receiveCounter")
+	telemetry.Registerer.MustRegister(r.queueOutputCounter)
+	log.Logger.Infof("register queueOutputCounter")
 	return nil
 }
 
@@ -57,16 +76,19 @@ func (r *ReceiverGatherer) Boot(ctx context.Context) {
 	var wg sync.WaitGroup
 	wg.Add(2)
 	go func() {
+		childCtx, cancel := context.WithCancel(ctx)
 		defer wg.Done()
 		for {
 			select {
 			case e := <-r.runningReceiver.Channel():
+				r.receiveCounter.WithLabelValues(r.config.PipeName, "all").Inc()
 				err := r.runningQueue.Push(e)
 				if err != nil {
-					// todo add abandonedCount metrics
-					log.Logger.Errorf("cannot put event into queue in %s namespace, error is: %v", r.config.NamespaceName, err)
+					r.receiveCounter.WithLabelValues(r.config.PipeName, "abandoned").Inc()
+					log.Logger.Errorf("cannot put event into queue in %s namespace, error is: %v", r.config.PipeName, err)
 				}
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				r.Shutdown()
 				return
 			}
@@ -74,18 +96,23 @@ func (r *ReceiverGatherer) Boot(ctx context.Context) {
 	}()
 
 	go func() {
+		childCtx, cancel := context.WithCancel(ctx)
 		defer wg.Done()
 		for {
 			select {
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				r.Shutdown()
 				return
 			default:
 				if e, err := r.runningQueue.Pop(); err == nil {
 					r.outputChannel <- e
+					r.queueOutputCounter.WithLabelValues(r.config.PipeName, "success").Inc()
+				} else if err == queue.ErrEmpty {
+					time.Sleep(time.Second)
 				} else {
+					r.queueOutputCounter.WithLabelValues(r.config.PipeName, "error").Inc()
 					log.Logger.Errorf("error in popping from the queue: %v", err)
-					time.Sleep(time.Second)
 				}
 			}
 		}
@@ -94,9 +121,9 @@ func (r *ReceiverGatherer) Boot(ctx context.Context) {
 }
 
 func (r *ReceiverGatherer) Shutdown() {
-	log.Logger.Infof("receiver gatherer module of %s namespace is closing", r.config.NamespaceName)
+	log.Logger.Infof("receiver gatherer module of %s namespace is closing", r.config.PipeName)
 	if err := r.runningQueue.Close(); err != nil {
-		log.Logger.Errorf("failure occurs when closing %s queue  in %s namespace, error is: %v", r.runningQueue.Name(), r.config.NamespaceName, err)
+		log.Logger.Errorf("failure occurs when closing %s queue  in %s namespace, error is: %v", r.runningQueue.Name(), r.config.PipeName, err)
 	}
 }
 
diff --git a/internal/satellite/module/processor/api/config.go b/internal/satellite/module/processor/api/config.go
index 934ab94..d8788ea 100644
--- a/internal/satellite/module/processor/api/config.go
+++ b/internal/satellite/module/processor/api/config.go
@@ -18,13 +18,13 @@
 package api
 
 import (
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 )
 
 // ProcessorConfig contains all implementation fields.
 type ProcessorConfig struct {
-	api.ModuleCommonConfig
+	config.CommonFields
 
 	FilterConfig []plugin.Config `mapstructure:"filters"` // filter plugins
 }
diff --git a/internal/satellite/module/processor/create.go b/internal/satellite/module/processor/create.go
index c5933b2..85e980c 100644
--- a/internal/satellite/module/processor/create.go
+++ b/internal/satellite/module/processor/create.go
@@ -27,7 +27,7 @@ import (
 
 // Init Processor and dependency plugins
 func NewProcessor(cfg *api.ProcessorConfig, s sender.Sender, g gatherer.Gatherer) api.Processor {
-	log.Logger.Infof("processor module of %s namespace is being initialized", cfg.NamespaceName)
+	log.Logger.Infof("processor module of %s namespace is being initialized", cfg.PipeName)
 	p := &Processor{
 		sender:         s,
 		gatherer:       g,
diff --git a/internal/satellite/module/processor/processor.go b/internal/satellite/module/processor/processor.go
index 990be07..a84fd9a 100644
--- a/internal/satellite/module/processor/processor.go
+++ b/internal/satellite/module/processor/processor.go
@@ -21,8 +21,8 @@ import (
 	"context"
 	"sync"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	gatherer "github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
 	processor "github.com/apache/skywalking-satellite/internal/satellite/module/processor/api"
 	sender "github.com/apache/skywalking-satellite/internal/satellite/module/sender/api"
@@ -49,11 +49,11 @@ func (p *Processor) Prepare() error {
 
 // Boot fetches the data of Queue, does a series of processing, and then sends to Sender.
 func (p *Processor) Boot(ctx context.Context) {
-	log.Logger.Infof("processor module of %s namespace is running", p.config.NamespaceName)
+	log.Logger.Infof("processor module of %s namespace is running", p.config.PipeName)
 	var wg sync.WaitGroup
 	wg.Add(1)
-
 	go func() {
+		childCtx, cancel := context.WithCancel(ctx)
 		defer wg.Done()
 		for {
 			select {
@@ -70,7 +70,8 @@ func (p *Processor) Boot(ctx context.Context) {
 				}
 				// send the final context that contains many events to the sender.
 				p.sender.InputDataChannel() <- c
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				p.Shutdown()
 				return
 			}
diff --git a/internal/satellite/module/sender/api/config.go b/internal/satellite/module/sender/api/config.go
index 1fff0d7..04cfa4d 100644
--- a/internal/satellite/module/sender/api/config.go
+++ b/internal/satellite/module/sender/api/config.go
@@ -18,12 +18,12 @@
 package api
 
 import (
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 )
 
 type SenderConfig struct {
-	api.ModuleCommonConfig
+	config.CommonFields
 	// plugins config
 	ForwardersConfig []plugin.Config `mapstructure:"forwarders"`  // forwarder plugins config
 	FallbackerConfig plugin.Config   `mapstructure:"fallbacker"`  // fallbacker plugins config
diff --git a/internal/satellite/module/sender/api/sender.go b/internal/satellite/module/sender/api/sender.go
index e1e3d0e..264ec14 100644
--- a/internal/satellite/module/sender/api/sender.go
+++ b/internal/satellite/module/sender/api/sender.go
@@ -18,7 +18,7 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/api"
 )
 
diff --git a/internal/satellite/module/sender/create.go b/internal/satellite/module/sender/create.go
index 43ae014..595e867 100644
--- a/internal/satellite/module/sender/create.go
+++ b/internal/satellite/module/sender/create.go
@@ -18,8 +18,8 @@
 package sender
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/buffer"
 	gatherer "github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/sender/api"
@@ -31,7 +31,7 @@ import (
 
 // NewSender crate a Sender.
 func NewSender(cfg *api.SenderConfig, g gatherer.Gatherer) api.Sender {
-	log.Logger.Infof("sender module of %s namespace is being initialized", cfg.NamespaceName)
+	log.Logger.Infof("sender module of %s namespace is being initialized", cfg.PipeName)
 	s := &Sender{
 		config:            cfg,
 		runningForwarders: []forwarder.Forwarder{},
diff --git a/internal/satellite/module/sender/sender.go b/internal/satellite/module/sender/sender.go
index 9ff723d..07a5e7a 100644
--- a/internal/satellite/module/sender/sender.go
+++ b/internal/satellite/module/sender/sender.go
@@ -22,11 +22,14 @@ import (
 	"sync"
 	"time"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/prometheus/client_golang/prometheus"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/buffer"
 	gatherer "github.com/apache/skywalking-satellite/internal/satellite/module/gatherer/api"
 	"github.com/apache/skywalking-satellite/internal/satellite/module/sender/api"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
 	client "github.com/apache/skywalking-satellite/plugins/client/api"
 	fallbacker "github.com/apache/skywalking-satellite/plugins/fallbacker/api"
 	forwarder "github.com/apache/skywalking-satellite/plugins/forwarder/api"
@@ -52,35 +55,51 @@ type Sender struct {
 	listener      chan client.ClientStatus       // client status listener
 	flushChannel  chan *buffer.BatchBuffer       // forwarder flush channel
 	buffer        *buffer.BatchBuffer            // cache the downstream input data
+
+	// metrics
+	sendCounter *prometheus.CounterVec
 }
 
 // Prepare register the client status listener to the client manager and open input channel.
 func (s *Sender) Prepare() error {
-	log.Logger.Infof("sender module of %s namespace is preparing", s.config.NamespaceName)
+	log.Logger.Infof("sender module of %s namespace is preparing", s.config.PipeName)
 	s.runningClient.RegisterListener(s.listener)
 	s.logicInput = s.physicalInput
+	for _, runningForwarder := range s.runningForwarders {
+		err := runningForwarder.Prepare(s.runningClient.GetConnectedClient())
+		if err != nil {
+			return err
+		}
+	}
+	s.sendCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
+		Name: "sender_send_count",
+		Help: "Total number of the output count in the Sender.",
+	}, []string{"pipe", "status", "type"})
+	telemetry.Registerer.MustRegister(s.sendCounter)
+	log.Logger.Infof("register sendCounter")
 	return nil
 }
 
 // Boot fetches the downstream input data and forward to external services, such as Kafka and OAP receiver.
 func (s *Sender) Boot(ctx context.Context) {
-	log.Logger.Infof("sender module of %s namespace is running", s.config.NamespaceName)
+	log.Logger.Infof("sender module of %s namespace is running", s.config.PipeName)
 	var wg sync.WaitGroup
 	wg.Add(2)
 	// 1. keep fetching the downstream data when client connected, and put it into BatchBuffer.
 	// 2. When reaches the buffer limit or receives a timer flush signal, and put BatchBuffer into flushChannel.
 	go func() {
 		defer wg.Done()
+		childCtx, cancel := context.WithCancel(ctx)
 		timeTicker := time.NewTicker(time.Duration(s.config.FlushTime) * time.Millisecond)
 		for {
 			select {
 			case status := <-s.listener:
 				switch status {
 				case client.Connected:
-					log.Logger.Infof("sender module of %s namespace is notified the connection connected", s.config.NamespaceName)
+					log.Logger.Infof("sender module of %s namespace is notified the connection connected", s.config.PipeName)
 					s.logicInput = s.physicalInput
 				case client.Disconnect:
-					log.Logger.Infof("sender module of %s namespace is notified the connection disconnected", s.config.NamespaceName)
+					log.Logger.Infof("sender module of %s namespace is notified the connection disconnected", s.config.PipeName)
 					s.logicInput = nil
 				}
 			case <-timeTicker.C:
@@ -94,7 +113,8 @@ func (s *Sender) Boot(ctx context.Context) {
 					s.flushChannel <- s.buffer
 					s.buffer = buffer.NewBatchBuffer(s.config.MaxBufferSize)
 				}
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				s.logicInput = nil
 				return
 			}
@@ -103,11 +123,13 @@ func (s *Sender) Boot(ctx context.Context) {
 	// Keep fetching BatchBuffer to forward.
 	go func() {
 		defer wg.Done()
+		childCtx, cancel := context.WithCancel(ctx)
 		for {
 			select {
 			case b := <-s.flushChannel:
 				s.consume(b)
-			case <-ctx.Done():
+			case <-childCtx.Done():
+				cancel()
 				s.Shutdown()
 				return
 			}
@@ -118,7 +140,7 @@ func (s *Sender) Boot(ctx context.Context) {
 
 // Shutdown closes the channels and tries to force forward the events in the buffer.
 func (s *Sender) Shutdown() {
-	log.Logger.Infof("sender module of %s namespace is closing", s.config.NamespaceName)
+	log.Logger.Infof("sender module of %s namespace is closing", s.config.PipeName)
 	close(s.logicInput)
 	for buf := range s.flushChannel {
 		s.consume(buf)
@@ -130,7 +152,7 @@ func (s *Sender) Shutdown() {
 // consume would forward the events by type and ack this batch.
 func (s *Sender) consume(batch *buffer.BatchBuffer) {
 	log.Logger.Infof("sender module of %s namespace is flushing a new batch buffer."+
-		" the start offset is %s, and the size is %d", s.config.NamespaceName, batch.Last(), batch.Len())
+		" the start offset is %s, and the size is %d", s.config.PipeName, batch.Last(), batch.Len())
 	var events = make(map[protocol.EventType]event.BatchEvents)
 	for i := 0; i < batch.Len(); i++ {
 		eventContext := batch.Buf()[i]
@@ -140,19 +162,17 @@ func (s *Sender) consume(batch *buffer.BatchBuffer) {
 			}
 		}
 	}
-
 	for _, f := range s.runningForwarders {
 		for t, batchEvents := range events {
 			if f.ForwardType() != t {
 				continue
 			}
-			if err := f.Forward(s.runningClient.GetConnectedClient(), batchEvents); err == nil {
+			if err := f.Forward(batchEvents); err == nil {
+				s.sendCounter.WithLabelValues(s.config.PipeName, "success", f.ForwardType().String()).Add(float64(len(batchEvents)))
 				continue
 			}
-			if !s.runningFallbacker.FallBack(batchEvents, s.runningClient.GetConnectedClient(), f.Forward) {
-				if s.runningClient.IsConnected() {
-					s.runningClient.ReportErr()
-				}
+			if !s.runningFallbacker.FallBack(batchEvents, f.Forward) {
+				s.sendCounter.WithLabelValues(s.config.PipeName, "failure", f.ForwardType().String()).Add(float64(len(batchEvents)))
 			}
 		}
 	}
diff --git a/internal/satellite/sharing/sharing_plugins.go b/internal/satellite/sharing/sharing_plugins.go
index ee60398..eefae88 100644
--- a/internal/satellite/sharing/sharing_plugins.go
+++ b/internal/satellite/sharing/sharing_plugins.go
@@ -35,6 +35,7 @@ var once sync.Once
 // Load loads the sharing config to the Manager.
 func Load(cfg *config.SharingConfig) {
 	once.Do(func() {
+		Manager = make(map[string]plugin.SharingPlugin)
 		for _, c := range cfg.Clients {
 			p := client.GetClient(c)
 			Manager[p.Name()] = p
@@ -58,6 +59,17 @@ func Prepare() error {
 	return nil
 }
 
+func Start() error {
+	for _, sharingPlugin := range Manager {
+		if err := sharingPlugin.Start(); err != nil {
+			log.Logger.Errorf("error in closing the %s sharing plugin: %v", sharingPlugin.Name(), err)
+			Close()
+			return fmt.Errorf("cannot preare the sharing plugins named %s: %v", sharingPlugin.Name(), err)
+		}
+	}
+	return nil
+}
+
 func Close() {
 	for _, sharingPlugin := range Manager {
 		if err := sharingPlugin.Close(); err != nil {
diff --git a/internal/satellite/telemetry/telemetry.go b/internal/satellite/telemetry/telemetry.go
new file mode 100644
index 0000000..4efae89
--- /dev/null
+++ b/internal/satellite/telemetry/telemetry.go
@@ -0,0 +1,53 @@
+// Licensed to 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. Apache Software Foundation (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 telemetry
+
+import (
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+// Registerer is the global metrics center for collecting the telemetry data in core modules or plugins.
+var (
+	registry   *prometheus.Registry
+	Registerer prometheus.Registerer // The register is for adding metrics to the registry.
+	Gatherer   prometheus.Gatherer   // The gatherer is for fetching metrics from the registry.
+)
+
+// Config defines the common telemetry labels.
+type Config struct {
+	Service   string `mapstructure:"service"`   // The service name.
+	Namespace string `mapstructure:"namespace"` // The kubernetes namespace.
+	Pod       string `mapstructure:"pod"`       // The kubernetes pod name.
+}
+
+// Init create the global telemetry center according to the config.
+func Init(c *Config) {
+	labels := make(map[string]string)
+	if c.Service != "" {
+		labels["service"] = c.Service
+	}
+	if c.Namespace != "" {
+		labels["kubernetes_namespace"] = c.Namespace
+	}
+	if c.Pod != "" {
+		labels["pod"] = c.Pod
+	}
+	registry = prometheus.NewRegistry()
+	Registerer = prometheus.WrapRegistererWith(labels, registry)
+	Gatherer = registry
+}
diff --git a/plugins/client/api/client.go b/plugins/client/api/client.go
index 87a1ffd..f5a3317 100644
--- a/plugins/client/api/client.go
+++ b/plugins/client/api/client.go
@@ -18,6 +18,8 @@
 package api
 
 import (
+	"reflect"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
 )
 
@@ -35,12 +37,13 @@ type ClientStatus int8
 type Client interface {
 	plugin.SharingPlugin
 
-	// IsConnected returns the status of the client.
-	IsConnected() bool
 	// GetConnection returns the connected client to publish events.
 	GetConnectedClient() interface{}
 	// RegisterListener register a listener to listen the client status.
 	RegisterListener(chan<- ClientStatus)
-	// Report client error connection error to notify other listeners.
-	ReportErr()
+}
+
+// Get an initialized client plugin.
+func GetClient(config plugin.Config) Client {
+	return plugin.Get(reflect.TypeOf((*Client)(nil)).Elem(), config).(Client)
 }
diff --git a/plugins/client/api/client_repository.go b/plugins/client/client_repository.go
similarity index 80%
rename from plugins/client/api/client_repository.go
rename to plugins/client/client_repository.go
index 1368fed..c766803 100644
--- a/plugins/client/api/client_repository.go
+++ b/plugins/client/client_repository.go
@@ -15,23 +15,19 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package client
 
 import (
 	"reflect"
 
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins/client/api"
 )
 
-// Get an initialized client plugin.
-func GetClient(config plugin.Config) Client {
-	return plugin.Get(reflect.TypeOf((*Client)(nil)).Elem(), config).(Client)
-}
-
 // RegisterClientPlugins register the used client plugins.
 func RegisterClientPlugins() {
-	plugin.RegisterPluginCategory(reflect.TypeOf((*Client)(nil)).Elem())
-	clients := []Client{
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Client)(nil)).Elem())
+	clients := []api.Client{
 		// Please register the client plugins at here.
 	}
 	for _, client := range clients {
diff --git a/plugins/fallbacker/api/fallbacker.go b/plugins/fallbacker/api/fallbacker.go
index 41a9bd7..676ef2f 100644
--- a/plugins/fallbacker/api/fallbacker.go
+++ b/plugins/fallbacker/api/fallbacker.go
@@ -18,8 +18,10 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"reflect"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/plugins/forwarder/api"
 )
 
@@ -27,7 +29,10 @@ import (
 type Fallbacker interface {
 	plugin.Plugin
 	//  FallBack returns nil when finishing a successful process and returns a new Fallbacker when failure.
-	FallBack(batch event.BatchEvents, connection interface{}, forward api.ForwardFunc) bool
+	FallBack(batch event.BatchEvents, forward api.ForwardFunc) bool
 }
 
-type DisconnectionCallback func()
+// Get an initialized client plugin.
+func GetFallbacker(config plugin.Config) Fallbacker {
+	return plugin.Get(reflect.TypeOf((*Fallbacker)(nil)).Elem(), config).(Fallbacker)
+}
diff --git a/plugins/fallbacker/api/fallbacker_repository.go b/plugins/fallbacker/fallbacker_repository.go
similarity index 80%
rename from plugins/fallbacker/api/fallbacker_repository.go
rename to plugins/fallbacker/fallbacker_repository.go
index ef8949d..92e7109 100644
--- a/plugins/fallbacker/api/fallbacker_repository.go
+++ b/plugins/fallbacker/fallbacker_repository.go
@@ -15,24 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package fallbacker
 
 import (
 	"reflect"
 
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins/fallbacker/api"
 	"github.com/apache/skywalking-satellite/plugins/fallbacker/timer"
 )
 
-// Get an initialized client plugin.
-func GetFallbacker(config plugin.Config) Fallbacker {
-	return plugin.Get(reflect.TypeOf((*Fallbacker)(nil)).Elem(), config).(Fallbacker)
-}
-
 // RegisterFallbackerPlugins register the used fallbacker plugins.
 func RegisterFallbackerPlugins() {
-	plugin.RegisterPluginCategory(reflect.TypeOf((*Fallbacker)(nil)).Elem())
-	fallbackers := []Fallbacker{
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Fallbacker)(nil)).Elem())
+	fallbackers := []api.Fallbacker{
 		// Please register the fallbacker plugins at here.
 		&timer.Fallbacker{},
 	}
diff --git a/plugins/fallbacker/timer/timer_fallbacker.go b/plugins/fallbacker/timer/timer_fallbacker.go
index a70ce0e..8398098 100644
--- a/plugins/fallbacker/timer/timer_fallbacker.go
+++ b/plugins/fallbacker/timer/timer_fallbacker.go
@@ -20,13 +20,15 @@ package timer
 import (
 	"time"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/plugins/forwarder/api"
 )
 
 // Fallbacker is a timer fallbacker when forward fails. `latencyFactor` is the standard retry duration,
 // and the time for each retry is expanded by 2 times until the number of retries reaches the maximum.
 type Fallbacker struct {
+	config.CommonFields
 	maxTimes      int `mapstructure:"max_times"`
 	latencyFactor int `mapstructure:"latency_factor"`
 }
@@ -46,19 +48,15 @@ latency_factor: 2000
 `
 }
 
-func (t *Fallbacker) FallBack(batch event.BatchEvents, connection interface{}, forward api.ForwardFunc) bool {
-	if err := forward(connection, batch); err != nil {
-		count := 1
-		currentLatency := count * t.latencyFactor
-		for count < t.maxTimes {
-			time.Sleep(time.Duration(currentLatency) * time.Millisecond)
-			if err := forward(connection, batch); err != nil {
-				currentLatency *= 2
-			} else {
-				return true
-			}
+func (t *Fallbacker) FallBack(batch event.BatchEvents, forward api.ForwardFunc) bool {
+	currentLatency := t.latencyFactor
+	for i := 1; i < t.maxTimes; i++ {
+		time.Sleep(time.Duration(currentLatency) * time.Millisecond)
+		if err := forward(batch); err != nil {
+			currentLatency *= 2
+		} else {
+			return true
 		}
-		return false
 	}
-	return true
+	return false
 }
diff --git a/plugins/fetcher/api/fetcher.go b/plugins/fetcher/api/fetcher.go
index 83139a9..7727d13 100644
--- a/plugins/fetcher/api/fetcher.go
+++ b/plugins/fetcher/api/fetcher.go
@@ -18,14 +18,15 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 )
 
 // Fetcher is a plugin interface, that defines new fetchers.
 type Fetcher interface {
 	plugin.Plugin
 
+	Prepare()
 	// Fetch would fetch some APM data.
 	Fetch() event.BatchEvents
 }
diff --git a/plugins/filter/api/filter.go b/plugins/filter/api/filter.go
index 61ac376..9943b2a 100644
--- a/plugins/filter/api/filter.go
+++ b/plugins/filter/api/filter.go
@@ -18,8 +18,8 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 )
 
 // Filter is a plugin interface, that defines new pipeline filters.
diff --git a/plugins/forwarder/api/forwarder.go b/plugins/forwarder/api/forwarder.go
index 6b7b881..68017c7 100644
--- a/plugins/forwarder/api/forwarder.go
+++ b/plugins/forwarder/api/forwarder.go
@@ -18,19 +18,28 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"reflect"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/protocol/gen-codes/satellite/protocol"
 )
 
 // Forwarder is a plugin interface, that defines new forwarders.
 type Forwarder interface {
 	plugin.Plugin
+	// Prepare do some preparation works, such as create a stub in gRPC and create a producer in Kafka.
+	Prepare(connection interface{}) error
 	// Forward the batch events to the external services, such as Kafka MQ and SkyWalking OAP cluster.
-	Forward(connection interface{}, batch event.BatchEvents) error
+	Forward(batch event.BatchEvents) error
 	// ForwardType returns the supported event type.
 	ForwardType() protocol.EventType
 }
 
 // ForwardFunc represent the Forward() in Forwarder
-type ForwardFunc func(connection interface{}, batch event.BatchEvents) error
+type ForwardFunc func(batch event.BatchEvents) error
+
+// GetForwarder an initialized filter plugin.
+func GetForwarder(config plugin.Config) Forwarder {
+	return plugin.Get(reflect.TypeOf((*Forwarder)(nil)).Elem(), config).(Forwarder)
+}
diff --git a/plugins/forwarder/api/forwarder_repository.go b/plugins/forwarder/forwarder_repository.go
similarity index 79%
rename from plugins/forwarder/api/forwarder_repository.go
rename to plugins/forwarder/forwarder_repository.go
index 89db43e..dfaf1eb 100644
--- a/plugins/forwarder/api/forwarder_repository.go
+++ b/plugins/forwarder/forwarder_repository.go
@@ -15,23 +15,19 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package forwarder
 
 import (
 	"reflect"
 
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins/forwarder/api"
 )
 
-// GetForwarder an initialized filter plugin.
-func GetForwarder(config plugin.Config) Forwarder {
-	return plugin.Get(reflect.TypeOf((*Forwarder)(nil)).Elem(), config).(Forwarder)
-}
-
 // RegisterForwarderPlugins register the used filter plugins.
 func RegisterForwarderPlugins() {
-	plugin.RegisterPluginCategory(reflect.TypeOf((*Forwarder)(nil)).Elem())
-	forwarders := []Forwarder{
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Forwarder)(nil)).Elem())
+	forwarders := []api.Forwarder{
 		// Please register the forwarder plugins at here.
 	}
 	for _, forwarder := range forwarders {
diff --git a/plugins/init.go b/plugins/init.go
index 97f0177..c121bb3 100644
--- a/plugins/init.go
+++ b/plugins/init.go
@@ -18,15 +18,15 @@
 package plugins
 
 import (
-	client "github.com/apache/skywalking-satellite/plugins/client/api"
-	fallbacker "github.com/apache/skywalking-satellite/plugins/fallbacker/api"
+	"github.com/apache/skywalking-satellite/plugins/client"
+	"github.com/apache/skywalking-satellite/plugins/fallbacker"
 	fetcher "github.com/apache/skywalking-satellite/plugins/fetcher/api"
 	filter "github.com/apache/skywalking-satellite/plugins/filter/api"
-	forwarder "github.com/apache/skywalking-satellite/plugins/forwarder/api"
+	"github.com/apache/skywalking-satellite/plugins/forwarder"
 	parser "github.com/apache/skywalking-satellite/plugins/parser/api"
 	"github.com/apache/skywalking-satellite/plugins/queue"
-	receiver "github.com/apache/skywalking-satellite/plugins/receiver/api"
-	server "github.com/apache/skywalking-satellite/plugins/server/api"
+	"github.com/apache/skywalking-satellite/plugins/receiver"
+	"github.com/apache/skywalking-satellite/plugins/server"
 )
 
 // RegisterPlugins register the whole supported plugin category and plugin types to the registry.
diff --git a/plugins/parser/api/parser.go b/plugins/parser/api/parser.go
index 3e09e3a..c6bc7de 100644
--- a/plugins/parser/api/parser.go
+++ b/plugins/parser/api/parser.go
@@ -18,8 +18,8 @@
 package api
 
 import (
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 )
 
 // Parser is a plugin interface, that defines new Parsers for Collector plugin.
diff --git a/plugins/server/api/server.go b/plugins/queue/api/error.go
similarity index 75%
copy from plugins/server/api/server.go
copy to plugins/queue/api/error.go
index 09d3f2b..ff58e95 100644
--- a/plugins/server/api/server.go
+++ b/plugins/queue/api/error.go
@@ -17,12 +17,9 @@
 
 package api
 
-import "github.com/apache/skywalking-satellite/internal/pkg/plugin"
+import "errors"
 
-// Server is a plugin interface, that defines new servers, such as gRPC server and http server.
-type Server interface {
-	plugin.SharingPlugin
-
-	// Start a server to receive the input APM data.
-	Start() error
-}
+var (
+	ErrEmpty = errors.New("cannot read data when the queue is empty")
+	ErrFull  = errors.New("cannot push data when the queue is full")
+)
diff --git a/plugins/queue/api/queue.go b/plugins/queue/api/queue.go
index fcf9628..0788b27 100644
--- a/plugins/queue/api/queue.go
+++ b/plugins/queue/api/queue.go
@@ -20,8 +20,8 @@ package api
 import (
 	"reflect"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/protocol/gen-codes/satellite/protocol"
 )
 
diff --git a/plugins/queue/mmap/queue.go b/plugins/queue/mmap/queue.go
index 68712c9..17f6500 100644
--- a/plugins/queue/mmap/queue.go
+++ b/plugins/queue/mmap/queue.go
@@ -31,8 +31,10 @@ import (
 
 	"google.golang.org/protobuf/proto"
 
-	"github.com/apache/skywalking-satellite/internal/pkg/event"
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
 	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/event"
 	"github.com/apache/skywalking-satellite/plugins/queue/api"
 	"github.com/apache/skywalking-satellite/plugins/queue/mmap/meta"
 	"github.com/apache/skywalking-satellite/protocol/gen-codes/satellite/protocol"
@@ -45,7 +47,7 @@ const (
 
 // Queue is a memory mapped queue to store the input data.
 type Queue struct {
-	sync.Mutex
+	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.
@@ -73,7 +75,7 @@ type Queue struct {
 }
 
 func (q *Queue) Name() string {
-	return "mmap-queue"
+	return plugin.GetPluginName(q)
 }
 
 func (q *Queue) Description() string {
@@ -217,8 +219,6 @@ func (q *Queue) flush() {
 
 // doFlush flush the segment and meta files to the disk.
 func (q *Queue) doFlush() {
-	q.Lock()
-	defer q.Unlock()
 	for _, segment := range q.segments {
 		if segment == nil {
 			continue
diff --git a/plugins/queue/mmap/queue_opreation.go b/plugins/queue/mmap/queue_opreation.go
index 3559ef1..9516487 100644
--- a/plugins/queue/mmap/queue_opreation.go
+++ b/plugins/queue/mmap/queue_opreation.go
@@ -23,7 +23,7 @@
 package mmap
 
 import (
-	"fmt"
+	"github.com/apache/skywalking-satellite/plugins/queue/api"
 )
 
 // Because the design of the mmap-queue in Satellite references the design of the
@@ -42,7 +42,7 @@ const uInt64Size = 8
 // then the data itself. It means the whole data may not exist in the one segments.
 func (q *Queue) push(bytes []byte) error {
 	if q.isFull() {
-		return fmt.Errorf("cannot push data when the queue is full")
+		return api.ErrFull
 	}
 	id, offset := q.meta.GetWritingOffset()
 	id, offset, err := q.writeLength(len(bytes), id, offset)
@@ -66,7 +66,7 @@ func (q *Queue) push(bytes []byte) error {
 // then the data itself. It means the whole data may not exist in the one segments.
 func (q *Queue) pop() (data []byte, rid, roffset int64, err error) {
 	if q.isEmpty() {
-		return nil, 0, 0, fmt.Errorf("cannot read data when the queue is empty")
+		return nil, 0, 0, api.ErrEmpty
 	}
 	preID, preOffset := q.meta.GetReadingOffset()
 	id, offset, length, err := q.readLength(preID, preOffset)
diff --git a/plugins/receiver/api/receiver.go b/plugins/receiver/api/receiver.go
index ba7f208..9007f3d 100644
--- a/plugins/receiver/api/receiver.go
+++ b/plugins/receiver/api/receiver.go
@@ -18,8 +18,9 @@
 package api
 
 import (
+	"reflect"
+
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
-	"github.com/apache/skywalking-satellite/plugins/server/api"
 	"github.com/apache/skywalking-satellite/protocol/gen-codes/satellite/protocol"
 )
 
@@ -28,8 +29,13 @@ type Receiver interface {
 	plugin.Plugin
 
 	// RegisterHandler register  a handler to the server, such as to handle a gRPC or an HTTP request
-	RegisterHandler(server api.Server)
+	RegisterHandler(server interface{})
 
 	// Channel would be put a data when the receiver receives an APM data.
 	Channel() <-chan *protocol.Event
 }
+
+// Get an initialized receiver plugin.
+func GetReceiver(config plugin.Config) Receiver {
+	return plugin.Get(reflect.TypeOf((*Receiver)(nil)).Elem(), config).(Receiver)
+}
diff --git a/plugins/receiver/api/receiver_repository.go b/plugins/receiver/receiver_repository.go
similarity index 80%
rename from plugins/receiver/api/receiver_repository.go
rename to plugins/receiver/receiver_repository.go
index cbf9cbc..a178011 100644
--- a/plugins/receiver/api/receiver_repository.go
+++ b/plugins/receiver/receiver_repository.go
@@ -15,23 +15,19 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package receiver
 
 import (
 	"reflect"
 
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins/receiver/api"
 )
 
-// Get an initialized receiver plugin.
-func GetReceiver(config plugin.Config) Receiver {
-	return plugin.Get(reflect.TypeOf((*Receiver)(nil)).Elem(), config).(Receiver)
-}
-
 // RegisterReceiverPlugins register the used receiver plugins.
 func RegisterReceiverPlugins() {
-	plugin.RegisterPluginCategory(reflect.TypeOf((*Receiver)(nil)).Elem())
-	receivers := []Receiver{
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Receiver)(nil)).Elem())
+	receivers := []api.Receiver{
 		// Please register the receiver plugins at here.
 	}
 	for _, receiver := range receivers {
diff --git a/plugins/server/api/server.go b/plugins/server/api/server.go
index 09d3f2b..a5d3101 100644
--- a/plugins/server/api/server.go
+++ b/plugins/server/api/server.go
@@ -17,12 +17,20 @@
 
 package api
 
-import "github.com/apache/skywalking-satellite/internal/pkg/plugin"
+import (
+	"reflect"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+)
 
 // Server is a plugin interface, that defines new servers, such as gRPC server and http server.
 type Server interface {
 	plugin.SharingPlugin
+	// GetServer returns the listener server.
+	GetServer() interface{}
+}
 
-	// Start a server to receive the input APM data.
-	Start() error
+// Get an initialized server plugin.
+func GetServer(config plugin.Config) Server {
+	return plugin.Get(reflect.TypeOf((*Server)(nil)).Elem(), config).(Server)
 }
diff --git a/plugins/server/prometheus/Prometheus.go b/plugins/server/prometheus/Prometheus.go
new file mode 100644
index 0000000..2fcf5b7
--- /dev/null
+++ b/plugins/server/prometheus/Prometheus.go
@@ -0,0 +1,83 @@
+// Licensed to 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. Apache Software Foundation (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 prometheus
+
+import (
+	"net/http"
+
+	"github.com/prometheus/client_golang/prometheus"
+	"github.com/prometheus/client_golang/prometheus/promhttp"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/config"
+	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
+)
+
+type Server struct {
+	config.CommonFields
+	Address  string `mapstructure:"address"`  // The prometheus server address.
+	Endpoint string `mapstructure:"endpoint"` // The prometheus server metrics endpoint.
+
+	server *http.ServeMux // The prometheus server.
+}
+
+func (s *Server) Name() string {
+	return plugin.GetPluginName(s)
+}
+
+func (s *Server) Description() string {
+	return "this is a prometheus server to export the metrics in Satellite."
+}
+
+func (s *Server) DefaultConfig() string {
+	return `
+# The prometheus server address.
+address: ":9299"
+# The prometheus server metrics endpoint.
+endpoint: "/metrics"
+`
+}
+
+func (s *Server) Prepare() error {
+	s.server = http.NewServeMux()
+	return nil
+}
+
+func (s *Server) Start() error {
+	// add go info metrics.
+	telemetry.Registerer.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
+	telemetry.Registerer.MustRegister(prometheus.NewGoCollector())
+	// register prometheus metrics exporter handler.
+	s.server.Handle(s.Endpoint, promhttp.HandlerFor(telemetry.Gatherer, promhttp.HandlerOpts{}))
+	go func() {
+		err := http.ListenAndServe(s.Address, s.server)
+		if err != nil {
+			log.Logger.Errorf("start prometheus http server error: %v", err)
+		}
+	}()
+	return nil
+}
+
+func (s *Server) Close() error {
+	return nil
+}
+
+func (s *Server) GetServer() interface{} {
+	return s.server
+}
diff --git a/plugins/server/prometheus/Prometheus_test.go b/plugins/server/prometheus/Prometheus_test.go
new file mode 100644
index 0000000..fa12f44
--- /dev/null
+++ b/plugins/server/prometheus/Prometheus_test.go
@@ -0,0 +1,64 @@
+// Licensed to 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. Apache Software Foundation (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 prometheus
+
+import (
+	"fmt"
+	"net/http"
+	"reflect"
+	"testing"
+
+	"github.com/apache/skywalking-satellite/internal/pkg/log"
+	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/internal/satellite/telemetry"
+	"github.com/apache/skywalking-satellite/plugins/server/api"
+)
+
+func initPrometheusServer(cfg plugin.Config) (*Server, error) {
+	log.Init(&log.LoggerConfig{})
+	telemetry.Init(new(telemetry.Config))
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Server)(nil)).Elem())
+	plugin.RegisterPlugin(new(Server))
+	cfg[plugin.NameField] = "prometheus-server"
+	q := api.GetServer(cfg)
+	if q == nil {
+		return nil, fmt.Errorf("cannot get a default config mmap queue from the registry")
+	}
+	if err := q.Prepare(); err != nil {
+		return nil, fmt.Errorf("queue cannot initialize: %v", err)
+	}
+	return q.(*Server), nil
+}
+
+func TestServer_Start(t *testing.T) {
+	server, err := initPrometheusServer(make(plugin.Config))
+	if err != nil {
+		t.Fatalf("cannot init the prometheus server: %v", err)
+	}
+	_ = server.Start()
+	response, err := http.Get("http://127.0.0.1" + server.Address + server.Endpoint)
+	defer func() {
+		_ = response.Body.Close()
+	}()
+	if err != nil {
+		t.Fatalf("cannot fetch telemetry data from prometheus server: %v", err)
+	}
+	if response.Status != "200 OK" {
+		t.Fatalf("the response code is not 200:%s", response.Status)
+	}
+}
diff --git a/plugins/server/api/server_repository.go b/plugins/server/server_repository.go
similarity index 80%
rename from plugins/server/api/server_repository.go
rename to plugins/server/server_repository.go
index f2f1dae..0ac9958 100644
--- a/plugins/server/api/server_repository.go
+++ b/plugins/server/server_repository.go
@@ -15,24 +15,22 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package api
+package server
 
 import (
 	"reflect"
 
 	"github.com/apache/skywalking-satellite/internal/pkg/plugin"
+	"github.com/apache/skywalking-satellite/plugins/server/api"
+	"github.com/apache/skywalking-satellite/plugins/server/prometheus"
 )
 
-// Get an initialized server plugin.
-func GetServer(config plugin.Config) Server {
-	return plugin.Get(reflect.TypeOf((*Server)(nil)).Elem(), config).(Server)
-}
-
 // RegisterServerPlugins register the used server plugins.
 func RegisterServerPlugins() {
-	plugin.RegisterPluginCategory(reflect.TypeOf((*Server)(nil)).Elem())
-	servers := []Server{
+	plugin.RegisterPluginCategory(reflect.TypeOf((*api.Server)(nil)).Elem())
+	servers := []api.Server{
 		// Please register the server plugins at here.
+		new(prometheus.Server),
 	}
 	for _, server := range servers {
 		plugin.RegisterPlugin(server)