This commit is contained in:
Martin Ptáček
2023-06-21 00:01:31 +02:00
parent b4cea4d2fd
commit d7c0af105e
4 changed files with 169 additions and 104 deletions

View File

@ -1,3 +0,0 @@
package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker
//TODO

View File

@ -0,0 +1,102 @@
package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker
import android.content.Context
import androidx.room.Dao
import androidx.room.Database
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.Room
import androidx.room.RoomDatabase
//TODO
@Entity
data class RoomTimeSeries {
}
@Entity
data class RoomSample(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val timeStamp : Long,
val value : Double,
)
@Database(
entities = [RoomTimeSeries::class, RoomSample::class],
version = 1
)
abstract class RemoteWriteDatabase: RoomDatabase() {
abstract val dao: RoomDao
}
@Dao
interface RoomDao {
@Query("")//TODO
fun insertOneTimeSeriesSample(){
}
@Query("") //TODO
fun getNumberOfTimeSeriesSamples(){
}
@Query("") //TODO
fun getTotalNumberOfSamples(){
}
}
class RemoteWriteSenderDbStorage(getContext: () -> Context) : RemoteWriteSenderStorage(){
private val roomDb by lazy {
Room.databaseBuilder(
getContext(),
RemoteWriteDatabase::class.java,
"contacts.db"
).build()
}
private fun encodeLabels(labelsList: List<TimeSeriesLabel>) : String{
//TODO
var result : String = ""
for (label in labelsList){
// check if label contains escape character
if (label.name.contains("-") || label.value.contains("-")){
throw IllegalArgumentException("Time series labels should not contain \'-\'")
}else{
//TODO
}
}
return result
}
private fun decodeLabels(labels : String) : List<TimeSeriesLabel> {
//TODO
}
override fun writeScrapedSample(metricsScrape: MetricsScrape) {
TODO("Not yet implemented")
}
override fun getScrapedSamplesCompressedProtobuf(howMany: Int): ByteArray {
TODO("Not yet implemented")
}
override fun removeNumberOfScrapedSamples(number: Int) {
TODO("Not yet implemented")
}
override fun isEmpty(): Boolean {
TODO("Not yet implemented")
}
override fun getLength(): Int {
TODO("Not yet implemented")
}
}

View File

@ -1,16 +1,18 @@
package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker
import android.util.Log import android.util.Log
import remote.write.RemoteWrite
import java.util.LinkedList import java.util.LinkedList
import java.util.Queue import java.util.Queue
// HashMap<List of labels including name, List of TimeSeries samples to this TimeSeries> // HashMap<List of labels including name, List of TimeSeries samples to this TimeSeries>
private typealias ConverterHashMap = HashMap<List<TimeSeriesLabel>, MutableList<TimeSeriesSample>> private typealias ConverterHashMap = HashMap<List<TimeSeriesLabel>, MutableList<TimeSeriesSample>>
class RemoteWriteSenderMemoryStorage : RemoteWriteSenderStorage() { class RemoteWriteSenderMemStorage : RemoteWriteSenderStorage() {
private fun filterExpiredMetrics(metrics : MutableList<MetricsScrape>){ private fun filterExpiredMetrics(metrics : MutableList<MetricsScrape>){
val oldestMetricTimeMs : Long = System.currentTimeMillis() - maxMetricsAge * 1000 val now : Long = System.currentTimeMillis()
val oldestMetricTimeMs : Long = now() - maxMetricsAge * 1000
var howManyMetricsRemove : Int = 0 var howManyMetricsRemove : Int = 0
// count how many metrics to remove // count how many metrics to remove
@ -36,7 +38,7 @@ class RemoteWriteSenderMemoryStorage : RemoteWriteSenderStorage() {
labels: List<TimeSeriesLabel>, samples: MutableList<TimeSeriesSample> labels: List<TimeSeriesLabel>, samples: MutableList<TimeSeriesSample>
): TimeSeries { ): TimeSeries {
val timeSeriesBuilder: TimeSeries.Builder = TimeSeries.newBuilder() val timeSeriesBuilder: RemoteWrite.TimeSeries.Builder = RemoteWrite.TimeSeries.newBuilder()
timeSeriesBuilder.addAllLabels(labels.map { timeSeriesBuilder.addAllLabels(labels.map {
it.toProtobufLabel() it.toProtobufLabel()
@ -148,4 +150,62 @@ class RemoteWriteSenderMemoryStorage : RemoteWriteSenderStorage() {
override fun getLength(): Int { override fun getLength(): Int {
return data.count() return data.count()
} }
} }
//TODO sort this out
class RemoteWriteSenderSimpleMemoryStorage : RemoteWriteSenderStorage() {
private val data: Queue<MetricsScrape> = LinkedList()
override fun getScrapedSamplesCompressedProtobuf(howMany: Int): ByteArray {
if (howMany < 1) {
throw IllegalArgumentException("howMany must be bigger than zero")
}
val scrapedMetrics: MutableList<MetricsScrape> = mutableListOf()
for (i in 1..howMany) {
val oneMetric: MetricsScrape? = data.poll()
if (oneMetric == null) {
break
} else {
scrapedMetrics.add(oneMetric)
}
}
Log.d(TAG, "Getting scraped samples: ${scrapedMetrics.size} samples")
filterExpiredMetrics(scrapedMetrics)
val writeRequest: RemoteWrite.WriteRequest = this.metricsScrapeListToProtobuf(scrapedMetrics.toList())
val bytes: ByteArray = writeRequest.toByteArray()
return this.encodeWithSnappy(bytes)
}
//TODO use this thing
override fun removeNumberOfScrapedSamples(number: Int) {
if (number > 0) {
for (i in 1..number) {
if(data.isEmpty()){
break;
}else{
data.remove()
}
}
} else {
throw IllegalArgumentException("number must by higher than 0")
}
}
override fun writeScrapedSample(metricsScrape: MetricsScrape) {
Log.d(TAG, "Writing scraped sample to storage")
data.add(metricsScrape)
}
override fun isEmpty(): Boolean {
return data.isEmpty()
}
override fun getLength(): Int {
return data.count()
}
}

View File

@ -104,13 +104,13 @@ data class TimeSeriesSample(
abstract class RemoteWriteSenderStorage { abstract class RemoteWriteSenderStorage {
companion object{ companion object{
protected const val maxMetricsAge : Int = 58 * 60 // 58 minutes const val maxMetricsAge : Int = 58 * 60 // 58 minutes
protected val remoteWriteLabel: TimeSeriesLabel = TimeSeriesLabel( val remoteWriteLabel: TimeSeriesLabel = TimeSeriesLabel(
name = "backfill", name = "backfill",
value = "true", value = "true",
) )
protected fun encodeWithSnappy(data: ByteArray): ByteArray { fun encodeWithSnappy(data: ByteArray): ByteArray {
return Snappy.compress(data) return Snappy.compress(data)
} }
} }
@ -122,97 +122,3 @@ abstract class RemoteWriteSenderStorage {
abstract fun getLength(): Int abstract fun getLength(): Int
} }
class RemoteWriteSenderSimpleMemoryStorage : RemoteWriteSenderStorage() {
private val data: Queue<MetricsScrape> = LinkedList()
override fun getScrapedSamplesCompressedProtobuf(howMany: Int): ByteArray {
if (howMany < 1) {
throw IllegalArgumentException("howMany must be bigger than zero")
}
val scrapedMetrics: MutableList<MetricsScrape> = mutableListOf()
for (i in 1..howMany) {
val oneMetric: MetricsScrape? = data.poll()
if (oneMetric == null) {
break
} else {
scrapedMetrics.add(oneMetric)
}
}
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)
}
//TODO use this thing
override fun removeNumberOfScrapedSamples(number: Int) {
if (number > 0) {
for (i in 1..number) {
if(data.isEmpty()){
break;
}else{
data.remove()
}
}
} else {
throw IllegalArgumentException("number must by higher than 0")
}
}
override fun writeScrapedSample(metricsScrape: MetricsScrape) {
Log.d(TAG, "Writing scraped sample to storage")
data.add(metricsScrape)
}
override fun isEmpty(): Boolean {
return data.isEmpty()
}
override fun getLength(): Int {
return data.count()
}
}
@Entity
data class RoomLabel {
@PrimaryKey
}
@Entity
data class RoomTimeSeries {
}
interface RoomDao {
@Query
fun insertOneTimeSeriesSample(){
}
}
class RemoteWriteSenderDatabaseStorage : RemoteWriteSenderStorage() {
override fun getScrapedSamplesCompressedProtobuf(howMany: Int): ByteArray {
TODO("Not yet implemented")
}
override fun removeNumberOfScrapedSamples(number: Int) {
TODO("Not yet implemented")
}
override fun writeScrapedSample(metricsScrape: MetricsScrape) {
TODO("Not yet implemented")
}
override fun isEmpty(): Boolean {
TODO("Not yet implemented")
}
override fun getLength(): Int {
TODO("Not yet implemented")
}
}