当前位置: 首页 > news >正文

前端埋点上报的几种方式

现代Web应用程序中,埋点上报是一种重要的数据收集和分析手段。本文将介绍前端埋点上报的几种常见方式,并详细阐述如何在项目中运用这些方式进行数据上报,以帮助开发者更好地进行数据收集和分析。

上报方式

在前端中,常见的埋点上报方式有以下几种:

1. 图片请求(Image Beacon):通过创建一个Image对象,将要上报的数据作为URL参数拼接到一个1x1像素的透明图片URL中,发送一个GET请求来触发上报。

2. XMLHttpRequest或Fetch API:使用XMLHttpRequest或Fetch API发送异步请求来上报数据。可以选择使用GET或POST方法,并将数据作为请求体或URL参数发送。

3. Navigator.sendBeacon():Navigator.sendBeacon()方法允许在页面卸载时异步发送数据。它通常用于在页面关闭时进行最后的数据上报,以确保数据能够成功发送。

4. WebSocket:使用WebSocket协议与服务器建立持久连接,并通过发送消息来进行实时的埋点数据上报。

5. 第三方统计工具:使用第三方统计工具(如Google Analytics、百度统计等)提供的JavaScript SDK来进行埋点和数据上报。

6. 自定义接口:根据业务需求,自行设计和开发接口用于接收和处理埋点数据,并通过Ajax等方式将数据发送到自定义接口进行上报。 每种方式都有其适用场景和特点。选择合适的埋点上报方式取决于具体需求、性能要求、实时性要求以及对用户体验的影响等因素。

1. 图片请求

优点

  • 简单易用,兼容性好,可以跨域上报。
  • 不会阻塞页面加载和关闭。

缺点

  • 只能发送GET请求,无法获取响应结果。
  • 不支持异步操作。

通过创建一个Image对象,将要上报的数据作为URL参数拼接到一个1x1像素的透明图片URL中,发送一个GET请求来触发上报。

const data = { event: 'click', element: 'button' };
const url = ` https://example.com/track?data= ${encodeURIComponent(JSON.stringify(data))}`;
const img = new Image();
img.src = url;

2. XMLHttpRequest或Fetch API

优点

  • 可以发送异步请求,支持GET和POST等多种HTTP方法。
  • 可以获取响应结果,并进行进一步处理。

缺点

  • 需要手动处理请求和响应的逻辑。
  • 需要处理跨域请求的问题(如设置CORS)。

使用XMLHttpRequest或Fetch API发送异步请求来上报数据。可以选择使用GET或POST方法,并将数据作为请求体或URL参数发送。

 
const data = { event: 'click', element: 'button' };// 使用XMLHttpRequest
const xhr = new XMLHttpRequest();
xhr.open('POST', ' https://example.com/track ');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));// 使用Fetch API
fetch(' https://example.com/track ', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(data)
});

3. Navigator.sendBeacon()

优点

  • 在页面卸载时可靠地发送数据,不会阻塞页面关闭。
  • 支持在后台发送数据。

缺点

  • 只能发送POST请求,无法获取响应结果。

Navigator.sendBeacon()方法允许在页面卸载时异步发送数据。它通常用于在页面关闭时进行最后的数据上报,以确保数据能够成功发送。

const data = { event: 'unload', page: 'home' };
const url = ' https://example.com/track ';
navigator.sendBeacon(url, JSON.stringify(data));

4. WebSocket

优点

  • 实时性好,支持双向通信。
  • 适用于实时监控和大规模数据上报。

缺点

  • 需要服务器端支持WebSocket协议。
  • 较复杂且不适用于简单的埋点需求。

使用WebSocket协议与服务器建立持久连接,并通过发送消息来进行实时的埋点数据上报。

 
const socket = new WebSocket('wss://example.com/track');
socket.onopen = () => {const data = { event: 'click', element: 'button' };socket.send(JSON.stringify(data));
};

5. 第三方统计工具

优点

  • 提供了完整的统计功能和分析报告。
  • 具有较高的稳定性和可靠性。

缺点

  • 需要依赖第三方服务,可能受限于服务商的限制。
  • 需要遵循第三方统计工具的使用规范和隐私政策。
使用方式
  • 注册和配置:首先,您需要注册并获取一个账户,然后在你的网站或应用程序中添加相应的跟踪代码。通常,这涉及将一段JavaScript代码添加到每个页面的头部或尾部。
  • 埋点配置:根据百度统计提供的文档和指南,你可以配置需要进行埋点跟踪的事件、页面浏览、自定义变量等。这通常涉及在特定事件或页面上添加特定的代码片段。
  • 数据分析:通过登录到百度统计的控制台,你可以查看收集到的数据、生成报告和分析用户行为等。

6. 自定义接口

优点

  • 可以根据具体需求和业务逻辑进行灵活的定制和扩展。
  • 可以完全控制数据的处理和存储方式。

缺点

  • 需要额外开发和维护自定义接口。
  • 需要考虑安全性、性能和可扩展性等方面的问题。
使用方式
  • 接口设计:根据业务需求,设计并开发一个用于接收和处理埋点数据的自定义接口。这可以是一个后端API接口,可以使用任何后端技术栈来实现。
  • 数据上报:在前端代码中,通过发送异步请求(如XMLHttpRequest或Fetch API)将埋点数据发送到自定义接口的URL。
  • 数据处理:在自定义接口中,根据业务逻辑对接收到的数据进行处理、存储或进一步分析。

总结

根据具体需求和项目情况,选择适合的埋点上报方式非常重要。对于简单的埋点需求,图片请求或XMLHttpRequest/Fetch API可能是较为简单和常用的选择。对于实时性要求较高或需要自定义功能的情况,WebSocket或自定义接口可能更适合。而第三方统计工具则提供了完整的统计功能和分析报告,但需要依赖第三方服务。

在实际项目中,可以根据需求综合考虑各种因素来选择合适的埋点上报方式。同时也可以根据具体情况结合多种方式进行埋点上报,以满足不同的需求。

相关文章:

前端埋点上报的几种方式

现代Web应用程序中,埋点上报是一种重要的数据收集和分析手段。本文将介绍前端埋点上报的几种常见方式,并详细阐述如何在项目中运用这些方式进行数据上报,以帮助开发者更好地进行数据收集和分析。 上报方式 在前端中,常见的埋点上…...

外部 prometheus监控k8s集群资源

prometheus监控k8s集群资源 一,通过CADvisior 监控pod的资源状态1.1 授权外边用户可以访问prometheus接口。1.2 获取token保存1.3 配置prometheus.yml 启动并查看状态1.4 Grafana 导入仪表盘 二,通过kube-state-metrics 监控k8s资源状态2.1 部署 kube-st…...

centos安装神通数据库

1、安装 wget工具 yum install -y wget2、安装rar解压工具 wget --no-check-certificate http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz tar zxvf rarlinux-x64-5.3.0.tar.gz && cd rar/ && make install3、下载oscar神通数据库(linux 64…...

汇编-PUSHFD和POPFD标志寄存器值压栈和出栈

PUSHFD指令将32位EFLAGS寄存器内容压入堆栈, 而POPFD指令则将栈顶单元内容弹出到EFLAGS寄存器 格式:...

基于SSM的进销存管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...

Django DRF限流组件

在DRF中,限流发生在认证、权限之后,限流组件的使用步骤: 1、编写自定义限流类; 2、在settings.py中配置redis; 3、安装django-redis; 4、启动redis服务; 5、局部应用,一般是在核心的视图中使用&…...

UEC++ day7

敌人NPC机制 敌人机制分析与需求 新建一个character类来作为敌人,直接建蓝图设置骨骼网格,因为敌人可能多种就不规定死,然后这个敌人肯定需要两个触发器,一个用于大范围巡逻,一个用于是否达到主角近点进行攻击 注意我…...

win11,安装python,pip,和opencv

1,安装python 在应用商店,输入python,下载安装 2,安装pip 在cmd中,输入pip install SomePackage,安装某一个版本的pip 3,安装opencv 在cmd中,输入 pip3 install opencv-contrib-python -i https://pyp…...

kafka入门(一):kafka消息发送与消费

kafka的基础概念 Producer (消息生产者) 向主题发布消息的客户端应用程序称为生产者(Producer),生产者用于持续不断的向某个主题发送消息。 Consumer (消息消费者) 订阅主题消息的客户端程序称为消费者(Consumer),消费者用于处理生产者产生的消息。 Co…...

CMap数据库筛选化学药物

数据库clue.io 文献链接:连接图谱:使用基因表达特征连接小分子、基因和疾病 |科学 (science.org) 基本模式:利用CMap将差异基因列表与数据库参考数据集比对;根据差异表达基因在参考基因表达谱富集情况得到一个相关性分数&#…...

mysql命令行(mysql-client)连接数据库

有时项目连接不上数据库,报错鉴权失败,先用mysql工具连接下,容易发现问题。 直接输入mysql看是否已安装,如果没有就安装下。 yum -y install mysql-client; 这个名称一直记不准,有时记为mysql-cli,结果发现…...

sklearn中的TfidfTransformer和gensim中的TfidfModel的区别

sklearn.feature_extraction.text.TfidfTransformer 和 gensim.models.TfidfModel 都是用于计算文本数据的 TF-IDF 值的工具。它们的主要区别在于实现方式和输入数据的格式。 1、实现方式和输入数据格式: TfidfTransformer 是 scikit-learn 中的一个类,…...

spring注解

spring注解 Configuration 用于标注配置类Bean 结合Configuration(full mode)使用或结合Component(light mode)使用。可以导入第三方组件,入方法有参数默认从IOC容器中获取,可以指定initMethod和destroyMethod 指定初…...

SpringCloud实用篇02

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我…...

Nginx快速入门教程,域名转发、负载均衡

1.Nginx简介 Nginx是⽬前最流⾏的Web服务器, 最开始是由⼀个叫做igor的俄罗斯的程序员开发的, 2019年3⽉11⽇被美国的F5公司以6.7亿美元的价格收购, 现在Nginx是F5公司旗下的⼀款产品了。 2.Nginx的版本 Nginx开源版本主要分为两种&#x…...

ElasticSearch之健康状态

参考Cluster health API。 命令样例,如下: curl -X GET "https://localhost:9200/_cluster/health?wait_for_statusyellow&timeout50s&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9&qu…...

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…...

【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...

求二叉树中指定节点所在的层数(可运行)

运行环境.cpp 我这里设置的是查字符e的层数,大家可以在main函数里改成自己想查的字符。(输入的字符一定是自己树里有的)。 如果没有输出结果,一定是建树错误!!!!!&…...

Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、移植

Opencv3.*主模块默认包括两个3D库 calib3d用于相机校准和三维重建 ,viz用于三维图像显示,其中viz是cmake选配。 参考: https://docs.opencv.org/3.4.12/index.html 下载linux版本的源码 sources。 查看cmake apt list --installed | grep…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...