Upgrade skywalking-cli dependency (#26)

* Some enchancements for HPA metric adapter:

 * Support special characters in label selectors
 * Add namespace to HPA metrics

Signed-off-by: Gao Hongtao <hanahmily@gmail.com>

* Document namespace

Signed-off-by: Gao Hongtao <hanahmily@gmail.com>

* Upgrade skywalking-cli

Signed-off-by: Gao Hongtao <hanahmily@gmail.com>

* Update release version

Signed-off-by: Gao Hongtao <hanahmily@gmail.com>

* Fix lint issues

Signed-off-by: Gao Hongtao <hanahmily@gmail.com>
diff --git a/CHANGES.md b/CHANGES.md
index 94597ca..695cc65 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -2,13 +2,16 @@
 ==================
 Release Notes.
 
-0.2.1
+0.3.0
 ------------------
 
 #### Features
 - Support special characters in the metric selector of HPA metric adapter.
 - Add the namespace to HPA metric name.
 
+#### Chores
+- Upgrade skywalking-cli dependency.
+
 0.2.0
 ------------------
 
diff --git a/go.mod b/go.mod
index 306cda6..c3aa8ce 100644
--- a/go.mod
+++ b/go.mod
@@ -4,18 +4,16 @@
 
 require (
 	github.com/Masterminds/sprig/v3 v3.1.0
-	github.com/apache/skywalking-cli v0.0.0-20201125155244-ffee47d2e83d
+	github.com/apache/skywalking-cli v0.0.0-20210209032327-04a0ce08990f
 	github.com/evanphx/json-patch v4.9.0+incompatible
 	github.com/ghodss/yaml v1.0.0
 	github.com/go-logr/logr v0.3.0
 	github.com/kubernetes-sigs/custom-metrics-apiserver v0.0.0-20201110135240-8c12d6d92362
-	github.com/machinebox/graphql v0.2.2
 	github.com/sirupsen/logrus v1.7.0
 	github.com/spf13/cobra v1.1.1
 	github.com/stretchr/testify v1.6.1
 	github.com/urfave/cli v1.22.1
 	k8s.io/api v0.20.1
-	k8s.io/apiextensions-apiserver v0.20.1 // indirect
 	k8s.io/apimachinery v0.20.1
 	k8s.io/apiserver v0.20.1
 	k8s.io/client-go v0.20.1
@@ -26,3 +24,7 @@
 )
 
 replace github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.4.1
+
+replace skywalking/network => github.com/apache/skywalking-cli/gen-codes/skywalking/network v0.0.0-20210209032327-04a0ce08990f
+
+replace google.golang.org/grpc => google.golang.org/grpc v1.29.1
diff --git a/go.sum b/go.sum
index 7b28650..27f1b01 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,3 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -75,6 +74,10 @@
 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 github.com/apache/skywalking-cli v0.0.0-20201125155244-ffee47d2e83d h1:vJeCfqKTLGQXGUy3+dYRNclCJgRsj3VQiCff/+yvfMA=
 github.com/apache/skywalking-cli v0.0.0-20201125155244-ffee47d2e83d/go.mod h1:kUqj2ESaiYz89JFJUr+cL6EDmzlEYSrlEMOkWg9wuS4=
+github.com/apache/skywalking-cli v0.0.0-20210209032327-04a0ce08990f h1:DknnvUn5ZR1hRtS42stGr3O6REwBFh6iyotoCJ2jFZ8=
+github.com/apache/skywalking-cli v0.0.0-20210209032327-04a0ce08990f/go.mod h1:EMKZ5MAEnCrNTPxqWu3s1QgnoUDQEO0oS+ohNB09JE8=
+github.com/apache/skywalking-cli/gen-codes/skywalking/network v0.0.0-20210209032327-04a0ce08990f/go.mod h1:kacAwfQjKgotVA/J4v4LZLo682UCOb1AktGep9oDDxw=
+github.com/apache/skywalking-swck v0.2.0/go.mod h1:kU75U5Tb3aEi1Vk1KX7hzyh8Hv7sUMNx0Djq5PLEPWI=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@@ -101,7 +104,7 @@
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
@@ -141,7 +144,7 @@
 github.com/emicklei/go-restful v2.14.3+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful-swagger12 v0.0.0-20201014110547-68ccff494617 h1:jri9taV4TK9oItoWJCofXJi21Dp/k25u32NnfphqLAY=
 github.com/emicklei/go-restful-swagger12 v0.0.0-20201014110547-68ccff494617/go.mod h1:qr0VowGBT4CS4Q8vFF8BSeKz34PuqKGxs/L0IAQA9DQ=
-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.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@@ -404,6 +407,7 @@
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
 github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
@@ -610,7 +614,6 @@
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -632,7 +635,6 @@
 golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/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-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -682,7 +684,6 @@
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
 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=
@@ -747,7 +748,6 @@
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -807,7 +807,6 @@
 google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -838,17 +837,8 @@
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8=
 google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
-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.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -889,6 +879,8 @@
 gopkg.in/yaml.v2 v2.2.8/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=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go
index 0033251..220cb7a 100644
--- a/pkg/provider/provider.go
+++ b/pkg/provider/provider.go
@@ -26,13 +26,9 @@
 	"sync"
 	"time"
 
-	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/graphql/client"
-	swctlschema "github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
+	swctlapi "github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 	apiprovider "github.com/kubernetes-sigs/custom-metrics-apiserver/pkg/provider"
-	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 	apierr "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -45,6 +41,7 @@
 
 const labelValueTypeStr string = "str"
 const labelValueTypeByte string = "byte"
+const stepMinute string = "2006-01-02 1504"
 
 var (
 	NsGroupResource = apischema.GroupResource{Resource: "namespaces"}
@@ -52,7 +49,7 @@
 
 // externalMetricsProvider is a implementation of provider.MetricsProvider which provides metrics from OAP
 type externalMetricsProvider struct {
-	metricDefines           []*swctlschema.MetricDefinition
+	metricDefines           []*swctlapi.MetricDefinition
 	lock                    sync.RWMutex
 	ctx                     *cli.Context
 	regex                   string
@@ -165,7 +162,7 @@
 
 func (p *externalMetricsProvider) GetExternalMetric(namespace string, metricSelector labels.Selector,
 	info apiprovider.ExternalMetricInfo) (*external_metrics.ExternalMetricValueList, error) {
-	var md *swctlschema.MetricDefinition
+	var md *swctlapi.MetricDefinition
 	for _, m := range p.metricDefines {
 		if p.getMetricNameWithNamespace(m.Name) == info.Metric {
 			md = m
@@ -193,61 +190,50 @@
 	now := time.Now()
 	startTime := now.Add(-3 * time.Minute)
 	endTime := now
-	step := swctlschema.StepMinute
-	duration := swctlschema.Duration{
-		Start: startTime.Format(utils.StepFormats[step]),
-		End:   endTime.Format(utils.StepFormats[step]),
+	step := swctlapi.StepMinute
+	duration := swctlapi.Duration{
+		Start: startTime.Format(stepMinute),
+		End:   endTime.Format(stepMinute),
 		Step:  step,
 	}
 
 	normal := true
-	condition := swctlschema.MetricsCondition{
-		Name: md.Name,
-		Entity: &swctlschema.Entity{
-			Scope:               interceptor.ParseScope(md.Name),
-			ServiceName:         svc.val,
-			ServiceInstanceName: instance.val,
-			EndpointName:        endpoint.val,
-			Normal:              &normal,
-		},
+	empty := ""
+	entity := &swctlapi.Entity{
+		ServiceName:             svc.val,
+		ServiceInstanceName:     instance.val,
+		EndpointName:            endpoint.val,
+		Normal:                  &normal,
+		DestServiceName:         &empty,
+		DestNormal:              &normal,
+		DestServiceInstanceName: &empty,
+		DestEndpointName:        &empty,
 	}
-	var metricsValues swctlschema.MetricsValues
-	if md.Type == swctlschema.MetricsTypeRegularValue {
-		var response map[string]swctlschema.MetricsValues
-
-		request := graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValues.graphql"))
-
-		request.Var("condition", condition)
-		request.Var("duration", duration)
-
-		if err := client.ExecuteQuery(p.ctx, request, &response); err != nil {
+	entity.Scope = parseScope(entity)
+	condition := swctlapi.MetricsCondition{
+		Name:   md.Name,
+		Entity: entity,
+	}
+	var metricsValues swctlapi.MetricsValues
+	if md.Type == swctlapi.MetricsTypeRegularValue {
+		var err error
+		metricsValues, err = metrics.LinearIntValues(p.ctx, condition, duration)
+		if err != nil {
 			return nil, apierr.NewInternalError(fmt.Errorf("unable to fetch metrics: %v", err))
 		}
-
-		klog.V(4).Infof("Linear request{condition:%s, duration:%s}  response %s", display(condition), display(duration), display(response))
-
-		metricsValues = response["result"]
-	} else if md.Type == swctlschema.MetricsTypeLabeledValue {
+		klog.V(4).Infof("Linear request{condition:%s, duration:%s}  response %s", display(condition), display(duration), display(metricsValues))
+	} else if md.Type == swctlapi.MetricsTypeLabeledValue {
 		if *label.val == "" {
 			klog.Errorf("%s is lack of required label 'label'", md.Name)
 			return nil, apierr.NewBadRequest(fmt.Sprintf("%s is lack of required label 'label'", md.Name))
 		}
-		var response map[string][]swctlschema.MetricsValues
-
-		request := graphql.NewRequest(assets.Read("graphqls/metrics/LabeledMetricsValues.graphql"))
-
-		request.Var("duration", duration)
-		request.Var("condition", condition)
-		request.Var("labels", []string{*label.val})
-
-		if err := client.ExecuteQuery(p.ctx, request, &response); err != nil {
+		result, err := metrics.MultipleLinearIntValues(p.ctx, condition, []string{*label.val}, duration)
+		if err != nil {
 			return nil, apierr.NewInternalError(fmt.Errorf("unable to fetch metrics: %v", err))
 		}
 
 		klog.V(4).Infof("Labeled request{condition:%s, duration:%s, labels:%s}  response %s",
-			display(condition), display(duration), *label.val, display(response))
-
-		result := response["result"]
+			display(condition), display(duration), *label.val, display(result))
 
 		for _, r := range result {
 			if *r.Label == *label.val {
@@ -272,7 +258,7 @@
 	if sValue == 0 {
 		sTime = endTime
 	}
-	klog.V(4).Infof("metric value: %d, timestamp: %s", sValue, sTime.Format(utils.StepFormats[step]))
+	klog.V(4).Infof("metric value: %d, timestamp: %s", sValue, sTime.Format(stepMinute))
 
 	return &external_metrics.ExternalMetricValueList{
 		Items: []external_metrics.ExternalMetricValue{
@@ -310,3 +296,24 @@
 func (p *externalMetricsProvider) getMetricNameWithNamespace(metricName string) string {
 	return strings.Join([]string{p.namespace, metricName}, "|")
 }
+
+// TODO: remove this function once cli move it from internal module to pkg
+func parseScope(entity *swctlapi.Entity) swctlapi.Scope {
+	scope := swctlapi.ScopeAll
+
+	if *entity.DestEndpointName != "" {
+		scope = swctlapi.ScopeEndpointRelation
+	} else if *entity.DestServiceInstanceName != "" {
+		scope = swctlapi.ScopeServiceInstanceRelation
+	} else if *entity.DestServiceName != "" {
+		scope = swctlapi.ScopeServiceRelation
+	} else if *entity.EndpointName != "" {
+		scope = swctlapi.ScopeEndpoint
+	} else if *entity.ServiceInstanceName != "" {
+		scope = swctlapi.ScopeServiceInstance
+	} else if *entity.ServiceName != "" {
+		scope = swctlapi.ScopeService
+	}
+
+	return scope
+}
diff --git a/pkg/provider/registry.go b/pkg/provider/registry.go
index e468a10..e8ef5cc 100644
--- a/pkg/provider/registry.go
+++ b/pkg/provider/registry.go
@@ -20,11 +20,8 @@
 import (
 	"encoding/json"
 
-	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/graphql/client"
-	swctlschema "github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 	apiprovider "github.com/kubernetes-sigs/custom-metrics-apiserver/pkg/provider"
-	"github.com/machinebox/graphql"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/klog/v2"
 )
@@ -51,16 +48,10 @@
 }
 
 func (p *externalMetricsProvider) updateMetrics() error {
-	var response map[string][]*swctlschema.MetricDefinition
-	request := graphql.NewRequest(assets.Read("graphqls/metrics/ListMetrics.graphql"))
-	request.Var("regex", p.regex)
-
-	err := client.ExecuteQuery(p.ctx, request, &response)
+	mdd, err := metrics.ListMetrics(p.ctx, p.regex)
 	if err != nil {
 		return err
 	}
-
-	mdd := response["result"]
 	klog.Infof("Get service metrics: %s", display(mdd))
 	if len(mdd) > 0 {
 		p.lock.Lock()