Prometheus 指标在 Swift 中:iOS/macOS 应用的监控

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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) // 减少 1


Histogram 使用示例

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()}


其他功能

  • 标签

推荐