Swift Digest
Blog | Swift.org Blog

Swift System Metrics 1.0 の発表: プロセスレベルのモニタリング

Announcing Swift System Metrics 1.0: Process-Level Monitoring

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

何が発表されたのか

サービスを運用するうえで、プロセスがどれだけの CPU やメモリを使っているかといった指標を継続的に監視することは、性能問題の早期発見やリソース最適化、コスト効率の維持に役立ちます。とはいえ、こうしたメトリクスを自前で収集しようとすると、プラットフォームごとに異なる API を扱う必要があり、手間がかかります。

Swift System Metrics は、プロセスレベルのシステムメトリクスを収集して報告する Swift パッケージです。Linux と macOS をまたいで共通の API を提供するため、プラットフォームの違いを意識せずに可観測性を組み込めます。数行のコードで導入できるため、ごく小さなサービスでも初日から本番品質の可観測性を持てるようになります。

1.0 に到達したことで API が安定し、今後は後方互換性のある API を維持しながら進化していく方針です。なお、このパッケージは以前 swift-metrics-extras という名前で提供されていましたが、目的をより的確に表すために swift-system-metrics へ改名されました。

収集できるメトリクス

1.0 時点で、Swift System Metrics は次の指標を収集・報告します。

API が安定した公開インターフェースを持ち、Linux と macOS の両方をサポートし、musl libc とも互換性があります。収集したメトリクスをすぐに可視化できるよう、Grafana ダッシュボードの設定例も同梱されています。

何に使えるのか

導入はパッケージ依存の追加から始めます。Package.swift に依存を追加します。

.package(url: "https://github.com/apple/swift-system-metrics", from: "1.0.0")

ターゲットにライブラリ依存を追加します。

.product(name: "SystemMetrics", package: "swift-system-metrics")

あとは SystemMetricsMonitor を生成し、Swift Service Lifecycle の ServiceGroup に他のサービスと並べて登録するだけです。収集されたメトリクスは、別途設定したメトリクスバックエンド(次の例では swift-otel 経由で OpenTelemetry)へ報告されます。

import SystemMetrics
import ServiceLifecycle
import Logging
import OTel

@main
struct Application {
  static func main() async throws {
    // Create a logger, or use one of the existing loggers
    let logger = Logger(label: "Application")

    // Setup MetricsSystem, for example using swift-otel
    var otelConfig = OTel.Configuration.default
    otelConfig.serviceName = "Application"
    let otelService = try OTel.bootstrap(configuration: otelConfig)

    // Setup your service
    let service = FooService()

    // Create the monitor
    let systemMetricsMonitor = SystemMetricsMonitor(logger: logger)

    // Create the service
    let serviceGroup = ServiceGroup(
      services: [otelService, service, systemMetricsMonitor],
      gracefulShutdownSignals: [.sigint],
      cancellationSignals: [.sigterm],
      logger: logger
    )

    try await serviceGroup.run()
  }
}

メトリクスの報告先は特定のバックエンドに固定されません。Swift System Metrics が収集した値は Swift Metrics に報告され、Swift Metrics がバックエンド非依存の API として Prometheus や OpenTelemetry といった一般的なバックエンドに橋渡しします。

導入・今後の位置づけ

完全なドキュメントは Swift Package Index で公開されています。

1.0 に到達したことで、このプロジェクトは進化を続けながらも後方互換性のある API を維持します。プロジェクト側では、収集するプロセスメトリクスの種類を増やし、サポートするプラットフォームを広げるための貢献を募っています。

関連リンク