Después de instrumentar su aplicación con OpenTelemetry y reportar los datos a Managed Service for OpenTelemetry, el servicio comienza el monitoreo de la aplicación. Puede consultar una amplia variedad de datos de monitoreo, como la topología de la aplicación, las trazas, las excepciones, las transacciones lentas y el análisis de SQL. En este tema se muestra cómo usar OpenTelemetry para instrumentar una aplicación Swift y reportar sus datos.
Requisitos previos
Demostración
En este tema se demuestra cómo usar OpenTelemetry para reportar datos desde una aplicación de línea de comandos de macOS escrita en Swift. Este método también aplica para aplicaciones de iOS.
Repositorio del código de ejemplo: opentelemetry-swift-demo
Paso 1: Crear una aplicación y agregar dependencias
Cree una aplicación macOS Command Line Tool en Xcode.
-
En Xcode, seleccione , introduzca
https://github.com/open-telemetry/opentelemetry-swiften el cuadro de búsqueda y seleccione la versión 1.4.1.NotaPara obtener más información sobre las versiones, consulte opentelemetry-swift releases.
Vaya a File > Add Packages. En la barra de búsqueda, introduzca
https://github.com/open-telemetry/opentelemetry-swifty seleccione el paquete opentelemetry-swift. Establezca Dependency Rule en Exact Version, introduzca1.4.1como versión, seleccione su proyecto en el menú Add to Project y haga clic en Add Package. -
Seleccione los productos del paquete obligatorios.
Los productos del paquete necesarios para esta demostración incluyen OpenTelemetryApi, OpenTelemetryProtocolExporter, OpenTelemetrySdk, ResourceExtension, StdoutExporter y URLSessionInstrumentation.
Paso 2: Inicializar OpenTelemetry
-
Cree un exportador para enviar los datos de telemetría.
Elija uno de los tres métodos siguientes para reportar los datos de trazas.
-
Método 1: reportar datos de trazas mediante gRPC
Reemplace
<YOUR_GRPC_ENDPOINT>y<YOUR_GRPC_PORT>con la información del endpoint de la sección de requisitos previos. Por ejemplo:host: "tracing-analysis-dc-hz.aliyuncs.com", port: 8090.Reemplace
<YOUR_AUTHENTICATION_TOKEN>con el token de autenticación de la sección de requisitos previos.
let grpcChannel = ClientConnection( configuration: ClientConnection.Configuration.default( target: .hostAndPort("<YOUR_GRPC_ENDPOINT>", <YOUR_GRPC_PORT>), // Example endpoint: tracing-analysis-dc-hz.aliyuncs.com. Do not include the "http://" prefix. eventLoopGroup: MultiThreadedEventLoopGroup(numberOfThreads: 1) ) ) let otlpGrpcConfiguration = OtlpConfiguration( timeout: OtlpConfiguration.DefaultTimeoutInterval, headers: [ ("Authentication","<YOUR_AUTHENTICATION_TOKEN>") ] ) let otlpGrpcTraceExporter = OtlpTraceExporter(channel: grpcChannel, config: otlpGrpcConfiguration) -
Método 2: reportar datos de trazas mediante HTTP
Reemplace
<YOUR_HTTP_ENDPOINT>con la URL del endpoint de la sección de requisitos previos. Por ejemplo:http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxx@xxxx_xxxx@xxxx/api/otlp/traces.let url = URL(string: "<YOUR_HTTP_ENDPOINT>") let otlpHttpTraceExporter = OtlpHttpTraceExporter(endpoint: url!) -
Método 3: imprimir los datos de trazas en la consola
let consoleTraceExporter = StdoutExporter(isDebug: true)
-
-
Obtenga un tracer para crear spans.
Reemplace
<YOUR_SERVICE_NAME>con el nombre de su aplicación y<YOUR_HOSTNAME>con su nombre de host.-
Reemplace
<trace-exporter>según el método que eligió en the previous step.Método 1: reemplace
<trace-exporter>porotlpGrpcTraceExporter.Método 2: reemplace
<trace-exporter>porotlpHttpTraceExporter.Método 3: reemplace
<trace-exporter>porconsoleTraceExporter.
// Set the application name and hostname. let resource = Resource(attributes: [ ResourceAttributes.serviceName.rawValue: AttributeValue.string("<YOUR_SERVICE_NAME>"), ResourceAttributes.hostName.rawValue: AttributeValue.string("<YOUR_HOSTNAME>") ]) // Configure the TracerProvider. OpenTelemetry.registerTracerProvider(tracerProvider: TracerProviderBuilder() .add(spanProcessor: BatchSpanProcessor(spanExporter: <trace-exporter>)) // Report to Managed Service for OpenTelemetry. .with(resource: resource) .build()) // Get a tracer to create spans. let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "instrumentation-library-name", instrumentationVersion: "1.0.0")
Paso 3: Crear spans para rastrear los datos de trazas
-
Cree un span, agregue un atributo y un evento, e imprima su ID de traza.
let span = tracer.spanBuilder(spanName: "first span").startSpan() // Set an attribute. 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) ] // your code... // Set an event. span.addEvent(name: "computation complete", attributes: attributes) // Print the TraceId. print(span.context.traceId.hexString) // your code... // End the current span. span.end() -
Cree un span anidado.
let parentSpan = tracer.spanBuilder(spanName: "parent span").startSpan() // your code... let childSpan = tracer.spanBuilder(spanName: "child span").setParent(parentSpan).startSpan() // your code... childSpan.end() // your code... parentSpan.end() -
Inicie la aplicación.
Inicie sesión en la consola de ARMS. En el panel de navegación izquierdo, seleccione . En la página Applications, haga clic en el nombre de la aplicación. En la página que aparece, consulte los datos de trazas.
NotaSi se muestra el ícono
en la columna Language, la aplicación está conectada a Application Monitoring. Si se muestra un guion (-), la aplicación está conectada a Managed Service for OpenTelemetry.
Paso 4: Conectar las trazas del cliente y del servidor
-
Modifique el formato de propagación del contexto de traza en los encabezados de la solicitud.
Los distintos protocolos usan diferentes encabezados HTTP para propagar el contexto de traza a los servicios posteriores. Por ejemplo, OpenTelemetry usa el formato W3C Trace Context de manera predeterminada, pero también admite otros formatos, mientras que Zipkin usa el formato B3 o B3 Multi. Para obtener más información, consulte Configure trace context propagation formats for OpenTelemetry.
-
Para conectar las trazas del cliente y del servidor, configure el formato de propagación (
textPropagatorsybaggagePropagator) en el cliente para que coincida con el protocolo del servidor:Si el servidor usa el formato W3C Trace Context predeterminado de OpenTelemetry, no es necesario configurar
textPropagatorsnibaggagePropagatoren el cliente.-
Si el servidor usa el formato B3 o B3 Multi de Zipkin, establezca
textPropagatorsenB3PropagatorybaggagePropagatorenZipkinBaggagePropagatordentro del cliente.// Set the B3 propagation format. OpenTelemetry.registerPropagators(textPropagators: [B3Propagator()], baggagePropagator: ZipkinBaggagePropagator()) -
Si el servidor usa el protocolo Jaeger, establezca
textPropagatorsenJaegerPropagatorybaggagePropagatorenJaegerBaggagePropagatordentro del cliente.// Set the Jaeger propagation format. OpenTelemetry.registerPropagators(textPropagators: [JaegerPropagator()], baggagePropagator: JaegerBaggagePropagator()) -
También puede configurar varios formatos de propagación de trazas de forma simultánea.
// Use the W3C Trace Context, B3, and Jaeger formats at the same time. OpenTelemetry.registerPropagators(textPropagators: [W3CTraceContextPropagator(), B3Propagator(), JaegerPropagator()], baggagePropagator: W3CBaggagePropagator())
-
Importe
URLSessionInstrumentation.URLSessionInstrumentationes un complemento que intercepta automáticamente las solicitudes de red deURLSessionpara crear trazas.import URLSessionInstrumentation ... let networkInstrumentation = URLSessionInstrumentation(configuration: URLSessionInstrumentationConfiguration()) -
Use
URLSessionpara enviar una solicitud de red al servidor.let url = URL(string: "<YOUR_SERVER_ADDRESS>")! 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() -
Inicie la aplicación y consulte la traza conectada entre el cliente y el servidor en la página Trace Explorer.
En la traza,
HTTP GETrepresenta la aplicación de iOS yzipkin-demo-serverrepresenta la aplicación del servidor.Los atributos de la solicitud, como
http.method=GET,http.status_code=200yhttp.url=http://localhost:8081/zipkin/server, aparecen en la sección Additional Information > Attributes del span.
