Erfahrungsbericht matomo Tracking Rauschen

Ist hier noch jemand dabei? Irgendwie scheint diese ganze Self-Tracking-Sache eher eingeschlafen zu sein. So mein Eindruck. Interessiert keinen wirklich mehr.

Meine Beobachtungen zeigen, dass diese Direkter Zugriff - 0 Sekunden - 1 Page Viewer vorwiegend von Clouds kommen. Da ist viel Amazon dabei, aber auch Google sowie exotische. Ich habe jetzt eine kleine größere Liste an IP-Ranges von solchen Viewern. Es ist sehr aufwendig diese zu erstellen. Ich muss jede IP eines solchen Viewers checken und den IP-Range herausfinden. Es wäre sehr hilfreich, wenn solche IP-Ranges zur Verfügung gestellt werden, wie zB von Amazon und Google Cloud. Diese haben mehrere und sehr viele.

Diesen Direkter Zugriff - 0 Sekunden - 1 Page Viewer, die meist von einer Cloud kommen, kann eine Falle gestellt werden, wie ich in letzter Zeit beobachte. Dazu muss im Header der Webpages der Website die Hauptdomain als canonical eingetragen werden. Dann eine zweite Domain auf die Website aufschalten und diese irgendwo unauffällig, am besten im Footer, zusammen mit der Hauptdomain verlinken, damit sie von den Crawlern gefunden wird. Diese Direkter Zugriff - 0 Sekunden - 1 Page Viewer springen auf diese zweite Domain an und es sind (bei mir) ausschließlich diese Direkter Zugriff - 0 Sekunden - 1 Page Viewer, die von einer Cloud kommen und diese Domain verwenden. Es sind nicht wenige. Es ist relevant.

Nur zur Info: Das ist glaube ich was

unter anderem macht

Danke für den Link zum Plugin, aber obwohl es ein Matomo Plugin ist, telefoniert es jedes mal mit den Cloud-Hostern. Unfein.
Beispiel:

        $aws = Http::sendHttpRequest('https://ip-ranges.amazonaws.com/ip-ranges.json', 120, null, null, 0,
            false, false, false, 'GET', null, null, false);

Taugt also nicht. Es können die IPs aus den JSONs extrahiert werden und im Matomo Backend Einstellungen in den IP-Filter eingetragen werden. Immerhin. Besser als nichts.

Headless Browser erkennen wäre eine feine Sache, aber dafür so ein Plugin installieren? Das sollte eine Default-Funktion von Matomo sein, zum an/abwählen.

Es sind insgesamt 70.040 IP-Ranges. Das ist echt heftig. Es sind einige doppelt, wohl bei Google Cloud und Google Digital Ocean. Nach dem filtern der Doppelten sind es noch 40.017 IP-Ranges.

Im Bezug zu dem verlinkten Plugin sei erwähnt, dass dieses die Doppelten mit drin hat und jedes Mal einen Call zu diesen Servern macht:

amazon aws
https://ip-ranges.amazonaws.com/ip-ranges.json

microsoft azure
https://www.microsoft.com/en-us/download/confirmation.aspx?id=56519

google digital ocean
https://www.digitalocean.com/geo/google.csv

google cloud
https://www.gstatic.com/ipranges/cloud.json

oracle cloud
https://docs.cloud.oracle.com/en-us/iaas/tools/public_ip_ranges.json

Wie zu erwarten ist es durchaus schwierig bis unmöglich all diese IP-Ranges in den Backend Einstellungen von Matomo einzutragen. Ich habe es geschafft. Am besten per Browser Inspektor vorher ein max-height: 500px; bei der Textarea einstellen.

Übrigens sind einige der von mir gesammelten IP-Ranges auch dabei, aber nicht alle. Von daher habe ich meine Sammlung bei mir hinten dran gehangen und auch nach Doppelten gefiltert.

Wenn jemand eine Idee hat, wie ich euch die 40.017 IP-Ranges zukommen lassen kann, dann her damit.

[editiert]
Es scheint etwas zu bringen. Aber erstmal 1 Woche, 1 Monat abwarten und dann nochmal nachsehen.

Ich habe jetzt zudem nochmal meinen Tracking-Code angepasst:

var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
_paq.push(['enableHeartBeatTimer', 10]); // ←HeartBeat all 10 seconds
setTimeout(function() { // ← Timeout 1 second
var u="//www.example.com/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', 1]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
}, 1000); // ← Timeout 1 second
setTimeout(function() { // ← Timeout 2 seconds
_paq.push(['ping']); // ← Ping after 2 seconds
}, 2000); // ← Timeout 2 seconds
window.addEventListener('beforeunload', function(e) {
	_paq.push(['ping']);
});

Also mit 1 Sekunde Timeout, bevor die Matomo-Skript-Datei geladen wird. Damit fallen alle “1 Aktion 0 Sekunden” raus. 1 Sekunde später ein Ping und zudem HeartBeat alle 10 Sekunden sowie beforeunload (das allerdings nicht bei allen funktioniert). Am heutigen Tag waren nur noch 2 mit “1 Aktion 0 Sekunden” dabei. Zudem waren diese von Google und nicht Direkte Zugriffe. Das ist eine immense Verbessererung gegenüber Gestern mit sehr vielen “1 Aktion 0 Sekunden”, die allerdings fast alle von Google kamen. Darunter waren ein paar Sonderlinge, die immer ein und die selbe Page und nur diese besuchen.

Ich werde das jetzt vorerst wohl so laufen lassen. Sieht für den ersten Tag auf einer meiner Websites ganz gut aus. Mehr Infos nach einer Analyse, wenn der Monat November durchgelaufen ist.

Hier noch eine Info zum Timeout:

Matomo zählt die Zeit nicht ab dem das Matomo-Skript geladen wird, sondern ab dem Zeitpunkt, ab dem die Webpage aufgerufen wird. Es geht also mit dem 1 Sekunde Timeout keine Zeit verloren. Aktuell habe ich sogar 2 Sekunden Timeout aktiv bevor das Matomo-Skript geladen wird und es werden Viewer mit 2 Sekunden Verweilzeit getrackt. Alles darunter nicht.

Beispiel:

Seite - Einstiegszeit - Zeit auf Seite
Seite1 - 19:03:09 - 3 Sekunden
Seite2 - 19:03:12 - 6 Sekunden
Seite3 - 19:03:18 - 8 Sekunden
Seite4 - 19:03:26 - 2 Sekunden
Seite5 - 19:03:28 - 5 Sekunden

Meine Websites sind sehr unterschiedlich und nutzen alle den selben Tracking-Code. Zurzeit habe ich ein Timeout von 2 Sekunden aktiv. Dabei ist auf einer Website, bei der sehr schnell durchgeklickt werden kann, zu beobachten, dass einige Page-Views nicht getrackt werden (fortlaufende Nummerierung der Pages mit Lücken im Tracking-Log). 2 Sekunden sind also (bei mir) zuviel. Ich werde das wieder auf 1 Sekunde heruntersetzen. Dann werden nur die Page-Views unter 1 Sekunde nicht getrackt. 1 Sekunde Verweilzeit sollte bei echten Viewern, bzw. als wirkliches Page-View (und nicht nur sinnloses durchklicken / wegklicken) schon drin sein.

Ich habe die Cloud IP range Liste mal hier veröffentlicht: https://github.com/matomoto/cloud-ip-list

Wegen den schnellen Durchklick-Viewern habe ich jetzt etwas eingebaut. Wenn der Referrer gleich der Domain/Hostname der Webpage ist, dann wird das Matomo-Skript sofort geladen, wenn nicht, dann 1 Sekunde warten. Anders gesagt: Hat ein Viewer bereits eine Page der Website besucht, dann wird das Skript sofort geladen, wenn nicht dann 1 Sekunde warten. Damit werden die Direkt Views mit 0 Sekunden sowie One-Page-Views mit 0 Sekunden nicht mehr getrackt. Falls Viewer ein Browser-Plugin verwenden, dass immer den Referrer löscht, so macht das wenig aus, da dann eben nur die 0 Sekunden Time on Page Visits bei Multi-Page-Viewern nicht getrackt werden, sowie alles ab 1 Sekunde getrackt wird.

var _paq = window._paq = window._paq || [];

function matomoscriptloader() {
var u="//example.com/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '0']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
}
if (document.referrer.includes(window.location.hostname) === true) {
matomoscriptloader();
} else {
setTimeout(function() {
matomoscriptloader();
}, 1000);
}

Die Beobachtung zeigt, dass nun auch 0 Sekunden Time on Page Visits bei Multi-Page-Viewer - wie gewünscht - getrackt werden.

Update.
Da schon wieder Direkt Views mit 0 Sekunden sowie 0 Actions dabei waren, die eventuell durchgerutscht sind, habe ich es nochmals mit einem readyState spezifiziert und die Zeit auf 1100 Millisekunden gesetzt.

if (document.referrer.includes(window.location.hostname) === true) {
matomoscriptloader();
} else {
var matomoreadystate = setInterval(function() {
if (document.readyState === "complete") {
setTimeout(function() {
matomoscriptloader();
}, 1100);
clearInterval(matomoreadystate);
}
}, 100);
}

Hinweis: Damit das _paq.push in einer Funktion funktioniert, muss _paq in window verwendet werden:

var _paq = window._paq = window._paq || [];

So zumindest habe ich das irgendwo gelesen. Alter Tracking Code verwendet var _paq = _paq || [];.

Ich habe immer noch Direkt Views mit ohne Sekunden sowie 1 Page und 0 Actions. Dagegen ist wohl nichts mehr zu machen. Vielleicht liegt das an den Devices oder Betriebssystemen oder Browser-Plugins. Es ist iOS und Android dabei. Es sind auch welche mit ohne Page dabei.

Heute waren wieder eindeutige Bots dabei. Zwischenzeitlich hatte ich das Laden der matomo.js vor ein paar Wochen auf setTimeout mit 10 Sekunden gestellt. Also es werden nur Visits getrackt, die mindestens 10 Sekunden auf einer Entry Page sind. Beim Besuch weiterer Pages gibt es kein solches setTimeout und es wird sofort getrackt.

Die betreffenden Visits heute haben insgesamt 5 verschiedene Websites (One Pager) besucht mit jeweils gleichem Verhalten.
Wegen dem setTimeout von 10 Sekunden müssen diese hinzugerechnet werden.
Alle: Chrome 110.0 - GNU/Linux - Desktop

~06:30
IP: 192.186.0.0
United States
Direct Entry
1 Action - 4s

~18:30
IP: 198.20.0.0
United States
Direct Entry
1 Action - 5s
~07:20
IP: 149.20.0.0
United States
Direct Entry
1 Action - 5s

~20:30
IP: 216.213.0.0
United States
Direct Entry
1 Action - 4s
~06:30
IP: 216.180.0.0
United States
Direct Entry
1 Action - 4s

~18:30
IP: 168.91.0.0
United States
Direct Entry
1 Action - 3s
~06:45
IP: 148.59.0.0
United States
Direct Entry
1 Action - 4s

~19:00
IP: 139.180.0.0
United States
Direct Entry
1 Action - 5s
~02:45
IP: 167.160.0.0
United States
Direct Entry
1 Action - 3s

~14:30
IP: 142.147.0.0
United States
Direct Entry
1 Action - 3s

Es ist nur ein vages und kein eindeutiges Muster zu erkennen.

Chrome 110.0 - GNU/Linux - Desktop
United States
Direct Entry
1 Action - 3-5s

Diese Bots scheinen stetig die IP zu wechseln.

Es ist sehr unwahrscheinlich, dass dies natürliche Personen sind, weil dieses Muster auf 5 verschiedenen Websites gleich auftritt.

Weitere solcher Bots auf einer Website, die über mehrere Domains erreichbar ist.
3 verschiedene Domains.
Alle Chrome 110.0 - GNU/Linux - Desktop.

~01:30
IP: 162.244.0.0
United States
Direct Entry
1 Action - 4s

~02:45
IP: 168.91.0.0
United States
Direct Entry
1 Action - 4s

~07:00
IP: 149.20.0.0
United States
Direct Entry
1 Action - 5s

Es hat den Anschein als wenn diese Bots das setTimeout abwarten.

Neue Erkenntnis: Headless Browser (Chrome) werden seit letztem Jahr(?) nicht mehr im User Agent erkenntlich gemacht und sind folglich nicht mehr darüber identifizierbar. Es werden aber weitere Daten bereitgestellt, mittels denen diese Headless Browser identifizierbar sind (JavaScript).

Hier mehr Infos dazu und ein JavasScript Code zum Erkennen dieser Headless Browser:
(experimentell)