ASMAdaptiveConcurrency secara dinamis menyesuaikan jumlah permintaan konkuren yang diizinkan berdasarkan data permintaan hasil pengambilan sampel dan menolak permintaan ketika tingkat konkurensi melebihi kapasitas layanan, sehingga melindungi layanan Anda dari kelebihan beban.
Prasyarat
-
Instans ASM telah dibuat dan menjalankan versi 1.12.4.19 atau yang lebih baru. Untuk informasi selengkapnya, lihat Create an ASM instance.
Klien kubectl telah terhubung ke kluster. Untuk informasi selengkapnya, lihat Connect to an ACK cluster using kubectl.
Informasi latar belakang
Ketika suatu layanan melebihi kapasitas bebannya, layanan tersebut harus menolak permintaan berlebih untuk mencegah kegagalan berantai. Anda dapat menggunakan DestinationRule Service Mesh untuk mengonfigurasi pemutusan sirkuit dasar. Namun, pendekatan ini mengharuskan Anda menentukan ambang batas yang memicu pemutusan sirkuit, seperti jumlah tertentu permintaan tertunda. Bidang data Service Mesh kemudian hanya akan menolak permintaan ketika lalu lintas jaringan melebihi konfigurasi pemutusan sirkuit tersebut. Dalam skenario dunia nyata, kapasitas beban suatu layanan sulit diperkirakan secara akurat.
ASMAdaptiveConcurrency menggunakan algoritma kontrol konkurensi adaptif alih-alih ambang batas tetap. Algoritma ini secara berkala membandingkan latensi hasil pengambilan sampel dengan latensi ideal yang diukur. Berdasarkan serangkaian perhitungan, algoritma tersebut secara dinamis menyesuaikan batas konkurensi, sehingga menjaga batas tersebut tetap mendekati kapasitas layanan dan menolak permintaan yang melebihi batas tersebut. Permintaan yang ditolak akan mengembalikan HTTP 503 dan pesan error reached concurrency limit.
Selama setiap pengukuran MinRTT periodik, jumlah koneksi dibatasi pada nilai kecil (min_concurrency). Oleh karena itu, setelah Anda mengaktifkan AdaptiveConcurrency untuk suatu layanan, aktifkan juga retries pada layanan tersebut melalui DestinationRule. Retries memungkinkan sidecar mengirim ulang permintaan yang ditolak selama perhitungan MinRTT, sehingga permintaan yang dikirim ulang memiliki peluang lebih besar untuk menghasilkan respons.
Langkah 1: Deploy aplikasi contoh
Deploy testserver sebagai layanan yang akan dilindungi dan gotest sebagai generator beban.
-
testserver — Memproses 500 permintaan secara konkuren, mengantrikan permintaan yang melebihi batas ini, dan membutuhkan waktu 1.000 ms untuk memproses setiap permintaan.
-
gotest — Mengirim 200 permintaan sekaligus per replica. Di gotest.yaml,
replicasdiatur ke0sehingga tidak ada beban yang dihasilkan sebelum kontrol konkurensi adaptif diterapkan. Anda akan melakukan scale out gotest di Langkah 4.
-
Buat file bernama testserver.yaml dengan konten berikut.
apiVersion: apps/v1 kind: Deployment metadata: labels: app: testserver name: testserver namespace: default spec: replicas: 1 selector: matchLabels: app: testserver template: metadata: creationTimestamp: null labels: app: testserver spec: containers: - args: - -m - "500" - -t - "1000" command: - /usr/local/bin/limited-concurrency-http-server image: registry.cn-hangzhou.aliyuncs.com/acs/asm-limited-concurrency-http-server:v0.1.1-gee0b08f-aliyun imagePullPolicy: IfNotPresent name: testserver ports: - containerPort: 8080 protocol: TCPGunakan
-muntuk menentukan jumlah permintaan konkuren yang dapat ditangani aplikasi dan gunakan-tuntuk menentukan waktu pemrosesan permintaan. -
Jalankan perintah berikut untuk deploy aplikasi testserver.
kubectl apply -f testserver.yaml -
Buat file bernama testservice.yaml dengan konten berikut.
apiVersion: v1 kind: Service metadata: labels: app: testserver name: testserver namespace: default spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 8080 protocol: TCP targetPort: 8080 - name: metrics port: 15020 protocol: TCP targetPort: 15020 selector: app: testserver type: ClusterIP -
Jalankan perintah berikut untuk deploy Service testserver.
kubectl apply -f testservice.yaml -
Buat file bernama gotest.yaml dengan konten berikut.
apiVersion: apps/v1 kind: Deployment metadata: labels: app: gotest name: gotest namespace: default spec: replicas: 0 selector: matchLabels: app: gotest template: metadata: creationTimestamp: null labels: app: gotest spec: containers: - args: - -c - "200" - -n - "10000" - -u - testserver:8080 command: - /root/go-stress-testing-linux image: xocoder/go-stress-testing-linux:v0.1 imagePullPolicy: Always name: gotest resources: limits: cpu: 500m -
Jalankan perintah berikut untuk deploy aplikasi gotest.
kubectl apply -f gotest.yaml
Langkah 2: Buat resource ASMAdaptiveConcurrency
-
Buat file bernama adaptiveconcurrency.yaml dengan konten berikut.
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMAdaptiveConcurrency metadata: name: sample-adaptive-concurrency namespace: default spec: workload_selector: labels: app: testserver sample_aggregate_percentile: value: 60 concurrency_limit_params: max_concurrency_limit: 500 concurrency_update_interval: 15s min_rtt_calc_params: interval: 60s request_count: 100 jitter: value: 15 min_concurrency: 50 buffer: value: 25File di atas menggunakan nilai contoh untuk aplikasi testserver, bukan nilai default:
max_concurrency_limitdiatur ke500agar sesuai dengan 500 permintaan konkuren yang dapat diproses oleh testserver, danmin_concurrencydiatur ke50, jauh di bawah kapasitas tersebut, sehingga testserver dapat merespons dengan latensi ideal selama perhitungan MinRTT. Tabel berikut menjelaskan setiap parameter beserta nilai default-nya.Parameter Tipe Deskripsi Wajib workload_selector WorkloadSelector Selektor workload yang menentukan cara mencocokkan workload tempat konfigurasi ini berlaku. Ya workload_selector.labels map Label dari workload (Pod) yang akan dicocokkan. Label ini digunakan untuk mencocokkan workload. Ya sample_aggregate_percentile Percent Persentil pengambilan sampel. Latensi pada persentil ini dari permintaan yang diambil sampelnya digunakan sebagai SampleRTT dalam perhitungan. Tentukan persentil pada field value. Ya sample_aggregate_percentile.value int Persentase. Nilai valid: 0 hingga 100. Ya concurrency_limit_params ConcurrencyLimitParams Konfigurasi terkait batas konkurensi. Ya concurrency_limit_params.max_concurrency_limit int Batas konkurensi maksimum. Nilai default: 1000. Tidak concurrency_limit_params.concurrency_update_interval duration Interval perhitungan konkurensi maksimum. Contoh: 15s. Ya min_rtt_calc_params MinRTTCalcParams Konfigurasi untuk menghitung MinRTT. Ya min_rtt_calc_params.interval duration Interval perhitungan waktu round-trip ideal. Contoh: 60s. Tidak min_rtt_calc_params.request_count int Jumlah permintaan yang datanya digunakan untuk menghitung waktu round-trip ideal. Nilai default: 50. Tidak min_rtt_calc_params.jitter Percent Penundaan acak yang ditambahkan saat menghitung waktu round-trip ideal. Tentukan persentase pada field value. Tidak min_rtt_calc_params.jitter.value int Persentase penundaan acak. Misalnya, jika interval adalah 120s dan jitter adalah 50, maka interval menjadi random(120, 120 + (120 * 50%)). Nilai default: 15. Tidak min_rtt_calc_params.min_concurrency int Jumlah permintaan konkuren yang digunakan saat menghitung waktu round-trip ideal. Nilai ini juga merupakan nilai konkurensi awal controller. Atur nilai ini jauh di bawah bottleneck layanan agar layanan dapat memberikan respons dengan latensi ideal pada tingkat konkurensi ini. Nilai default: 3. Tidak min_rtt_calc_params.buffer Percent Rentang fluktuasi latensi yang dapat diterima. Tentukan persentase pada field value. Tidak min_rtt_calc_params.buffer.value int Persentase fluktuasi latensi yang dapat diterima. Misalnya, jika fluktuasi 10% dapat diterima untuk latensi sekitar 100 ms, atur nilai ini ke 10. Nilai default: 25. Tidak -
Jalankan perintah berikut untuk membuat resource ASMAdaptiveConcurrency.
kubectl apply -f adaptiveconcurrency.yaml
Langkah 3: Aktifkan Managed Service for Prometheus (opsional)
Managed Service for Prometheus menyediakan tampilan intuitif tentang cara kerja controller konkurensi dan menyederhanakan penyetelan parameter. Lakukan langkah ini jika Anda ingin mengamati controller konkurensi pada Dasbor Grafana, karena dasbor di Langkah 4 menggunakan metrik yang diekspor di sini. Jika Anda hanya perlu mengetahui apakah batas konkurensi berlaku, Anda dapat melewati langkah ini: permintaan yang ditolak oleh batas konkurensi akan mengembalikan HTTP 503 dan pesan error reached concurrency limit.
-
Aktifkan Managed Service for Prometheus. Untuk informasi selengkapnya, lihat Connect and configure Managed Service for Prometheus.
-
Buat file bernama servicemonitor.yaml dengan konten berikut. ServiceMonitor memungkinkan Managed Service for Prometheus mengumpulkan data dari testserver.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: testserver-envoy-metrics namespace: default spec: endpoints: - interval: 5s path: /stats/prometheus port: metrics namespaceSelector: any: true selector: matchLabels: app: testserver -
Di lingkungan KubeConfig kluster, jalankan perintah berikut untuk membuat ServiceMonitor.
kubectl apply -f servicemonitor.yaml
Langkah 4: Verifikasi bahwa kontrol konkurensi adaptif berlaku
Lakukan scale out gotest untuk mengirim lebih banyak permintaan daripada yang dapat diproses testserver secara konkuren, lalu periksa bagaimana controller konkurensi merespons. Operasi dasbor pada bagian ini memerlukan metrik yang diekspor di Langkah 3.
-
Atur jumlah replica gotest menjadi 5. Satu replica aplikasi gotest mengirim 200 permintaan. Oleh karena itu, lima replica mengirim 1.000 permintaan.
-
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Pada halaman Cluster List, klik nama kluster tujuan atau klik Details di kolom Actions.
Di panel navigasi kiri halaman manajemen kluster, pilih .
-
Pada halaman Deployments, atur Namespace ke default. Di kolom Actions aplikasi gotest, pilih More > View in YAML.
-
Pada dialog Edit YAML, atur
replicaske5lalu klik Update.
-
-
Impor dasbor untuk Grafana menggunakan definisi JSON yang tersedia di Lampiran topik ini, lalu lihat status berjalan controller konkurensi. Untuk informasi selengkapnya, lihat dokumentasi ARMS.
-
Di dasbor, pilih kluster dan atur service ke testserver serta pod ke ALL.
Hasil yang diharapkan: Aplikasi gotest mengirim 1.000 permintaan ke aplikasi testserver, tetapi aplikasi testserver selalu membatasi jumlah permintaan konkuren yang diterimanya menjadi kurang dari 500. Hal ini menunjukkan bahwa kontrol konkurensi adaptif ASMAdaptiveConcurrency berlaku.
Lampiran: Definisi dasbor Grafana
Gunakan definisi JSON berikut untuk mengimpor dasbor Grafana di Langkah 4.
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"description": "monitoring ASM Adaptive Concurrency",
"editable": true,
"gnetId": 6693,
"graphTooltip": 0,
"id": 3239002,
"iteration": 1651922323976,
"links": [],
"panels": [
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 22,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_rq_blocked{service=\"$service\", pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "RqBlocked",
"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": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"hiddenSeries": false,
"id": 24,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_burst_queue_size{service=\"$service\", pod=\"$pod\"}",
"format": "time_series",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "HeadRoom",
"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": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 8
},
"hiddenSeries": false,
"id": 26,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_concurrency_limit{service=\"$service\",pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "ConcurrencyLimit",
"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": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 8
},
"hiddenSeries": false,
"id": 28,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_gradient{service=\"$service\",pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Gradient",
"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": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 16
},
"hiddenSeries": false,
"id": 32,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_min_rtt_msecs{service=\"$service\",pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "MinRTT(msec)",
"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
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "$cluster",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 16
},
"hiddenSeries": false,
"id": 34,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_sample_rtt_msecs{service=\"$service\",pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "SampleRTT(msec)",
"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
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "test-adaptive-concurrency_1217520382582089",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 24
},
"hiddenSeries": false,
"id": 30,
"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.4.0-pre",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_min_rtt_calculation_active{service=\"$service\",pod=\"$pod\"}",
"interval": "",
"legendFormat": "{{service}}-{{pod}}",
"queryType": "randomWalk",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "MinRTTCalc",
"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
}
}
],
"refresh": "5s",
"schemaVersion": 26,
"style": "dark",
"tags": [],
"templating": {
"list": [
{
"current": {
"selected": true,
"text": "edas120_1217520382582089",
"value": "edas120_1217520382582089"
},
"error": null,
"hide": 0,
"includeAll": false,
"label": null,
"multi": false,
"name": "cluster",
"options": [],
"query": "prometheus",
"queryValue": "",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"allValue": null,
"current": {
"isNone": true,
"selected": false,
"text": "None",
"value": ""
},
"datasource": "$cluster",
"definition": "label_values(envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_burst_queue_size,service)",
"error": null,
"hide": 0,
"includeAll": false,
"label": null,
"multi": false,
"name": "service",
"options": [],
"query": "label_values(envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_burst_queue_size,service)",
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allValue": null,
"current": {
"selected": false,
"text": "All",
"value": "$__all"
},
"datasource": "$cluster",
"definition": "label_values(envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_concurrency_limit, pod)",
"error": null,
"hide": 0,
"includeAll": true,
"label": null,
"multi": true,
"name": "pod",
"options": [],
"query": "label_values(envoy_http_inbound_0_0_0_0_8080_adaptive_concurrency_gradient_controller_concurrency_limit, pod)",
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
}
]
},
"time": {
"from": "now-15m",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"1m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
],
"time_options": [
"5m",
"15m",
"1h",
"6h",
"12h",
"24h",
"2d",
"7d",
"30d"
]
},
"timezone": "",
"title": "ASM Adaptive Concurrency",
"uid": "000000084",
"version": 3
}