首页 > 其他分享 >可观测性网站之Session的生命周期

可观测性网站之Session的生命周期

时间:2024-01-27 16:04:13浏览次数:32  
标签:生命周期 Session DELAY 会话 session cookieSession 性网站 页面 view

本文会列出session的属性值、统计指标,重点讲解session几个字段值,虽然从代码中看出的考虑策略,session和view、app均有关联,但本文仅从代码层面对session的创建、更新、过期的逻辑进行讲解,其中会把关键的变量值也会列出来。

定义:

用户会话信息记录,当前会话中,将会基于会话维度用户页面、资源、操作、错误、长任务相关访问数据。 下面简单列出session有哪些属性,仅供参考。

属性

字段

类型

描述

session_id

string

会话 id(用户会话 15 分钟内未产生交互行为则视为过期 )

session_type

string

会话类型。参考值:user synthetics - user 表示是RUM功能产生的数据;- synthetics 表示是 headless拨测产生的数据。

session_referrer

string

会话来源。一般是记录来源的页面地址。

session_first_view_id

string

当前会话的第一个页面的 view_id

session_first_view_url

string

当前会话的第一个页面的 URL

session_first_view_host

string

当前会话的第一个页面的域名

session_first_view_path

string

当前会话的第一个页面的地址

session_first_view_path_group

string

当前会话的第一个页面的地址分组

session_first_view_url_query

string

当前会话的第一个页面的 query 信息

session_last_view_id

string

当前会话的最后一个访问页面的 view_id

session_last_view_url

string

当前会话的最后一个页面的 URL

session_last_view_host

string

当前会话的最后一个页面的域名

session_last_view_path

string

当前会话的最后一个页面的地址

session_last_view_path_group

string

当前会话的最后一个页面的地址分组

session_last_view_url_query

object

当前会话的最后一个页面的 query 信息

统计指标

字段

类型

描述

time_spent

number(ns)

当前会话持续时长

session_view_count

number

当前会话关联view_id个数

session_error_count

number

当前会话产生错误个数

session_resource_count

number

当前会话加载资源个数

session_action_count

number

当前会话用户操作次数

session_long_task_count

number

当前会话产生长任务次数

session部分逻辑

并不是所有字段都有值得讲解,比如session_has_replay这个字段代表是否有会话是否有录制。今天只针对session的生命周期进行讲解。

id的生成

这个简单,首先这个要从startSessionStore,其中session要从cookie中获取,如果没有就需要创建,创建或更新的这部分逻辑如下:

function expandOrRenewCookie(cookieSession) {
    var sessionState = computeSessionState(cookieSession[productKey])
    var trackingType = sessionState.trackingType
    var isTracked = sessionState.isTracked
    cookieSession[productKey] = trackingType
    if (isTracked && !cookieSession.id) {
      cookieSession.id = UUID()
      cookieSession.created = String(dateNow())
    }
    return isTracked
  }

上面需要注意一点,这里的cookie值是_dataflulx_usr_id,如何查看当前的cookie值呢,一般可以通过document.cookie进行获取,简单的查看方式便是f12打开控制台,在application中查看,如下图所示。

可观测性网站之Session的生命周期_字段

在上图中,我们除了能看到当前的cookie的value,还有比较重要的内容:

  • domain
  • 过期时间
  • 大小

获取cookie

有关如何获取cookie,这里实现的逻辑是调用


name

document.cookie,name

findCommanSeparatedValue是利用正则进行获取,代码如下:

export function findCommaSeparatedValue(rawString, name) {
  var matches = rawString.match('(?:^|;)\\s*' + name + '\\s*=\\s*([^;]+)')
  return matches ? matches[1] : undefined
}

创建cookie的值

接着上面的逻辑,如果是首次进入,需要创建和设置cookie,我们先看创建的代码:

cookieSession.id = UUID()

UUID这个方法实现也比较简单,是通过Math.random后最后转换成16进制,可以看下面代码:

export function UUID(placeholder) {
  return placeholder
    ? // eslint-disable-next-line  no-bitwise
      (
        parseInt(placeholder, 10) ^
        ((Math.random() * 16) >> (parseInt(placeholder, 10) / 4))
      ).toString(16)
    : `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, UUID)
}

但是我们需要注意,还有几个其他相关属性很重要

export var SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR
export var SESSION_EXPIRATION_DELAY = 15 * ONE_MINUTE

这里SESSION_TIME_OUT_DELAY用于设定最大时长,也就是说4个小时;SESSION_EXPIRATION_DELAY用于判断是否过期,这里是15分钟。

说到时间,就需要知道cookieSession创建时,还有一个比较重要的参数,上面两个变量便是依据这个参数进行的对比,这个参数是:cookieSession.created:

cookieSession.created = String(dateNow())

目测是本地时间,但是得看一下源码 import { dateNow, UUID, throttle } from '../helper/tools' dataNow也来自helper/tools中,其中代码是这样写的:

export function dateNow() {

  return new Date().getTime()
}

看代码采用的是new Date(),也就是客户端的时间,在上面两个相对的时间后,就会执行相关session的更新或者创建。所以对于session的判断也有必要讲一讲,这里使用的函数是根据hasSessionInCache的返回值真假来判断 return sessionCache[productKey] !== undefined,如果存在,还需要判断是否过期(isSessionInCacheOutdated),这里判断条件除了id外还有另外一个值

function isSessionInCacheOutdated(cookieSession) {
    return (
      sessionCache.id !== cookieSession.id ||
      sessionCache[productKey] !== cookieSession[productKey]
    )
  }

假设返回为假,则需要session过期(expireSession):

function expireSession() {
    sessionCache = {}
    expireObservable.notify()
  }

检查session

因为session的特殊性,所以不能频繁更新和检查session,所以应该有性能上的节流。 expandOrRenewSession: throttle(expandOrRenewSession, COOKIE_ACCESS_DELAY) .throttled, 目前软件的节流时间是export var COOKIE_ACCESS_DELAY = ONE_SECOND 节流函数比较简单,就不做介绍了。 其中还有最后一项,就是session是否在有效期内(isActiveSession):

function isActiveSession(session) {
    return (
      (session.created === undefined ||
        dateNow() - Number(session.created) < SESSION_TIME_OUT_DELAY) &&
      (session.expire === undefined || dateNow() < Number(session.expire))
    )
  }

session的过期

SESSION_TIME_OUT_DELAY就是上面提到的比较重要的属性值,目前是 export var SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR 有关session是否还要持久化的方法(persistSession)

export function persistSession(session, options) {
  if (isExpiredState(session)) {
    clearSession(options)
    return
  }
  session.expire = String(dateNow() + SESSION_EXPIRATION_DELAY)
  setSession(session, options)
}

SESSION_EXPIRATION_DELAY就是上面提到的比较重要的属性值,目前是15分钟。

有关用户是否活动,是通过事件监听dom是否出现VISIBILITY_CHANGE来判断。

var _addEventListener= addEventListener(document, DOM_EVENT.VISIBILITY_CHANGE, expandSessionWhenVisible)

总结

本文介绍了session的属性和常见统计指标,单独把session的id的创建、更新、获取逻辑以及过期时间的逻辑都做了讲解,希望能对读者有所启发。

标签:生命周期,Session,DELAY,会话,session,cookieSession,性网站,页面,view
From: https://blog.51cto.com/u_12003135/9443872

相关文章

  • 在K8S中,Pod生命周期包含哪些?
    在Kubernetes(简称K8s)中,Pod的生命周期经历了一系列状态变化。以下是Pod可能处于的一些主要状态:Pending:当创建一个Pod时,它首先会进入Pending状态。这个状态下,Kubernetes正在为Pod分配节点、拉取容器镜像或等待其他资源就绪。在这个阶段,Pod尚未被调度到具体的Node上或者其依赖的......
  • 004*:组件的生命周期(初始化、进行中、销毁)
    目录 正文1:生命周期-初始化/*目标1:始化生命周期的执行过程2:理解生命周期的各个钩子函数的作用*/importReact,{Component}from'react'exportdefaultclassLifeCycleComponentextendsComponent{//构造函数constructor(props){super(p......
  • php session反序列化
    关于SessionSession,在汉语中表示通话、会话、对话(期)、话路[对谈时间]的意思,其本来的含义一个终端用户与交互系统进行通信的时间(间隔),通常是指从注册(进入系统)到注销(退出系统)之间所经过的时间。比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个Session......
  • Cookie和Session的关系 - 通俗举例
    目录Cookie和Session的关系关系:工作流程简述:举例-商店购物定义:操作流程:Cookie和Session的关系Cookie和Session是在web开发中用于维护用户状态的两个关键概念。Cookie:定义:Cookie是在客户端(通常是浏览器)存储的小型文本文件,由服务器发送到客户端并存储在用户的计算......
  • 类的生命周期
    类的生命周期从类被加载到虚拟机内存中开始,到释放内存总共有7个阶段:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using),卸载(Unloading)。其中验证,准备,解析三个部分统称为连接(Linking)。类加载过程类是在运行期间第一次使用时动态加载......
  • Cookie、Session 和 Token 有什么区别?
    Cookie、Session和Token通常都是用来保存用户登录信息的技术,但三者有很大的区别,简单来说Cookie适用于简单的状态管理,Session适用于需要保护用户敏感信息的场景,而Token适用于状态无关的身份验证和授权。具体来说,Cookie、Session和Token的区别主要有以下几点区别:存储......
  • chrome内核浏览器:测试环境:url(ip+端口)设置cookie、session失败
    chrome内核浏览器:测试环境:url(ip+端口)设置cookie、session失败有个单点登录系统,登录成功,通过:ip+端口/xxx.js方式设置,目标网址的cookie、session.,通过跳转访问目标网站。在测试的时候,发下cookie、session怎么设置都不成功。登录成功:设置cookie、session t跳转过去,发现原来......
  • Rust 泛型、Trait 和生命周期
    本文在原文基础上有删减,原文参考泛型、Trait和生命周期。目录泛型数据类型在函数定义中使用泛型结构体定义中的泛型枚举定义中的泛型方法定义中的泛型泛型代码的性能Trait:定义共同行为定义trait为类型实现trait默认实现trait作为参数TraitBound语法通过+指定多个traitb......
  • 软件生命周期模型
    ......
  • Servlet系列:生命周期(init、 service、destroy)详解
    Servlet的生命周期是由Web容器(如Tomcat)管理的,包括以下三个阶段:加载和实例化:当Web应用程序启动时,Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成,也可以通过Servlet的名称手动加载。在实例化Servlet后,Web容器会调用其init()方法进行初始化。处理请......