样例展示——以dubbo为例
按照aeraki官方提供的yaml部署dubbo样例,来验证其他协议在istio的流量管理,可观测性等特性。
dubbo
--- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-sample-provider-v1 labels: app: dubbo-sample-provider spec: selector: matchLabels: app: dubbo-sample-provider replicas: 1 template: metadata: labels: app: dubbo-sample-provider version: v1 spec: containers: - name: dubbo-sample-provider image: aeraki/dubbo-sample-provider ports: - containerPort: 20880 --- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-sample-provider-v2 labels: app: dubbo-sample-provider spec: selector: matchLabels: app: dubbo-sample-provider replicas: 1 template: metadata: labels: app: dubbo-sample-provider version: v2 spec: containers: - name: dubbo-sample-provider image: aeraki/dubbo-sample-provider ports: - containerPort: 20880 --- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-sample-consumer labels: app: dubbo-sample-consumer spec: selector: matchLabels: app: dubbo-sample-consumer replicas: 8 template: metadata: labels: app: dubbo-sample-consumer spec: containers: - name: dubbo-sample-consumer image: aeraki/dubbo-sample-consumer env: - name: mode value: demo ports: - containerPort: 9009
ServiceEntry
--- apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: test-dubbo-service annotations: interface: org.apache.dubbo.samples.basic.api.DemoService spec: hosts: - org.apache.dubbo.samples.basic.api.demoservice addresses: - 193.193.192.192 ports: - number: 20880 # aeraki也是通过port-name来识别的, 所以命名为:tcp-protocol-xxxx。 比如tcp-dubbo-sv,tcp-thrift-sv name: tcp-dubbo protocol: TCP workloadSelector: labels: app: dubbo-sample-provider resolution: STATIC
DestinctiomRule & VirtualService
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: dubbo-sample-provider spec: host: org.apache.dubbo.samples.basic.api.demoservice subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: test-dubbo-route spec: hosts: - org.apache.dubbo.samples.basic.api.demoservice http: - name: "reviews-traffic-splitting" route: - destination: host: org.apache.dubbo.samples.basic.api.demoservice subset: v1 weight: 20 - destination: host: org.apache.dubbo.samples.basic.api.demoservice subset: v2 weight: 80
如果运行正常的话,我们会看到dubbo的consumer和provider可以正常的running,而且打印出consumer的日志,可以看到consumer正常的请求provider的服务。
# kubectl get po -n dubbo
NAME READY STATUS RESTARTS AGE
dubbo-sample-consumer-855455bdb7-2wksm 2/2 Running 0 6h51m
dubbo-sample-consumer-855455bdb7-b6tqx 2/2 Running 0 6h42m
dubbo-sample-consumer-855455bdb7-fghdk 2/2 Running 0 6h42m
dubbo-sample-consumer-855455bdb7-jrzfw 2/2 Running 0 6h42m
dubbo-sample-consumer-855455bdb7-ljgcs 2/2 Running 0 6h51m
dubbo-sample-consumer-855455bdb7-nmtwb 2/2 Running 0 6h42m
dubbo-sample-consumer-855455bdb7-wm84t 2/2 Running 0 6h42m
dubbo-sample-consumer-855455bdb7-z8dwd 2/2 Running 0 6h42m
dubbo-sample-provider-v1-5b769968f7-4bmlw 2/2 Running 0 8h
dubbo-sample-provider-v2-5cb59df666-bph2b 2/2 Running 0 8h
# kubectl logs -f dubbo-sample-consumer-855455bdb7-2wksm -n dubbo
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-4bmlw/10.100.130.250
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-bph2b/10.100.37.33
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-4bmlw/10.100.130.250
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-4bmlw/10.100.130.250
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-4bmlw/10.100.130.250
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-4bmlw/10.100.130.250
如果查看aeraki的日志的话我们可以看到,aeraki帮助我们创建了对应的envoyfilter
2021-04-13T14:26:16.984626Z info adsc Received istiod.istio-system:15010 type networking.istio.io/v1alpha3/ServiceEntry cnt=36 nonce=7x0NcyWvgxw=73e52952-4bfb-4f39-a5c2-613286f50455
2021-04-13T14:26:16.985237Z info config-controller Matched protocol :Dubbo add test-dubbo-service
2021-04-13T14:26:16.985409Z info adsc Received istiod.istio-system:15010 type networking.istio.io/v1alpha3/VirtualService cnt=2 nonce=7x0NcyWvgxw=a20515eb-5bfb-4bd9-b169-a48ba21072fa
2021-04-13T14:26:16.985507Z info adsc Received istiod.istio-system:15010 type networking.istio.io/v1alpha3/DestinationRule cnt=2 nonce=7x0NcyWvgxw=a38f9509-9998-4524-bdf2-38a8c03780de
2021-04-13T14:26:17.485474Z info envoyfilter-controller Push debounce stable[29] 1: 500.118976ms since last change, 500.118769ms since last push
2021-04-13T14:26:17.522352Z info envoyfilter-controller Creating EnvoyFilter: {<nil> [apply_to:NETWORK_FILTER match:<listener:<filter_chain:<filter:<name:"envoy.filters.network.tcp_proxy" > > name:"193.193.192.192_20880" > > patch:<operation:REPLACE value:<fields:<key:"name" value:<string_value:"envoy.filters.network.dubbo_proxy" > > fields:<key:"typed_config" value:<struct_value:<fields:<key:"@type" value:<string_value:"type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy" > > fields:<key:"routeConfig" value:<list_value:<values:<struct_value:<fields:<key:"interface" value:<string_value:"org.apache.dubbo.samples.basic.api.DemoService" > > fields:<key:"name" value:<string_value:"outbound|20880||org.apache.dubbo.samples.basic.api.demoservice" > > fields:<key:"routes" value:<list_value:<values:<struct_value:<fields:<key:"match" value:<struct_value:<fields:<key:"method" value:<struct_value:<fields:<key:"name" value:<struct_value:<fields:<key:"safeRegex" value:<struct_value:<fields:<key:"googleRe2" value:<struct_value:<> > > fields:<key:"regex" value:<string_value:".*" > > > > > > > > > > > > > > fields:<key:"route" value:<struct_value:<fields:<key:"cluster" value:<string_value:"outbound|20880||org.apache.dubbo.samples.basic.api.demoservice" > > > > > > > > > > > > > > > fields:<key:"statPrefix" value:<string_value:"outbound|20880||org.apache.dubbo.samples.basic.api.demoservice" > > > > > > > ] {} [] 0}
2021-04-13T14:26:17.534377Z info envoyfilter-controller Creating EnvoyFilter: {labels:<key:"app" value:"dubbo-sample-provider" > [apply_to:NETWORK_FILTER match:<listener:<filter_chain:<filter:<name:"envoy.filters.network.tcp_proxy" > destination_port:20880 > name:"virtualInbound" > > patch:<operation:REPLACE value:<fields:<key:"name" value:<string_value:"envoy.filters.network.dubbo_proxy" > > fields:<key:"typed_config" value:<struct_value:<fields:<key:"@type" value:<string_value:"type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy" > > fields:<key:"routeConfig" value:<list_value:<values:<struct_value:<fields:<key:"interface" value:<string_value:"org.apache.dubbo.samples.basic.api.DemoService" > > fields:<key:"name" value:<string_value:"inbound|20880||" > > fields:<key:"routes" value:<list_value:<values:<struct_value:<fields:<key:"match" value:<struct_value:<fields:<key:"method" value:<struct_value:<fields:<key:"name" value:<struct_value:<fields:<key:"safeRegex" value:<struct_value:<fields:<key:"googleRe2" value:<struct_value:<> > > fields:<key:"regex" value:<string_value:".*" > > > > > > > > > > > > > > fields:<key:"route" value:<struct_value:<fields:<key:"cluster" value:<string_value:"inbound|20880||" > > > > > > > > > > > > > > > fields:<key:"statPrefix" value:<string_value:"inbound|20880||" > > > > > > > ] {} [] 0}
2021-04-13T14:26:17.690614Z info config-controller Virtual Service changed: add test-dubbo-route
流量控制演示
灰度发布/金丝雀发布
金丝雀发布也被称为灰度发布,主要是将流量切分,少量的生产环境的流量导入到线上服务的新版本来验证新版本的准确性和稳定性,确认没有异常之后再将剩余的服务流量导入到新的版本。
以前,旷工在下矿洞是面临的一个重要危险是矿井中的毒气,他们想到一个办法来辨别矿井中是否有毒气,矿工们随身携带一只金丝雀下矿井,金丝雀对毒气的抵抗能力比人类要弱,在毒气环境下会先挂掉起到预警的作用。
Istio可以通过envoy强大的路由能力灵活控制版本的流量百分比。接下来我们来验证一下使用了aeraki能否对我们的dubbo服务进行灰度发布的模拟。在我们正常的running起来了dubbo的服务之后,由于创建了VirtualService(aeraki对于dubbo这种grpc的应用还是沿用了VirtualService同个CRD),所以我们可以看到istio对于dubbo的consumer已经对provider的请求流量进行了分流,百分之八十的流量会请求到了v1版本,百分之二十的流量则是到了v2版本。通过kiali的request rate流量图可以看出来
通过观察consumer的日志也可以看到,consumer大概有百分之八十的流量请求到了v1,百分之二十的流量请求到了v2。
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-v7zdq/10.100.245.62
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-v7zdq/10.100.245.62
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-v7zdq/10.100.245.62
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
这时候我们修改VirtualService的路由规则,用来模拟基于按流量比例分流的灰度发布,将百分之五十平均分配到到v1和v2版本,修改后的virtualService为:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-dubbo-route
spec:
hosts:
- org.apache.dubbo.samples.basic.api.demoservice
http:
- name: "reviews-traffic-splitting"
route:
- destination:
host: org.apache.dubbo.samples.basic.api.demoservice
subset: v1
weight: 20
- destination:
host: org.apache.dubbo.samples.basic.api.demoservice
subset: v2
weight: 80
这时候我们查看kiali,可以看到流量已经平均分配到了v1和v2版本
可以看到我们可以通过istio+aeraki灵活精准的控制了不同版本的dubbo流量比例。随着v2版本的流量不断增大最终彻底替代v1版本称为线上版本,整个金丝雀发布也就结束了。不过,aeraki进行流量切换的时候,dubbo的服务会中断一会,对于服务的消费者来说不是很友好,后续会尝试对其进行改进。
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
[13/04/21 02:54:04:004 UTC] NettyClientWorker-1-1 INFO netty4.NettyClientHandler: [DUBBO] The connection of /10.100.245.0:34708 -> org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880 is disconnected., dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
org.apache.dubbo.rpc.RpcException: Failed to invoke remote method: sayHello, provider: dubbo://org.apache.dubbo.samples.basic.api.demoservice:20880/org.apache.dubbo.samples.basic.api.DemoService?application=demo-consumer&check=true&init=false&interface=org.apache.dubbo.samples.basic.api.DemoService&pid=1®ister.ip=10.100.245.0&remote.application=&revision=1.0-SNAPSHOT&side=consumer&sticky=false&timeout=3000, cause: message can not send, because channel is closed . url:dubbo://org.apache.dubbo.samples.basic.api.demoservice:20880/org.apache.dubbo.samples.basic.api.DemoService?application=demo-consumer&check=true&codec=dubbo&heartbeat=60000&init=false&interface=org.apache.dubbo.samples.basic.api.DemoService&pid=1®ister.ip=10.100.245.0&remote.application=&revision=1.0-SNAPSHOT&side=consumer&sticky=false&timeout=3000
at org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:115)
at org.apache.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:163)
at org.apache.dubbo.rpc.protocol.AsyncToSyncInvoker.invoke(AsyncToSyncInvoker.java:52)
at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89)
at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:81)
at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:51)
at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:81)
at org.apache.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:69)
at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:81)
at org.apache.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:78)
at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:74)
at org.apache.dubbo.common.bytecode.proxy0.sayHello(proxy0.java)
at org.apache.dubbo.samples.basic.BasicConsumer.main(BasicConsumer.java:45)
Caused by: org.apache.dubbo.remoting.RemotingException: message can not send, because channel is closed . url:dubbo://org.apache.dubbo.samples.basic.api.demoservice:20880/org.apache.dubbo.samples.basic.api.DemoService?application=demo-consumer&check=true&codec=dubbo&heartbeat=60000&init=false&interface=org.apache.dubbo.samples.basic.api.DemoService&pid=1®ister.ip=10.100.245.0&remote.application=&revision=1.0-SNAPSHOT&side=consumer&sticky=false&timeout=3000
at org.apache.dubbo.remoting.transport.AbstractClient.send(AbstractClient.java:176)
at org.apache.dubbo.remoting.transport.AbstractPeer.send(AbstractPeer.java:53)
at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel.request(HeaderExchangeChannel.java:135)
at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeClient.request(HeaderExchangeClient.java:95)
at org.apache.dubbo.rpc.protocol.dubbo.ReferenceCountExchangeClient.request(ReferenceCountExchangeClient.java:91)
at org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:105)
... 12 more
[13/04/21 02:54:23:023 UTC] dubbo-client-idleCheck-thread-1 INFO header.ReconnectTimerTask: [DUBBO] Initial connection to HeaderExchangeClient [channel=org.apache.dubbo.remoting.transport.netty4.NettyClient [/10.100.245.0:34708 -> org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880]], dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
[13/04/21 02:54:23:023 UTC] dubbo-client-idleCheck-thread-1 INFO netty4.NettyChannel: [DUBBO] Close netty channel [id: 0x63804caa, L:/10.100.245.0:34708 ! R:org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880], dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
[13/04/21 02:54:23:023 UTC] dubbo-client-idleCheck-thread-1 INFO netty4.NettyClient: [DUBBO] Close old netty channel [id: 0x63804caa, L:/10.100.245.0:34708 ! R:org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880] on create new netty channel [id: 0xb92ae7fc, L:/10.100.245.0:33370 - R:org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880], dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
[13/04/21 02:54:23:023 UTC] dubbo-client-idleCheck-thread-1 INFO transport.AbstractClient: [DUBBO] Successed connect to server org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880 from NettyClient 10.100.245.0 using dubbo version 1.0-SNAPSHOT, channel is NettyChannel [channel=[id: 0xb92ae7fc, L:/10.100.245.0:33370 - R:org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880]], dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
[13/04/21 02:54:23:023 UTC] NettyClientWorker-1-2 INFO netty4.NettyClientHandler: [DUBBO] The connection of /10.100.245.0:33370 -> org.apache.dubbo.samples.basic.api.demoservice/193.193.192.192:20880 is established., dubbo version: 1.0-SNAPSHOT, current host: 10.100.245.0
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-v7zdq/10.100.245.62
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v1-5b769968f7-59s9h/10.100.37.40
Hello Aeraki, response from dubbo-sample-provider-v2-5cb59df666-v7zdq/10.100.245.62
aeraki也实现了基于七层的流量路由,支持根据dubbo的服务名进行路由,将method的流量导向到不同的版本,支持method的精准/前缀/正则三种不同的路由模式。
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-dubbo-route
spec:
hosts:
- org.apache.dubbo.samples.basic.api.demoservice
http:
- name: "reviews-v1-routes"
match:
- method:
exact: "demoservice"
route:
- destination:
host: org.apache.dubbo.samples.basic.api.demoservice
subset: v1
- name: "reviews-v2-routes"
match:
- method:
prefix: say
route:
- destination:
host: org.apache.dubbo.samples.basic.api.demoservice
subset: v2
- name: "reviews-v3-routes"
match:
- method:
regex: ^s.*o$
route:
- destination:
host: org.apache.dubbo.samples.basic.api.demoservice
subset: v2
可观测性演示
kiali: kiali的观测性已经在上面的流量控制可以观测到了
Metrics——prometheus+grafana
aeraki已经支持的metrics的协议有Dubbo、Thrift、Kafka、ZooKeeper。如果需要支持其他协议可以去实现对应协议的pluhin,以dubbo协议举例,在grafana中导入配置即可看到对应的监控数据
{
"__inputs": [
{
"name": "DS_PROMETHEUS",
"label": "Prometheus",
"description": "",
"type": "datasource",
"pluginId": "prometheus",
"pluginName": "Prometheus"
}
],
"__requires": [
{
"type": "panel",
"id": "bargauge",
"name": "Bar gauge",
"version": ""
},
{
"type": "panel",
"id": "gauge",
"name": "Gauge",
"version": ""
},
{
"type": "grafana",
"id": "grafana",
"name": "Grafana",
"version": "7.2.1"
},
{
"type": "panel",
"id": "graph",
"name": "Graph",
"version": ""
},
{
"type": "datasource",
"id": "prometheus",
"name": "Prometheus",
"version": "1.0.0"
}
],
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"id": null,
"links": [],
"panels": [
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 12,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "7.2.1",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "sum(rate(envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request[5m]))",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Dubbo Request Per Second",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"fieldConfig": {
"defaults": {
"custom": {},
"unit": "ms"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"hiddenSeries": false,
"id": 2,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "7.2.1",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "histogram_quantile(0.95, sum(rate(envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_bucket[5m])) by (le))",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Dubbo Request Latency",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"format": "ms",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": "${DS_PROMETHEUS}",
"fieldConfig": {
"defaults": {
"custom": {
"align": null,
"filterable": false
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 80
}
]
},
"unit": "percent"
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 8
},
"id": 4,
"options": {
"displayMode": "gradient",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"showUnfilled": true
},
"pluginVersion": "7.2.1",
"targets": [
{
"expr": "envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_bucket{le=\"10\",app=\"dubbo-sample-consumer\"}/ignoring (le) envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_count *100",
"interval": "",
"legendFormat": "Less than 10 ms",
"refId": "A"
},
{
"expr": "envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_bucket{le=\"100\",app=\"dubbo-sample-consumer\"}/ignoring (le) envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_count *100",
"interval": "",
"legendFormat": "Less than 100 ms",
"refId": "B"
},
{
"expr": "envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_bucket{le=\"1000\",app=\"dubbo-sample-consumer\"}/ignoring (le) envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_count *100",
"interval": "",
"legendFormat": "Less than 1 s",
"refId": "C"
},
{
"expr": "envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_bucket{le=\"10000\",app=\"dubbo-sample-consumer\"}/ignoring (le) envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request_time_ms_count *100",
"interval": "",
"legendFormat": "Less than 10 s",
"refId": "D"
}
],
"timeFrom": null,
"timeShift": null,
"title": "Dubbo Request Distribution",
"type": "bargauge"
},
{
"datasource": "${DS_PROMETHEUS}",
"fieldConfig": {
"defaults": {
"custom": {},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percent"
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 8
},
"id": 8,
"options": {
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"showThresholdLabels": false,
"showThresholdMarkers": true
},
"pluginVersion": "7.2.1",
"targets": [
{
"expr": "sum(rate(envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_response_success[5m]))/sum(rate(envoy_dubbo_outbound_20880__org_apache_dubbo_samples_basic_api_demoservice_request[5m]))*100",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
"timeFrom": null,
"timeShift": null,
"title": "Dubbo Call Success Rate",
"type": "gauge"
}
],
"refresh": "10s",
"schemaVersion": 26,
"style": "dark",
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Aeraki Demo",
"uid": "pgz7wp-Gz",
"version": 23
}