Google Analytics mal anders: Monitoring von IoT Geräten

Google Analytics ist das Urgestein von Analytics Software und gehört seit 2005 zu Google. Mit der neuen Version Google Analytics 4 oder kurz GA4 werden neue Wege beschritten. Zugegeben: Es ist ein bisschen ein umdenken und umgewöhnen, aber so langsam finde ich mich damit ab.

Monitoring von IoT Geräte – Voraussetzungen

Wir haben eine handvoll an IoT Geräten im Einsatz. Diese verschicken über unser Lorawan und Stack Nachrichten an eine Endplattform. Also ganz konkret:

Ein Temperatursensor schickt die Temperatur alle 10 Minuten via Lorawan an ein Dashboard. Dort werden diese aufgezeichnet. Dann gibt es noch einen weiteren Regensensor, welcher die Daten alle 15 Minuten an eine andere Plattform schickt, um diese dort zu archivieren.

Beliebig viele IoT Sensoren schicken an beliebig viele Abnehmer.

Die Frage war jetzt:

  • Wie kann ich wissen, wieviele Geräte täglich/monatlich aktiv sind und den Distributor verwenden?
  • Welche Endabnehmer werden aktiv verwendet?

Warum sind diese Zahlen interessant?

Dafür gibt es drei einfache Gründe:

  • Die Verrechnung des Distributors geschieht in Abhängigkeit der Anzahl der verwendeten Geräte.
  • Eine Lastplanung. Die Architektur ist zwar so, dass sie theoretisch selbst skaliert. Kontrolle ist aber immer besser!
  • Ein sehr einfaches Monitoring. Gibt es allenfalls plötzlich Sprünge oder gar Lücken. Diese könnten auf Fehler hinweisen.

Lösungsansatz

Da der ganze Stack Serverless ist und auch keine einfach zugängliche Datenbank verfügbar ist, lässt sich nicht einfach ohne weiteres ein einfacher Counter hinzufügen. Ein naheliegender Ansatz wäre somit halt eine Datenbank anzudocken und eine kleine Applikation zu schreiben: = viel Aufwand.

Und wenn schon eine eigene Lösung, dann müsste es wohl eine Time-Series Datenbank sein, weil diese wiederum müsste eigentlich alle Events verbuchen. So à la InfluxDB oder gar ein fertiges Tool mit Grafana, wo man dann wiederum alle möglichen Auswertungen machen kann.

ABER: Wieder ein neues Tool, was mit zusätzlichen Kosten verbunden ist… wo ich doch eigentlich lediglich eine simple Anwendung suche, nämlich wieviele IoT Geräte sich monatlich über den Distributor verbinden.

Hallo Welt – Google Analytics

Dann die zündende Idee: Google Analytics brüstet sich, dass GA4 nicht mehr nur auf Webseiten beschränkt ist, sondern auf alles möglich und unmögliche. Defacto habe ich hier gratis eine gemanagte Timeseries Datenbank.

Wahrscheinlich haben die GA4 Ersteller nicht an diesen Usecase gedacht, aber hey… Das macht die Informatik doch gerade aus.

Und das ist die Lösung

Die Lösung ist so einfach wie brilliant. Ein kleines Snippet schickt bei jeder Message ein Event an Google Analytics:

def send_to_ga4(frame, device):
    config = current_app.config
    url = f\"https://www.google-analytics.com/mp/collect?measurement_id={config[\'GA4_MEASUREMENT_ID\']}&api_secret={config[\'GA4_API_SECRET\']}\"
    hash_object = hashlib.sha256(frame[\"devid\"].encode(\'utf-8\'))
    client_id = hash_object.hexdigest()
    session_id = client_id + datetime.now().strftime(\"%d%m%y\")
    payload = {
        \"client_id\": client_id,
        \"non_personalized_ads\": False,
        \"events\": [
            {
                \"name\": \"uplink\",
                \"params\": {
                    \"session_id\": session_id,
                    \"engagement_time_msec\": \"100\",
                }
            }
        ]
    }
    for application in device[\'application\']:
        payload[\"events\"].append(
            {
                \"name\": \"page_view\",
                \"params\": {
                    # \"page_location\": application[\"url\"],
                    \"page_title\": application[\"name\"]
                }
            }
        )
    r = requests.post(url,data=json.dumps(payload),verify=True)

Noch ein paar Erklärungen dazu:

  • Die client_id ist die ID des Geräts
  • Die session_id ist die ID des Geräts, plus das aktuelle Datum. Damit geht eine Session 1 Tag und ich kann somit zählen, wieviele Nachrichten ein Gerät pro Session (Tag) verschickt.
  • Die pages_views sind die Abnehmer. Damit wird ersichtlich, welche Abnehmer wieviel gebraucht werden.

Voilà. Und damit haben wir ein super einfaches Monitoring Tool gebaut. Sogar der Echtzeitbericht funktioniert. Und wenn man Koordinaten hätte, könnte man die Geräte sogar lokalisieren.

Über Datenschutz müssen wir uns für einmal keine Sorgen machen, da lediglich ein paar gehashte IDs übermittelt werden.