|
| 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 | +} |
0 commit comments