Telemetry: tag relay fetches with X-Client (app/widget) — app via RelayFuelProvider, widget focused/fuel-only fetches + diag beacon; Siri untouched (cached-only). Purely observational for relay admin /stats.
This commit is contained in:
@@ -166,8 +166,7 @@ struct FuelPriceTimelineProvider<Configuration: WidgetConfigurationIntent & Widg
|
|||||||
URLQueryItem(name: "price", value: String(first?.prices[entry.fuel] ?? -1)),
|
URLQueryItem(name: "price", value: String(first?.prices[entry.fuel] ?? -1)),
|
||||||
]
|
]
|
||||||
guard let url = components.url else { return }
|
guard let url = components.url else { return }
|
||||||
var request = URLRequest(url: url)
|
var request = RelayFuelProvider.relayRequest(url, client: "widget", timeout: 2)
|
||||||
request.timeoutInterval = 2
|
|
||||||
Task {
|
Task {
|
||||||
_ = try? await URLSession.shared.data(for: request)
|
_ = try? await URLSession.shared.data(for: request)
|
||||||
}
|
}
|
||||||
@@ -313,8 +312,7 @@ struct FuelPriceTimelineProvider<Configuration: WidgetConfigurationIntent & Widg
|
|||||||
URLQueryItem(name: "radius", value: String(radiusKM)),
|
URLQueryItem(name: "radius", value: String(radiusKM)),
|
||||||
URLQueryItem(name: "limit", value: "500"),
|
URLQueryItem(name: "limit", value: "500"),
|
||||||
]
|
]
|
||||||
var request = URLRequest(url: components.url!)
|
var request = RelayFuelProvider.relayRequest(components.url!, client: "widget", timeout: 5)
|
||||||
request.timeoutInterval = 5
|
|
||||||
do {
|
do {
|
||||||
let (data, response) = try await URLSession.shared.data(for: request)
|
let (data, response) = try await URLSession.shared.data(for: request)
|
||||||
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else { return nil }
|
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else { return nil }
|
||||||
@@ -337,8 +335,7 @@ struct FuelPriceTimelineProvider<Configuration: WidgetConfigurationIntent & Widg
|
|||||||
URLQueryItem(name: "fuel", value: fuel.rawValue),
|
URLQueryItem(name: "fuel", value: fuel.rawValue),
|
||||||
URLQueryItem(name: "limit", value: String(limit)),
|
URLQueryItem(name: "limit", value: String(limit)),
|
||||||
]
|
]
|
||||||
var request = URLRequest(url: components.url!)
|
var request = RelayFuelProvider.relayRequest(components.url!, client: "widget", timeout: 5)
|
||||||
request.timeoutInterval = 5
|
|
||||||
do {
|
do {
|
||||||
let (data, response) = try await URLSession.shared.data(for: request)
|
let (data, response) = try await URLSession.shared.data(for: request)
|
||||||
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else { return nil }
|
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else { return nil }
|
||||||
|
|||||||
@@ -71,6 +71,19 @@ struct RelayFuelProvider: FuelPriceProviding {
|
|||||||
/// dataset update time). Written by fetchStations, read by the view.
|
/// dataset update time). Written by fetchStations, read by the view.
|
||||||
static var latestMeta: RelayMeta?
|
static var latestMeta: RelayMeta?
|
||||||
|
|
||||||
|
/// Admin telemetry: the relay tags inbound connections by client kind
|
||||||
|
/// (app vs widget) so the developer can monitor the poll model. Siri
|
||||||
|
/// never fetches (cached-data-first). Purely observational — the relay
|
||||||
|
/// ignores the header for responses.
|
||||||
|
static let clientTagHeader = "X-Client"
|
||||||
|
|
||||||
|
static func relayRequest(_ url: URL, client: String, timeout: TimeInterval = 30) -> URLRequest {
|
||||||
|
var request = URLRequest(url: url)
|
||||||
|
request.timeoutInterval = timeout
|
||||||
|
request.setValue(client, forHTTPHeaderField: clientTagHeader)
|
||||||
|
return request
|
||||||
|
}
|
||||||
|
|
||||||
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation] {
|
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation] {
|
||||||
var components = URLComponents(url: baseURL.appendingPathComponent("api/v1/stations"), resolvingAgainstBaseURL: false)!
|
var components = URLComponents(url: baseURL.appendingPathComponent("api/v1/stations"), resolvingAgainstBaseURL: false)!
|
||||||
var query: [URLQueryItem] = [URLQueryItem(name: "fuel", value: fuel.rawValue)]
|
var query: [URLQueryItem] = [URLQueryItem(name: "fuel", value: fuel.rawValue)]
|
||||||
@@ -89,7 +102,8 @@ struct RelayFuelProvider: FuelPriceProviding {
|
|||||||
}
|
}
|
||||||
components.queryItems = query
|
components.queryItems = query
|
||||||
|
|
||||||
let (data, response) = try await URLSession.shared.data(from: components.url!)
|
let request = RelayFuelProvider.relayRequest(components.url!, client: "app")
|
||||||
|
let (data, response) = try await URLSession.shared.data(for: request)
|
||||||
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
|
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
|
||||||
throw FuelProviderError.relayUnavailable
|
throw FuelProviderError.relayUnavailable
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user