usage/Sources/Usage.Monitor.swift

57 lines
1.7 KiB
Swift

import Foundation
extension Usage {
public class Monitor {
let fileHandler: FileHandle
public private(set) var running: Bool = false
private let queue: DispatchQueue = .init(label: "Usage.Monitor.queue")
private var timeBase: mach_timebase_info = mach_timebase_info()
public init(_ forWritingTo: URL) throws {
mach_timebase_info(&timeBase)
fileHandler = try .init(forWritingTo: forWritingTo)
}
public func startRunning(_ hz: Double) {
queue.async {
guard !self.running else {
return
}
self.running = true
self.run(hz)
}
}
public func stopRunning() {
queue.async {
guard self.running else {
return
}
self.running = false
self.fileHandler.closeFile()
}
}
func run(_ hz: Double) {
while running {
let startTime = mach_absolute_time()
exectute()
let diff = (mach_absolute_time() - startTime)
Thread.sleep(forTimeInterval: (1 / hz) * 1000000)
}
}
func exectute() {
guard let cpu = Usage.cpu(), let memory = Usage.memory() else {
return
}
let timestamp = Date().timeIntervalSince1970
let line = "\(timestamp),\(cpu.user),\(cpu.system),\(cpu.nice),\(cpu.idle),\(memory)\n"
if let line = line.data(using: .utf8) {
fileHandler.write(line)
}
}
}
}