Prometheus 指标在 Swift (iOS/macOS) 中
Prometheus 是一个强大的开源监控和告警系统,它通过 HTTP 从目标应用收集指标。在 Swift 的 iOS 和 macOS 生态系统中,有多个库支持以 Prometheus 格式导出指标。在本文中,我们将介绍 SwiftPrometheus 库——一个用于在 Swift 应用中收集和导出指标的轻量级工具。
什么是 SwiftPrometheus?
SwiftPrometheus 是一个用于 Swift 的客户端库,实现了 Prometheus 规范。它允许创建三种主要指标类型:Counter(计数器)、Gauge(仪表盘)和 Histogram(直方图)。该库完全用 Swift 编写,支持 iOS 13+、macOS 10.15+、watchOS 6+ 和 tvOS 13+。
安装
将依赖项添加到您的 Package.swift 中:
// swift-tools-version:5.5import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/QuickBirdEng/SwiftPrometheus.git", from: "2.0.0") ], targets: [ .target( name: "MyApp", dependencies: ["SwiftPrometheus"] ) ])或者通过 CocoaPods 在 Podfile 中:
pod 'SwiftPrometheus', '~> 2.0'主要指标类型
- Counter — 单调递增的计数器(例如,请求数量)。
- Gauge — 可以增加和减少的值(例如,当前温度)。
- Histogram — 按指定区间分布的值(例如,响应时间)。
Counter 使用示例
import SwiftPrometheus
let prometheus = Prometheus()let httpRequests = prometheus.createCounter(for: "http_requests_total", help: "Total number of HTTP requests", labels: ["method", "path"])
httpRequests.inc() // +1httpRequests.inc(5) // +5httpRequests.labels(["GET", "/api/v1/users"]).inc() // 带标签Gauge 使用示例
let temperature = prometheus.createGauge(for: "device_temperature_celsius", help: "Current device temperature")
temperature.set(36.5) // 设置值temperature.inc(2.0) // 增加 2temperature.dec(1.0) // 减少 1Histogram 使用示例
let requestDuration = prometheus.createHistogram(for: "request_duration_seconds", help: "Request duration in seconds", buckets: [0.1, 0.5, 1.0, 2.5, 5.0])
requestDuration.observe(0.3) // 记录值以 Prometheus 格式导出指标
为了导出,创建一个 HTTP 端点,以文本格式提供指标。Vapor(服务器端)示例:
import Vaporimport SwiftPrometheus
func routes(_ app: Application) throws { app.get("metrics") { req in let metrics = prometheus.collect() return Response(body: .init(string: metrics)) }}对于 iOS/macOS 应用,可以使用内置的 URLSession 将指标发送到 Prometheus 服务器:
func sendMetrics() { let metrics = prometheus.collect() var request = URLRequest(url: URL(string: "https://pushgateway.example.org/metrics")!) request.httpMethod = "POST" request.httpBody = metrics.data(using: .utf8) URLSession.shared.dataTask(with: request).resume()}其他功能
- 标签