All Products
Search
Document Center

Alibaba Cloud Service Mesh:Gunakan ASMAdaptiveConcurrency untuk menerapkan kontrol konkurensi adaptif

Last Updated:Aug 28, 2026

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

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, replicas diatur ke 0 sehingga tidak ada beban yang dihasilkan sebelum kontrol konkurensi adaptif diterapkan. Anda akan melakukan scale out gotest di Langkah 4.

  1. 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: TCP

    Gunakan -m untuk menentukan jumlah permintaan konkuren yang dapat ditangani aplikasi dan gunakan -t untuk menentukan waktu pemrosesan permintaan.

  2. Jalankan perintah berikut untuk deploy aplikasi testserver.

    kubectl apply -f testserver.yaml
  3. 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
  4. Jalankan perintah berikut untuk deploy Service testserver.

    kubectl apply -f testservice.yaml
  5. 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
  6. Jalankan perintah berikut untuk deploy aplikasi gotest.

kubectl apply -f gotest.yaml

Langkah 2: Buat resource ASMAdaptiveConcurrency

  1. Use kubectl on the control plane to access Istio resources.

  2. 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: 25

    File di atas menggunakan nilai contoh untuk aplikasi testserver, bukan nilai default: max_concurrency_limit diatur ke 500 agar sesuai dengan 500 permintaan konkuren yang dapat diproses oleh testserver, dan min_concurrency diatur ke 50, 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
  3. 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.

  1. Aktifkan Managed Service for Prometheus. Untuk informasi selengkapnya, lihat Connect and configure Managed Service for Prometheus.

  2. 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
  3. 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.

  1. Atur jumlah replica gotest menjadi 5. Satu replica aplikasi gotest mengirim 200 permintaan. Oleh karena itu, lima replica mengirim 1.000 permintaan.

    1. Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Cluster List, klik nama kluster tujuan atau klik Details di kolom Actions.

    3. Di panel navigasi kiri halaman manajemen kluster, pilih Workload > Deployments.

    4. Pada halaman Deployments, atur Namespace ke default. Di kolom Actions aplikasi gotest, pilih More > View in YAML.

    5. Pada dialog Edit YAML, atur replicas ke 5 lalu klik Update.

  2. 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.

  3. 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
}