2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Le nom scientifique est Event Tracking, qui se concentre principalement sur la capture, le traitement et l'envoi de technologies associées et de processus de mise en œuvre pour le comportement des utilisateurs ou les processus métier.
Enterrer un point est un terme professionnel dans le domaine des données, et c'est également un nom courant dans le domaine Internet.
Les points enterrés constituent la base de l'analyse des données produits et sont généralement utilisés pour le retour d'expérience des systèmes de recommandation, le suivi et l'analyse du comportement des utilisateurs, l'analyse statistique de nouvelles fonctions ou des effets de l'activité opérationnelle, etc.
Les points d'intégration incluent deux concepts importants : événement (event) et attribut (param)
L'enfouissement sans trace (enfouissement complet) utilise la méthode de surveillance intégrée du navigateur ou de l'application pour surveiller la page de navigation, les clics et d'autres comportements de l'utilisateur. Il est généralement utilisé pour l'analyse de données à gros grains, telles que le slardar de l'entreprise.
défaut:
Points d'enfouissement du code, les développeurs front-end personnalisent la surveillance et la collecte dans le code
défaut:
SDK de points enterrés, le SDK expose l'interface de reporting des points enterrés, et les développeurs ne connaissent pas le processus de surveillance et de collecte, comme le thé de l'entreprise
Inconvénients : NA
avantage:
Habituellement, le front-end compte les points enterrés en fonction des dimensions de la page. Les attributs d'événement courants sont les suivants :
Les attributs | décrire |
---|---|
identifiant utilisateur | L'identifiant de l'utilisateur, si l'utilisateur n'est pas connecté, renvoie un identifiant d'identification spécifique |
URL | L'URL de la page de déclenchement de l'événement en cours |
heure de l'évènement | L'horodatage qui a déclenché le point caché |
heure locale | L'heure locale de l'utilisateur qui a déclenché le point masqué est exprimée au format standard AAAA=MM-JJ HH:mm:ss, ce qui est pratique pour une requête de chaîne directe ultérieure. |
type d'appareil | Le type d'appareil actuellement utilisé par l'utilisateur, tel que Apple, Samsung, Chrome |
Reference de l'appareil | L'identifiant de l'appareil utilisé par l'utilisateur actuel |
Type d'os | Le type de système entre Windows, Macos, iOS, Android |
osVersion | version du système |
version de l'application | Version de l'application |
identifiant de l'application | Identifiant actuel de l'application |
supplémentaire | Les données personnalisées, généralement des chaînes sérialisées, et la structure des données doivent rester stables |
événement | Temps de rapport | décrire |
---|---|---|
Rester la page | Lorsque la page actuelle change ou que la page est déchargée | Enregistrer le temps de navigation de la page précédente |
PV | En entrant dans la page | Nombre de visites de pages, uv doit uniquement être filtré en fonction de l'ID de l'appareil |
événements d'interaction | Lorsqu'un événement d'interaction utilisateur est déclenché | Comme un clic, un appui long, etc. |
événement logique | Lorsque les conditions logiques sont remplies | Tels que la connexion, la page de saut, etc. |
Actuellement, la plupart des données des indicateurs de performances proviennent de l'API window.performance.
le nom du paramètre | décrire |
---|---|
connecterFin | HTTP (TCP) Renvoie l'horodatage lorsque la connexion entre le navigateur et le serveur a été établie. Si une connexion persistante est établie, la valeur de retour est égale à la valeur de l'attribut fetchStart. L'établissement de la connexion fait référence à l'achèvement de tous les échanges et processus d'authentification. |
ConnecterDémarrer | Horodatage HTTP (TCP) à la fin de la requête du nom de domaine. Si une connexion persistante est utilisée ou si les informations sont stockées dans un cache ou une ressource locale, cette valeur sera cohérente avec fetchStart. |
domComplet | L'analyse du document en cours est terminée, c'est-à-dire l'horodatage lorsque Document.readyState devient « terminé » et le changement d'état prêt correspondant est déclenché. |
domContentLoadedEventEnd | L'horodatage lorsque tous les scripts qui doivent être exécutés immédiatement ont été exécutés (quel que soit l'ordre d'exécution). |
domContentLoadedEventStart | Lorsque l'analyseur envoie l'événement DOMContentLoaded, l'horodatage lorsque tous les scripts qui doivent être exécutés ont été analysés. |
domInteractif | L'horodatage lorsque la structure DOM de la page Web actuelle termine l'analyse et commence à charger les ressources intégrées (c'est-à-dire lorsque la propriété Document.readyState passe à « interactive » et que l'événement readystatechange correspondant est déclenché). |
domChargement | L'horodatage du moment où la structure DOM de la page Web actuelle commence à être analysée (c'est-à-dire lorsque la propriété Document.readyState passe à « chargement » et que l'événement readystatechange correspondant est déclenché). |
Recherche de domaineFin | Heure à laquelle la requête du nom de domaine DNS a été terminée.Égal à la valeur fetchStart si la mise en cache locale (c'est-à-dire aucune requête DNS) ou des connexions persistantes est utilisée |
Recherche de domaineDémarrer | Horodatage DNS UNIX lorsque la requête du nom de domaine a démarré. Si une connexion persistante est utilisée ou si les informations sont stockées dans un cache ou une ressource locale, cette valeur sera cohérente avec fetchStart. |
fetchStart | Le navigateur est prêt à récupérer l'horodatage du document à l'aide d'une requête HTTP. Ce moment se situera avant que le cache de l’application ne soit vérifié. |
Fin de l'événement de chargement | Lorsque l'événement de chargement se termine, c'est-à-dire l'horodatage de la fin de l'événement de chargement. Si cet événement n'a pas encore été envoyé, ou n'est pas encore terminé, sa valeur sera 0. |
chargerEventStart | L'horodatage de l'envoi de l'événement de chargement. Si cet événement n'a pas encore été envoyé, sa valeur sera 0. |
navigationDémarrer | L'horodatage de la fin du téléchargement de la page précédente dans le même navigateur. S'il n'y a pas de page précédente, cette valeur sera la même que fetchStart. |
RedirectionFin | L'horodatage de la dernière redirection HTTP (c'est-à-dire le moment où le dernier bit de la réponse HTTP a été directement reçu). S'il n'y a pas de redirection ou si la redirection provient d'une origine différente, cette valeur renverra 0. |
redirigerDémarrer | L'horodatage du démarrage de la première redirection HTTP. S'il n'y a pas de redirection ou si la redirection provient d'une origine différente, cette valeur renverra 0. |
demandeDémarrer | Renvoie l'horodatage lorsque le navigateur a effectué une requête HTTP au serveur (ou a commencé à lire le cache local). |
réponseFin | Renvoie l'horodatage lorsque le navigateur a reçu (ou lu depuis le cache local, ou lu depuis une ressource locale) le dernier octet du serveur (ou lorsque la connexion HTTP a été fermée si elle a été fermée avant cela). |
réponseDémarrer | Renvoie l'horodatage lorsque le navigateur a reçu le premier octet du serveur (ou lu depuis le cache local).Si la couche transport échoue après la demande initiale et que la connexion est rouverte, cet attribut sera compté comme l'heure d'initiation correspondante de la nouvelle demande. |
démarrage de la connexion sécurisée | HTTPS renvoie l'horodatage lorsque le navigateur et le serveur ont commencé la négociation pour une connexion sécurisée. Si la page Web actuelle ne nécessite pas de connexion sécurisée, renvoyez 0. |
Fin de l'événement de déchargement | Correspondant à unloadEventStart, l'horodatage de la fin du traitement de l'événement de déchargement. S'il n'y a pas de page précédente, cette valeur renverra 0. |
Démarrage de l'événement de déchargement | L'horodatage de l'événement de déchargement de page précédent. S'il n'y a pas de page précédente, cette valeur renverra 0. |
Nom de l'indicateur | décrire |
---|---|
PF | Heure de première page dessinée |
FCP | Le moment où la page a du contenu dessiné pour la première fois |
FMP | Le premier temps d'affichage effectif de la page FMP>=FCP |
TTI | Page de temps entièrement interactive |
FID | Lors de la phase de chargement de la page, le délai de la première interaction de l'utilisateur |
MPFID | Pendant la phase de chargement de la page, le délai maximum que l'interaction de l'utilisateur peut rencontrer |
CHARGER | L'heure à laquelle la page est complètement chargée (l'heure à laquelle l'événement de chargement se produit) |
L'indicateur FP (FIrst Paint) reflète généralement le temps d'écran blanc de la page. Le temps d'écran blanc reflétera la situation actuelle. Plus le temps d'attente de l'utilisateur pour le contenu est court, plus les performances de chargement du réseau sont élevées. est très bon, l'écran blanc Plus le temps est court, plus la probabilité de désabonnement des utilisateurs est faible.
Cet indicateur peut obtenir les informations de point fournies par l'API PerformancePaintTming via la méthode preformance.getEntriesByType('paint') Recherchez l'objet portant le nom first-paint et la description correspond aux données de l'indicateur FP :
FCP (First Contentful Paint) est le moment où le contenu est rendu pour la première fois. Dans les indicateurs statistiques de performance, le temps écoulé entre le moment où l'utilisateur commence à accéder à la page Web et FCP peut généralement être considéré comme le temps sans contenu. , FCP >= FP
Les indicateurs peuvent obtenir les informations ponctuelles fournies par l'API PerformancePaintTiming via la méthode performance.getEntriesByType('paint') Recherchez l'objet portant le nom first-contentful-paint, qui décrit les données de l'indicateur FCP, comme indiqué dans la figure suivante :
FMP (First Meaningful Paint) est le moment où un contenu significatif est dessiné pour la première fois. Lorsque la mise en page et le contenu textuel de la page entière sont complètement rendus, on peut considérer que la première peinture significative d'un contenu significatif est terminée.Par conséquent, FMP mesure le temps nécessaire aux utilisateurs pour voir le contenu principal d’une page Web et constitue un indicateur de mesure important du point de vue de l’expérience utilisateur.
Une méthode de calcul du FMP désormais reconnue par l'industrie front-end est « le temps de dessin après le changement maximal de mise en page de la page pendant le chargement et le rendu ». Vous pouvez utiliser MutationObserver pour surveiller chaque changement global du DOM de la page, déclencher le rappel de MutationObserver et calculer le score de changement de l'arborescence DOM actuelle pendant le rappel. Le moment où le score change le plus est le moment FMP.
TTI (Time To Interactive), qui est le temps qu'il faut depuis le début du chargement de la page jusqu'à ce que la page soit dans un état entièrement interactif. Lorsque la page est dans un état entièrement interactif, les trois conditions suivantes sont remplies :
La page affiche déjà du contenu utile.
La fonction de réponse aux événements associée aux éléments visibles sur la page a été enregistrée.
La fonction de réponse à un événement peut commencer à s'exécuter dans les 50 ms suivant l'apparition de l'événement.
window.performance.getEntriesByType('resource') renverra divers indicateurs de performance de toutes les ressources (js, css, img...) chargées sur la page actuelle, qui peuvent être utilisés pour la collecte de données statiques sur les performances des ressources.
Les principaux types sont : script, lien, img, css, xmlhttprequest, beacon, fetch, autre.
PerformanceResourceTiming - API Web | MDN
Nom de l'indicateur | décrire | Calcul |
---|---|---|
Requête DNS | La phase DNS prend du temps | Recherche de domaineFin - Recherche de domaineDébut |
Connexion TCP | Temps de phase TCP | connectEnd - connectStart |
Établissement de la connexion SSL | Temps de connexion SSL | connectEnd - secureConnectionStart |
Requête réseau du premier octet | Temps de réponse du premier octet (ttfb) | réponseDémarrage - demandeDémarrage |
Il en existe trois sortes
// 在捕获阶段,捕获资源加载失败错误
Element.addEventListener('error', e => {
const target = e.target
if (target != window) {
monitor.errors.push({
type: target.localName,
url: target.src || target.href,
msg: (target.src || target.href) + ' is load error',
time: Date.now()
})
}
})
// 监听 js 错误
window.onerror = function(msg, url, row, col, error) {
monitor.errors.push({
type: 'javascript',
row: row,
col: col,
msg: error && error.stack? error.stack : msg,
url: url,
time: Date.now()
})
}
// 监听 promise 错误 缺点是获取不到行数数据
addEventListener('unhandledrejection', e => {
monitor.errors.push({
type: 'promise',
msg: (e.reason && e.reason.msg) || e.reason || '',
time: Date.now()
})
})
Dans ce scénario, il y a deux problèmes à considérer :
Si l'interface de reporting des données et le système métier utilisent le même nom de domaine, le navigateur a des limites sur le nombre de requêtes simultanées, il existe donc une possibilité de concurrence pour les ressources réseau.
Les navigateurs ignorent généralement les requêtes ajax asynchrones lorsque la page est déchargée. Si une requête de données est nécessaire, une requête ajax synchrone est généralement créée dans l'événement unload ou beforeunload pour retarder le déchargement de la page. Du point de vue de l’utilisateur, les sauts de page ralentissent.
avantage:
Envoie des données de manière fiable lorsque la page est déchargée, sans empêcher la fermeture de la page.
Prise en charge de l'envoi de données en arrière-plan.
défaut:
Seules les requêtes POST peuvent être envoyées et les résultats des réponses ne peuvent pas être obtenus.
En plus d'Internet Explorer, les navigateurs modernes grand public actuels ont un taux de prise en charge très élevé des balises. Balise - Documentation MDN
L'interface Beacon permet de programmer des requêtes asynchrones non bloquantes vers le serveur Web.
En termes simples, Beacon peut envoyer des données de manière asynchrone au serveur et peut garantir que la demande est envoyée avant la fin du déchargement de la page (résoudre le problème selon lequel le déchargement de la page ajax mettra fin à la demande). Comment l'utiliser:
navigator.sendBeacon(url, data);
Le paramètre data est facultatif et son type peut être ArrayBufferView, Blob, DOMString ou FormData. Si le navigateur ajoute avec succès la demande de balise à la file d'attente à envoyer, cette méthode renverra vrai, sinon elle renverra faux.
Lors de l'utilisation de Beacon, le backend doit utiliser la méthode post pour recevoir les paramètres. Compte tenu des problèmes inter-domaines, le backend doit également modifier l'interface et configurer CORS. Dans le même temps, l'en-tête de requête doit correspondre à l'en-tête de requête sécurisé CORS, dans lequel le type de contenu doit être application/x-www-form-urlencoded, multipart/form-data ou text/plain.
type ContentType = 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain';
const serilizeParams = (params: object) => {
return window.btoa(JSON.stringify(params))
}
function sendBeacon(url: string, params: object) {
const formData = new FormData()
formData.append('params', serilizeParams(params))
navigator.sendBeacon(url, formData)
}
avantage:
Il est simple à utiliser, présente une bonne compatibilité et peut être signalé sur plusieurs domaines.
Ne bloquera pas le chargement et la fermeture de la page.
défaut:
Seules les requêtes GET peuvent être envoyées et les résultats des réponses ne peuvent pas être obtenus.
Les opérations asynchrones ne sont pas prises en charge.
Le problème de compatibilité de sendBeacon est inévitable, mais vous pouvez utiliser pleinement la fonctionnalité selon laquelle la plupart des navigateurs termineront le chargement de l'image avant le déchargement de la page et signaler les données en ajoutant img à la page.
function sendImage(url: string, params: object) {
const img = new Image()
img.style.display = 'none'
const removeImage = function() {
img.parentNode.removeChild(img)
}
img.onload = removeImage
img.onerror = removeImage
img.src = `${url}?params=${serilizeParams(params)}`
document.body.appendChild(img)
}
Étant donné que l'image img est une requête get, différents serveurs ont des restrictions sur la longueur de l'URI. Lorsque la longueur dépasse la limite, une erreur HTTP 414 se produit. Par conséquent, vous devez également faire attention à la fréquence de rapport pour réduire trop d'attributs. téléchargé en même temps.
La méthode sendBeacon est préférée et la méthode Image est utilisée comme solution de secours.
function sendLog(url: string, params: object) {
if(navigator.sendBeacon) {
sendBeacon(url, params)
} else {
sendImage(url, params)
}
}
En fait, beaucoup de gens utilisent le GIF pour enterrer ce point ?
La transmission des données au serveur peut être effectuée en demandant l'interface, en demandant des fichiers ordinaires ou en demandant des ressources d'image. Tant que les données peuvent être rapportées, qu'il s'agisse de demander un fichier GIF, de demander un fichier js ou d'appeler une interface de page, le serveur ne se soucie pas réellement de la méthode de rapport spécifique. Alors pourquoi tous les systèmes utilisent-ils uniformément la méthode consistant à demander des images GIF pour rapporter des données ?
●Empêcher les opérations inter-domaines
De manière générale, le nom de domaine en pointillés n'est pas le nom de domaine actuel, donc toutes les requêtes d'interface constitueront des requêtes cross-domaines. Les requêtes inter-domaines peuvent facilement être interceptées par les navigateurs en raison d'une configuration incorrecte et d'erreurs de rapport, ce qui est inacceptable. Cependant, l'attribut src de l'image ne traverse pas le domaine et des requêtes peuvent également être initiées. (Exclure les rapports d'interface)
●Empêcher de bloquer le chargement des pages et d'affecter l'expérience utilisateur
Habituellement, après avoir créé un nœud de ressource, le navigateur n'enverra pas de demande de ressource jusqu'à ce que l'objet soit injecté dans l'arborescence DOM du navigateur. L'utilisation répétée du DOM entraînera non seulement des problèmes de performances, mais le chargement de ressources js/css bloquera également le rendu des pages et affectera l'expérience utilisateur.
L'exception concerne les demandes d'images. Non seulement il n'a pas besoin d'être inséré dans le DOM lors de la construction d'une image, mais il peut lancer une requête tant que le nouvel objet Image est créé en js, et il n'y a pas de problème de blocage dans un environnement de navigateur sans js, c'est possible. également être géré normalement via la balise img, qui est un autre type de demande de ressources qui ne peut pas être fait. (Exclure la méthode de fichier)
●Par rapport au PNG/JPG, le GIF a la plus petite taille
Le plus petit fichier BMP nécessite 74 octets, PNG nécessite 67 octets et un GIF légal ne nécessite que 43 octets.
Pour la même réponse, GIF peut économiser 41 % de trafic que BMP et 35 % de trafic que PNG.
Et la plupart d’entre eux utilisent un GIF transparent de 1*1 pixel pour créer des rapports.
1x1 pixel est la plus petite image légale. De plus, comme cela se fait à travers des images, il est préférable de rendre les images transparentes, afin que cela n'affecte pas l'effet d'affichage de la page elle-même. Pour indiquer que l'image est transparente, il vous suffit d'utiliser un bit binaire pour marquer. l'image comme une couleur transparente, et il n'est pas nécessaire de stocker les données de l'espace colorimétrique, ce qui peut économiser du volume.
avantage:
Des requêtes asynchrones peuvent être envoyées et plusieurs méthodes HTTP telles que GET et POST sont prises en charge.
Les résultats de la réponse peuvent être obtenus et traités ultérieurement.
défaut:
La logique de demande et de réponse doit être gérée manuellement.
Besoin de gérer les problèmes de requêtes inter-domaines (tels que la configuration de CORS).
Utilisez XMLHttpRequest ou l'API Fetch pour envoyer des requêtes asynchrones pour rapporter des données. Vous pouvez choisir d'utiliser la méthode GET ou POST et envoyer les données sous forme de corps de requête ou de paramètres d'URL.
avantage:
Bonnes performances en temps réel et prend en charge la communication bidirectionnelle.
Convient à la surveillance en temps réel et au reporting de données à grande échelle.
défaut:
Le serveur doit prendre en charge le protocole WebSocket.
Plus complexe et ne convient pas aux exigences simples de points enterrés.
Les outils d'enfouissement de données frontaux courants incluent Google Analytics, Baidu Statistics, Umeng Statistics, etc. Bien entendu, vous pouvez également utiliser l'interface ou la plate-forme interne de l'entreprise pour la création de rapports.
Prenons Google Analytics comme exemple :
Google Analytics est un outil d'analyse de site Web développé par Google pour suivre et générer des rapports sur le trafic d'un site Web. Il aide les propriétaires de sites Web à comprendre le comportement de leurs visiteurs, notamment qui ils sont, d'où ils viennent, ce qu'ils font sur le site, et bien plus encore. Grâce à Google Analytics, les propriétaires de sites Web peuvent mieux comprendre leur audience, optimiser le contenu du site Web et les stratégies marketing, améliorant ainsi les performances du site Web et l'expérience utilisateur. Google Analytics fournit une multitude de fonctions d'analyse de données, notamment des données en temps réel, l'analyse du comportement des utilisateurs, le suivi des conversions, l'analyse des sources de trafic, etc. Il s’agit d’un outil puissant largement utilisé dans divers sites Web et campagnes de marketing en ligne.
Puisque nous utilisons Google Analytics, nous devons d'abord disposer d'un compte Google, que vous devez créer vous-même. Deuxièmement, vous devez connaître l'entrée de Google Analytics. Voici les deux adresses utilisées :
Gestionnaire de balises Google : tagmanager.google.com/
Analyses : analytics.google.com/
Gestionnaire de balises Google
Google Tag Manager (GTM) est un système de gestion de balises développé et fourni par Google. Il permet aux administrateurs de sites Web de gérer et de déployer divers codes de suivi, codes d'analyse et balises marketing sans modifier le code du site Web. Avec GTM, les utilisateurs peuvent facilement ajouter, mettre à jour et supprimer des balises sans dépendre des développeurs.
Les principales fonctionnalités de GTM incluent :
En clair : cette plate-forme est utilisée pour collecter des événements cachés déclenchés par le front-end et peut réaliser des rapports de données en personnalisant les conditions de déclenchement et en déclenchant des rappels d'événements. Elle est utilisée ici pour collecter des données et les signaler à Google Analytics.
Google Analytics
Comme son nom l'indique, il s'agit d'un site Web utilisé pour collecter, visualiser et afficher des données.