From 81d68e537449d5ac74656e15550e78881d649fbd Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Wed, 28 Aug 2024 15:41:34 -0400 Subject: [PATCH 01/15] add app launch tti log --- platform/swift/source/CaptureRustBridge.h | 12 ++++++++++++ platform/swift/source/CoreLogger.swift | 4 ++++ platform/swift/source/LoggerBridge.swift | 4 ++++ platform/swift/source/LoggerBridging.swift | 2 ++ platform/swift/source/Logging.swift | 2 ++ platform/swift/source/src/bridge.rs | 14 ++++++++++++++ 6 files changed, 38 insertions(+) diff --git a/platform/swift/source/CaptureRustBridge.h b/platform/swift/source/CaptureRustBridge.h index 019ca8557..7620c31e7 100644 --- a/platform/swift/source/CaptureRustBridge.h +++ b/platform/swift/source/CaptureRustBridge.h @@ -147,6 +147,18 @@ void capture_write_app_update_log( double duration_ms ); +/* + * Writes an app launch TTI log. + * + * @param loggerId the ID of the logger to write to. + * @param duration_ms the duration of time between a user's intent to launch it and the point in time + * when the app became interactive. + */ +void capture_write_app_launch_tti_log( + logger_id logger_id, + double duration_ms +); + /* * Starts new sessions using configured session strategy. * diff --git a/platform/swift/source/CoreLogger.swift b/platform/swift/source/CoreLogger.swift index b1ffbcaab..f6082e7f3 100644 --- a/platform/swift/source/CoreLogger.swift +++ b/platform/swift/source/CoreLogger.swift @@ -120,6 +120,10 @@ extension CoreLogger: CoreLogging { ) } + func logAppLaunchTTI(duration: TimeInterval) { + self.underlyingLogger.logAppLaunchTTI(duration: duration) + } + func startNewSession() { self.underlyingLogger.startNewSession() } diff --git a/platform/swift/source/LoggerBridge.swift b/platform/swift/source/LoggerBridge.swift index 3851f8be9..17ce03517 100644 --- a/platform/swift/source/LoggerBridge.swift +++ b/platform/swift/source/LoggerBridge.swift @@ -127,6 +127,10 @@ final class LoggerBridge: LoggerBridging { capture_write_app_update_log(self.loggerID, appVersion, buildNumber, appSizeBytes, duration) } + func logAppLaunchTTI(duration: TimeInterval) { + capture_write_app_launch_tti_log(self.loggerID, duration) + } + func startNewSession() { capture_start_new_session(self.loggerID) } diff --git a/platform/swift/source/LoggerBridging.swift b/platform/swift/source/LoggerBridging.swift index 1eea7ca3b..d5746ad5f 100644 --- a/platform/swift/source/LoggerBridging.swift +++ b/platform/swift/source/LoggerBridging.swift @@ -41,6 +41,8 @@ protocol LoggerBridging { duration: TimeInterval ) + func logAppLaunchTTI(duration: TimeInterval) + func start() func startNewSession() diff --git a/platform/swift/source/Logging.swift b/platform/swift/source/Logging.swift index be26bf510..927d3203e 100644 --- a/platform/swift/source/Logging.swift +++ b/platform/swift/source/Logging.swift @@ -112,6 +112,8 @@ public protocol Logging { func startSpan( name: String, level: LogLevel, file: String?, line: Int?, function: String?, fields: Fields? ) -> Span + + func logAppLaunchTTI(duration: TimeInterval) } extension Logging { diff --git a/platform/swift/source/src/bridge.rs b/platform/swift/source/src/bridge.rs index 9fc159de8..ab1a06bf1 100644 --- a/platform/swift/source/src/bridge.rs +++ b/platform/swift/source/src/bridge.rs @@ -738,6 +738,20 @@ extern "C" fn capture_write_app_update_log( ); } +#[no_mangle] +extern "C" fn capture_write_app_launch_tti_log( + logger_id: LoggerId<'_>, + duration_s: f64, +) { + with_handle_unexpected( + || -> anyhow::Result<()> { + logger_id.log_app_launch_tti(Duration::seconds_f64(duration_s)); + Ok(()) + }, + "swift write app launch TTI log", + ); +} + #[no_mangle] extern "C" fn capture_start_new_session(logger_id: LoggerId<'_>) { logger_id.start_new_session(); From 4f2d648a3b4e474b8fa82266a42b79e19848d9be Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Wed, 28 Aug 2024 16:33:02 -0400 Subject: [PATCH 02/15] implement app launch TTI event on iOS --- .../swift/hello_world/LoggerCustomer.swift | 4 ++++ platform/shared/src/lib.rs | 22 +++++++++++++++++++ platform/swift/source/Capture.swift | 11 ++++++++++ platform/swift/source/CaptureRustBridge.h | 2 +- platform/swift/source/CoreLogging.swift | 7 ++++++ platform/swift/source/Logger.swift | 4 ++++ platform/swift/source/src/bridge.rs | 5 +---- 7 files changed, 50 insertions(+), 5 deletions(-) diff --git a/examples/swift/hello_world/LoggerCustomer.swift b/examples/swift/hello_world/LoggerCustomer.swift index d2322f84a..983a6e2e2 100644 --- a/examples/swift/hello_world/LoggerCustomer.swift +++ b/examples/swift/hello_world/LoggerCustomer.swift @@ -79,6 +79,8 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { } override init() { + let start = Date() + Logger .configure( withAPIKey: kBitdriftAPIKey, @@ -95,6 +97,8 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { super.init() MXMetricManager.shared.add(self) + + Logger.logAppLaunchTTI(duration: Date().timeIntervalSince(start)) } func startNewSession() { diff --git a/platform/shared/src/lib.rs b/platform/shared/src/lib.rs index 2d67eb18b..a0448a396 100644 --- a/platform/shared/src/lib.rs +++ b/platform/shared/src/lib.rs @@ -9,6 +9,7 @@ pub mod error; pub mod metadata; use bd_client_common::error::handle_unexpected; +use bd_logger::{log_level, AnnotatedLogField, LogField, LogFieldKind, LogType}; use bd_runtime::runtime::Snapshot; use std::future::Future; use std::ops::Deref; @@ -158,6 +159,27 @@ impl LoggerHolder { holder.shutdown(false); drop(holder); } + + /// Logs an out-of-the-box app launch TTI log event. + pub fn log_app_launch_tti(&self, duration: time::Duration) { + let fields = vec![AnnotatedLogField { + field: LogField { + key: "_duration_ms".into(), + value: (duration.as_seconds_f64() * 1_000f64).to_string().into(), + }, + kind: LogFieldKind::Ootb, + }]; + + self.log( + log_level::INFO, + LogType::Lifecycle, + "AppLaunchTTI".into(), + fields, + vec![], + None, + false, + ); + } } impl<'a> From> for i64 { diff --git a/platform/swift/source/Capture.swift b/platform/swift/source/Capture.swift index ad0b4b37f..6b9518bd6 100644 --- a/platform/swift/source/Capture.swift +++ b/platform/swift/source/Capture.swift @@ -261,6 +261,17 @@ extension Logger { ) } + // MARK: - Predefined Logs + + /// Writes an app launch TTI log event. This event should be logged only once per Logger configuration. + /// Consecutive calls have no effect. + /// + /// - parameter duration: The time between a user's intent to launch the app and when the app becomes + /// interactive. + public static func logAppLaunchTTI(duration: TimeInterval) { + Self.getShared()?.logAppLaunchTTI(duration: duration) + } + // MARK: - Network Activity Logging /// Logs information about a network request. diff --git a/platform/swift/source/CaptureRustBridge.h b/platform/swift/source/CaptureRustBridge.h index 7620c31e7..edf2a2878 100644 --- a/platform/swift/source/CaptureRustBridge.h +++ b/platform/swift/source/CaptureRustBridge.h @@ -151,7 +151,7 @@ void capture_write_app_update_log( * Writes an app launch TTI log. * * @param loggerId the ID of the logger to write to. - * @param duration_ms the duration of time between a user's intent to launch it and the point in time + * @param duration_ms the duration of time between a user's intent to launch an app and the point in time * when the app became interactive. */ void capture_write_app_launch_tti_log( diff --git a/platform/swift/source/CoreLogging.swift b/platform/swift/source/CoreLogging.swift index 643dd107f..35bd15bc0 100644 --- a/platform/swift/source/CoreLogging.swift +++ b/platform/swift/source/CoreLogging.swift @@ -89,6 +89,13 @@ protocol CoreLogging: AnyObject { duration: TimeInterval ) + /// Writes an app launch TTI log event. This event should be logged only once per Logger configuration. + /// Consecutive calls have no effect. + /// + /// - parameter duration: The time between a user's intent to launch the app and when the app becomes + /// interactive. + func logAppLaunchTTI(duration: TimeInterval) + /// Stars new session using configured session strategy. func startNewSession() diff --git a/platform/swift/source/Logger.swift b/platform/swift/source/Logger.swift index 703a7344b..b4406d1d2 100644 --- a/platform/swift/source/Logger.swift +++ b/platform/swift/source/Logger.swift @@ -462,6 +462,10 @@ extension Logger: Logging { timeProvider: self.timeProvider ) } + + public func logAppLaunchTTI(duration: TimeInterval) { + self.underlyingLogger.logAppLaunchTTI(duration: duration) + } } // MARK: - Features diff --git a/platform/swift/source/src/bridge.rs b/platform/swift/source/src/bridge.rs index af9771e39..0de572675 100644 --- a/platform/swift/source/src/bridge.rs +++ b/platform/swift/source/src/bridge.rs @@ -739,10 +739,7 @@ extern "C" fn capture_write_app_update_log( } #[no_mangle] -extern "C" fn capture_write_app_launch_tti_log( - logger_id: LoggerId<'_>, - duration_s: f64, -) { +extern "C" fn capture_write_app_launch_tti_log(logger_id: LoggerId<'_>, duration_s: f64) { with_handle_unexpected( || -> anyhow::Result<()> { logger_id.log_app_launch_tti(Duration::seconds_f64(duration_s)); From 150da31cb6f43cab9ed243a3d90aa063cfc503e0 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Wed, 28 Aug 2024 17:04:58 -0400 Subject: [PATCH 03/15] add android implementation --- examples/android/MainActivity.kt | 5 +++ examples/swift/hello_world/ContentView.swift | 3 +- .../swift/hello_world/LoggerCustomer.swift | 10 +++-- .../kotlin/io/bitdrift/capture/Capture.kt | 14 +++++++ .../io/bitdrift/capture/CaptureJniLibrary.kt | 12 ++++++ .../kotlin/io/bitdrift/capture/ILogger.kt | 13 +++++++ .../kotlin/io/bitdrift/capture/LoggerImpl.kt | 4 ++ platform/jvm/src/jni.rs | 19 +++++++++ platform/shared/src/lib.rs | 39 +++++++++++-------- platform/swift/source/Logger.swift | 8 ++-- platform/swift/source/Logging.swift | 13 ++++++- 11 files changed, 113 insertions(+), 27 deletions(-) diff --git a/examples/android/MainActivity.kt b/examples/android/MainActivity.kt index 2e405376b..1d25d77ab 100644 --- a/examples/android/MainActivity.kt +++ b/examples/android/MainActivity.kt @@ -48,6 +48,9 @@ import okhttp3.Request import okhttp3.Response import java.io.IOException import kotlin.system.exitProcess +import kotlin.time.Duration +import kotlin.time.DurationUnit +import kotlin.time.toDuration class MainActivity : ComponentActivity() { @@ -121,6 +124,8 @@ class MainActivity : ComponentActivity() { Logger.addField("field_container_field_key", "field_container_field_value") Logger.logInfo(mapOf("key" to "value")) { "MainActivity onCreate called" } + + Logger.logAppLaunchTTI(1.toDuration(DurationUnit.SECONDS)) } private fun createComposeUI() { diff --git a/examples/swift/hello_world/ContentView.swift b/examples/swift/hello_world/ContentView.swift index ff63e1409..edd52ef3f 100644 --- a/examples/swift/hello_world/ContentView.swift +++ b/examples/swift/hello_world/ContentView.swift @@ -17,8 +17,8 @@ struct ContentView: View { @State private var selectedLogLevel = LoggerCustomer.LogLevel.info init(navigationController: UINavigationController?) { - self.navigationController = navigationController self.loggerCustomer = LoggerCustomer() + self.navigationController = navigationController self.currentSessionID = self.loggerCustomer.sessionID ?? "No Session ID" } @@ -103,6 +103,7 @@ struct ContentView: View { } } .padding(5) + .onAppear { self.loggerCustomer.logAppLaunchTTI() } } } diff --git a/examples/swift/hello_world/LoggerCustomer.swift b/examples/swift/hello_world/LoggerCustomer.swift index 983a6e2e2..396c46564 100644 --- a/examples/swift/hello_world/LoggerCustomer.swift +++ b/examples/swift/hello_world/LoggerCustomer.swift @@ -44,6 +44,8 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { var id: String { return self.rawValue } } + private var appStartTime: Date + private let requestDefinitions = [ // swiftlint:disable:next force_unwrapping use_static_string_url_init RequestDefinition(method: "GET", url: URL(string: "https://httpbin.org/get")!), @@ -79,7 +81,7 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { } override init() { - let start = Date() + self.appStartTime = Date() Logger .configure( @@ -97,8 +99,6 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { super.init() MXMetricManager.shared.add(self) - - Logger.logAppLaunchTTI(duration: Date().timeIntervalSince(start)) } func startNewSession() { @@ -164,6 +164,10 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { Logger.logTrace("Sending log with level [Trace]", fields: fields) } } + + func logAppLaunchTTI() { + Logger.logAppLaunchTTI(duration: Date().timeIntervalSince(self.appStartTime)) + } } extension LoggerCustomer: MXMetricManagerSubscriber { diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt index 6db5116e9..6a314b9c8 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt @@ -20,6 +20,7 @@ import io.bitdrift.capture.providers.SystemDateProvider import io.bitdrift.capture.providers.session.SessionStrategy import okhttp3.HttpUrl import java.util.concurrent.atomic.AtomicReference +import kotlin.time.Duration /** * Top level namespace Capture SDK. @@ -278,6 +279,19 @@ object Capture { logger()?.log(level = level, fields = fields, throwable = throwable, message = message) } + /** + * Writes an app launch TTI log event. This event should be logged only once per Logger configuration. + * Consecutive calls have no effect. + * + * @param duration The time between a user's intent to launch the app and when the app becomes + * interactive. + */ + @JvmStatic + @JvmOverloads + fun logAppLaunchTTI(duration: Duration) { + logger()?.logAppLaunchTTI(duration) + } + /** * Signals that an operation has started at this point in time. * diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt index 912c0e160..6010ec587 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt @@ -229,6 +229,18 @@ internal object CaptureJniLibrary { durationS: Double, ) + /** + * Writes an app launch TTI log. + * + * @param loggerId the ID of the logger to write to. + * @param durationS the time between a user's intent to launch the app and when the app becomes + * interactive. + */ + external fun writeAppLaunchTTILog( + loggerId: Long, + durationS: Double, + ) + /** * Flushes logger's state to disk. * diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt index 01d81cff4..299ab3c1c 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt @@ -10,6 +10,7 @@ package io.bitdrift.capture import io.bitdrift.capture.events.span.Span import io.bitdrift.capture.network.HttpRequestInfo import io.bitdrift.capture.network.HttpResponseInfo +import kotlin.time.Duration /** * A Capture SDK logger interface. @@ -72,6 +73,7 @@ interface ILogger { /** * Logs a message at a specified level. + * * @param level the severity of the log. * @param fields and optional collection of key-value pairs to be added to the log line. * @param throwable an optional throwable to include in the log line. @@ -84,6 +86,15 @@ interface ILogger { message: () -> String, ) + /** + * Writes an app launch TTI log event. This event should be logged only once per Logger configuration. + * Consecutive calls have no effect. + * + * @param duration The time between a user's intent to launch the app and when the app becomes + * interactive. + */ + fun logAppLaunchTTI(duration: Duration) + /** * Signals that an operation has started at this point in time. Each operation consists of start * and end event logs. The start event is emitted immediately upon calling the @@ -100,12 +111,14 @@ interface ILogger { /** * Records information about an HTTP network request + * * @param httpRequestInfo information used to enrich the log line */ fun log(httpRequestInfo: HttpRequestInfo) /** * Records information about an HTTP network response + * * @param httpResponseInfo information used to enrich the log line */ fun log(httpResponseInfo: HttpResponseInfo) diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/LoggerImpl.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/LoggerImpl.kt index fc2dbd4eb..6c34120b6 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/LoggerImpl.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/LoggerImpl.kt @@ -284,6 +284,10 @@ internal class LoggerImpl( ) } + override fun logAppLaunchTTI(duration: Duration) { + CaptureJniLibrary.writeAppLaunchTTILog(this.loggerId, duration.toDouble(DurationUnit.SECONDS)) + } + override fun startSpan(name: String, level: LogLevel, fields: Map?): Span { return Span(this, name, level, fields) } diff --git a/platform/jvm/src/jni.rs b/platform/jvm/src/jni.rs index 1b2032dd9..b8c0e18ec 100644 --- a/platform/jvm/src/jni.rs +++ b/platform/jvm/src/jni.rs @@ -995,6 +995,25 @@ pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_writeAppUpdate ); } +#[no_mangle] +pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_writeAppLaunchTTILog( + _env: JNIEnv<'_>, + _class: JClass<'_>, + logger_id: jlong, + duration_s: f64, +) { + bd_client_common::error::with_handle_unexpected( + || -> anyhow::Result<()> { + let logger = unsafe { LoggerId::from_raw(logger_id) }; + logger.log_app_launch_tti(Duration::seconds_f64(duration_s)); + + Ok(()) + }, + "jni write app launch TTI log", + ); +} + + #[no_mangle] pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_flush( _env: JNIEnv<'_>, diff --git a/platform/shared/src/lib.rs b/platform/shared/src/lib.rs index a0448a396..f86c00ca6 100644 --- a/platform/shared/src/lib.rs +++ b/platform/shared/src/lib.rs @@ -11,6 +11,7 @@ pub mod metadata; use bd_client_common::error::handle_unexpected; use bd_logger::{log_level, AnnotatedLogField, LogField, LogFieldKind, LogType}; use bd_runtime::runtime::Snapshot; +use parking_lot::Once; use std::future::Future; use std::ops::Deref; use std::pin::Pin; @@ -93,6 +94,7 @@ pub struct LoggerHolder { logger: bd_logger::Logger, handle: bd_logger::LoggerHandle, future: parking_lot::Mutex>, + app_launch_tti_log: Once, } impl Deref for LoggerHolder { @@ -110,6 +112,7 @@ impl LoggerHolder { logger, handle, future: parking_lot::Mutex::new(Some(future)), + app_launch_tti_log: Once::new(), } } @@ -162,23 +165,25 @@ impl LoggerHolder { /// Logs an out-of-the-box app launch TTI log event. pub fn log_app_launch_tti(&self, duration: time::Duration) { - let fields = vec![AnnotatedLogField { - field: LogField { - key: "_duration_ms".into(), - value: (duration.as_seconds_f64() * 1_000f64).to_string().into(), - }, - kind: LogFieldKind::Ootb, - }]; - - self.log( - log_level::INFO, - LogType::Lifecycle, - "AppLaunchTTI".into(), - fields, - vec![], - None, - false, - ); + self.app_launch_tti_log.call_once(|| { + let fields = vec![AnnotatedLogField { + field: LogField { + key: "_duration_ms".into(), + value: (duration.as_seconds_f64() * 1_000f64).to_string().into(), + }, + kind: LogFieldKind::Ootb, + }]; + + self.log( + log_level::INFO, + LogType::Lifecycle, + "AppLaunchTTI".into(), + fields, + vec![], + None, + false, + ); + }) } } diff --git a/platform/swift/source/Logger.swift b/platform/swift/source/Logger.swift index b4406d1d2..551449e8e 100644 --- a/platform/swift/source/Logger.swift +++ b/platform/swift/source/Logger.swift @@ -442,6 +442,10 @@ extension Logger: Logging { self.deviceCodeController.createTemporaryDeviceCode(deviceID: self.deviceID, completion: completion) } + public func logAppLaunchTTI(duration: TimeInterval) { + self.underlyingLogger.logAppLaunchTTI(duration: duration) + } + public func startSpan( name: String, level: LogLevel, @@ -462,10 +466,6 @@ extension Logger: Logging { timeProvider: self.timeProvider ) } - - public func logAppLaunchTTI(duration: TimeInterval) { - self.underlyingLogger.logAppLaunchTTI(duration: duration) - } } // MARK: - Features diff --git a/platform/swift/source/Logging.swift b/platform/swift/source/Logging.swift index 927d3203e..cfe829384 100644 --- a/platform/swift/source/Logging.swift +++ b/platform/swift/source/Logging.swift @@ -95,6 +95,17 @@ public protocol Logging { /// main queue. func createTemporaryDeviceCode(completion: @escaping (Result) -> Void) + // MARK: - Predefined logs + + /// Writes an app launch TTI log event. This event should be logged only once per Logger configuration. + /// Consecutive calls have no effect. + /// + /// - parameter duration: The time between a user's intent to launch the app and when the app becomes + /// interactive. + func logAppLaunchTTI(duration: TimeInterval) + + // MARK: - Spans + /// Signals that an operation has started at this point in time. Each operation consists of start and /// end event logs. The start event is emitted immediately upon calling the `startSpan(...)` method, /// while the corresponding end event is emitted when the `end(...)` method is called on the `Span` @@ -112,8 +123,6 @@ public protocol Logging { func startSpan( name: String, level: LogLevel, file: String?, line: Int?, function: String?, fields: Fields? ) -> Span - - func logAppLaunchTTI(duration: TimeInterval) } extension Logging { From dd0ca45d0f1286b1b73f2a15fb811b3fd34924b0 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Wed, 28 Aug 2024 17:08:08 -0400 Subject: [PATCH 04/15] better docs --- .../kotlin/io/bitdrift/capture/CaptureJniLibrary.kt | 3 ++- platform/shared/src/lib.rs | 5 +++-- platform/swift/source/CaptureRustBridge.h | 11 ++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt index 6010ec587..e78d6e0d6 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt @@ -230,7 +230,8 @@ internal object CaptureJniLibrary { ) /** - * Writes an app launch TTI log. + * Writes an app launch TTI log. The method should be called only once per logger Id. Consecutive calls + * have no effect. * * @param loggerId the ID of the logger to write to. * @param durationS the time between a user's intent to launch the app and when the app becomes diff --git a/platform/shared/src/lib.rs b/platform/shared/src/lib.rs index f86c00ca6..eab778982 100644 --- a/platform/shared/src/lib.rs +++ b/platform/shared/src/lib.rs @@ -163,7 +163,8 @@ impl LoggerHolder { drop(holder); } - /// Logs an out-of-the-box app launch TTI log event. + /// Logs an out-of-the-box app launch TTI log event. The method should be called only once. + /// Consecutive calls have not effect. pub fn log_app_launch_tti(&self, duration: time::Duration) { self.app_launch_tti_log.call_once(|| { let fields = vec![AnnotatedLogField { @@ -173,7 +174,7 @@ impl LoggerHolder { }, kind: LogFieldKind::Ootb, }]; - + self.log( log_level::INFO, LogType::Lifecycle, diff --git a/platform/swift/source/CaptureRustBridge.h b/platform/swift/source/CaptureRustBridge.h index edf2a2878..4af16cb17 100644 --- a/platform/swift/source/CaptureRustBridge.h +++ b/platform/swift/source/CaptureRustBridge.h @@ -137,26 +137,27 @@ bool capture_should_write_app_update_log( * @param app_version the version of the app. * @param build_number the app build number. * @param app_install_size_bytes the size of the app in bytes. - * @param duration_ms the duration of time the preparation of the log took. + * @param duration_s the duration of time the preparation of the log took. */ void capture_write_app_update_log( logger_id logger_id, NSString *app_version, NSString *build_number, uint64_t app_install_size_bytes, - double duration_ms + double duration_s ); /* - * Writes an app launch TTI log. + * Writes an app launch TTI log. The method should be called only once per logger Id. Consecutive calls + * have no effect. * * @param loggerId the ID of the logger to write to. - * @param duration_ms the duration of time between a user's intent to launch an app and the point in time + * @param duration_s the duration of time between a user's intent to launch an app and the point in time * when the app became interactive. */ void capture_write_app_launch_tti_log( logger_id logger_id, - double duration_ms + double duration_s ); /* From b3d50a2bebf36f2ff663169527c60c07facd080a Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 10:30:19 -0400 Subject: [PATCH 05/15] clippy fixes --- platform/shared/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/shared/src/lib.rs b/platform/shared/src/lib.rs index eab778982..9e23aa29c 100644 --- a/platform/shared/src/lib.rs +++ b/platform/shared/src/lib.rs @@ -184,7 +184,7 @@ impl LoggerHolder { None, false, ); - }) + }); } } From 6a5b61ab11dd16ff6c636f20905ad82cca3de730 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 10:34:35 -0400 Subject: [PATCH 06/15] :hammer: From 66a81340dfd706b52a52409b1a256f4adbc09692 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 10:36:24 -0400 Subject: [PATCH 07/15] fix symbols --- platform/jvm/jni_symbols.lds | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/jvm/jni_symbols.lds b/platform/jvm/jni_symbols.lds index b8a376ad9..8c51ce4d7 100644 --- a/platform/jvm/jni_symbols.lds +++ b/platform/jvm/jni_symbols.lds @@ -15,6 +15,7 @@ Java_io_bitdrift_capture_CaptureJniLibrary_writeResourceUtilizationLog Java_io_bitdrift_capture_CaptureJniLibrary_writeSDKConfiguredLog Java_io_bitdrift_capture_CaptureJniLibrary_shouldWriteAppUpdateLog Java_io_bitdrift_capture_CaptureJniLibrary_writeAppUpdateLog +Java_io_bitdrift_capture_CaptureJniLibrary_writeAppLaunchTTILog Java_io_bitdrift_capture_CaptureJniLibrary_flush Java_io_bitdrift_capture_CaptureJniLibrary_debugDebug Java_io_bitdrift_capture_CaptureJniLibrary_debugError From f47b8ed444316ffbd4842a45f09af6ef02079ffd Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 10:41:01 -0400 Subject: [PATCH 08/15] Remove @JvmOverloads --- .../jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt index 6a314b9c8..82b9a024e 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt @@ -287,7 +287,6 @@ object Capture { * interactive. */ @JvmStatic - @JvmOverloads fun logAppLaunchTTI(duration: Duration) { logger()?.logAppLaunchTTI(duration) } From d80b904556e394639952e62bca2cbe76b0e31231 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 10:59:26 -0400 Subject: [PATCH 09/15] fix mocks --- .../platform/swift/unit_integration/mocks/MockCoreLogging.swift | 2 ++ .../swift/unit_integration/mocks/MockLoggerBridging.swift | 2 ++ test/platform/swift/unit_integration/mocks/MockLogging.swift | 2 ++ 3 files changed, 6 insertions(+) diff --git a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift index 7bf2fca33..79234c594 100644 --- a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift @@ -124,6 +124,8 @@ extension MockCoreLogging: CoreLogging { self.logAppUpdateExpectation?.fulfill() } + func logAppLaunchTTI(duration _: TimeInterval) {} + func addField(withKey _: String, value _: String) {} func removeField(withKey _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift index 7609f8cf4..fa64bfb7f 100644 --- a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift @@ -94,6 +94,8 @@ extension MockLoggerBridging: LoggerBridging { self.logAppUpdateExpectation?.fulfill() } + func logAppLaunchTTI(duration _: TimeInterval) {} + func addField(withKey _: String, value _: String) {} func removeField(withKey _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLogging.swift b/test/platform/swift/unit_integration/mocks/MockLogging.swift index 386920d7e..748cbbc67 100644 --- a/test/platform/swift/unit_integration/mocks/MockLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLogging.swift @@ -109,6 +109,8 @@ extension MockLogging: Logging { self.onLog(log) } + func logAppLaunchTTI(duration _: TimeInterval) {} + func addField(withKey _: String, value _: FieldValue) {} func removeField(withKey _: String) {} From ca3cd4282ce8fbc190cf47e376393ae34b343731 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 14:08:06 -0400 Subject: [PATCH 10/15] ignore negative durations --- Cargo.lock | 1 + platform/shared/Cargo.toml | 1 + platform/shared/src/lib.rs | 11 ++++++++++- platform/swift/source/Capture.swift | 4 ++-- platform/swift/source/Logger.swift | 4 ++-- platform/swift/source/Logging.swift | 2 +- 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb7e10786..489ff7087 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1879,6 +1879,7 @@ dependencies = [ "bd-logger", "bd-runtime", "bd-session", + "log", "parking_lot", "pretty_assertions", "regex", diff --git a/platform/shared/Cargo.toml b/platform/shared/Cargo.toml index b5104d8fb..1fab6c5ed 100644 --- a/platform/shared/Cargo.toml +++ b/platform/shared/Cargo.toml @@ -14,6 +14,7 @@ bd-log-primitives.workspace = true bd-logger.workspace = true bd-runtime.workspace = true bd-session.workspace = true +log.workspace = true parking_lot.workspace = true regex.workspace = true time.workspace = true diff --git a/platform/shared/src/lib.rs b/platform/shared/src/lib.rs index 9e23aa29c..c8c5f66d2 100644 --- a/platform/shared/src/lib.rs +++ b/platform/shared/src/lib.rs @@ -167,10 +167,19 @@ impl LoggerHolder { /// Consecutive calls have not effect. pub fn log_app_launch_tti(&self, duration: time::Duration) { self.app_launch_tti_log.call_once(|| { + let duration_ms = duration.as_seconds_f64() * 1_000f64; + if duration_ms < 0.0 { + log::warn!( + "dropping app launch TTI log: reported TTI is negative: {}", + duration_ms + ); + return; + } + let fields = vec![AnnotatedLogField { field: LogField { key: "_duration_ms".into(), - value: (duration.as_seconds_f64() * 1_000f64).to_string().into(), + value: duration_ms.to_string().into(), }, kind: LogFieldKind::Ootb, }]; diff --git a/platform/swift/source/Capture.swift b/platform/swift/source/Capture.swift index 6b9518bd6..71babe22f 100644 --- a/platform/swift/source/Capture.swift +++ b/platform/swift/source/Capture.swift @@ -268,8 +268,8 @@ extension Logger { /// /// - parameter duration: The time between a user's intent to launch the app and when the app becomes /// interactive. - public static func logAppLaunchTTI(duration: TimeInterval) { - Self.getShared()?.logAppLaunchTTI(duration: duration) + public static func logAppLaunchTTI(_ duration: TimeInterval) { + Self.getShared()?.logAppLaunchTTI(duration) } // MARK: - Network Activity Logging diff --git a/platform/swift/source/Logger.swift b/platform/swift/source/Logger.swift index 551449e8e..ab0328fb3 100644 --- a/platform/swift/source/Logger.swift +++ b/platform/swift/source/Logger.swift @@ -442,8 +442,8 @@ extension Logger: Logging { self.deviceCodeController.createTemporaryDeviceCode(deviceID: self.deviceID, completion: completion) } - public func logAppLaunchTTI(duration: TimeInterval) { - self.underlyingLogger.logAppLaunchTTI(duration: duration) + public func logAppLaunchTTI(_ duration: TimeInterval) { + self.underlyingLogger.logAppLaunchTTI(duration) } public func startSpan( diff --git a/platform/swift/source/Logging.swift b/platform/swift/source/Logging.swift index cfe829384..32cf2cde4 100644 --- a/platform/swift/source/Logging.swift +++ b/platform/swift/source/Logging.swift @@ -102,7 +102,7 @@ public protocol Logging { /// /// - parameter duration: The time between a user's intent to launch the app and when the app becomes /// interactive. - func logAppLaunchTTI(duration: TimeInterval) + func logAppLaunchTTI(_ duration: TimeInterval) // MARK: - Spans From 0b33aa4ee2b34023c7cabd37ee6923626b014bf6 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 21:47:10 -0400 Subject: [PATCH 11/15] update lock, add docs per cr --- Cargo.Bazel.lock | 6 +++++- .../capture/src/main/kotlin/io/bitdrift/capture/Capture.kt | 2 +- .../main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt | 4 ++-- .../capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt | 2 +- platform/swift/source/Capture.swift | 2 +- platform/swift/source/Logging.swift | 2 +- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Cargo.Bazel.lock b/Cargo.Bazel.lock index 5cda1540e..0ef07b77b 100644 --- a/Cargo.Bazel.lock +++ b/Cargo.Bazel.lock @@ -1,5 +1,5 @@ { - "checksum": "1c0b0ba664ad4b267d43db44407b2f5a8066bbe33d272fbb409fa397d1ee03d8", + "checksum": "2593290c0a2b86dae2b0a2622e5d06ee4ce660618e1c93511ec7c306f6429466", "crates": { "addr2line 0.22.0": { "name": "addr2line", @@ -11205,6 +11205,10 @@ "id": "bd-session 1.0.0", "target": "bd_session" }, + { + "id": "log 0.4.22", + "target": "log" + }, { "id": "parking_lot 0.12.3", "target": "parking_lot" diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt index 82b9a024e..4032db39a 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/Capture.kt @@ -284,7 +284,7 @@ object Capture { * Consecutive calls have no effect. * * @param duration The time between a user's intent to launch the app and when the app becomes - * interactive. + * interactive. Calls with a negative duration are ignored. */ @JvmStatic fun logAppLaunchTTI(duration: Duration) { diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt index e78d6e0d6..347d2c6e0 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt @@ -219,7 +219,7 @@ internal object CaptureJniLibrary { * @param appVersion * @param appVersionCode * @param appInstallSizeBytes the size of the app installation. Expressed in bytes. - * @param durationS the duration of time the preparation of the log took. + * @param durationS the duration of time the preparation of the log took. Expressed in seconds. */ external fun writeAppUpdateLog( loggerId: Long, @@ -235,7 +235,7 @@ internal object CaptureJniLibrary { * * @param loggerId the ID of the logger to write to. * @param durationS the time between a user's intent to launch the app and when the app becomes - * interactive. + * interactive. Expressed in seconds. */ external fun writeAppLaunchTTILog( loggerId: Long, diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt index 299ab3c1c..9d1c98edc 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/ILogger.kt @@ -91,7 +91,7 @@ interface ILogger { * Consecutive calls have no effect. * * @param duration The time between a user's intent to launch the app and when the app becomes - * interactive. + * interactive. Calls with a negative duration are ignored. */ fun logAppLaunchTTI(duration: Duration) diff --git a/platform/swift/source/Capture.swift b/platform/swift/source/Capture.swift index 71babe22f..f2fe5b55c 100644 --- a/platform/swift/source/Capture.swift +++ b/platform/swift/source/Capture.swift @@ -267,7 +267,7 @@ extension Logger { /// Consecutive calls have no effect. /// /// - parameter duration: The time between a user's intent to launch the app and when the app becomes - /// interactive. + /// interactive. Calls with a negative duration are ignored. public static func logAppLaunchTTI(_ duration: TimeInterval) { Self.getShared()?.logAppLaunchTTI(duration) } diff --git a/platform/swift/source/Logging.swift b/platform/swift/source/Logging.swift index 32cf2cde4..a90cff52f 100644 --- a/platform/swift/source/Logging.swift +++ b/platform/swift/source/Logging.swift @@ -101,7 +101,7 @@ public protocol Logging { /// Consecutive calls have no effect. /// /// - parameter duration: The time between a user's intent to launch the app and when the app becomes - /// interactive. + /// interactive. Calls with a negative duration are ignored. func logAppLaunchTTI(_ duration: TimeInterval) // MARK: - Spans From 89814679cd1ff1315a70dc9db28355e446132f59 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 21:58:25 -0400 Subject: [PATCH 12/15] fix lock --- Cargo.Bazel.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.Bazel.lock b/Cargo.Bazel.lock index 6d1a907d1..d4688f39e 100644 --- a/Cargo.Bazel.lock +++ b/Cargo.Bazel.lock @@ -1,5 +1,5 @@ { - "checksum": "56425165453d96ae5bf70ff6018fcb7c04df849e34a7e81588062e458fd2a43b", + "checksum": "8ad31ce9dea7ee209cf012275ebd9379bd6f5ccc1ba1f90281d98b110fbb673f", "crates": { "addr2line 0.22.0": { "name": "addr2line", From a4d84633d2cbc6afd3118ab2af5a7c895aa3bae3 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 22:05:41 -0400 Subject: [PATCH 13/15] remove duration label --- examples/swift/hello_world/LoggerCustomer.swift | 2 +- .../src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt | 2 +- platform/swift/source/CoreLogger.swift | 4 ++-- platform/swift/source/CoreLogging.swift | 2 +- platform/swift/source/LoggerBridge.swift | 2 +- platform/swift/source/LoggerBridging.swift | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/swift/hello_world/LoggerCustomer.swift b/examples/swift/hello_world/LoggerCustomer.swift index 396c46564..22e48e41f 100644 --- a/examples/swift/hello_world/LoggerCustomer.swift +++ b/examples/swift/hello_world/LoggerCustomer.swift @@ -166,7 +166,7 @@ final class LoggerCustomer: NSObject, URLSessionDelegate { } func logAppLaunchTTI() { - Logger.logAppLaunchTTI(duration: Date().timeIntervalSince(self.appStartTime)) + Logger.logAppLaunchTTI(Date().timeIntervalSince(self.appStartTime)) } } diff --git a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt index 347d2c6e0..6e51bf73a 100644 --- a/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt +++ b/platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt @@ -235,7 +235,7 @@ internal object CaptureJniLibrary { * * @param loggerId the ID of the logger to write to. * @param durationS the time between a user's intent to launch the app and when the app becomes - * interactive. Expressed in seconds. + * interactive. Expressed in seconds. Calls with a negative duration are ignored. */ external fun writeAppLaunchTTILog( loggerId: Long, diff --git a/platform/swift/source/CoreLogger.swift b/platform/swift/source/CoreLogger.swift index f6082e7f3..e88d63129 100644 --- a/platform/swift/source/CoreLogger.swift +++ b/platform/swift/source/CoreLogger.swift @@ -120,8 +120,8 @@ extension CoreLogger: CoreLogging { ) } - func logAppLaunchTTI(duration: TimeInterval) { - self.underlyingLogger.logAppLaunchTTI(duration: duration) + func logAppLaunchTTI(_ duration: TimeInterval) { + self.underlyingLogger.logAppLaunchTTI(duration) } func startNewSession() { diff --git a/platform/swift/source/CoreLogging.swift b/platform/swift/source/CoreLogging.swift index 35bd15bc0..93197624d 100644 --- a/platform/swift/source/CoreLogging.swift +++ b/platform/swift/source/CoreLogging.swift @@ -94,7 +94,7 @@ protocol CoreLogging: AnyObject { /// /// - parameter duration: The time between a user's intent to launch the app and when the app becomes /// interactive. - func logAppLaunchTTI(duration: TimeInterval) + func logAppLaunchTTI(_ duration: TimeInterval) /// Stars new session using configured session strategy. func startNewSession() diff --git a/platform/swift/source/LoggerBridge.swift b/platform/swift/source/LoggerBridge.swift index 17ce03517..41d68166c 100644 --- a/platform/swift/source/LoggerBridge.swift +++ b/platform/swift/source/LoggerBridge.swift @@ -127,7 +127,7 @@ final class LoggerBridge: LoggerBridging { capture_write_app_update_log(self.loggerID, appVersion, buildNumber, appSizeBytes, duration) } - func logAppLaunchTTI(duration: TimeInterval) { + func logAppLaunchTTI(_ duration: TimeInterval) { capture_write_app_launch_tti_log(self.loggerID, duration) } diff --git a/platform/swift/source/LoggerBridging.swift b/platform/swift/source/LoggerBridging.swift index d5746ad5f..7cc236915 100644 --- a/platform/swift/source/LoggerBridging.swift +++ b/platform/swift/source/LoggerBridging.swift @@ -41,7 +41,7 @@ protocol LoggerBridging { duration: TimeInterval ) - func logAppLaunchTTI(duration: TimeInterval) + func logAppLaunchTTI(_ duration: TimeInterval) func start() From 50508c8253dcb32293e38905f67ef11de06a5396 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Thu, 29 Aug 2024 23:32:36 -0400 Subject: [PATCH 14/15] fix --- .../platform/swift/unit_integration/mocks/MockCoreLogging.swift | 2 +- .../swift/unit_integration/mocks/MockLoggerBridging.swift | 2 +- test/platform/swift/unit_integration/mocks/MockLogging.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift index 79234c594..e05ebcdac 100644 --- a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift @@ -124,7 +124,7 @@ extension MockCoreLogging: CoreLogging { self.logAppUpdateExpectation?.fulfill() } - func logAppLaunchTTI(duration _: TimeInterval) {} + func logAppLaunchTTI(_ duration: TimeInterval) {} func addField(withKey _: String, value _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift index fa64bfb7f..b0a908063 100644 --- a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift @@ -94,7 +94,7 @@ extension MockLoggerBridging: LoggerBridging { self.logAppUpdateExpectation?.fulfill() } - func logAppLaunchTTI(duration _: TimeInterval) {} + func logAppLaunchTTI(_ duration: TimeInterval) {} func addField(withKey _: String, value _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLogging.swift b/test/platform/swift/unit_integration/mocks/MockLogging.swift index 748cbbc67..8838e3150 100644 --- a/test/platform/swift/unit_integration/mocks/MockLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLogging.swift @@ -109,7 +109,7 @@ extension MockLogging: Logging { self.onLog(log) } - func logAppLaunchTTI(duration _: TimeInterval) {} + func logAppLaunchTTI(_ duration: TimeInterval) {} func addField(withKey _: String, value _: FieldValue) {} From c31c75989c1e55923abbb0f1a9f50f24aed52691 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Fri, 30 Aug 2024 07:50:17 -0400 Subject: [PATCH 15/15] format fix --- .../platform/swift/unit_integration/mocks/MockCoreLogging.swift | 2 +- .../swift/unit_integration/mocks/MockLoggerBridging.swift | 2 +- test/platform/swift/unit_integration/mocks/MockLogging.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift index e05ebcdac..718371516 100644 --- a/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockCoreLogging.swift @@ -124,7 +124,7 @@ extension MockCoreLogging: CoreLogging { self.logAppUpdateExpectation?.fulfill() } - func logAppLaunchTTI(_ duration: TimeInterval) {} + func logAppLaunchTTI(_: TimeInterval) {} func addField(withKey _: String, value _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift index b0a908063..5fd833b12 100644 --- a/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLoggerBridging.swift @@ -94,7 +94,7 @@ extension MockLoggerBridging: LoggerBridging { self.logAppUpdateExpectation?.fulfill() } - func logAppLaunchTTI(_ duration: TimeInterval) {} + func logAppLaunchTTI(_: TimeInterval) {} func addField(withKey _: String, value _: String) {} diff --git a/test/platform/swift/unit_integration/mocks/MockLogging.swift b/test/platform/swift/unit_integration/mocks/MockLogging.swift index 8838e3150..b7db23649 100644 --- a/test/platform/swift/unit_integration/mocks/MockLogging.swift +++ b/test/platform/swift/unit_integration/mocks/MockLogging.swift @@ -109,7 +109,7 @@ extension MockLogging: Logging { self.onLog(log) } - func logAppLaunchTTI(_ duration: TimeInterval) {} + func logAppLaunchTTI(_: TimeInterval) {} func addField(withKey _: String, value _: FieldValue) {}