Browse Source

Icon, cache & timer counter

isundil 4 years ago
parent
commit
1037e57738

BIN
app/src/main/ic_launcher-playstore.png


+ 9 - 24
app/src/main/java/info/knacki/prometheusandroidexporter/CollectorManager.java

@@ -1,13 +1,10 @@
 package info.knacki.prometheusandroidexporter;
 
-import androidx.annotation.NonNull;
-
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
-public class CollectorManager implements Iterable<CollectorValue> {
+public class CollectorManager {
     private static CollectorManager sInstance = null;
     private final HashMap<String, ICollector> fCollectors;
     private HashMap<String, Collection<CollectorValue>> fValues;
@@ -41,26 +38,14 @@ public class CollectorManager implements Iterable<CollectorValue> {
         }
     }
 
-    @NonNull
-    @Override
-    public Iterator<CollectorValue> iterator() {
-        return new Iterator<CollectorValue>() {
-            private final Iterator<Map.Entry<String, Collection<CollectorValue>>> mainIterator = fValues.entrySet().iterator();
-            private Iterator<CollectorValue> secondIterator = null;
-
-            @Override
-            public boolean hasNext() {
-                if (secondIterator == null)
-                    return mainIterator.hasNext();
-                return secondIterator.hasNext() || mainIterator.hasNext();
-            }
+    public interface Runnable {
+        void Run(CollectorValue value);
+    }
 
-            @Override
-            public CollectorValue next() {
-                if (secondIterator == null || secondIterator.hasNext())
-                    secondIterator = mainIterator.next().getValue().iterator();
-                return secondIterator.next();
-            }
-        };
+    public void forEach(Runnable action) {
+        for (Map.Entry<String, Collection<CollectorValue>> i: fValues.entrySet()) {
+            for (CollectorValue j: i.getValue())
+                action.Run(j);
+        }
     }
 }

+ 11 - 8
app/src/main/java/info/knacki/prometheusandroidexporter/HttpService.java

@@ -51,10 +51,10 @@ public class HttpService {
     }
 
     private void SendResponse(HttpExchange exh, int code, String contentType, String response) throws IOException {
-        exh.sendResponseHeaders(code, response.length());
         if (contentType != null)
             exh.getResponseHeaders().add("Content-Type", contentType +"; charset=" +Charset.defaultCharset().displayName());
-        // FIXME cache control
+        exh.getResponseHeaders().add("Content-Cache", "max-age=60"); // 1 minutes cache
+        exh.sendResponseHeaders(code, response.length());
         OutputStream os = exh.getResponseBody();
         os.write(response.getBytes());
         os.flush();
@@ -81,12 +81,15 @@ public class HttpService {
     private void ServeMetrics(HttpExchange httpExchange) throws IOException {
         if (FilterRequests(httpExchange))
             return;
-        StringBuilder os = new StringBuilder();
-        for (CollectorValue i : CollectorManager.GetInstance()) {
-            os.append("# HELP ").append(i.fName).append(" ").append(i.fHelp).append("\n");
-            os.append("# TYPE ").append(i.fName).append(" ").append(i.fType.fName).append("\n");
-            os.append(i.fName).append(" ").append(i.toString()).append("\n");
-        }
+        final StringBuilder os = new StringBuilder();
+        CollectorManager.GetInstance().forEach(new CollectorManager.Runnable() {
+            @Override
+            public void Run(CollectorValue i) {
+                os.append("# HELP ").append(i.fName).append(" ").append(i.fHelp).append("\n");
+                os.append("# TYPE ").append(i.fName).append(" ").append(i.fType.fName).append("\n");
+                os.append(i.fName).append(" ").append(i.toString()).append("\n");
+            }
+        });
         SendResponse(httpExchange, 200, "text/plain", os.toString());
     }
 }

+ 14 - 0
app/src/main/java/info/knacki/prometheusandroidexporter/MainService.java

@@ -1,5 +1,8 @@
 package info.knacki.prometheusandroidexporter;
 
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
@@ -29,6 +32,7 @@ public class MainService extends Service {
         catch (IOException e) {
             Logger.getLogger(MainService.class.getName()).log(Level.SEVERE, "Cannot start server: ", e);
         }
+        NotifyIcon();
     }
 
     @Nullable
@@ -45,4 +49,14 @@ public class MainService extends Service {
         PeriodicWorkRequest job = new PeriodicWorkRequest.Builder(CollectorWorker.class, 15, TimeUnit.MINUTES).build();
         WorkManager.getInstance(this).enqueue(job);
     }
+
+    private void NotifyIcon() {
+        Notification notif = (new Notification.Builder(this)
+            .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT))
+            .setSmallIcon(R.mipmap.ic_launcher)
+            .setContentTitle("Prometheus Android Exporter")
+            .setContentText("Service running")).build();
+        notif.flags = Notification.FLAG_ONGOING_EVENT;
+        ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(1, notif);
+    }
 }

+ 19 - 6
app/src/main/java/info/knacki/prometheusandroidexporter/collector/TestCollector.java

@@ -1,23 +1,36 @@
 package info.knacki.prometheusandroidexporter.collector;
 
 import java.util.ArrayDeque;
+import java.util.Calendar;
 import java.util.Collection;
 
 import info.knacki.prometheusandroidexporter.CollectorValue;
 import info.knacki.prometheusandroidexporter.ICollector;
 
 public class TestCollector implements ICollector {
-    private final CollectorValue countCollector = new CollectorValue("counter", "A count that counts", CollectorValue.Type.COUNTER);
+    private final CollectorValue countCollector = new CollectorValue("test_counter", "A count that counts", CollectorValue.Type.COUNTER);
+    private final CollectorValue timerCollector = new CollectorValue("test_timer", "A clock that counts", CollectorValue.Type.COUNTER);
     private int count =0;
 
-    @Override
-    public Collection<CollectorValue> ReadValues() {
-        ArrayDeque<CollectorValue> result = new ArrayDeque<>();
-
+    private CollectorValue ReadCounter() {
         CollectorValue val = new CollectorValue(countCollector);
         val.SetValue(count++);
-        result.add(val);
+        return val;
+    }
 
+    private CollectorValue ReadTimer() {
+        CollectorValue val = new CollectorValue(timerCollector);
+        Calendar cal = Calendar.getInstance();
+        int minutes = cal.get(Calendar.MINUTE);
+        val.SetValue(cal.get(Calendar.HOUR_OF_DAY) +(minutes < 10 ? "0" : "") +minutes);
+        return val;
+    }
+
+    @Override
+    public Collection<CollectorValue> ReadValues() {
+        ArrayDeque<CollectorValue> result = new ArrayDeque<>();
+        result.add(ReadCounter());
+        result.add(ReadTimer());
         return result;
     }
 }

+ 1 - 2
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
 </adaptive-icon>

+ 1 - 2
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
 </adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png