在使用可观测链路 OpenTelemetry 版控制台追踪应用的链路数据之前,需要将应用数据上报至可观测链路 OpenTelemetry 版。本文介绍如何为Swift应用埋点并上报链路数据。
前提条件
获取接入点信息
- 登录可观测链路 OpenTelemetry 版控制台。
- 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。
- 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。
- 在客户端采集工具区域单击OpenTelemetry。
在下方表格的相关信息列中,获取接入点信息。说明 如果应用部署于阿里云生产环境,则选择阿里云VPC网络接入点,否则选择公网接入点。
示例Demo
本文将通过具体示例介绍如何通过OpenTelemetry上报Swift语言编写的macOS命令行应用数据,该方法同样适用于iOS应用。
示例代码仓库地址:opentelemetry-swift-demo
步骤一:创建应用并添加依赖
- 选择要创建的应用,例如macOS的Command Line Tool。
- 在XCode中选择
https://github.com/open-telemetry/opentelemetry-swift
,选择1.4.1版本。 ,然后在搜索框中输入说明 更多版本信息,请参考opentelemetry-swift releases信息。 - 选中所需的Package Products。本文中使用到的Package Products如下:
步骤二:OpenTelemetry初始化
- 创建用于导出观测数据的组件。从以下3种方法中选择1种上报Trace数据。
- 方法一:通过gRPC协议上报Trace数据
- 请分别将
<gRPC-endpoint>
和<gRPC-port>
替换为从前提条件中获取的接入点信息,例如:host: "http://tracing-analysis-dc-hz.aliyuncs.com", port:8090
。 - 请将
<your-token>
替换为从前提条件中获取的鉴权Token。
let grpcChannel = ClientConnection.usingPlatformAppropriateTLS(for: MultiThreadedEventLoopGroup(numberOfThreads:1)) .connect(host: "<gRPC-endpoint>", port:<gRPC-port>) let otlpGrpcConfiguration = OtlpConfiguration( timeout: OtlpConfiguration.DefaultTimeoutInterval, headers: [ ("Authentication","<your-token>") ] ) let otlpGrpcTraceExporter = OtlpTraceExporter(channel: grpcChannel, config: otlpGrpcConfiguration)
- 请分别将
- 方法二:通过HTTP协议上报Trace数据
请将
<HTTP-endpoint>
替换为从前提条件中获取的接入点信息,例如:http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxx@xxxx_xxxx@xxxx/api/otlp/traces
。let url = URL(string: "<HTTP-endpoint>") let otlpHttpTraceExporter = OtlpHttpTraceExporter(endpoint: url!)
- 方法三:在命令行输出Trace数据
let consoleTraceExporter = StdoutExporter(isDebug: true)
- 方法一:通过gRPC协议上报Trace数据
- 获取用于创建Span的Tracer。
- 请将
<your-service-name>
替换为要上报的应用名,<your-host-name>
替换为主机名。 - 替换
<trace-exporter>
,根据步骤1上报Trace方法不同替换为不同值。- 方式一:
<trace-exporter>
替换为otlpGrpcTraceExporter
。 - 方式二:
<trace-exporter>
替换为otlpHttpTraceExporter
。 - 方式三:
<trace-exporter>
替换为consoleTraceExporter
。
- 方式一:
// 设置应用名与主机名 let resource = Resource(attributes: [ ResourceAttributes.serviceName.rawValue: AttributeValue.string("<your-service-name>"), ResourceAttributes.hostName.rawValue: AttributeValue.string("<your-host-name>") ]) // 配置TracerProvider OpenTelemetry.registerTracerProvider(tracerProvider: TracerProviderBuilder() .add(spanProcessor: BatchSpanProcessor(spanExporter: <trace-exporter>)) // 上报至可观测链路 OpenTelemetry 版 .with(resource: resource) .build()) // 获取tracer,用来创建Span let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "instrumentation-library-name", instrumentationVersion: "1.0.0")
- 请将
步骤三:创建Span追踪链路数据
- 创建Span,为Span添加属性(Attribute)和事件(Event),并输出当前Span的TraceId。
let span = tracer.spanBuilder(spanName: "first span").startSpan() // 设置属性 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... // 设置Event span.addEvent(name: "computation complete", attributes: attributes) // 打印TraceId print(span.context.traceId.hexString) // your code... // 结束当前span span.end()
- 创建嵌套的Span。
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()
- 启动应用。
在可观测链路 OpenTelemetry 版控制台的应用列表页面选择目标应用,查看链路数据。