この記事の要点
- プロセスレベルのシステムメトリクスを収集する Swift パッケージ Swift System Metrics が、安定版の 1.0 に到達しました。CPU 使用時間やメモリ使用量といった指標を収集でき、Linux と macOS の両方で共通の API を提供します。
- プロセスのメトリクスを監視することで、性能問題の検知、リソース使用の最適化、負荷変動下でのサービスの信頼性とコスト効率の確保ができます。数行のコードで自分のサービスに組み込めます。
- 単独のパッケージではなく、Swift でメトリクスを扱うための一連のパッケージ群の一部です。収集したメトリクスは、バックエンド非依存のメトリクス API である Swift Metrics を通じて Prometheus や OpenTelemetry などに送られ、プロセスの起動やリソースの後始末には Swift Service Lifecycle が使われます。
- このパッケージは以前
swift-metrics-extrasという名前でしたが、目的をより明確にするため改名されました。1.0 到達により API が安定し、今後は後方互換性が維持されます。
何が発表されたのか
サービスを運用するうえで、プロセスがどれだけの CPU やメモリを使っているかといった指標を継続的に監視することは、性能問題の早期発見やリソース最適化、コスト効率の維持に役立ちます。とはいえ、こうしたメトリクスを自前で収集しようとすると、プラットフォームごとに異なる API を扱う必要があり、手間がかかります。
Swift System Metrics は、プロセスレベルのシステムメトリクスを収集して報告する Swift パッケージです。Linux と macOS をまたいで共通の API を提供するため、プラットフォームの違いを意識せずに可観測性を組み込めます。数行のコードで導入できるため、ごく小さなサービスでも初日から本番品質の可観測性を持てるようになります。
1.0 に到達したことで API が安定し、今後は後方互換性のある API を維持しながら進化していく方針です。なお、このパッケージは以前 swift-metrics-extras という名前で提供されていましたが、目的をより的確に表すために swift-system-metrics へ改名されました。
収集できるメトリクス
1.0 時点で、Swift System Metrics は次の指標を収集・報告します。
- CPU 使用時間
- 仮想メモリおよび実メモリ(resident memory)の使用量
- オープン中および利用可能な最大のファイルディスクリプタ数
- プロセスの起動時刻
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 を維持します。プロジェクト側では、収集するプロセスメトリクスの種類を増やし、サポートするプラットフォームを広げるための貢献を募っています。