mirror of
https://github.com/mii443/prometheus-android-exporter.git
synced 2025-08-22 15:15:35 +00:00
remove expired remote write metrics on export
This commit is contained in:
@ -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)
|
||||
|
@ -18,7 +18,6 @@ class Util {
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
),
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user