diff --git a/runtime/build.gradle.kts b/runtime/build.gradle.kts index ea7c0acfda..bf9c7a05b3 100644 --- a/runtime/build.gradle.kts +++ b/runtime/build.gradle.kts @@ -62,7 +62,7 @@ subprojects { } } - named("jvmTest") { + findByName("jvmTest")?.run { dependencies { implementation(libraries.kotlinx.coroutines.debug) implementation(libraries.kotest.assertions.core.jvm) diff --git a/runtime/observability/logging-crt/build.gradle.kts b/runtime/observability/logging-crt/build.gradle.kts new file mode 100644 index 0000000000..b59d7b81d8 --- /dev/null +++ b/runtime/observability/logging-crt/build.gradle.kts @@ -0,0 +1,18 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +description = "Logging provider based on CRT" +extra["displayName"] = "Smithy :: Kotlin :: Observability :: CRT" +extra["moduleName"] = "aws.smithy.kotlin.runtime.telemetry.logging.crt" + +kotlin { + sourceSets { + nativeMain { + dependencies { + api(project(":runtime:observability:telemetry-api")) + api(libs.crt.kotlin) + } + } + } +} diff --git a/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogRecordBuilder.kt b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogRecordBuilder.kt new file mode 100644 index 0000000000..67415ed59b --- /dev/null +++ b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogRecordBuilder.kt @@ -0,0 +1,47 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package aws.smithy.kotlin.runtime.telemetry.logging.crt + +import aws.smithy.kotlin.runtime.telemetry.logging.LogLevel +import aws.smithy.kotlin.runtime.telemetry.logging.LogRecordBuilder +import aws.smithy.kotlin.runtime.telemetry.logging.MessageSupplier + +public class CrtLogRecordBuilder( + private val delegate: CrtLogger, + private val level: LogLevel, +) : LogRecordBuilder { + private var cause: Throwable? = null + private var msg: (() -> String)? = null + + override fun setCause(ex: Throwable) { + cause = ex + } + + override fun setMessage(message: String) { + msg = { message } + } + + override fun setMessage(message: MessageSupplier) { + msg = message + } + + // CRT logger does not support setting key-value pairs + override fun setKeyValuePair(key: String, value: Any) { } + + override fun emit() { + val message = requireNotNull(msg) { "no message provided to LogRecordBuilder" } + + val logMethod = when (level) { + LogLevel.Trace -> delegate::trace + LogLevel.Debug -> delegate::debug + LogLevel.Info -> delegate::info + LogLevel.Warning -> delegate::warn + LogLevel.Error -> delegate::error + } + + logMethod(cause, message) + } +} diff --git a/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogger.kt b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogger.kt new file mode 100644 index 0000000000..1a88eb068b --- /dev/null +++ b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLogger.kt @@ -0,0 +1,27 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package aws.smithy.kotlin.runtime.telemetry.logging.crt + +import aws.sdk.kotlin.crt.WithCrt +import aws.sdk.kotlin.crt.log +import aws.smithy.kotlin.runtime.telemetry.logging.LogLevel +import aws.smithy.kotlin.runtime.telemetry.logging.LogRecordBuilder +import aws.smithy.kotlin.runtime.telemetry.logging.Logger +import aws.smithy.kotlin.runtime.telemetry.logging.MessageSupplier +import aws.sdk.kotlin.crt.Config as CrtConfig +import aws.sdk.kotlin.crt.LogLevel as CrtLogLevel + +public class CrtLogger(public val name: String, public val config: CrtConfig) : + WithCrt(), + Logger { + override fun trace(t: Throwable?, msg: MessageSupplier): Unit = log(CrtLogLevel.Trace, msg()) + override fun debug(t: Throwable?, msg: MessageSupplier): Unit = log(CrtLogLevel.Debug, msg()) + override fun info(t: Throwable?, msg: MessageSupplier): Unit = log(CrtLogLevel.Info, msg()) + override fun warn(t: Throwable?, msg: MessageSupplier): Unit = log(CrtLogLevel.Warn, msg()) + override fun error(t: Throwable?, msg: MessageSupplier): Unit = log(CrtLogLevel.Error, msg()) + override fun isEnabledFor(level: LogLevel): Boolean = config.logLevel.ordinal >= level.ordinal + override fun atLevel(level: LogLevel): LogRecordBuilder = CrtLogRecordBuilder(this, level) +} diff --git a/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLoggerProvider.kt b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLoggerProvider.kt new file mode 100644 index 0000000000..31259e9804 --- /dev/null +++ b/runtime/observability/logging-crt/native/src/aws/smithy/kotlin/runtime/telemetry/logging/crt/CrtLoggerProvider.kt @@ -0,0 +1,14 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package aws.smithy.kotlin.runtime.telemetry.logging.crt + +import aws.smithy.kotlin.runtime.telemetry.logging.* +import aws.sdk.kotlin.crt.Config as CrtConfig + +public class CrtLoggerProvider : LoggerProvider { + override fun getOrCreateLogger(name: String): Logger = CrtLogger(name, CrtConfig()) + public fun getOrCreateLogger(name: String, config: CrtConfig): Logger = CrtLogger(name, config) +} diff --git a/runtime/observability/logging-slf4j2/build.gradle.kts b/runtime/observability/logging-slf4j2/build.gradle.kts index 2fd9ad4c70..1f2bd3ad69 100644 --- a/runtime/observability/logging-slf4j2/build.gradle.kts +++ b/runtime/observability/logging-slf4j2/build.gradle.kts @@ -4,7 +4,7 @@ */ description = "Logging provider based on SLF4J" extra["displayName"] = "Smithy :: Kotlin :: Observability :: SLF4J binding" -extra["moduleName"] = "aws.smithy.kotlin.runtime.telemetry" +extra["moduleName"] = "aws.smithy.kotlin.runtime.telemetry.slf4j" kotlin { sourceSets { diff --git a/runtime/observability/telemetry-defaults/build.gradle.kts b/runtime/observability/telemetry-defaults/build.gradle.kts index e77655c91d..357b11d80e 100644 --- a/runtime/observability/telemetry-defaults/build.gradle.kts +++ b/runtime/observability/telemetry-defaults/build.gradle.kts @@ -24,6 +24,12 @@ kotlin { } } + nativeMain { + dependencies { + implementation(project(":runtime:observability:logging-crt")) + } + } + all { languageSettings.optIn("aws.smithy.kotlin.runtime.InternalApi") } diff --git a/runtime/observability/telemetry-defaults/native/src/aws/smithy/kotlin/runtime/telemetry/logging/DefaultLoggerProviderNative.kt b/runtime/observability/telemetry-defaults/native/src/aws/smithy/kotlin/runtime/telemetry/logging/DefaultLoggerProviderNative.kt index 1d8bec0441..506d10869d 100644 --- a/runtime/observability/telemetry-defaults/native/src/aws/smithy/kotlin/runtime/telemetry/logging/DefaultLoggerProviderNative.kt +++ b/runtime/observability/telemetry-defaults/native/src/aws/smithy/kotlin/runtime/telemetry/logging/DefaultLoggerProviderNative.kt @@ -5,4 +5,6 @@ package aws.smithy.kotlin.runtime.telemetry.logging -internal actual val DefaultLoggerProvider: LoggerProvider = TODO("Not yet implemented") +import aws.smithy.kotlin.runtime.telemetry.logging.crt.CrtLoggerProvider + +internal actual val DefaultLoggerProvider: LoggerProvider = CrtLoggerProvider() diff --git a/runtime/protocol/http-client-engines/http-client-engine-default/build.gradle.kts b/runtime/protocol/http-client-engines/http-client-engine-default/build.gradle.kts index d2381c39f0..321be4f532 100644 --- a/runtime/protocol/http-client-engines/http-client-engine-default/build.gradle.kts +++ b/runtime/protocol/http-client-engines/http-client-engine-default/build.gradle.kts @@ -16,19 +16,28 @@ kotlin { implementation(project(":runtime:runtime-core")) } } + jvmMain { dependencies { // okhttp works on both JVM and Android implementation(project(":runtime:protocol:http-client-engines:http-client-engine-okhttp")) } } + jvmTest { dependencies { implementation(project(":runtime:protocol:http-client-engines:http-client-engine-crt")) } } + all { languageSettings.optIn("aws.smithy.kotlin.runtime.InternalApi") } + + nativeMain { + dependencies { + implementation(project(":runtime:protocol:http-client-engines:http-client-engine-crt")) + } + } } } diff --git a/runtime/protocol/http-client-engines/http-client-engine-default/native/src/aws/smithy/kotlin/runtime/http/engine/DefaultHttpEngineNative.kt b/runtime/protocol/http-client-engines/http-client-engine-default/native/src/aws/smithy/kotlin/runtime/http/engine/DefaultHttpEngineNative.kt index d9d060337f..6c0a4af219 100644 --- a/runtime/protocol/http-client-engines/http-client-engine-default/native/src/aws/smithy/kotlin/runtime/http/engine/DefaultHttpEngineNative.kt +++ b/runtime/protocol/http-client-engines/http-client-engine-default/native/src/aws/smithy/kotlin/runtime/http/engine/DefaultHttpEngineNative.kt @@ -5,5 +5,6 @@ package aws.smithy.kotlin.runtime.http.engine -internal actual fun newDefaultHttpEngine(block: (HttpClientEngineConfig.Builder.() -> Unit)?): CloseableHttpClientEngine = - TODO("Not yet implemented") +import aws.smithy.kotlin.runtime.http.engine.crt.CrtHttpEngine + +internal actual fun newDefaultHttpEngine(block: (HttpClientEngineConfig.Builder.() -> Unit)?): CloseableHttpClientEngine = CrtHttpEngine() diff --git a/settings.gradle.kts b/settings.gradle.kts index bfd379d2ec..4d9de3eae7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -75,6 +75,7 @@ include(":runtime:auth:http-auth-api") include(":runtime:auth:http-auth-aws") include(":runtime:auth:identity-api") include(":runtime:crt-util") +include(":runtime:observability:logging-crt") include(":runtime:observability:logging-slf4j2") include(":runtime:observability:telemetry-api") include(":runtime:observability:telemetry-defaults")