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

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-mesher.git


The following commit(s) were added to refs/heads/master by this push:
     new 2c94b41  SCB-1518 upgrade go chassis, new image for out of box edge 
service (#76)
2c94b41 is described below

commit 2c94b414dc41f3481dec6ad01d3b53f90c1b5c56
Author: Shawn <[email protected]>
AuthorDate: Fri Oct 18 12:43:45 2019 +0800

    SCB-1518 upgrade go chassis, new image for out of box edge service (#76)
    
    * upgrade go chassis
    
    * add license header
---
 README.md                                          | 13 ++++
 cmd/mesher/mesher.go                               |  2 +-
 .../mock/route.go => deployments/docker/db.js      | 50 ++++---------
 deployments/docker/docker-compose.yaml             | 83 ++++++++++++++++++++++
 docker/edge/Dockerfile                             | 38 ++++++++++
 docker/edge/chassis.yaml                           | 55 ++++++++++++++
 docker/edge/lager.yaml                             | 37 ++++++++++
 docker/edge/mesher.yaml                            | 55 ++++++++++++++
 docker/edge/microservice.yaml                      | 18 +++++
 docker/edge/start.sh                               | 64 +++++++++++++++++
 docs/configurations/admin.md                       |  3 -
 examples/edge/conf/chassis.yaml                    | 68 ++++--------------
 examples/edge/conf/mesher.yaml                     | 66 +++++++----------
 examples/edge/conf/microservice.yaml               |  2 +-
 go.mod                                             | 45 +++---------
 proxy/config/config.go                             |  2 +-
 proxy/config/config_test.go                        |  4 ++
 proxy/config/struct.go                             |  5 +-
 proxy/config/struct_ingress_test.go                |  2 +
 proxy/ingress/servicecomb/listener.go              |  4 +-
 proxy/pkg/egress/archaius/egress_manager.go        |  8 +--
 proxy/pkg/egress/pilot/egress.go                   |  4 +-
 proxy/pkg/egress/pilot/pilotsource.go              | 51 +++++++------
 proxy/pkg/metrics/metrics.go                       | 37 +++-------
 proxy/pkg/metrics/metrics_test.go                  | 26 +++----
 proxy/pkg/metrics/prom_recorder.go                 | 49 ++++---------
 proxy/pkg/metrics/prometheus_exporter.go           | 19 -----
 proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go    |  3 +-
 proxy/protocol/dubbo/proxy/rest2dubbo.go           |  5 +-
 proxy/protocol/grpc/reverse_proxy.go               |  9 ++-
 proxy/protocol/grpc/server.go                      |  6 +-
 proxy/protocol/http/gateway_test.go                | 70 ++++++++++++++++++
 proxy/protocol/http/http_server.go                 |  7 +-
 proxy/protocol/http/sidecar.go                     | 21 +++---
 proxy/resource/v1/route/route.go                   |  8 +--
 proxy/server/server.go                             | 20 +++---
 36 files changed, 621 insertions(+), 338 deletions(-)

diff --git a/README.md b/README.md
index 9da0058..8f69195 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,19 @@ it will build binary and docker image
 - tar file: release/mesher-latest-linux-amd64.tar
 - docker image name: servicecomb/mesher-sidecar:latest
 
+#### Build mesher edge service
+```shell script
+sudo docker build -t servicecomb/mesher-edge -f docker/edge/Dockerfile .
+```
+
+### How to run
+#### edge service
+```shell script
+sudo docker run -e PAAS_CSE_SC_ENDPOINT="" \
+-e PAAS_CSE_CC_ENDPOINT="" \
+-p 80:30101 \
+--name mesher-edge servicecomb/mesher-edge
+```
 # Documentations
 You can see more documentations in 
[here](https://mesher.readthedocs.io/en/latest/), 
 this online doc is for latest version of mesher, if you want to see your 
version's doc,
diff --git a/cmd/mesher/mesher.go b/cmd/mesher/mesher.go
index 007ff20..e450ce7 100644
--- a/cmd/mesher/mesher.go
+++ b/cmd/mesher/mesher.go
@@ -27,7 +27,7 @@ import (
        _ "github.com/apache/servicecomb-mesher/proxy/protocol/dubbo/server"
        _ 
"github.com/apache/servicecomb-mesher/proxy/protocol/dubbo/simpleRegistry"
        // config server
-       _ "github.com/go-chassis/go-chassis-config/servicecombkie"
+       _ "github.com/go-chassis/go-chassis-config/servicecomb"
        //protocols
        _ "github.com/apache/servicecomb-mesher/proxy/protocol/grpc"
        _ "github.com/apache/servicecomb-mesher/proxy/protocol/http"
diff --git a/proxy/resource/v1/route/mock/route.go b/deployments/docker/db.js
similarity index 50%
rename from proxy/resource/v1/route/mock/route.go
rename to deployments/docker/db.js
index 5eb2109..2f1ff7a 100644
--- a/proxy/resource/v1/route/mock/route.go
+++ b/deployments/docker/db.js
@@ -15,41 +15,15 @@
  * limitations under the License.
  */
 
-package mock
-
-import (
-       "github.com/go-chassis/go-chassis/core/config/model"
-       "github.com/go-chassis/go-chassis/core/router"
-       "github.com/stretchr/testify/mock"
-)
-
-//RouterMock ..
-type RouterMock struct {
-       mock.Mock
-}
-
-//Init ..
-func (m *RouterMock) Init(router.Options) error {
-       return nil
-}
-
-//SetRouteRule ..
-func (m *RouterMock) SetRouteRule(map[string][]*model.RouteRule) {}
-
-//FetchRouteRule ..
-func (m *RouterMock) FetchRouteRule() map[string][]*model.RouteRule {
-       return nil
-}
-
-//InitRouteRuleByKey ..
-func (m *RouterMock) InitRouteRuleByKey(k string) {}
-
-//FetchRouteRuleByServiceName ..
-func (m *RouterMock) FetchRouteRuleByServiceName(s string) []*model.RouteRule {
-       args := m.Called(s)
-       rules, ok := args.Get(0).([]*model.RouteRule)
-       if !ok {
-               return nil
-       }
-       return rules
-}
+db.createUser(
+    {
+        user: "kie",
+        pwd: "123",
+        roles:[
+            {
+                role: "readWrite",
+                db:   "kie"
+            }
+        ]
+    }
+);
\ No newline at end of file
diff --git a/deployments/docker/docker-compose.yaml 
b/deployments/docker/docker-compose.yaml
new file mode 100644
index 0000000..2018e2e
--- /dev/null
+++ b/deployments/docker/docker-compose.yaml
@@ -0,0 +1,83 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+version: '3.1'
+services:
+  mongo:
+    image: mongo:3.4
+    restart: always
+    ports:
+      - 27017:27017
+    environment:
+      MONGO_INITDB_DATABASE: kie
+      MONGO_INITDB_ROOT_USERNAME: kie
+      MONGO_INITDB_ROOT_PASSWORD: 123
+    volumes:
+      - ./db.js:/docker-entrypoint-initdb.d/db.js:ro
+  mongo-express:
+    image: mongo-express
+    restart: always
+    ports:
+      - 8081:8081
+    environment:
+      ME_CONFIG_MONGODB_ADMINUSERNAME: kie
+      ME_CONFIG_MONGODB_ADMINPASSWORD: 123
+  kie:
+    image: servicecomb/kie:latest
+    restart: always
+    ports:
+      - 30110:30110
+    environment:
+      MONGODB_USER: kie
+      MONGODB_PWD: 123
+      MONGODB_ADDR: mongo
+  etcd:
+    image: 'quay.io/coreos/etcd:latest'
+    # restart: always
+    environment:
+      ETCD_ADVERTISE_CLIENT_URLS: http://etcd:2379
+      ETCD_LISTEN_CLIENT_URLS: http://0.0.0.0:2379
+      ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd:2380
+      ETCD_LISTEN_PEER_URLS: http://0.0.0.0:2380
+      ETCD_INITIAL_CLUSTER: default=http://etcd:2380
+
+  service-center:
+    depends_on:
+      - etcd
+    image: 'servicecomb/service-center:latest'
+    ports:
+      - "30100:30100"
+    environment:
+      BACKEND_ADDRESS: etcd:2379
+
+  scfrontend:
+    depends_on:
+      - service-center
+    image: 'servicecomb/scfrontend:latest'
+    ports:
+      - "30103:30103"
+    environment:
+      SC_ADDRESS: http://service-center:30100
+  mesher-edge:
+    depends_on:
+      - service-center
+      - kie
+    image: 'servicecomb/mesher-edge:latest'
+    ports:
+      - "80:30101"
+    environment:
+      PAAS_CSE_SC_ENDPOINT: service-center:30100
+      PAAS_CSE_CC_ENDPOINT: kie:30110
\ No newline at end of file
diff --git a/docker/edge/Dockerfile b/docker/edge/Dockerfile
new file mode 100644
index 0000000..45aba70
--- /dev/null
+++ b/docker/edge/Dockerfile
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM golang:1.12.10 as builder
+
+COPY . /servicecomb-mesher/
+WORKDIR /servicecomb-mesher/
+ENV GOPROXY=https://goproxy.io
+RUN go build -a github.com/apache/servicecomb-mesher/cmd/mesher
+
+
+FROM frolvlad/alpine-glibc:latest
+RUN mkdir -p /opt/mesher && \
+    mkdir -p /etc/mesher/conf && \
+    mkdir -p /etc/ssl/mesher/
+# To upload schemas using env enable SCHEMA_ROOT as environment variable using 
dockerfile or pass while running container
+#ENV SCHEMA_ROOT=/etc/chassis-go/schemas umcomment in future
+
+ENV CHASSIS_HOME=/opt/mesher/
+
+COPY --from=builder /servicecomb-mesher/mesher $CHASSIS_HOME
+COPY docker/edge/microservice.yaml docker/edge/chassis.yaml 
docker/edge/lager.yaml $CHASSIS_HOME/conf/
+COPY docker/edge/mesher.yaml /etc/mesher/conf/
+COPY docker/edge/start.sh  $CHASSIS_HOME
+WORKDIR $CHASSIS_HOME
+ENTRYPOINT ["sh", "/opt/mesher/start.sh"]
diff --git a/docker/edge/chassis.yaml b/docker/edge/chassis.yaml
new file mode 100644
index 0000000..974dbd4
--- /dev/null
+++ b/docker/edge/chassis.yaml
@@ -0,0 +1,55 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+cse:
+  protocols:
+    http:
+      listenAddress: 127.0.0.1:30101
+    rest-admin:
+      listenAddress: 127.0.0.1:30102 # listen addr use to adminAPI
+  service:
+    registry:
+      address: http://127.0.0.1:30100 # uri of service center
+      scope: full #set full to be able to discover other app's service
+    config:
+      client:
+        serverUri: https://127.0.0.1:30110 #uri of config center
+        type: servicecomb-kie
+        refreshMode: 1 # 1: only pull config.
+        refreshInterval: 30 # unit is second
+  handler:
+    chain:
+      Consumer:
+        outgoing: 
router,bizkeeper-consumer,loadbalance,tracing-consumer,transport #consumer 
handlers
+      Provider:
+        incoming: tracing-provider #provider handlers
+
+## Mesher TLS is base on Go Chassis TLS config,  
https://docs.go-chassis.com/user-guides/tls.html
+ssl:
+#  mesher-edge.rest.Provider.cipherPlugin: default
+#  mesher-edge.rest.Provider.verifyPeer: false
+#  mesher-edge.rest.Provider.cipherSuits: 
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
+#  mesher-edge.rest.Provider.protocol: TLSv1.2
+#  mesher-edge.rest.Provider.caFile:
+#  mesher-edge.rest.Provider.certFile: server.crt
+#  mesher-edge.rest.Provider.keyFile: server.key
+#  mesher-edge.rest.Provider.certPwdFile:
+
+#tracing:
+#  enabled: true #enable distribution tracing
+#  collectorType: zipkin       #zipkin: Send tracing info to zipkin server
+#                              #namedPipe: Write tracing info to linux named 
pipe.
+#  collectorTarget: http://localhost:9411/api/v1/spans #If the collectorType 
is "zipkin", the target is a zipkin server url, if the collecterType is "file" 
or "namedPipe", the target is a file path.
diff --git a/docker/edge/lager.yaml b/docker/edge/lager.yaml
new file mode 100755
index 0000000..b5c962c
--- /dev/null
+++ b/docker/edge/lager.yaml
@@ -0,0 +1,37 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+# LoggerLevel: |DEBUG|INFO|WARN|ERROR|FATAL
+logger_level: DEBUG
+
+# LoggerFile: used to output the name of 
log.可配置绝对路径,也可以配置用于拼接CHASSIS_HOME的相对路径。
+logger_file: log/mesher.log
+
+# LogFormatText:设定日志的输出格式是 json 还是 plaintext (类似于log4j),默认为 
false,不建议修改,如果开发过程中想本地查看日志的话,
+# 可以设定 LoggerFile 和 LogFormatText 为 true,这样会输出类似于 log4j 格式的本地日志。
+log_format_text: false
+
+#rollingPolicy daily/size;用于配置根据时间,还是根据大小进行日志rotate操作。
+rollingPolicy: size
+
+# MaxDaily of a log file before rotate. By D Days.;日志rotate时间配置,单位"day"。
+log_rotate_date: 1
+
+# MaxSize of a log file before rotate. By M Bytes.;日志rotate文件大小配置,单位"MB"。
+log_rotate_size: 10
+
+# Max counts to keep of a log's backup files.日志最大存储数量,单位“个”。
+log_backup_count: 7
\ No newline at end of file
diff --git a/docker/edge/mesher.yaml b/docker/edge/mesher.yaml
new file mode 100644
index 0000000..3b62adf
--- /dev/null
+++ b/docker/edge/mesher.yaml
@@ -0,0 +1,55 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## Router rules and fault injection rules are moved to router.yaml
+#plugin:
+#  destinationResolver:
+#    http: host # how to turn host to destination name. default to service 
name,
+
+admin: #admin API
+  goRuntimeMetrics : true # enable metrics
+  enable: true
+
+## enable pprof to profile mesher runtime
+#pprof:
+#  enable: false
+
+#mesher:
+#  ingress:
+#    type: servicecomb
+#    rule:
+#      http: |
+#        - host: example.com
+#          limit: 30
+#          apiPath: /some/api
+#          service:
+#            name: example
+#            redirectPath: /another/api
+#            port:
+#              name: http-legacy
+#              value: 8080
+#        - apiPath: /sayerror/api
+#          service:
+#            name: Server
+#            redirectPath: /sayerror
+#            port:
+#              name: http
+#              value: 8080
+#        - apiPath: /some/api
+#          service:
+#            name: Server
+#            port:
+#              name: http
+#              value: 8080
\ No newline at end of file
diff --git a/docker/edge/microservice.yaml b/docker/edge/microservice.yaml
new file mode 100644
index 0000000..7b49d0c
--- /dev/null
+++ b/docker/edge/microservice.yaml
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+service_description:
+  name: mesher-edge
+  version: 1.7.0
diff --git a/docker/edge/start.sh b/docker/edge/start.sh
new file mode 100644
index 0000000..13f255f
--- /dev/null
+++ b/docker/edge/start.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+MESHER_DIR=$(cd $(dirname $0); pwd)
+MESHER_CONF_DIR="$MESHER_DIR/conf"
+
+MESHER_YAML="mesher.yaml"
+ETC_CONF_DIR="/etc/mesher/conf"
+
+CHASSIS_YAML="chassis.yaml"
+MICROSERVICE_YAML="microservice.yaml"
+MONITORING_YAML="monitoring.yaml"
+LAGER_YAML="lager.yaml"
+TLS_YAML="tls.yaml"
+AUTH_YAML="auth.yaml"
+TRACING_YAML="tracing.yaml"
+
+TMP_DIR="/tmp"
+
+check_config_files(){
+    # configs can be mounted, maybe config map
+    if [ -f "$TMP_DIR/$MESHER_YAML" ]; then
+        echo "$MESHER_YAML is customed"
+        cp -f $TMP_DIR/$MESHER_YAML $ETC_CONF_DIR/$MESHER_YAML
+    fi
+    copy_tmp2mesher $CHASSIS_YAML
+    copy_tmp2mesher $MONITORING_YAML
+    copy_tmp2mesher $LAGER_YAML
+    copy_tmp2mesher $TLS_YAML
+    copy_tmp2mesher $AUTH_YAML
+    copy_tmp2mesher $TRACING_YAML
+}
+copy_tmp2mesher(){
+    if [ -f $TMP_DIR/$1 ]; then
+        echo "$1 is customed"
+        cp -f $TMP_DIR/$1 $MESHER_CONF_DIR/$1
+    fi
+}
+
+check_config_files
+
+net_name=$(ip -o -4 route show to default | awk '{print $5}')
+listen_addr=$(ifconfig $net_name | grep -E 'inet\W' | grep -o -E 
[0-9]+.[0-9]+.[0-9]+.[0-9]+ | head -n 1)
+
+# replace ip addr
+sed -i 
s/"listenAddress:\s\{1,\}[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}"/"listenAddress:
 $listen_addr"/g $MESHER_CONF_DIR/$CHASSIS_YAML
+
+exec $MESHER_DIR/mesher --config $ETC_CONF_DIR/$MESHER_YAML --mode edge
diff --git a/docs/configurations/admin.md b/docs/configurations/admin.md
index 3354953..0dffc61 100644
--- a/docs/configurations/admin.md
+++ b/docs/configurations/admin.md
@@ -16,13 +16,10 @@ tune admin api in mesher.yaml
 ```yaml
 admin: 
   enable: true
-  goRuntimeMetrics : true # enable metrics
 ```
 
 
 **admin.enable**
 >*(optional, bool)* default is false
 
-**admin.goRuntimeMetrics**
->*(optional, bool)* default is false, enable to expose go runtime metrics in 
/v1/mesher/metrics
 
diff --git a/examples/edge/conf/chassis.yaml b/examples/edge/conf/chassis.yaml
index 0ab8bd4..de8325b 100644
--- a/examples/edge/conf/chassis.yaml
+++ b/examples/edge/conf/chassis.yaml
@@ -8,71 +8,27 @@ cse:
   service:
     registry:
       address: http://127.0.0.1:30100 # uri of service center
-      #address: https://cse.cn-north-1.myhuaweicloud.com:443 # uri of service 
center
       scope: full #set full to be able to discover other app's service
-      watch: false # set if you want to watch instance change event
-      autoIPIndex: true # set to true if u want to resolve source IP to micro 
service
-#    config:
-#      client:
-#        serverUri: https://127.0.0.1:30110 #uri of config center
-#        type: servicecomb-kie
-#        refreshMode: 1 # 1: only pull config.
-#        refreshInterval: 30 # unit is second
-  #  monitor: #Send monitoring data to CSE monitor Server
-  #    client:
-  #      serverUri: https://cse.cn-north-1.myhuaweicloud.com:443   # monitor 
server url
+    config:
+      client:
+        serverUri: https://127.0.0.1:30110 #uri of config center
+        type: servicecomb-kie
+        refreshMode: 1 # 1: only pull config.
+        refreshInterval: 30 # unit is second
   handler:
     chain:
       Consumer:
-        outgoing:  
router,bizkeeper-consumer,loadbalance,tracing-consumer,transport #consumer 
handlers
+        outgoing: 
router,bizkeeper-consumer,loadbalance,tracing-consumer,transport #consumer 
handlers
       Provider:
-        incoming:   tracing-provider #provider handlers
-#  loadbalance:
-#    strategy:
-#      name: RoundRobin  # Random|RoundRobin|SessionStickiness
-#    retryEnabled: false # if there is error, retry request or not
-#    retryOnNext: 2      # times to switch to another instance based on 
strategy
-#    retryOnSame: 3      # times to retry on the same instance
-#    backoff:            # backoff policy of retried request
-#      kind: constant    # jittered/constant/zero
-#      MinMs: 200        # millisecond, Minimum duration to backoff
-#      MaxMs: 400        # millisecond, Maximum duration to backoff
-## circuit breaker configurations
-#  isolation:
-#    Consumer:
-#      timeout:
-#        enabled: true
-#      timeoutInMilliseconds: 1000
-#      maxConcurrentRequests: 100
-#  circuitBreaker:
-#    Consumer:
-#      enabled: true
-#      forceOpen: false
-#      forceClosed: false
-#      sleepWindowInMilliseconds: 10000
-#      requestVolumeThreshold: 20
-#      errorThresholdPercentage: 50
-#  fallback:
-#    Consumer:
-#      enabled: true
-#      maxConcurrentRequests: 20
-#  fallbackpolicy:
-#    Consumer:
-#      policy: throwexception
+        incoming: tracing-provider #provider handlers
 
-## Mesher TLS is base on Go Chassis TLS config
+## Mesher TLS is base on Go Chassis TLS config,  
https://docs.go-chassis.com/user-guides/tls.html
 ssl:
 #  mesher-edge.rest.Provider.cipherPlugin: default
 #  mesher-edge.rest.Provider.verifyPeer: false
 #  mesher-edge.rest.Provider.cipherSuits: 
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
 #  mesher-edge.rest.Provider.protocol: TLSv1.2
 #  mesher-edge.rest.Provider.caFile:
-  mesher-edge.rest.Provider.certFile: server.crt
-  mesher-edge.rest.Provider.keyFile: server.key
-#  mesher-edge.rest.Provider.certPwdFile:
-
-#tracing:
-#  enabled: true #enable distribution tracing
-#  collectorType: zipkin       #zipkin: Send tracing info to zipkin server
-#                              #namedPipe: Write tracing info to linux named 
pipe.
-#  collectorTarget: http://localhost:9411/api/v1/spans #If the collectorType 
is "zipkin", the target is a zipkin server url, if the collecterType is "file" 
or "namedPipe", the target is a file path.
+#  mesher-edge.rest.Provider.certFile: server.crt
+#  mesher-edge.rest.Provider.keyFile: server.key
+#  mesher-edge.rest.Provider.certPwdFile:
\ No newline at end of file
diff --git a/examples/edge/conf/mesher.yaml b/examples/edge/conf/mesher.yaml
index 55aa97f..4c5a62f 100644
--- a/examples/edge/conf/mesher.yaml
+++ b/examples/edge/conf/mesher.yaml
@@ -11,42 +11,30 @@ admin: #admin API
 #pprof:
 #  enable: false
 
-
-# this health check will ping local service port to check if service is still 
alive, if service can not reachable, mesher
-# will update status to OUT_OF_SERVICE in service center
-#localHealthCheck:
-#  - port: 8080
-#    uri: /health
-#    interval: 30s
-#    match:
-#      status: 200
-#      body: ok
-
-
-mesher:
-  ingress:
-    type: servicecomb
-    rule:
-      http: |
-        - host: example.com
-          limit: 30
-          apiPath: /some/api
-          service:
-            name: example
-            redirectPath: /another/api
-            port:
-              name: http-legacy
-              value: 8080
-        - apiPath: /sayerror/api
-          service:
-            name: Server
-            redirectPath: /sayerror
-            port:
-              name: http
-              value: 8080
-        - apiPath: /some/api
-          service:
-            name: Server
-            port:
-              name: http
-              value: 8080
\ No newline at end of file
+#mesher:
+#  ingress:
+#    type: servicecomb
+#    rule:
+#      http: |
+#        - host: example.com
+#          limit: 30
+#          apiPath: /some/api
+#          service:
+#            name: example
+#            redirectPath: /another/api
+#            port:
+#              name: http-legacy
+#              value: 8080
+#        - apiPath: /sayerror/api
+#          service:
+#            name: Server
+#            redirectPath: /sayerror
+#            port:
+#              name: http
+#              value: 8080
+#        - apiPath: /some/api
+#          service:
+#            name: Server
+#            port:
+#              name: http
+#              value: 8080
\ No newline at end of file
diff --git a/examples/edge/conf/microservice.yaml 
b/examples/edge/conf/microservice.yaml
index 8103479..0aba6be 100644
--- a/examples/edge/conf/microservice.yaml
+++ b/examples/edge/conf/microservice.yaml
@@ -1,3 +1,3 @@
 service_description:
   name: mesher-edge
-  version: 0.0.1
+  version: 1.7.0
diff --git a/go.mod b/go.mod
index 0fa2317..0fb8ed6 100644
--- a/go.mod
+++ b/go.mod
@@ -1,31 +1,24 @@
 module github.com/apache/servicecomb-mesher
 
 require (
-       github.com/Shopify/toxiproxy v2.1.3+incompatible // indirect
-       github.com/emicklei/go-restful-swagger12 
v0.0.0-20170926063155-7524189396c6 // indirect
        github.com/envoyproxy/go-control-plane v0.6.0
        github.com/ghodss/yaml v1.0.0
        github.com/go-chassis/foundation v0.0.0-20190621030543-c3b63f787f4c
-       github.com/go-chassis/go-archaius v0.20.0
-       github.com/go-chassis/go-chassis v1.7.2-0.20190917011915-d49fa9cdd27d
-       github.com/go-chassis/go-chassis-config v0.10.0
+       github.com/go-chassis/go-archaius v0.23.0
+       github.com/go-chassis/go-chassis v1.7.2-0.20191014010950-405e29b7566e
+       github.com/go-chassis/go-chassis-config 
v0.12.1-0.20190926020053-87487eaa3a72
        github.com/go-chassis/gohessian v0.0.0-20180702061429-e5130c25af55
-       github.com/go-logfmt/logfmt v0.4.0 // indirect
-       github.com/go-mesh/openlogging v1.0.1-0.20181205082104-3d418c478b2d
-       github.com/gogo/googleapis v1.1.0 // indirect
-       github.com/gogo/protobuf v1.2.0
-       github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf // indirect
-       github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // 
indirect
-       github.com/imdario/mergo v0.3.6 // indirect
-       github.com/lyft/protoc-gen-validate v0.0.11 // indirect
+       github.com/go-mesh/openlogging v1.0.1
+       github.com/gogo/googleapis v1.3.0 // indirect
+       github.com/gogo/protobuf v1.3.0
+       github.com/google/gofuzz v1.0.0 // indirect
+       github.com/imdario/mergo v0.3.7 // indirect
+       github.com/lyft/protoc-gen-validate v0.1.0 // indirect
        github.com/patrickmn/go-cache v2.1.0+incompatible
        github.com/prometheus/client_golang v0.9.1
        github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f
-       github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 // 
indirect
-       github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 
// indirect
-       github.com/spf13/pflag v1.0.3 // indirect
+       github.com/spf13/pflag v1.0.5 // indirect
        github.com/stretchr/testify v1.3.0
-       github.com/uber-go/atomic v1.3.2 // indirect
        github.com/urfave/cli v1.20.1-0.20181029213200-b67dcf995b6a
        golang.org/x/net v0.0.0-20190311183353-d8887717615a
        golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 // indirect
@@ -36,20 +29,4 @@ require (
        k8s.io/client-go v9.0.0+incompatible
 )
 
-replace (
-       cloud.google.com/go v0.28.0 => 
github.com/GoogleCloudPlatform/google-cloud-go v0.28.0
-       github.com/kubernetes/client-go => ../k8s.io/client-go
-       github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5 => 
github.com/go-chassis/zipkin-go-opentracing v0.3.5-0.20190321072447-42cf74fc2a92
-       golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 => 
github.com/golang/crypto v0.0.0-20181030102418-4d3f4d9ffa16
-       golang.org/x/net v0.0.0-20180906233101-161cd47e91fd => 
github.com/golang/net v0.0.0-20180906233101-161cd47e91fd
-       golang.org/x/oauth2 v0.0.0-20180207181906-543e37812f10 => 
github.com/golang/oauth2 v0.0.0-20180207181906-543e37812f10
-       golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f => 
github.com/golang/sync v0.0.0-20180314180146-1d60e4601c6f
-       golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e => 
github.com/golang/sys v0.0.0-20180909124046-d0be0721c37e
-       golang.org/x/sys v0.0.0-20181031143558-9b800f95dbbc => 
github.com/golang/sys v0.0.0-20181031143558-9b800f95dbbc
-
-       golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
-       golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 => 
github.com/golang/time v0.0.0-20180412165947-fbb02b2291d2
-       google.golang.org/appengine v1.2.0 => github.com/golang/appengine v1.2.0
-       google.golang.org/genproto v0.0.0-20181101192439-c830210a61df => 
github.com/google/go-genproto v0.0.0-20181101192439-c830210a61df
-       google.golang.org/grpc v1.14.0 => github.com/grpc/grpc-go v1.14.0
-)
+replace github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5 => 
github.com/go-chassis/zipkin-go-opentracing v0.3.5-0.20190321072447-42cf74fc2a92
diff --git a/proxy/config/config.go b/proxy/config/config.go
index ac3143d..07ceef1 100644
--- a/proxy/config/config.go
+++ b/proxy/config/config.go
@@ -146,7 +146,7 @@ func SetKeyValueByFile(key, f string) string {
                return ""
        }
        contents = string(b)
-       archaius.AddKeyValue(key, contents)
+       archaius.Set(key, contents)
        return contents
 }
 
diff --git a/proxy/config/config_test.go b/proxy/config/config_test.go
index b17b731..9cbd597 100644
--- a/proxy/config/config_test.go
+++ b/proxy/config/config_test.go
@@ -24,6 +24,7 @@ import (
        //      "github.com/go-chassis/go-chassis/pkg/util/fileutil"
        "github.com/apache/servicecomb-mesher/proxy/cmd"
        "github.com/apache/servicecomb-mesher/proxy/config"
+       "github.com/go-chassis/go-archaius"
        "github.com/go-chassis/go-chassis/core/lager"
        "github.com/stretchr/testify/assert"
        "gopkg.in/yaml.v2"
@@ -37,7 +38,10 @@ func init() {
 }
 func TestGetConfigFilePath(t *testing.T) {
        var key = "mesher.yaml"
+       archaius.Init(archaius.WithENVSource())
        cmd.Init()
+       err := config.Init()
+       assert.Error(t, err)
        f, _ := config.GetConfigFilePath(key)
        assert.Contains(t, f, key)
 }
diff --git a/proxy/config/struct.go b/proxy/config/struct.go
index d4d5914..87b35f1 100644
--- a/proxy/config/struct.go
+++ b/proxy/config/struct.go
@@ -63,7 +63,6 @@ type Plugin struct {
 
 //Admin has attributes for enabling, serverURI and metrics for admin data
 type Admin struct {
-       Enable           bool   `yaml:"enable"`
-       ServerURI        string `yaml:"serverUri"`
-       GoRuntimeMetrics bool   `yaml:"goRuntimeMetrics"`
+       Enable    bool   `yaml:"enable"`
+       ServerURI string `yaml:"serverUri"`
 }
diff --git a/proxy/config/struct_ingress_test.go 
b/proxy/config/struct_ingress_test.go
index 22d268e..8384e28 100644
--- a/proxy/config/struct_ingress_test.go
+++ b/proxy/config/struct_ingress_test.go
@@ -59,4 +59,6 @@ mesher:
        rules, err := config.NewRules(c.Mesher.Ingress.Rule["http"])
        assert.NoError(t, err)
        assert.Equal(t, 2, rules.Len())
+       v := rules.Value()
+       assert.Equal(t, "example", v[0].Service.Name)
 }
diff --git a/proxy/ingress/servicecomb/listener.go 
b/proxy/ingress/servicecomb/listener.go
index a1cc7b8..d41051a 100644
--- a/proxy/ingress/servicecomb/listener.go
+++ b/proxy/ingress/servicecomb/listener.go
@@ -19,7 +19,7 @@ package servicecomb
 
 import (
        "github.com/apache/servicecomb-mesher/proxy/config"
-       "github.com/go-chassis/go-archaius/core"
+       "github.com/go-chassis/go-archaius/event"
        "github.com/go-chassis/go-chassis/core/common"
        "github.com/go-mesh/openlogging"
 )
@@ -27,7 +27,7 @@ import (
 type ingressRuleEventListener struct{}
 
 //Event update ingress rule
-func (r *ingressRuleEventListener) Event(e *core.Event) {
+func (r *ingressRuleEventListener) Event(e *event.Event) {
        if e == nil {
                openlogging.Warn("Event pointer is nil")
                return
diff --git a/proxy/pkg/egress/archaius/egress_manager.go 
b/proxy/pkg/egress/archaius/egress_manager.go
index 88e2f6f..eac986c 100644
--- a/proxy/pkg/egress/archaius/egress_manager.go
+++ b/proxy/pkg/egress/archaius/egress_manager.go
@@ -18,6 +18,8 @@
 package archaius
 
 import (
+       "github.com/go-chassis/go-archaius/event"
+       "github.com/go-chassis/go-archaius/source/util"
        "gopkg.in/yaml.v2"
        "path/filepath"
        "strings"
@@ -25,8 +27,6 @@ import (
        "github.com/apache/servicecomb-mesher/proxy/config"
        "github.com/apache/servicecomb-mesher/proxy/pkg/egress"
        "github.com/go-chassis/go-archaius"
-       "github.com/go-chassis/go-archaius/core"
-       "github.com/go-chassis/go-archaius/sources/utils"
        "github.com/go-chassis/go-chassis/core/lager"
        "github.com/go-chassis/go-chassis/pkg/util/fileutil"
 )
@@ -37,7 +37,7 @@ const EgressYaml = "egress.yaml"
 type egressRuleEventListener struct{}
 
 // update egress rule of a service
-func (r *egressRuleEventListener) Event(e *core.Event) {
+func (r *egressRuleEventListener) Event(e *event.Event) {
        if e == nil {
                lager.Logger.Warn("Event pointer is nil", nil)
                return
@@ -76,7 +76,7 @@ func (r *egressRuleEventListener) Event(e *core.Event) {
 // initialize the config mgr and add several sources
 func initEgressManager() error {
        egressListener := &egressRuleEventListener{}
-       archaius.AddFile(filepath.Join(fileutil.GetConfDir(), EgressYaml), 
archaius.WithFileHandler(utils.Convert2configMap))
+       archaius.AddFile(filepath.Join(fileutil.GetConfDir(), EgressYaml), 
archaius.WithFileHandler(util.UseFileNameAsKeyContentAsValue))
        archaius.RegisterListener(egressListener, ".*")
 
        return nil
diff --git a/proxy/pkg/egress/pilot/egress.go b/proxy/pkg/egress/pilot/egress.go
index ec4b1ac..678772d 100644
--- a/proxy/pkg/egress/pilot/egress.go
+++ b/proxy/pkg/egress/pilot/egress.go
@@ -52,13 +52,13 @@ func (r *PilotEgress) Init(o egress.Options) error {
 
 // refresh all the egress config
 func refresh() error {
-       configs := pilotfetcher.GetConfigurations()
+       configs := pilotfetcher.Configs()
 
        d := make(map[string][]*config.EgressRule)
        for k, v := range configs {
                rules, ok := v.([]*config.EgressRule)
                if !ok {
-                       err := fmt.Errorf("Egress rule type assertion fail, 
key: %s", k)
+                       err := fmt.Errorf("egress rule type assertion fail, 
key: %s", k)
                        return err
                }
                d[k] = rules
diff --git a/proxy/pkg/egress/pilot/pilotsource.go 
b/proxy/pkg/egress/pilot/pilotsource.go
index b290ce3..a66cc9e 100644
--- a/proxy/pkg/egress/pilot/pilotsource.go
+++ b/proxy/pkg/egress/pilot/pilotsource.go
@@ -20,6 +20,8 @@ package pilot
 import (
        "errors"
        "fmt"
+       "github.com/go-chassis/go-archaius/event"
+       "github.com/go-chassis/go-archaius/source"
        "os"
        "reflect"
        "strconv"
@@ -31,9 +33,6 @@ import (
        "github.com/apache/servicecomb-mesher/proxy/control/istio"
        "github.com/apache/servicecomb-mesher/proxy/pkg/egress"
        istioinfra "github.com/apache/servicecomb-mesher/proxy/pkg/infras/istio"
-       "github.com/go-chassis/go-archaius/core"
-       cm "github.com/go-chassis/go-archaius/core/config-manager"
-       "github.com/go-chassis/go-archaius/core/event-system"
        "github.com/go-chassis/go-chassis/core/lager"
 )
 
@@ -50,7 +49,7 @@ const clusteroriginaldst = 4
 // TODO: use stream instead
 var DefaultPilotRefresh = 10 * time.Second
 
-var pilotfetcher core.ConfigMgr
+var pilotfetcher *source.Manager
 var pilotChan = make(chan string, 10)
 
 func setChanForPilot(k string) bool {
@@ -64,12 +63,9 @@ func setChanForPilot(k string) bool {
 
 // InitPilotFetcher init the config mgr and add several sources
 func InitPilotFetcher(o egress.Options) error {
-       d := eventsystem.NewDispatcher()
-
        // register and init pilot fetcher
-       d.RegisterListener(&pilotEventListener{}, ".*")
-       pilotfetcher = cm.NewConfigurationManager(d)
-
+       pilotfetcher = source.NewManager()
+       pilotfetcher.RegisterListener(&pilotEventListener{}, ".*")
        return addEgressPilotSource(o)
 }
 
@@ -133,10 +129,9 @@ func (r *pilotSource) GetSourceName() string { return 
egressPilotSourceName }
 func (r *pilotSource) GetPriority() int      { return r.priority }
 func (r *pilotSource) Cleanup() error        { return nil }
 
-func (r *pilotSource) AddDimensionInfo(d string) (map[string]string, error)    
       { return nil, nil }
-func (r *pilotSource) GetConfigurationsByDI(d string) (map[string]interface{}, 
error) { return nil, nil }
-func (r *pilotSource) GetConfigurationByKeyAndDimensionInfo(key, d string) 
(interface{}, error) {
-       return nil, nil
+//AddDimensionInfo no use
+func (r *pilotSource) AddDimensionInfo(labels map[string]string) error {
+       return nil
 }
 
 func (r *pilotSource) GetConfigurations() (map[string]interface{}, error) {
@@ -162,6 +157,16 @@ func (r *pilotSource) GetConfigurationByKey(k string) 
(interface{}, error) {
        return nil, fmt.Errorf("not found %s", k)
 }
 
+//Set no use
+func (r *pilotSource) Set(key string, value interface{}) error {
+       return nil
+}
+
+//Delete no use
+func (r *pilotSource) Delete(key string) error {
+       return nil
+}
+
 // get egress config from pilot
 func (r *pilotSource) getEgressConfigFromPilot() ([]*config.EgressRule, error) 
{
        clusters, _ := r.fetcher.CDS()
@@ -201,7 +206,7 @@ func (r *pilotSource) setPortForDestination(service, port 
string) {
 func (r *pilotSource) SetPriority(priority int) {
        r.priority = priority
 }
-func (r *pilotSource) DynamicConfigHandler(callback 
core.DynamicConfigCallback) error {
+func (r *pilotSource) Watch(callback source.EventHandler) error {
        // Periodically refresh configurations
        ticker := time.NewTicker(r.refreshInverval)
        for {
@@ -250,8 +255,8 @@ func (r *pilotSource) refreshConfigurations() 
(map[string]interface{}, error) {
        return data, nil
 }
 
-func (r *pilotSource) populateEvents(updates map[string]interface{}) 
([]*core.Event, error) {
-       events := make([]*core.Event, 0)
+func (r *pilotSource) populateEvents(updates map[string]interface{}) 
([]*event.Event, error) {
+       events := make([]*event.Event, 0)
        new := make(map[string]interface{})
 
        // generate create and update event
@@ -263,16 +268,16 @@ func (r *pilotSource) populateEvents(updates 
map[string]interface{}) ([]*core.Ev
                new[key] = value
                currentValue, ok := current[key]
                if !ok { // if new configuration introduced
-                       events = append(events, constructEvent(core.Create, 
key, value))
+                       events = append(events, constructEvent(event.Create, 
key, value))
                } else if !reflect.DeepEqual(currentValue, value) {
-                       events = append(events, constructEvent(core.Update, 
key, value))
+                       events = append(events, constructEvent(event.Update, 
key, value))
                }
        }
        // generate delete event
        for key, value := range current {
                _, ok := new[key]
                if !ok { // when old config not present in new config
-                       events = append(events, constructEvent(core.Delete, 
key, value))
+                       events = append(events, constructEvent(event.Delete, 
key, value))
                }
        }
 
@@ -283,8 +288,8 @@ func (r *pilotSource) populateEvents(updates 
map[string]interface{}) ([]*core.Ev
        return events, nil
 }
 
-func constructEvent(eventType string, key string, value interface{}) 
*core.Event {
-       return &core.Event{
+func constructEvent(eventType string, key string, value interface{}) 
*event.Event {
+       return &event.Event{
                EventType:   eventType,
                EventSource: egressPilotSourceName,
                Value:       value,
@@ -296,13 +301,13 @@ func constructEvent(eventType string, key string, value 
interface{}) *core.Event
 type pilotEventListener struct{}
 
 // update egress rule of a service
-func (r *pilotEventListener) Event(e *core.Event) {
+func (r *pilotEventListener) Event(e *event.Event) {
        if e == nil {
                lager.Logger.Warn("pilot event pointer is nil", nil)
                return
        }
 
-       v := pilotfetcher.GetConfigurationsByKey(e.Key)
+       v := pilotfetcher.GetConfig(e.Key)
        if v == nil {
                istio.SaveToEgressCache(nil)
                return
diff --git a/proxy/pkg/metrics/metrics.go b/proxy/pkg/metrics/metrics.go
index d35e12d..ffd4859 100644
--- a/proxy/pkg/metrics/metrics.go
+++ b/proxy/pkg/metrics/metrics.go
@@ -23,7 +23,6 @@
 package metrics
 
 import (
-       mesherConf "github.com/apache/servicecomb-mesher/proxy/config"
        "github.com/go-chassis/go-chassis/pkg/runtime"
        "sync"
        "time"
@@ -50,39 +49,26 @@ var (
        mutex      = sync.Mutex{}
 )
 
-//Recorder export the metrics into various of system
-type Recorder interface {
-       RecordStatus(labelValues map[string]string, status int, opts 
*RecordOptions)
-       RecordLatency(labelValues map[string]string, latency float64, opts 
*RecordOptions)
-       RecordStartTime(labelValues map[string]string, start time.Time, opts 
*RecordOptions)
-}
-
 //Options define recorder options
 type Options struct {
-       LabelNames             []string //default label names, if RecordOptions 
LabelNames is nil
-       EnableGoRuntimeMetrics bool
-}
-
-//RecordOptions is options for record method
-type RecordOptions struct {
-       LabelNames []string // able top custom label names
+       LabelNames []string //default label names, if RecordOptions LabelNames 
is nil
 }
 
-var defaultRecorder Recorder = &promRecorder{}
+var defaultRecorder *PromRecorder
 
 //RecordStatus record an operation status
-func RecordStatus(labelValues map[string]string, statusCode int, opts 
*RecordOptions) {
-       defaultRecorder.RecordStatus(labelValues, statusCode, opts)
+func RecordStatus(labelValues map[string]string, statusCode int) {
+       defaultRecorder.RecordStatus(labelValues, statusCode)
 }
 
 //RecordLatency record an operation latency
-func RecordLatency(labelValues map[string]string, latency float64, opts 
*RecordOptions) {
-       defaultRecorder.RecordLatency(labelValues, latency, opts)
+func RecordLatency(labelValues map[string]string, latency float64) {
+       defaultRecorder.RecordLatency(labelValues, latency)
 }
 
-//RecordStartTime record app start time
-func RecordStartTime(labelValues map[string]string, start time.Time, opts 
*RecordOptions) {
-       defaultRecorder.RecordStartTime(labelValues, start, opts)
+//RecordStartTime record mesher start time
+func RecordStartTime(labelValues map[string]string, start time.Time) {
+       defaultRecorder.RecordStartTime(labelValues, start)
 }
 
 //Init initiate the recorder
@@ -90,12 +76,11 @@ func Init() error {
        var err error
        LabelValues := map[string]string{LServiceName: runtime.ServiceName, 
LApp: runtime.App, LVersion: runtime.Version}
        defaultRecorder, err = NewPromRecorder(&Options{
-               LabelNames:             LabelNames,
-               EnableGoRuntimeMetrics: 
mesherConf.GetConfig().Admin.GoRuntimeMetrics,
+               LabelNames: LabelNames,
        })
        if err != nil {
                return err
        }
-       RecordStartTime(LabelValues, time.Now(), nil)
+       RecordStartTime(LabelValues, time.Now())
        return nil
 }
diff --git a/proxy/pkg/metrics/metrics_test.go 
b/proxy/pkg/metrics/metrics_test.go
index 8e38b62..f61acbe 100644
--- a/proxy/pkg/metrics/metrics_test.go
+++ b/proxy/pkg/metrics/metrics_test.go
@@ -18,24 +18,17 @@
 package metrics_test
 
 import (
+       "github.com/prometheus/client_golang/prometheus"
+       "github.com/stretchr/testify/assert"
        "net/http"
        "strings"
        "testing"
 
-       "github.com/prometheus/client_golang/prometheus"
-       "github.com/stretchr/testify/assert"
-
-       mc "github.com/apache/servicecomb-mesher/proxy/config"
        "github.com/apache/servicecomb-mesher/proxy/pkg/metrics"
        "github.com/go-chassis/go-chassis/pkg/runtime"
 )
 
 func TestInit(t *testing.T) {
-       mc.SetConfig(&mc.MesherConfig{
-               Admin: mc.Admin{
-                       GoRuntimeMetrics: false,
-               },
-       })
        err := metrics.Init()
        runtime.ServiceName = "A"
        runtime.Version = "v1.1"
@@ -51,9 +44,9 @@ func TestRecordStatus(t *testing.T) {
                metrics.LVersion:     "",
                metrics.LApp:         "",
        }
-       metrics.RecordStatus(lvs, http.StatusOK, nil)
-       metrics.RecordStatus(lvs, http.StatusNotFound, nil)
-       metrics.RecordStatus(lvs, http.StatusInternalServerError, nil)
+       metrics.RecordStatus(lvs, http.StatusOK)
+       metrics.RecordStatus(lvs, http.StatusNotFound)
+       metrics.RecordStatus(lvs, http.StatusInternalServerError)
        metricFamilies, err := prometheus.DefaultGatherer.Gather()
        assert.Nil(err, "error should be nil while collecting metrics from 
prometheus")
        for _, metricFamily := range metricFamilies {
@@ -69,4 +62,13 @@ func TestRecordStatus(t *testing.T) {
        assert.Equal(errorcount4xx, float64(1))
        assert.Equal(errorcount5xx, float64(1))
 
+       metrics.RecordLatency(lvs, 1000)
+       metricFamilies, err = prometheus.DefaultGatherer.Gather()
+       var c float64
+       for _, metricFamily := range metricFamilies {
+               if name := metricFamily.GetName(); strings.Contains(name, 
metrics.LRequestLatencySeconds) {
+                       c = *metricFamily.Metric[0].Summary.SampleSum
+               }
+       }
+       assert.Equal(1000, int(c))
 }
diff --git a/proxy/pkg/metrics/prom_recorder.go 
b/proxy/pkg/metrics/prom_recorder.go
index 67305f1..dfa5164 100644
--- a/proxy/pkg/metrics/prom_recorder.go
+++ b/proxy/pkg/metrics/prom_recorder.go
@@ -19,7 +19,6 @@ package metrics
 
 import (
        "errors"
-       "github.com/prometheus/client_golang/prometheus"
        "net/http"
        "sync"
        "time"
@@ -27,59 +26,41 @@ import (
 
 var onceEnable sync.Once
 
-type promRecorder struct {
+//PromRecorder record metrics
+type PromRecorder struct {
        LabelNames []string
 }
 
 //NewPromRecorder return a prom recorder
-func NewPromRecorder(opts *Options) (Recorder, error) {
-       promConfig := getPrometheusSinker(getSystemPrometheusRegistry())
+func NewPromRecorder(opts *Options) (*PromRecorder, error) {
        if opts != nil {
-               if opts.EnableGoRuntimeMetrics {
-                       onceEnable.Do(func() {
-                               
promConfig.PromRegistry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
-                               
promConfig.PromRegistry.MustRegister(prometheus.NewGoCollector())
-                       })
-               }
-               return &promRecorder{LabelNames: opts.LabelNames}, nil
+               return &PromRecorder{LabelNames: opts.LabelNames}, nil
        }
        return nil, errors.New("options can not be nil")
 }
 
-//GetLN return label names based on options
-func (e *promRecorder) GetLN(opts *RecordOptions) (ln []string) {
-       ln = e.LabelNames
-       if opts != nil && len(opts.LabelNames) != 0 {
-               ln = opts.LabelNames
-       }
-       return
-}
-
 //RecordStatus record different metrics based on status
-func (e *promRecorder) RecordStatus(LabelValues map[string]string, statusCode 
int, opts *RecordOptions) {
-       ln := e.GetLN(opts)
+func (e *PromRecorder) RecordStatus(LabelValues map[string]string, statusCode 
int) {
        if statusCode >= http.StatusBadRequest && statusCode <= 
http.StatusUnavailableForLegalReasons {
-               DefaultPrometheusExporter.Count(LError4XX, ln, LabelValues)
-               DefaultPrometheusExporter.Count(LTotalFailures, ln, LabelValues)
+               DefaultPrometheusExporter.Count(LError4XX, e.LabelNames, 
LabelValues)
+               DefaultPrometheusExporter.Count(LTotalFailures, e.LabelNames, 
LabelValues)
        } else if statusCode >= http.StatusInternalServerError && statusCode <= 
http.StatusNetworkAuthenticationRequired {
-               DefaultPrometheusExporter.Count(LError5XX, ln, LabelValues)
-               DefaultPrometheusExporter.Count(LTotalFailures, ln, LabelValues)
+               DefaultPrometheusExporter.Count(LError5XX, e.LabelNames, 
LabelValues)
+               DefaultPrometheusExporter.Count(LTotalFailures, e.LabelNames, 
LabelValues)
        } else if statusCode >= http.StatusOK && statusCode <= 
http.StatusIMUsed {
-               DefaultPrometheusExporter.Count(LTotalSuccess, ln, LabelValues)
+               DefaultPrometheusExporter.Count(LTotalSuccess, e.LabelNames, 
LabelValues)
        }
-       DefaultPrometheusExporter.Count(LTotalRequest, ln, LabelValues)
+       DefaultPrometheusExporter.Count(LTotalRequest, e.LabelNames, 
LabelValues)
 }
 
 //RecordLatency record operation latency
-func (e *promRecorder) RecordLatency(LabelValues map[string]string, latency 
float64, opts *RecordOptions) {
-       ln := e.GetLN(opts)
-       DefaultPrometheusExporter.Summary(LRequestLatencySeconds, latency, ln, 
LabelValues)
+func (e *PromRecorder) RecordLatency(LabelValues map[string]string, latency 
float64) {
+       DefaultPrometheusExporter.Summary(LRequestLatencySeconds, latency, 
e.LabelNames, LabelValues)
 
 }
 
 //RecordStartTime save start time
-func (e *promRecorder) RecordStartTime(LabelValues map[string]string, start 
time.Time, opts *RecordOptions) {
-       ln := e.GetLN(opts)
-       DefaultPrometheusExporter.Gauge(LStartTime, float64(start.Unix()), ln, 
LabelValues)
+func (e *PromRecorder) RecordStartTime(LabelValues map[string]string, start 
time.Time) {
+       DefaultPrometheusExporter.Gauge(LStartTime, float64(start.Unix()), 
e.LabelNames, LabelValues)
 
 }
diff --git a/proxy/pkg/metrics/prometheus_exporter.go 
b/proxy/pkg/metrics/prometheus_exporter.go
index ee56857..d1dfc3e 100644
--- a/proxy/pkg/metrics/prometheus_exporter.go
+++ b/proxy/pkg/metrics/prometheus_exporter.go
@@ -44,30 +44,11 @@ type PrometheusMesherSinker struct {
 var (
        //DefaultPrometheusExporter stores value of default prometheus exporter 
type
        DefaultPrometheusExporter = GetPrometheusExporter()
-       prometheusRegistry        = prometheus.NewRegistry()
        onceInit                  sync.Once
        //DefaultPrometheusSinker stores value of default prometheus exporter 
type
        DefaultPrometheusSinker *PrometheusMesherSinker
 )
 
-//GetSystemPrometheusRegistry return prometheus registry which mesher use
-func getSystemPrometheusRegistry() *prometheus.Registry {
-       return prometheusRegistry
-}
-
-func newPrometheusProvider(promRegistry prometheus.Registerer) 
*PrometheusMesherSinker {
-       return &PrometheusMesherSinker{
-               PromRegistry: promRegistry,
-       }
-}
-
-func getPrometheusSinker(pr *prometheus.Registry) *PrometheusMesherSinker {
-       onceInit.Do(func() {
-               DefaultPrometheusSinker = newPrometheusProvider(pr)
-       })
-       return DefaultPrometheusSinker
-}
-
 //GetPrometheusExporter returns default prometheus exporter
 func GetPrometheusExporter() *PrometheusExporter {
        //use go chassis registry
diff --git a/proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go 
b/proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go
index 571b19e..3daec27 100755
--- a/proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go
+++ b/proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go
@@ -36,7 +36,6 @@ import (
        "github.com/go-chassis/go-chassis/client/rest"
        "github.com/go-chassis/go-chassis/core/common"
        chassisCommon "github.com/go-chassis/go-chassis/core/common"
-       chassisconfig "github.com/go-chassis/go-chassis/core/config"
        "github.com/go-chassis/go-chassis/core/handler"
        "github.com/go-chassis/go-chassis/core/invocation"
        "github.com/go-chassis/go-chassis/core/lager"
@@ -223,7 +222,7 @@ func Handle(ctx *dubbo.InvokeContext) error {
                //发送请求
                //value := ctx.Req.GetAttachment(ProxyTag, "")
                if !IsProvider { //come from proxyedDubboSvc
-                       ctx.Req.SetAttachment(common.HeaderSourceName, 
chassisconfig.SelfServiceName)
+                       ctx.Req.SetAttachment(common.HeaderSourceName, 
runtime.ServiceName)
                        ctx.Req.SetAttachment(ProxyTag, "true")
 
                        if mesherRuntime.Role == mesherCommon.RoleSidecar {
diff --git a/proxy/protocol/dubbo/proxy/rest2dubbo.go 
b/proxy/protocol/dubbo/proxy/rest2dubbo.go
index 69a8621..c327f33 100755
--- a/proxy/protocol/dubbo/proxy/rest2dubbo.go
+++ b/proxy/protocol/dubbo/proxy/rest2dubbo.go
@@ -19,6 +19,7 @@ package dubboproxy
 
 import (
        "fmt"
+       "github.com/go-chassis/go-chassis/pkg/runtime"
        "io/ioutil"
        "net/http"
        "net/url"
@@ -160,8 +161,8 @@ func getJVMType(v schema.MethParam, arg *util.Argument, 
bytesTmp [][]byte, query
 
 func preHandleToDubbo(req *http.Request) (*invocation.Invocation, string) {
        inv := new(invocation.Invocation)
-       inv.MicroServiceName = chassisconfig.SelfServiceName
-       inv.RouteTags = utiltags.NewDefaultTag(chassisconfig.SelfVersion, 
chassisconfig.GlobalDefinition.AppID)
+       inv.MicroServiceName = runtime.ServiceName
+       inv.RouteTags = utiltags.NewDefaultTag(runtime.Version, 
chassisconfig.GlobalDefinition.AppID)
 
        inv.Protocol = "dubbo"
        inv.URLPathFormat = req.URL.Path
diff --git a/proxy/protocol/grpc/reverse_proxy.go 
b/proxy/protocol/grpc/reverse_proxy.go
index 3cc62a2..fa61aac 100755
--- a/proxy/protocol/grpc/reverse_proxy.go
+++ b/proxy/protocol/grpc/reverse_proxy.go
@@ -32,7 +32,6 @@ import (
        "github.com/apache/servicecomb-mesher/proxy/util"
        "github.com/go-chassis/go-chassis/client/rest"
        chassisCommon "github.com/go-chassis/go-chassis/core/common"
-       chassisconfig "github.com/go-chassis/go-chassis/core/config"
        "github.com/go-chassis/go-chassis/core/handler"
        "github.com/go-chassis/go-chassis/core/invocation"
        "github.com/go-chassis/go-chassis/core/lager"
@@ -81,8 +80,8 @@ func consumerPreHandler(req *http.Request) 
*invocation.Invocation {
 
 func providerPreHandler(req *http.Request) *invocation.Invocation {
        inv := preHandler(req)
-       inv.MicroServiceName = chassisconfig.SelfServiceName
-       inv.RouteTags = utiltags.NewDefaultTag(chassisconfig.SelfVersion, 
chassisconfig.GlobalDefinition.AppID)
+       inv.MicroServiceName = runtime.ServiceName
+       inv.RouteTags = utiltags.NewDefaultTag(runtime.Version, runtime.App)
        inv.SourceMicroService = req.Header.Get(chassisCommon.HeaderSourceName)
        inv.Ctx = context.TODO()
        return inv
@@ -127,7 +126,7 @@ func LocalRequestHandler(w http.ResponseWriter, r 
*http.Request) {
        defer func(begin time.Time) {
                timeTaken := time.Since(begin).Seconds()
                serviceLabelValues := map[string]string{metrics.LServiceName: 
inv.MicroServiceName, metrics.LApp: inv.RouteTags.AppID(), metrics.LVersion: 
inv.RouteTags.Version()}
-               metrics.RecordLatency(serviceLabelValues, timeTaken, nil)
+               metrics.RecordLatency(serviceLabelValues, timeTaken)
        }(time.Now())
        var invRsp *invocation.Response
        c.Next(inv, func(ir *invocation.Response) error {
@@ -259,7 +258,7 @@ func WriteErrorResponse(inv *invocation.Invocation, w 
http.ResponseWriter, r *ht
 //RecordStatus record an operation status
 func RecordStatus(inv *invocation.Invocation, statusCode int) {
        LabelValues := map[string]string{metrics.LServiceName: 
inv.MicroServiceName, metrics.LApp: inv.RouteTags.AppID(), metrics.LVersion: 
inv.RouteTags.Version()}
-       metrics.RecordStatus(LabelValues, statusCode, nil)
+       metrics.RecordStatus(LabelValues, statusCode)
 }
 func copyHeader(dst, src http.Header) {
        for k, vs := range src {
diff --git a/proxy/protocol/grpc/server.go b/proxy/protocol/grpc/server.go
index 435a477..1e8bc8d 100644
--- a/proxy/protocol/grpc/server.go
+++ b/proxy/protocol/grpc/server.go
@@ -23,13 +23,13 @@ import (
        "fmt"
        "github.com/apache/servicecomb-mesher/proxy/common"
        "github.com/apache/servicecomb-mesher/proxy/resolver"
+       chassisRuntime "github.com/go-chassis/go-chassis/pkg/runtime"
        "net"
        "net/http"
        "strings"
 
        "github.com/apache/servicecomb-mesher/proxy/pkg/runtime"
        chassisCom "github.com/go-chassis/go-chassis/core/common"
-       chassisConfig "github.com/go-chassis/go-chassis/core/config"
        "github.com/go-chassis/go-chassis/core/lager"
        "github.com/go-chassis/go-chassis/core/server"
        chassisTLS "github.com/go-chassis/go-chassis/core/tls"
@@ -113,13 +113,13 @@ func (hs *httpServer) startSidecar(host, port string) 
error {
                return nil
        default:
                serverTLSConfig, serverSSLConfig, serverErr := 
chassisTLS.GetTLSConfigByService(
-                       chassisConfig.SelfServiceName, chassisCom.ProtocolRest, 
chassisCom.Provider)
+                       chassisRuntime.ServiceName, chassisCom.ProtocolRest, 
chassisCom.Provider)
                if serverErr != nil {
                        if !chassisTLS.IsSSLConfigNotExist(serverErr) {
                                return serverErr
                        }
                } else {
-                       sslTag := genTag(chassisConfig.SelfServiceName, 
chassisCom.ProtocolRest, chassisCom.Provider)
+                       sslTag := genTag(chassisRuntime.ServiceName, 
chassisCom.ProtocolRest, chassisCom.Provider)
                        lager.Logger.Warnf("%s TLS mode, verify peer: %t, 
cipher plugin: %s.",
                                sslTag, serverSSLConfig.VerifyPeer, 
serverSSLConfig.CipherPlugin)
                }
diff --git a/proxy/protocol/http/gateway_test.go 
b/proxy/protocol/http/gateway_test.go
new file mode 100644
index 0000000..c27930b
--- /dev/null
+++ b/proxy/protocol/http/gateway_test.go
@@ -0,0 +1,70 @@
+package http
+
+import (
+       "github.com/apache/servicecomb-mesher/proxy/ingress"
+       _ "github.com/apache/servicecomb-mesher/proxy/ingress/servicecomb"
+       "github.com/apache/servicecomb-mesher/proxy/pkg/metrics"
+       "github.com/go-chassis/go-archaius"
+       "github.com/go-chassis/go-chassis/control"
+       _ "github.com/go-chassis/go-chassis/control/archaius"
+       "github.com/go-chassis/go-chassis/core/common"
+       "github.com/go-chassis/go-chassis/core/config"
+       "github.com/go-chassis/go-chassis/core/config/model"
+       "github.com/go-chassis/go-chassis/core/handler"
+       "github.com/stretchr/testify/assert"
+       "net/http"
+       "net/http/httptest"
+       "strings"
+       "testing"
+)
+
+func TestHandleIngressTraffic(t *testing.T) {
+       b := []byte(`
+        - host: example.com
+          limit: 30
+          apiPath: /some/api
+          service:
+            name: example
+            tags:
+              version: 1.0.0
+            redirectPath: /another/api
+            port:
+              name: http-legacy
+              value: 8080
+        - host: foo.com
+          apiPath: /some/api
+          service:
+            name: foo
+            tags:
+              version: 1.0.0
+            redirectPath: /another/api
+            port:
+              name: http
+              value: 8080
+`)
+       err := metrics.Init()
+       assert.NoError(t, err)
+       err = handler.CreateChains(common.Provider, map[string]string{
+               "incoming": strings.Join([]string{}, ","),
+       },
+       )
+       err = handler.CreateChains(common.Consumer, map[string]string{
+               "outgoing": strings.Join([]string{}, ","),
+       },
+       )
+       archaius.Init(archaius.WithMemorySource())
+       err = archaius.Set("mesher.ingress.rule.http", string(b))
+       assert.NoError(t, err)
+       config.GlobalDefinition = new(model.GlobalCfg)
+       config.HystrixConfig = &model.HystrixConfigWrapper{}
+       archaius.UnmarshalConfig(config.GlobalDefinition)
+       assert.NoError(t, err)
+       err = control.Init(control.Options{})
+       assert.NoError(t, err)
+       err = ingress.Init()
+       assert.NoError(t, err)
+
+       req, _ := http.NewRequest(http.MethodGet, "http://foo.com/some/api";, 
nil)
+       w := httptest.NewRecorder()
+       HandleIngressTraffic(w, req)
+}
diff --git a/proxy/protocol/http/http_server.go 
b/proxy/protocol/http/http_server.go
index c7b73e6..a61452e 100644
--- a/proxy/protocol/http/http_server.go
+++ b/proxy/protocol/http/http_server.go
@@ -23,17 +23,16 @@ import (
        "errors"
        "fmt"
        "github.com/apache/servicecomb-mesher/proxy/ingress"
+       "github.com/apache/servicecomb-mesher/proxy/pkg/runtime"
        "net"
        "net/http"
        "strings"
 
        "github.com/apache/servicecomb-mesher/proxy/common"
        "github.com/apache/servicecomb-mesher/proxy/config"
-       "github.com/apache/servicecomb-mesher/proxy/pkg/runtime"
        "github.com/apache/servicecomb-mesher/proxy/protocol/dubbo/proxy"
        "github.com/apache/servicecomb-mesher/proxy/resolver"
        chassisCom "github.com/go-chassis/go-chassis/core/common"
-       chassisConfig "github.com/go-chassis/go-chassis/core/config"
        "github.com/go-chassis/go-chassis/core/lager"
        "github.com/go-chassis/go-chassis/core/server"
        chassisTLS "github.com/go-chassis/go-chassis/core/tls"
@@ -117,13 +116,13 @@ func (hs *httpServer) startSidecar(host, port string) 
error {
                return nil
        default:
                serverTLSConfig, serverSSLConfig, serverErr := 
chassisTLS.GetTLSConfigByService(
-                       chassisConfig.SelfServiceName, chassisCom.ProtocolRest, 
chassisCom.Provider)
+                       chassisRuntime.ServiceName, chassisCom.ProtocolRest, 
chassisCom.Provider)
                if serverErr != nil {
                        if !chassisTLS.IsSSLConfigNotExist(serverErr) {
                                return serverErr
                        }
                } else {
-                       sslTag := genTag(chassisConfig.SelfServiceName, 
chassisCom.ProtocolRest, chassisCom.Provider)
+                       sslTag := genTag(chassisRuntime.ServiceName, 
chassisCom.ProtocolRest, chassisCom.Provider)
                        lager.Logger.Warnf("%s TLS mode, verify peer: %t, 
cipher plugin: %s.",
                                sslTag, serverSSLConfig.VerifyPeer, 
serverSSLConfig.CipherPlugin)
                }
diff --git a/proxy/protocol/http/sidecar.go b/proxy/protocol/http/sidecar.go
index 144e852..6ec2011 100755
--- a/proxy/protocol/http/sidecar.go
+++ b/proxy/protocol/http/sidecar.go
@@ -84,8 +84,8 @@ func consumerPreHandler(req *http.Request) 
*invocation.Invocation {
 
 func providerPreHandler(req *http.Request) *invocation.Invocation {
        inv := preHandler(req)
-       inv.MicroServiceName = chassisconfig.SelfServiceName
-       inv.RouteTags = utiltags.NewDefaultTag(chassisconfig.SelfVersion, 
chassisconfig.GlobalDefinition.AppID)
+       inv.MicroServiceName = runtime.ServiceName
+       inv.RouteTags = utiltags.NewDefaultTag(runtime.Version, 
chassisconfig.GlobalDefinition.AppID)
        inv.SourceMicroService = req.Header.Get(chassisCommon.HeaderSourceName)
        inv.Ctx = context.TODO()
        return inv
@@ -119,19 +119,18 @@ func LocalRequestHandler(w http.ResponseWriter, r 
*http.Request) {
        var c *handler.Chain
        ok, egressRule := egress.Match(inv.MicroServiceName)
        if ok {
-               var intport int32 = 80
+               var targetPort int32 = 80
                for _, port := range egressRule.Ports {
                        if strings.EqualFold(port.Protocol, 
common.HTTPProtocol) {
-                               intport = port.Port
+                               targetPort = port.Port
                                break
                        }
                }
-               inv.Endpoint = inv.MicroServiceName + ":" + 
strconv.Itoa(int(intport))
+               inv.Endpoint = inv.MicroServiceName + ":" + 
strconv.Itoa(int(targetPort))
                c, err = handler.GetChain(common.ConsumerEgress, 
common.ChainConsumerEgress)
-
                if err != nil {
                        handleErrorResponse(inv, w, http.StatusBadGateway, err)
-                       lager.Logger.Error("Get chain failed" + err.Error())
+                       openlogging.Error("Get chain failed" + err.Error())
                        return
                }
 
@@ -139,14 +138,14 @@ func LocalRequestHandler(w http.ResponseWriter, r 
*http.Request) {
                c, err = handler.GetChain(chassisCommon.Consumer, 
common.ChainConsumerOutgoing)
                if err != nil {
                        handleErrorResponse(inv, w, http.StatusBadGateway, err)
-                       lager.Logger.Error("Get chain failed: " + err.Error())
+                       openlogging.Error("Get chain failed: " + err.Error())
                        return
                }
        }
        defer func(begin time.Time) {
                timeTaken := time.Since(begin).Seconds()
                serviceLabelValues := map[string]string{metrics.LServiceName: 
inv.MicroServiceName, metrics.LApp: inv.RouteTags.AppID(), metrics.LVersion: 
inv.RouteTags.Version()}
-               metrics.RecordLatency(serviceLabelValues, timeTaken, nil)
+               metrics.RecordLatency(serviceLabelValues, timeTaken)
        }(time.Now())
        var invRsp *invocation.Response
        c.Next(inv, func(ir *invocation.Response) error {
@@ -159,7 +158,7 @@ func LocalRequestHandler(w http.ResponseWriter, r 
*http.Request) {
        })
        resp, err := handleRequest(w, inv, invRsp)
        if err != nil {
-               lager.Logger.Error("Handle request failed: " + err.Error())
+               openlogging.Error("handle request failed: " + err.Error())
                return
        }
        RecordStatus(inv, resp.StatusCode)
@@ -304,7 +303,7 @@ func handleErrorResponse(inv *invocation.Invocation, w 
http.ResponseWriter, stat
 //RecordStatus record an operation status
 func RecordStatus(inv *invocation.Invocation, statusCode int) {
        LabelValues := map[string]string{metrics.LServiceName: 
inv.MicroServiceName, metrics.LApp: inv.RouteTags.AppID(), metrics.LVersion: 
inv.RouteTags.Version()}
-       metrics.RecordStatus(LabelValues, statusCode, nil)
+       metrics.RecordStatus(LabelValues, statusCode)
 }
 func copyHeader(dst, src http.Header) {
        for k, vs := range src {
diff --git a/proxy/resource/v1/route/route.go b/proxy/resource/v1/route/route.go
index 13f5957..e04a223 100644
--- a/proxy/resource/v1/route/route.go
+++ b/proxy/resource/v1/route/route.go
@@ -18,19 +18,19 @@
 package route
 
 import (
-       "github.com/go-chassis/go-chassis/core/config/model"
+       "github.com/go-chassis/go-chassis/core/config"
        "github.com/go-chassis/go-chassis/core/router"
 )
 
 //Rules is the struct for route rule
 type Rules struct {
-       Destinations map[string][]*model.RouteRule `yaml:"routeRule"`
+       Destinations map[string][]*config.RouteRule `yaml:"routeRule"`
 }
 
 var routeRules *Rules
 
 //GetServiceRouteRule gets route rule for that service
-func GetServiceRouteRule(serviceName string) []*model.RouteRule {
+func GetServiceRouteRule(serviceName string) []*config.RouteRule {
        if routeRules != nil {
                if v, ok := routeRules.Destinations[serviceName]; ok {
                        return v
@@ -42,7 +42,7 @@ func GetServiceRouteRule(serviceName string) 
[]*model.RouteRule {
                routeRules = new(Rules)
        }
        if routeRules.Destinations == nil {
-               routeRules.Destinations = make(map[string][]*model.RouteRule)
+               routeRules.Destinations = make(map[string][]*config.RouteRule)
        }
        routeRules.Destinations[serviceName] = rules
        return rules
diff --git a/proxy/server/server.go b/proxy/server/server.go
index 3a8b90d..717f7f7 100644
--- a/proxy/server/server.go
+++ b/proxy/server/server.go
@@ -70,15 +70,17 @@ func Run() {
 func profile() {
        if config.GetConfig().PProf != nil {
                if config.GetConfig().PProf.Enable {
-                       go func() {
-                               if config.GetConfig().PProf.Listen == "" {
-                                       config.GetConfig().PProf.Listen = 
"127.0.0.1:6060"
-                               }
-                               openlogging.Warn("Enable pprof on " + 
config.GetConfig().PProf.Listen)
-                               if err := 
http.ListenAndServe(config.GetConfig().PProf.Listen, nil); err != nil {
-                                       openlogging.Error("Can not enable 
pprof: " + err.Error())
-                               }
-                       }()
+                       go startProfiling()
                }
        }
 }
+
+func startProfiling() {
+       if config.GetConfig().PProf.Listen == "" {
+               config.GetConfig().PProf.Listen = "127.0.0.1:6060"
+       }
+       openlogging.Warn("Enable pprof on " + config.GetConfig().PProf.Listen)
+       if err := http.ListenAndServe(config.GetConfig().PProf.Listen, nil); 
err != nil {
+               openlogging.Error("Can not enable pprof: " + err.Error())
+       }
+}

Reply via email to