Após instrumentar sua aplicação com o OpenTelemetry e relatar dados ao Managed Service for OpenTelemetry, o service inicia o monitoramento da sua aplicação. É possível visualizar uma ampla variedade de dados de monitoramento, incluindo topologia da aplicação, traces, exceções, transações lentas e análise de SQL. Este tópico demonstra como usar o OpenTelemetry para instrumentar uma aplicação Swift e relatar seus dados.
Pré-requisitos
Demonstração
Este tópico demonstra como usar o OpenTelemetry para relatar dados de uma aplicação de linha de comando macOS escrita em Swift. Este método também se aplica a aplicações iOS.
Repositório de código de exemplo: opentelemetry-swift-demo
Etapa 1: Criar uma aplicação e adicionar dependências
Crie uma aplicação macOS Command Line Tool no Xcode.
-
No Xcode, selecione , insira
https://github.com/open-telemetry/opentelemetry-swiftna caixa de pesquisa e selecione a versão 1.4.1.NotaPara mais informações sobre versões, consulte opentelemetry-swift releases.
Acesse File > Add Packages. Na barra de pesquisa, insira
https://github.com/open-telemetry/opentelemetry-swifte selecione o pacote opentelemetry-swift. Defina a Dependency Rule como Exact Version, insira1.4.1como versão, selecione seu projeto no menu Add to Project e clique em Add Package. -
Selecione os produtos do pacote necessários.
Os produtos do pacote necessários para esta demonstração incluem OpenTelemetryApi, OpenTelemetryProtocolExporter, OpenTelemetrySdk, ResourceExtension, StdoutExporter e URLSessionInstrumentation.
Etapa 2: Inicializar o OpenTelemetry
-
Crie um exporter para enviar dados de telemetria.
Escolha um dos três métodos a seguir para relatar dados de trace.
-
Método 1: Relatar dados de trace via gRPC
Substitua
<YOUR_GRPC_ENDPOINT>e<YOUR_GRPC_PORT>pelas informações de endpoint da seção Pré-requisitos. Exemplo:host: "tracing-analysis-dc-hz.aliyuncs.com", port: 8090.Substitua
<YOUR_AUTHENTICATION_TOKEN>pelo token de autenticação obtido na seção Pré-requisitos.
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: Relatar dados de trace via HTTP
Substitua
<YOUR_HTTP_ENDPOINT>pela URL do endpoint obtida na seção Pré-requisitos. Exemplo: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 dados de trace no console
let consoleTraceExporter = StdoutExporter(isDebug: true)
-
-
Obtenha um tracer para criar spans.
Substitua
<YOUR_SERVICE_NAME>pelo nome da sua aplicação e<YOUR_HOSTNAME>pelo seu hostname.-
Substitua
<trace-exporter>de acordo com o método escolhido na etapa anterior.Método 1: Substitua
<trace-exporter>porotlpGrpcTraceExporter.Método 2: Substitua
<trace-exporter>porotlpHttpTraceExporter.Método 3: Substitua
<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")
Etapa 3: Criar spans para rastrear dados de trace
-
Crie um span, adicione um atributo e um evento e imprima seu trace ID.
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() -
Crie um span aninhado.
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 a aplicação.
Faça login no console do ARMS. No painel de navegação à esquerda, escolha . Na página Applications, clique no nome da aplicação. Na página exibida, visualize os dados de trace.
NotaSe o ícone
for exibido na coluna Language, a aplicação está conectada ao Application Monitoring. Se um hífen (-) for exibido, a aplicação está conectada ao Managed Service for OpenTelemetry.
Etapa 4: Conectar os traces de cliente e servidor
-
Modifique o formato de propagação de contexto de trace nos cabeçalhos da requisição.
Protocolos diferentes utilizam cabeçalhos HTTP distintos para propagar o contexto de trace para services downstream. Por exemplo, o OpenTelemetry usa o formato W3C Trace Context por padrão, mas também suporta outros formatos, enquanto o Zipkin utiliza o formato B3 ou B3 Multi. Para mais informações, consulte Configurar formatos de propagação de contexto de trace para OpenTelemetry.
-
Para conectar traces de cliente e servidor, defina o formato de propagação (
textPropagatorsebaggagePropagator) no cliente para corresponder ao protocolo do servidor:Se o servidor utilizar o formato padrão OpenTelemetry W3C Trace Context, não é necessário definir
textPropagatorsebaggagePropagatorno cliente.-
Se o servidor utilizar o formato Zipkin B3 ou B3 Multi, defina
textPropagatorscomoB3PropagatorebaggagePropagatorcomoZipkinBaggagePropagatorno cliente.// Set the B3 propagation format. OpenTelemetry.registerPropagators(textPropagators: [B3Propagator()], baggagePropagator: ZipkinBaggagePropagator()) -
Se o servidor utilizar o protocolo Jaeger, defina
textPropagatorscomoJaegerPropagatorebaggagePropagatorcomoJaegerBaggagePropagatorno cliente.// Set the Jaeger propagation format. OpenTelemetry.registerPropagators(textPropagators: [JaegerPropagator()], baggagePropagator: JaegerBaggagePropagator()) -
Também é possível definir múltiplos formatos de propagação de trace simultaneamente.
// Use the W3C Trace Context, B3, and Jaeger formats at the same time. OpenTelemetry.registerPropagators(textPropagators: [W3CTraceContextPropagator(), B3Propagator(), JaegerPropagator()], baggagePropagator: W3CBaggagePropagator())
-
Importe
URLSessionInstrumentation.O
URLSessionInstrumentationé um plug-in que intercepta automaticamente requisições de redeURLSessionpara criar traces.import URLSessionInstrumentation ... let networkInstrumentation = URLSessionInstrumentation(configuration: URLSessionInstrumentationConfiguration()) -
Utilize
URLSessionpara enviar uma requisição de rede ao 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 a aplicação e visualize o trace conectado entre cliente e servidor na página Trace Explorer.
No trace,
HTTP GETrepresenta a aplicação iOS ezipkin-demo-serverrepresenta a aplicação servidora.Atributos da requisição como
http.method=GET,http.status_code=200ehttp.url=http://localhost:8081/zipkin/serveraparecem na seção Additional Information > Attributes do span.
