remove expired remote write metrics on export

This commit is contained in:
Martin Ptáček
2023-06-16 18:43:17 +02:00
parent 9d89aea252
commit 4d25b0f625
3 changed files with 73 additions and 5 deletions

View File

@ -106,10 +106,36 @@ data class TimeSeriesSample(
private typealias ConverterHashMap = HashMap<List<TimeSeriesLabel>, MutableList<TimeSeriesSample>>
abstract class RemoteWriteSenderStorage {
private val remoteWriteLabel: TimeSeriesLabel = TimeSeriesLabel(
name = "backfill",
value = "true",
)
companion object{
private const val maxMetricsAge : Int = 58 * 60 // 58 minutes
private val remoteWriteLabel: TimeSeriesLabel = TimeSeriesLabel(
name = "backfill",
value = "true",
)
fun filterExpiredMetrics(metrics : MutableList<MetricsScrape>){
val oldestMetricTimeMs : Long = System.currentTimeMillis() - maxMetricsAge * 1000
var howManyMetricsRemove : Int = 0
// count how many metrics to remove
for (i in 0 until metrics.size){
val scrape : MetricsScrape = metrics[i]
if(scrape.timeSeriesList.isNotEmpty()){
if(scrape.timeSeriesList.first().sample.timeStampMs < oldestMetricTimeMs){
howManyMetricsRemove++
}else{
break; // I suppose scrapes were performed one after another
}
}
}
// remove metrics
for (i in 1..howManyMetricsRemove){
metrics.removeFirst()
}
}
}
protected fun encodeWithSnappy(data: ByteArray): ByteArray {
return Snappy.compress(data)
@ -205,6 +231,8 @@ class RemoteWriteSenderSimpleMemoryStorage : RemoteWriteSenderStorage() {
}
Log.d(TAG, "Getting scraped samples: ${scrapedMetrics.size} samples")
filterExpiredMetrics(scrapedMetrics)
val writeRequest: WriteRequest = this.metricsScrapeListToProtobuf(scrapedMetrics.toList())
val bytes: ByteArray = writeRequest.toByteArray()
return this.encodeWithSnappy(bytes)

View File

@ -0,0 +1,41 @@
package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker
import org.junit.Assert.*
import org.junit.Test
class RemoteWriteSenderStorageTest{
@Test
fun `basic test filterExpiredMetrics`(){
val metrics : MutableList<MetricsScrape> = mutableListOf(
// MetricSamples must be ordered
createDummyMetricsScrape(70),
createDummyMetricsScrape(50),
createDummyMetricsScrape(30),
)
// execute SUT
RemoteWriteSenderStorage.filterExpiredMetrics(metrics)
assertEquals(2, metrics.size)
// assert the right order
val firstTimeStamp = metrics[0].timeSeriesList[0].sample.timeStampMs
val secondTimeStamp = metrics[1].timeSeriesList[0].sample.timeStampMs
assertTrue(firstTimeStamp < secondTimeStamp)
}
private fun createDummyMetricsScrape(ageInMinutes : Int) : MetricsScrape{
return MetricsScrape(
timeSeriesList = listOf(
StorageTimeSeries(
labels = listOf<TimeSeriesLabel>(),
sample = TimeSeriesSample(
// too old
timeStampMs = System.currentTimeMillis() - ageInMinutes * 60 * 1000L,
value = 0.0,
),
)
)
)
}
}