全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Skenario 3: Lewati header baggage dalam jejak

更新时间:Jul 02, 2025

Anda dapat menggunakan jalur lalu lintas dalam mode permissif untuk mengisolasi versi aplikasi dan mengarahkan lalu lintas berdasarkan rasio tertentu. Aplikasi Anda harus menambahkan header yang ditransmisikan secara transparan di seluruh jejak permintaan dengan nilai yang berbeda. Header ini disebut header permintaan pass-through ujung-ke-ujung (E2E). Dalam contoh ini, header baggage digunakan sebagai header permintaan E2E. Ketika layanan dalam suatu jalur memanggil satu sama lain, jika layanan yang dipanggil tidak ada di jalur tersebut, permintaan diteruskan ke layanan yang sama di jalur dasar. Fitur ini memastikan integritas jejak dan menyederhanakan manajemen lalu lintas.

Penting

Sebelum memulai, pastikan Anda telah membaca dan memahami topik Gunakan jalur lalu lintas dalam mode permissif untuk mengelola lalu lintas ujung-ke-ujung dan konten terkait.

Deskripsi skenario

Dalam contoh ini, tiga layanan (mocka, mockb, dan mockc) dan tiga jalur (s1, s2, dan s3) digunakan untuk mensimulasikan jejak. Jalur s1 adalah jalur dasar yang mencakup semua tiga layanan versi v1. Jalur s2 hanya mencakup mocka dan mockc versi v2, sedangkan jalur s3 hanya mencakup mockb versi v3. Pertama, gunakan kemampuan auto-instrumentasi OpenTelemetry untuk mengaktifkan pod layanan agar melewati header baggage. Kemudian, buat tiga jalur dalam mode permissif dan konfigurasikan bobot pengalihan lalu lintas untuk mengarahkan lalu lintas sesuai rasio tertentu.

Langkah 1: Menyebarkan layanan sampel

  1. Aktifkan injeksi proxy sidecar otomatis untuk namespace default. Untuk informasi lebih lanjut, lihat Kelola namespace global.

    Catatan

    Untuk informasi lebih lanjut tentang injeksi proxy sidecar otomatis, lihat Aktifkan injeksi proxy sidecar otomatis.

  2. Buat file mock.yaml dengan konten berikut:

    Tampilkan file mock.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mocka
      labels:
        app: mocka
        service: mocka
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mocka
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v1
      labels:
        app: mocka
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mocka
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockb
      labels:
        app: mockb
        service: mockb
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockb
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v1
      labels:
        app: mockb
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockb
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockc
      labels:
        app: mockc
        service: mockc
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockc
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v1
      labels:
        app: mockc
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockc
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v2
      labels:
        app: mocka
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mocka
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v2
      labels:
        app: mockb
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockb
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v2
      labels:
        app: mockc
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockc
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v3
      labels:
        app: mocka
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mocka
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v3
      labels:
        app: mockb
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockb
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v3
      labels:
        app: mockc
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockc
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockc
            ports:
            - containerPort: 8000

    Anotasi instrumentation.opentelemetry.io/inject-java: "true" dan instrumentation.opentelemetry.io/container-names: "default" ditambahkan ke setiap pod layanan untuk mendeklarasikan bahwa layanan yang sesuai diimplementasikan dalam Java, dan Operator OpenTelemetry diperlukan untuk menginstrumen otomatis kontainer bernama default.

  3. Jalankan perintah berikut untuk menyebarkan layanan:

    kubectl apply -f mock.yaml

    Berdasarkan mekanisme auto-instrumen OpenTelemetry, pod layanan dapat secara otomatis melewati header baggage dalam jejak.

Langkah 2: Buat grup jalur dan jalur yang sesuai

  1. Buat grup jalur.

    1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > Traffic Lane.

    3. Di halaman Traffic Lane, klik Create Swimlane Group. Di panel Create Swimlane Group, konfigurasikan parameter yang diperlukan dan klik OK.

      Parameter

      Deskripsi

      Name of swim lane group

      Untuk contoh ini, masukkan test.

      Istio gateway for an ingress gateway

      Pilih ingressgateway.

      Lane Mode

      Pilih Permissive Mode.

      Pass-through Mode of Trace Context

      Pilih Pass Through Baggage Header.

      Routing Request Header

      Masukkan x-asm-prefer-tag.

      Swimlane Services

      Pilih kluster tempat layanan mocka, mockb, dan mockc berada dari daftar drop-down Kluster Kubernetes dan default dari daftar drop-down Namespace. Pilih layanan mocka, mockb, dan mockc dalam daftar, dan klik ikon image.png untuk menambahkan layanan ini ke bagian selected.

  2. Buat jalur bernama s1, s2, dan s3. Ikat jalur s1 ke versi v1 layanan sampel, jalur s2 ke versi v2 layanan sampel, dan jalur s3 ke versi v3 layanan sampel.

    1. Di bagian Traffic Rule Definition halaman Traffic Lane, klik Create swimlanes.

    2. Di kotak dialog Create swimlanes, konfigurasikan parameter yang diperlukan dan klik OK.

    Parameter

    Deskripsi

    Swimlane Name

    Beri nama tiga jalur sebagai s1, s2, dan s3 masing-masing.

    Configure Service Tag

    Label Key: Setel ke ASM_TRAFFIC_TAG.

    Label Value: Setel ke v1 untuk jalur s1, v2 untuk jalur s2, dan v3 untuk jalur s3.

    Add Service

    • Untuk jalur s1, pilih mocka(default), mockb(default), dan mockc(default).

    • Untuk jalur s2, pilih mocka(default) dan mockc(default).

    • Untuk jalur s3, pilih mockb(default).

    Gambar berikut menunjukkan konfigurasi jalur s1.

    image

    Setelah ketiga jalur dibuat, Anda dapat melihatnya di bagian Definisi Aturan Lalu Lintas, seperti yang ditunjukkan pada gambar berikut.

    image

    Secara default, jalur pertama yang Anda buat dalam grup jalur diatur sebagai jalur dasar. Namun, Anda dapat mengubah jalur dasar. Ketika lalu lintas ditujukan untuk layanan yang tidak ada di jalur lain, permintaan diteruskan ke jalur dasar sesuai dengan mekanisme fallback. Untuk informasi lebih lanjut tentang cara mengubah jalur dasar, lihat Ubah jalur dasar dalam mode permissif.

    Di panel navigasi kiri Konsol ASM, pilih Traffic Management Center > DestinationRule atau VirtualService untuk melihat destination rule atau virtual service yang dihasilkan secara otomatis untuk setiap layanan dalam grup jalur. Sebagai contoh, destination rule dan virtual service berikut dibuat secara otomatis untuk layanan mocka.

    Tampilkan destination rule dan virtual service yang dibuat secara otomatis untuk layanan mocka

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-dr-test-default-mocka
      namespace: istio-system
    spec:
      host: mocka.default.svc.cluster.local
      subsets:
        - labels:
            ASM_TRAFFIC_TAG: v1
          name: s1
        - labels:
            ASM_TRAFFIC_TAG: v2
          name: s2
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-vs-test-default-mocka
      namespace: istio-system
    spec:
      hosts:
        - mocka.default.svc.cluster.local
      http:
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s1
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s1
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s2
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s2
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s3
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s3
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
  3. Buat aturan pengalihan lalu lintas berbasis bobot yang seragam.

    1. Di bagian Definisi Aturan Lalu Lintas halaman Jalur Lalu Lintas, klik Pengalihan Berbasis Bobot di bagian Aturan Pengalihan Lalu Lintas.

    2. Di kotak dialog Setel Aturan Pengalihan Seragam, konfigurasikan parameter yang diperlukan dan klik OK. Contoh berikut mengasumsikan bahwa jalur permintaan masuk dari semua layanan di jalur adalah /mock, dan aturan pengalihan lalu lintas yang sama dikonfigurasikan untuk setiap jalur.

      Parameter

      Deskripsi

      realm name

      Setel ke *.

      Matching request URI

      Setel parameter Method ke Prefix dan parameter Content ke /.

      Gambar berikut menunjukkan contoh konfigurasi aturan pengalihan lalu lintas seragam:

      image

  4. Setel bobot pengalihan lalu lintas untuk ketiga jalur. Bobot menentukan proporsi lalu lintas yang dikirim ke setiap jalur.

    1. Di bagian Traffic Rule Definition halaman Traffic Lane, klik tombol image.png di sebelah nomor di kolom Traffic Routing Weight. Di kotak dialog Edit Traffic Routing Weight, konfigurasikan parameter yang diperlukan dan klik OK.

      Parameter

      Deskripsi

      Ingress service

      Setel ke mocka.default.svc.cluster.local untuk ketiga jalur.

      Weight Value

      • Untuk jalur s1, setel nilainya menjadi 60.

      • Untuk jalur s2, setel nilainya menjadi 20.

      • Untuk jalur s3, setel nilainya menjadi 20.

      Gambar berikut menunjukkan contoh konfigurasi bobot pengalihan lalu lintas.

      image

Langkah 3: Verifikasi bahwa fitur rilis canary ujung-ke-ujung berfungsi

  1. Dapatkan alamat IP publik dari gateway ingress. Untuk informasi lebih lanjut, lihat Langkah 2: Dapatkan alamat IP gateway ingress ASM.

  2. Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan. xxx.xxx.xxx.xxx adalah alamat IP yang diperoleh pada langkah sebelumnya.

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. Verifikasi bahwa fitur rilis canary ujung-ke-ujung berfungsi.

    1. Jalankan perintah berikut untuk melihat pemanggilan layanan di ketiga jalur:

      for i in {1..100};  do curl http://${ASM_GATEWAY_IP}/ ;  echo ''; sleep 1; done;

      Keluaran yang diharapkan:

      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)

      Keluaran tersebut menunjukkan bahwa lalu lintas dikirim ke jalur s1, s2, dan s3 dengan rasio sekitar 6:2:2, dan s1 digunakan sebagai jalur dasar. Jika versi tertentu dari layanan tidak ada dalam jejak, layanan yang sesuai di jalur s1 dipanggil.