Skip to content

Commit 43a2eaf

Browse files
committed
more kotlin examples
1 parent 36975d5 commit 43a2eaf

3 files changed

Lines changed: 143 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package dev.faststats.example
2+
3+
import dev.faststats.Attributes
4+
import dev.faststats.ErrorTracker
5+
import dev.faststats.FastStatsContext
6+
import dev.faststats.SimpleContext
7+
import java.lang.reflect.InvocationTargetException
8+
import java.nio.file.AccessDeniedException
9+
10+
object KotlinErrorTrackerExample {
11+
// Context-aware: automatically tracks uncaught errors from the same class loader
12+
val CONTEXT_AWARE: ErrorTracker = ErrorTracker.contextAware() // Filter expected noise before it is submitted
13+
.ignoreError(InvocationTargetException::class.java, "Expected .* but got .*")
14+
.ignoreError(AccessDeniedException::class.java)
15+
16+
// Context-unaware: only tracks errors passed to trackError() manually
17+
val CONTEXT_UNAWARE: ErrorTracker =
18+
ErrorTracker.contextUnaware() // Replace sensitive values in error messages before submission
19+
.anonymize("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$", "[email hidden]")
20+
.anonymize("Bearer [A-Za-z0-9._~+/=-]+", "Bearer [token hidden]")
21+
.anonymize("AKIA[0-9A-Z]{16}", "[aws-key hidden]")
22+
.anonymize("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", "[uuid hidden]")
23+
.anonymize("([?&](?:api_?key|token|secret)=)[^&\\s]+", "$1[redacted]")
24+
25+
val CONTEXT: FastStatsContext = contextFactory
26+
.errorTrackerService(CONTEXT_AWARE) // Set the global/internal error tracker
27+
.create()
28+
29+
init {
30+
// Attributes on the global error tracker are attached to all reports
31+
CONTEXT_AWARE.getAttributes()
32+
.put("environment", "production")
33+
.put("component", "global-error-handler")
34+
35+
// Tracker-wide attributes are attached to every report submitted by this tracker
36+
CONTEXT_UNAWARE.getAttributes()
37+
.put("component", "manual-error-handler")
38+
39+
// Register an additional tracker for submission
40+
CONTEXT.errorTrackerService().orElseThrow().registerErrorTracker(CONTEXT_UNAWARE)
41+
}
42+
43+
fun manualTracking() {
44+
try {
45+
throw RuntimeException("Something went wrong!")
46+
} catch (e: Exception) {
47+
CONTEXT_UNAWARE.trackError(e) // Add additional attributes for more context
48+
.attributes(
49+
Attributes.empty()
50+
.put("operation", "manualTracking")
51+
.put("severity", "warning")
52+
.put("retryable", false)
53+
) // Define whether the error was properly handled
54+
.handled(false)
55+
}
56+
}
57+
58+
private val contextFactory: SimpleContext.Factory<*, *>
59+
get() = throw UnsupportedOperationException()
60+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.faststats.example
2+
3+
import dev.faststats.*
4+
import java.time.Duration
5+
import java.util.function.Consumer
6+
7+
object KotlinFeatureFlagExample {
8+
val CONTEXT: FastStatsContext = contextFactory
9+
// .featureFlagService(FeatureFlagService.Factory::create) // Define a feature flag service with default settings
10+
.featureFlagService { factory: FeatureFlagService.Factory? ->
11+
factory!!
12+
.attributes(
13+
Attributes.empty() // Define global attributes
14+
.put("version", "1.2.3")
15+
.put("java_version", System.getProperty("java.version"))
16+
.put("java_vendor", System.getProperty("java.vendor"))
17+
)
18+
.ttl(Duration.ofMinutes(10)) // Custom cache TTL for resolved flag values
19+
.create()
20+
}.create()
21+
22+
val SERVICE: FeatureFlagService = CONTEXT.featureFlagService().orElseThrow()
23+
24+
// Define flags with default values
25+
val NEW_COMMANDS: FeatureFlag<Boolean> = SERVICE.define("new_commands", false)
26+
val COMPRESSION: FeatureFlag<String> = SERVICE.define("compression", "zstd")
27+
28+
fun usage() {
29+
// Async: waits for the server value to be fetched
30+
NEW_COMMANDS.whenReady().thenAccept(Consumer { enabled: Boolean? ->
31+
if (enabled == true) {
32+
// register new commands
33+
}
34+
})
35+
36+
// Non-blocking: returns the cached value if present without triggering a fetch
37+
COMPRESSION.getCached().ifPresent(Consumer { compression: String? ->
38+
when (compression) {
39+
"zstd" -> {}
40+
"lz4" -> {}
41+
else -> {}
42+
}
43+
})
44+
45+
// Refresh stale values explicitly when your code decides it is needed
46+
if (COMPRESSION.isExpired()) {
47+
COMPRESSION.fetch().thenAccept(Consumer { })
48+
}
49+
50+
// Opt-in/out (requires allow_specific_opt_in on server)
51+
NEW_COMMANDS.optIn().thenAccept(Consumer { updatedValue: Boolean? ->
52+
if (updatedValue == true) {
53+
// react to the updated server value
54+
}
55+
})
56+
NEW_COMMANDS.optOut().thenAccept(Consumer { updatedValue: Boolean? ->
57+
if (!updatedValue!!) {
58+
// react to the updated server value
59+
}
60+
})
61+
}
62+
63+
private val contextFactory: SimpleContext.Factory<*, *>
64+
get() = throw UnsupportedOperationException()
65+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.faststats.example
2+
3+
import dev.faststats.data.Metric
4+
5+
object KotlinMetricTypesExample {
6+
// Single value metrics
7+
val PLAYER_COUNT: Metric<Number> = Metric.number("player_count") { 42 }
8+
val SERVER_VERSION: Metric<String> = Metric.string("server_version") { "1.0.0" }
9+
val MAINTENANCE_MODE: Metric<Boolean> = Metric.bool("maintenance_mode") { false }
10+
11+
// Array metrics
12+
val INSTALLED_PLUGINS: Metric<Array<String>> = Metric.stringArray("installed_plugins") {
13+
arrayOf("WorldEdit", "Essentials")
14+
}
15+
val WORLDS: Metric<Array<String>> = Metric.stringArray("worlds") {
16+
arrayOf("city", "farmworld", "farmworld_nether", "famrworld_end")
17+
}
18+
}

0 commit comments

Comments
 (0)