@@ -75,7 +75,8 @@ object Telemetry: Subscriber {
75
75
76
76
var host: String = Constants .DEFAULT_API_HOST
77
77
// 1.0 is 100%, will get set by Segment setting before start()
78
- var sampleRate: Double = 0.1
78
+ // Values are adjusted by the sampleRate on send
79
+ var sampleRate: Double = 1.0
79
80
var flushTimer: Int = 30 * 1000 // 30s
80
81
var httpClient: HTTPClient = HTTPClient (" " , MetricsRequestFactory ())
81
82
var sendWriteKeyOnError: Boolean = true
@@ -96,6 +97,7 @@ object Telemetry: Subscriber {
96
97
private val seenErrors = mutableMapOf<String , Int >()
97
98
private var started = false
98
99
private var rateLimitEndTime: Long = 0
100
+ private var flushFirstError = true
99
101
private val exceptionHandler = CoroutineExceptionHandler { _, t ->
100
102
errorHandler?.let {
101
103
it( Exception (
@@ -116,7 +118,7 @@ object Telemetry: Subscriber {
116
118
if (! enable || started || sampleRate == 0.0 ) return
117
119
started = true
118
120
119
- // Assume sampleRate is now set and everything in the queue hasn't had it applied
121
+ // Everything queued was sampled at default 100%, downsample adjustment and send will adjust values
120
122
if (Math .random() > sampleRate) {
121
123
resetQueue()
122
124
}
@@ -187,9 +189,13 @@ object Telemetry: Subscriber {
187
189
if (! metric.startsWith(METRICS_BASE_TAG )) return
188
190
if (tags.isEmpty()) return
189
191
if (queue.size >= maxQueueSize) return
192
+ if (Math .random() > sampleRate) return
190
193
191
- var filteredTags = tags.toMap()
192
- if (! sendWriteKeyOnError) filteredTags = tags.filterKeys { it.lowercase() != " writekey" }
194
+ var filteredTags = if (sendWriteKeyOnError) {
195
+ tags.toMap()
196
+ } else {
197
+ tags.filterKeys { it.lowercase() != " writekey" }
198
+ }
193
199
var logData: String? = null
194
200
if (sendErrorLogData) {
195
201
logData = if (log.length > errorLogSizeMax) {
@@ -199,23 +205,11 @@ object Telemetry: Subscriber {
199
205
}
200
206
}
201
207
202
- val errorKey = tags[" error" ]
203
- if (errorKey != null ) {
204
- if (seenErrors.containsKey(errorKey)) {
205
- seenErrors[errorKey] = seenErrors[errorKey]!! + 1
206
- if (Math .random() > sampleRate) return
207
- // Adjust how many we've seen after the first since we know for sure.
208
- addRemoteMetric(metric, filteredTags, log= logData,
209
- value = (seenErrors[errorKey]!! * sampleRate).toInt())
210
- seenErrors[errorKey] = 0
211
- } else {
212
- addRemoteMetric(metric, filteredTags, log= logData)
213
- flush()
214
- seenErrors[errorKey] = 0 // Zero because it's already been sent.
215
- }
216
- }
217
- else {
218
- addRemoteMetric(metric, filteredTags, log= logData)
208
+ addRemoteMetric(metric, filteredTags, log= logData)
209
+
210
+ if (flushFirstError) {
211
+ flushFirstError = false
212
+ flush()
219
213
}
220
214
}
221
215
@@ -339,12 +333,12 @@ object Telemetry: Subscriber {
339
333
system.settings?.let { settings ->
340
334
settings.metrics[" sampleRate" ]?.jsonPrimitive?.double?.let {
341
335
sampleRate = it
336
+ // We don't want to start telemetry until two conditions are met:
337
+ // Telemetry.enable is set to true
338
+ // Settings from the server have adjusted the sampleRate
339
+ // start is called in both places
340
+ start()
342
341
}
343
- // We don't want to start telemetry until two conditions are met:
344
- // Telemetry.enable is set to true
345
- // Settings from the server have adjusted the sampleRate
346
- // start is called in both places
347
- start()
348
342
}
349
343
}
350
344
0 commit comments