Reference: AWS: Cloudwatch Evidently

dependencies {
    
    implementation(platform("org.http4k:http4k-bom:6.36.0.0"))

    implementation("org.http4k:http4k-connect-amazon-evidently")
    implementation("org.http4k:http4k-connect-amazon-evidently-fake")
}

The Evidently connector provides the following Actions:

 *  CreateProject
 *  CreateFeature
 *  EvaluateFeature
 *  BatchEvaluateFeature
 *  DeleteFeature
 *  DeleteProject

Example usage

Kotlin example.kt
package content.ecosystem.connect.reference.amazon.evidently

import dev.forkhandles.result4k.onFailure
import org.http4k.aws.AwsCredentials
import org.http4k.client.JavaHttpClient
import org.http4k.connect.amazon.core.model.Region
import org.http4k.connect.amazon.evidently.Evidently
import org.http4k.connect.amazon.evidently.FakeEvidently
import org.http4k.connect.amazon.evidently.Http
import org.http4k.connect.amazon.evidently.createFeature
import org.http4k.connect.amazon.evidently.createProject
import org.http4k.connect.amazon.evidently.evaluateFeature
import org.http4k.connect.amazon.evidently.model.EntityId
import org.http4k.connect.amazon.evidently.model.FeatureName
import org.http4k.connect.amazon.evidently.model.ProjectName
import org.http4k.connect.amazon.evidently.model.VariableValue
import org.http4k.connect.amazon.evidently.model.VariationName
import org.http4k.core.HttpHandler
import org.http4k.filter.debug

const val USE_REAL_CLIENT = false

fun main() {
    // we can connect to the real service or the fake (drop in replacement)
    val http: HttpHandler = if (USE_REAL_CLIENT) JavaHttpClient() else FakeEvidently()

    // create a client
    val client = Evidently.Http(Region.of("us-east-1"), { AwsCredentials("accessKeyId", "secretKey") }, http.debug())

    val projectName = ProjectName.of("acme-service")
    val featureName = FeatureName.of("take-over-the-world")

    // create project
    client.createProject(projectName)
        .onFailure { it.reason.throwIt() }

    // create feature
    client.createFeature(
        project = projectName,
        name = featureName,
        defaultVariation = VariationName.of("bide-our-time"),
        variations = mapOf(
            VariationName.of("bide-our-time") to VariableValue(false),
            VariationName.of("it-is-time") to VariableValue(true)
        ),
        entityOverrides = mapOf(
            EntityId.of("test-subject-1") to VariationName.of("it-is-time")
        )
    ).onFailure { it.reason.throwIt() }

    // evaluate feature
    val result = client.evaluateFeature(projectName, featureName, EntityId.of("test-subject-2"))
        .onFailure { it.reason.throwIt() }

    println(result)
}

The client APIs utilise the http4k-platform-aws module for request signing, which means no dependencies on the incredibly fat Amazon-SDK JARs. This means this integration is perfect for running Serverless Lambdas where binary size is a performance factor.

Default Fake port: 45011

To start:

Kotlin fake.kt
package content.ecosystem.connect.reference.amazon.evidently

import org.http4k.chaos.start
import org.http4k.connect.amazon.evidently.FakeEvidently

val evidently = FakeEvidently().start()
scarf