mirror of
https://github.com/mii443/prometheus-android-exporter.git
synced 2025-08-22 15:15:35 +00:00
sync
This commit is contained in:
@ -1,3 +0,0 @@
|
|||||||
package com.birdthedeveloper.prometheus.android.prometheus.android.exporter.worker
|
|
||||||
|
|
||||||
//TODO
|
|
@ -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")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
@ -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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user