全部产品
Search
文档中心

Managed Service for OpenTelemetry:Gunakan Managed Service for OpenTelemetry untuk melaporkan data aplikasi Swift

更新时间:Jul 02, 2025

Setelah menggunakan Alibaba Cloud Managed Service for OpenTelemetry untuk menginstrumentasi aplikasi dan melaporkan data jejak ke Managed Service for OpenTelemetry, aplikasi mulai dipantau. Anda dapat melihat data pemantauan seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan Managed Service for OpenTelemetry untuk menginstrumentasi aplikasi Swift dan melaporkan data jejak.

Sebelum memulai

Untuk mendapatkan titik akhir Managed Service for OpenTelemetry, ikuti langkah-langkah berikut:

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di bilah navigasi sisi kiri, klik Cluster Configurations. Di halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client menjadi OpenTelemetry.

    Dapatkan titik akhir Managed Service for OpenTelemetry dari kolom Related Information pada tabel di bagian bawah.OT接入点信息

    Catatan

    Jika aplikasi Anda diterapkan di lingkungan produksi Alibaba Cloud, gunakan titik akhir Virtual Private Cloud (VPC). Jika tidak, gunakan titik akhir publik.

Kode contoh

Pada contoh ini, Managed Service for OpenTelemetry digunakan untuk melaporkan data jejak aplikasi baris perintah macOS yang ditulis dalam Swift. Metode yang digunakan juga berlaku untuk aplikasi iOS.

Unduh kode contoh dari opentelemetry-swift-demo.

Langkah 1: Buat aplikasi dan tambahkan dependensi

  1. Pilih jenis aplikasi yang ingin dibuat. Sebagai contoh, pilih macOS > Alat Baris Perintah.

    Command Line Tool

  2. Di XCode, pilih File > Add Packages..., masukkan https://github.com/open-telemetry/opentelemetry-swift di kotak pencarian, lalu pilih versi 1.4.1.

    Catatan

    Untuk informasi lebih lanjut tentang versi, kunjungi halaman opentelemetry-swift di GitHub.

    opentelemetry-swift

  3. Pilih paket yang diperlukan.

    Gambar berikut menunjukkan paket yang digunakan dalam contoh ini.Package Products

Langkah 2: Inisialisasi OpenTelemetry

  1. Buat ekspor untuk mengekspor data pemantauan.

    Pilih salah satu metode berikut untuk melaporkan data jejak:

    • Metode 1: Laporkan data jejak menggunakan protokol gRPC

      • Ganti <gRPC-endpoint> dan <gRPC-port> dengan titik akhir dan nomor port yang diperoleh di bagian "Sebelum Memulai". Dalam contoh ini, host: "http://tracing-analysis-dc-hz.aliyuncs.com", port:8090 digunakan.

      • Ganti <your-token> dengan token otentikasi yang diperoleh di bagian "Sebelum Memulai".

      let grpcChannel = ClientConnection(
          configuration: ClientConnection.Configuration.default(
              target: .hostAndPort("<gRPC-endpoint>", 8090), // Tentukan titik akhir yang tidak mengandung awalan http://. Dalam contoh ini, tracing-analysis-dc-hz.aliyuncs.com digunakan.
              eventLoopGroup: MultiThreadedEventLoopGroup(numberOfThreads: 1)
          )
      )
      
      let otlpGrpcConfiguration = OtlpConfiguration(
          timeout: OtlpConfiguration.DefaultTimeoutInterval,
          headers: [
              ("Authentication","xxxxxx")
          ]
      
      )
      let otlpGrpcTraceExporter = OtlpTraceExporter(channel: grpcChannel, config: otlpGrpcConfiguration)
    • Metode 2: Laporkan data jejak menggunakan protokol HTTP

      Ganti <HTTP-endpoint> dengan titik akhir yang diperoleh di bagian "Sebelum Memulai". Dalam contoh ini, http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxx@xxxx_xxxx@xxxx/api/otlp/traces digunakan.

      let url = URL(string: "<HTTP-endpoint>")
      let otlpHttpTraceExporter = OtlpHttpTraceExporter(endpoint: url!)
    • Metode 3: Dapatkan data jejak di baris perintah

      let consoleTraceExporter = StdoutExporter(isDebug: true)
  2. Dapatkan tracer yang digunakan untuk membuat rentang.

    • Ganti <your-service-name> dengan nama aplikasi yang datanya ingin dilaporkan, dan <your-host-name> dengan nama host.

    • Ganti <trace-exporter> dengan nilai berbeda berdasarkan metode yang digunakan untuk melaporkan data jejak di Langkah 1.

      • Metode 1: Ganti <trace-exporter> dengan otlpGrpcTraceExporter.

      • Metode 2: Ganti <trace-exporter> dengan otlpHttpTraceExporter.

      • Metode 3: Ganti <trace-exporter> dengan consoleTraceExporter.

    // Tentukan nama aplikasi dan nama host.
    let resource = Resource(attributes: [
        ResourceAttributes.serviceName.rawValue: AttributeValue.string("<your-service-name>"),
        ResourceAttributes.hostName.rawValue: AttributeValue.string("<your-host-name>")
    ])
    
    // Konfigurasikan TracerProvider.
    OpenTelemetry.registerTracerProvider(tracerProvider: TracerProviderBuilder()
                                         .add(spanProcessor: BatchSpanProcessor(spanExporter: <trace-exporter>)) // Laporkan data ke Managed Service for OpenTelemetry.
                                         .with(resource: resource)
                                         .build())
    
    // Dapatkan tracer yang digunakan untuk membuat rentang.
    let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "instrumentation-library-name", instrumentationVersion: "1.0.0")

Langkah 3: Buat rentang untuk melacak data jejak

  1. Buat rentang, konfigurasikan atribut dan acara untuk rentang tersebut, lalu dapatkan ID jejak dari rentang tersebut.

    let span = tracer.spanBuilder(spanName: "rentang pertama").startSpan()
    // Konfigurasikan atribut.
    span.setAttribute(key: "http.method", value: "GET")
    span.setAttribute(key: "http.url", value: "www.aliyun.com")
    let attributes = [
        "key": AttributeValue.string("value"),
        "result": AttributeValue.int(100)
    ]
    
    // kode Anda...
    
    // Konfigurasikan acara.
    span.addEvent(name: "perhitungan selesai", attributes: attributes)
    
    // Tampilkan ID jejak.
    print(span.context.traceId.hexString)
    
    // kode Anda...
    
    // Akhiri rentang saat ini.
    span.end()
  2. Buat rentang bersarang.

    let parentSpan = tracer.spanBuilder(spanName: "rentang induk").startSpan()
    
    // kode Anda...
    
    let childSpan = tracer.spanBuilder(spanName: "rentang anak").setParent(parentSpan).startSpan()
    
    // kode Anda...
    
    childSpan.end()
    
    // kode Anda...
    
    parentSpan.end()
  3. Mulai aplikasi.

    Di halaman Applications dari Konsol Managed Service for OpenTelemetry, klik nama aplikasi. Di halaman yang muncul, lihat data jejak.

Langkah 4: Hubungkan aplikasi klien dan aplikasi server

  1. Ubah format untuk melewati data jejak di header permintaan HTTP.

    • Protokol yang berbeda menggunakan header permintaan HTTP yang berbeda untuk melewati konteks jejak. Sebagai contoh, OpenTelemetry secara default menggunakan format W3C Trace Context dan mendukung format lainnya, sedangkan Zipkin menggunakan format B3 atau B3 Multi. Untuk informasi lebih lanjut, lihat Tentukan Format untuk Melewati Data Jejak.

    • Atur format untuk melewati data jejak untuk aplikasi klien berdasarkan protokol yang digunakan oleh aplikasi server. Dengan cara ini, aplikasi klien iOS dan aplikasi server dapat dihubungkan.

      • Jika aplikasi server menggunakan format W3C Trace Context dari OpenTelemetry, Anda tidak perlu menentukan parameter textPropagators dan baggagePropagator untuk aplikasi klien.

      • Jika aplikasi server menggunakan format B3 atau B3 Multi dari Zipkin, atur parameter textPropagators menjadi B3Propagator dan parameter baggagePropagator menjadi ZipkinBaggagePropagator untuk aplikasi klien.

        // Tentukan format B3 untuk melewati data jejak. 
        OpenTelemetry.registerPropagators(textPropagators: [B3Propagator()],
                                          baggagePropagator: ZipkinBaggagePropagator())
      • Jika aplikasi server menggunakan protokol Jaeger, atur parameter textPropagators menjadi JaegerPropagator dan parameter baggagePropagator menjadi JaegerBaggagePropagator untuk aplikasi klien.

        // Tentukan format Jaeger untuk melewati data jejak. 
        OpenTelemetry.registerPropagators(textPropagators: [JaegerPropagator()],
                                          baggagePropagator: JaegerBaggagePropagator())
      • Anda juga dapat menentukan beberapa format untuk melewati data jejak.

        // Tentukan format W3C Trace Context, B3, dan Jaeger untuk melewati data jejak. 
        OpenTelemetry.registerPropagators(textPropagators: [W3CTraceContextPropagator(), 
                                                            B3Propagator(), 
                                                            JaegerPropagator()],
                                          baggagePropagator: W3CBaggagePropagator())
  2. Impor plug-in URLSessionInstrumentation.

    URLSessionInstrumentation adalah plug-in instrumentasi otomatis yang disediakan oleh OpenTelemetry untuk kelas URLSession. Ini secara otomatis mencegat semua permintaan jaringan yang dikirim dari kelas URLSession dan membuat jejak.

    import URLSessionInstrumentation
    
    ...
    let networkInstrumentation = URLSessionInstrumentation(configuration: URLSessionInstrumentationConfiguration())
  3. Gunakan kelas URLSession untuk mengirim permintaan guna mengakses aplikasi server.

    let url = URL(string: "<Alamat Server>")!
    let request = URLRequest(url: url)
    let semaphore = DispatchSemaphore(value: 0)
    
    let task = URLSession.shared.dataTask(with: request) { data, _, _ in
        if let data = data {
            let string = String(decoding: data, as: UTF8.self)
            print(string)
        }
        semaphore.signal()
    }
    task.resume()
    
    semaphore.wait()

    Lihat Kode Contoh Lengkap

    OpenTelemetryUtil.swift

    import Foundation
    
    import GRPC
    import NIO
    import OpenTelemetryApi
    import OpenTelemetrySdk
    import OpenTelemetryProtocolExporter
    import StdoutExporter
    
    class OpenTelemetryUtil {
        
        private static let tracerProvider: TracerProvider = {
            // Laporkan data jejak menggunakan protokol gRPC.
            let grpcChannel = ClientConnection(
                configuration: ClientConnection.Configuration.default(
                    target: .hostAndPort("tracing-analysis-dc-hz.aliyuncs.com", 8090),
                    eventLoopGroup: MultiThreadedEventLoopGroup(numberOfThreads: 1)
                )
            )
            
    
            let otlpGrpcConfiguration = OtlpConfiguration(
                timeout: OtlpConfiguration.DefaultTimeoutInterval,
                headers: [
                    ("Authentication","${Token Otentikasi}")
                ]
    
            )
            let otlpGrpcTraceExporter = OtlpTraceExporter(channel: grpcChannel, config: otlpGrpcConfiguration)
            let consoleTraceExporter = StdoutExporter(isDebug: true)
            
            // Tentukan nama aplikasi dan nama host.
            let resource = Resource(attributes: [
                ResourceAttributes.serviceName.rawValue: AttributeValue.string("otel-swift-demo-grpc"),
                ResourceAttributes.hostName.rawValue: AttributeValue.string("adam.mac")
            ])
    
            let tracerProvider = TracerProviderBuilder()
                .add(spanProcessor: BatchSpanProcessor(spanExporter: otlpGrpcTraceExporter))
    //            .add(spanProcessor: BatchSpanProcessor(spanExporter: consoleTraceExporter)) // Tampilkan data jejak di konsol, yang digunakan untuk debugging.
                .with(resource: resource)
                .build()
            
            
            // Konfigurasikan TracerProvider.
            OpenTelemetry.registerTracerProvider(tracerProvider: tracerProvider)
            // Ubah format untuk melewati data jejak.
            OpenTelemetry.registerPropagators(textPropagators: [W3CTraceContextPropagator(),
                                                                B3Propagator(),
                                                                JaegerPropagator()],
                                              baggagePropagator: W3CBaggagePropagator())
            
            return tracerProvider
            
        }()
        
        
        // Dapatkan tracer yang digunakan untuk membuat rentang.
        static func getTracer(name: String, version: String) -> Tracer {
            return tracerProvider.get(instrumentationName: name, instrumentationVersion: version)
        }
    
    }
    

    main.swift

    import Foundation
    
    
    import OpenTelemetryApi
    import OpenTelemetrySdk
    // Lakukan instrumentasi otomatis pada permintaan jaringan.
    import URLSessionInstrumentation
    
    let tracer = OpenTelemetryUtil.getTracer(name: "ios-demo", version: "1.0.0")
    
    // Buat rentang bersarang.
    let parentSpan = tracer.spanBuilder(spanName: "rentang induk").startSpan()
    
    let childSpan = tracer.spanBuilder(spanName: "rentang anak").setParent(parentSpan).startSpan()
    
    // Konfigurasikan atribut.
    childSpan.setAttribute(key: "http.method", value: "GET")
    childSpan.setAttribute(key: "http.url", value: "www.aliyun.com")
    let attributes = [
        "stringKey": AttributeValue.string("value"),
        "intKey": AttributeValue.int(100)
    ]
    // Konfigurasikan acara.
    childSpan.addEvent(name: "acara", attributes: attributes)
    // Tampilkan ID jejak.
    print(childSpan.context.traceId.hexString)
    
    // Kirim permintaan jaringan untuk mengakses aplikasi server.
    let networkInstrumentation = URLSessionInstrumentation(configuration: URLSessionInstrumentationConfiguration())
    
    let url = URL(string: "${Alamat Server}")!
    let request = URLRequest(url: url)
    let semaphore = DispatchSemaphore(value: 0)
    
    let task = URLSession.shared.dataTask(with: request) { data, _, _ in
        if let data = data {
            let string = String(decoding: data, as: UTF8.self)
            print(string)
        }
        semaphore.signal()
    }
    task.resume()
    
    semaphore.wait()
    
    
    // Secara manual akhiri rentang yang dibuat.
    childSpan.end()
    parentSpan.end()
    
    sleep(60)
    
    print("akhir")
    
  4. Mulai aplikasi dan lihat jejak antara aplikasi klien dan aplikasi server di halaman Penjelajah Jejak.

    Gambar berikut menunjukkan sebuah contoh. Dalam contoh ini, HTTP GET adalah aplikasi iOS dan zipkin-demo-server adalah aplikasi server.

    image