入门

在不到 5 分钟内为您的应用获取遥测数据!

此页面将向您展示如何在 Swift 中开始使用 OpenTelemetry。

您将了解到如何对一个简单的应用程序进行插装,以便 跟踪 (traces) 能输出到控制台。

先决条件

请确保您已在本地安装以下软件

示例应用程序

以下示例使用了一个基础的 Vapor 应用程序。如果您不使用 Vapor,没关系 — 您可以和任何 Swift 应用程序一起使用 OpenTelemetry Swift,无论它们是运行在服务器还是 iOS 设备上。

更多示例,请参阅 示例

依赖项

首先,在一个新目录中创建一个名为 Package.swift 的文件,并包含以下内容

// swift-tools-version:5.9
import PackageDescription

let package = Package(
    name: "dice-server",
    platforms: [
       .macOS(.v13)
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "4.83.1")
    ],
    targets: [
        .executableTarget(
            name: "DiceApp",
            dependencies: [
                .product(name: "Vapor", package: "vapor")
            ],
            path: "."
        )
    ]
)

创建并启动 HTTP 服务器

在同一个文件夹中,创建一个名为 main.swift 的文件,并将以下代码添加到该文件

import Vapor

@main
enum Entrypoint {
    static func main() async throws {
        let app = try Application(.detect())
        defer { app.shutdown() }
        app.get("rolldice") { req in
            let result = Int.random(in: 1..<7)
            return result
        }
        try app.run()
    }
}

使用以下命令构建并运行应用程序,然后在 Web 浏览器中打开 https://:8080/rolldice 以确保其正常工作。

$ swift run
Building for debugging...
Build complete! (0.31s)
2023-10-04T17:16:13+0200 notice codes.vapor.application : [Vapor] Server starting on http://127.0.0.1:8080

仪表

要将 OpenTelemetry 添加到您的应用程序中,请使用以下附加依赖项更新 Package.swift

// swift-tools-version:5.9
import PackageDescription


let package = Package(
    name: "dice-server",
    platforms: [
       .macOS(.v13)
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "4.83.1"),
        .package(url: "https://github.com/open-telemetry/opentelemetry-swift", from: "1.0.0"),
    ],
    targets: [
        .executableTarget(
            name: "DiceApp",
            dependencies: [
                .product(name: "Vapor", package: "vapor"),
                .product(name: "OpenTelemetryApi", package: "opentelemetry-swift"),
                .product(name: "OpenTelemetrySdk", package: "opentelemetry-swift"),
                .product(name: "StdoutExporter", package: "opentelemetry-swift"),
                .product(name: "ResourceExtension", package: "opentelemetry-swift"),
            ],
            path: "."
        )
    ]
)

更新 main.swift 文件,添加代码来初始化一个跟踪器,并在调用 rolldice 请求处理程序时发出 span

import Vapor
import OpenTelemetryApi
import OpenTelemetrySdk
import StdoutExporter
import ResourceExtension

@main
enum Entrypoint {
    static func main() async throws {

        let spanExporter = StdoutExporter();
        let spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter)
        let resources = DefaultResources().get()

        let instrumentationScopeName = "DiceServer"
        let instrumentationScopeVersion = "semver:0.1.0"

        OpenTelemetry.registerTracerProvider(tracerProvider:
            TracerProviderBuilder()
                .add(spanProcessor: spanProcessor)
                .with(resource: resources)
                .build()
        )
        let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: instrumentationScopeName, instrumentationVersion: instrumentationScopeVersion) as! TracerSdk


        let app = try Application(.detect())
        defer { app.shutdown() }

        app.get("rolldice") { req in
            let span = tracer.spanBuilder(spanName: "GET /rolldice").setSpanKind(spanKind: .client).startSpan()
            let result = Int.random(in: 1..<7)
            span.end();
            return result
        }

        try app.run()
    }
}

重新启动您的服务器

swift run

当您向服务器的 https://:8080/rolldice 发送请求时,您会看到一个 span 被输出到控制台(为了方便阅读,输出已进行格式化)

{
  "attributes": {},
  "duration": 2.70605087280273e-5,
  "parentSpanId": "0000000000000000",
  "span": "GET /rolldice",
  "spanId": "635455eb236a1592",
  "spanKind": "client",
  "start": 718126321.210727,
  "traceFlags": {
    "sampled": true
  },
  "traceId": "c751f7af0586dac8ef3607c6fc128884",
  "traceState": {
    "entries": []
  }
}

下一步

通过 手动插装 您自己的代码,丰富您的自动生成的插装。这将为您提供定制化的可观测数据。

查看可用的 插装库,它们可以为流行的框架和库生成遥测数据。