DataScript 中提供了以下虚拟服务函数:

函数

描述

avi.vs.analytics.counter(metric_name, [operation], [value])

创建并操作计数器类型衡量指标。有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题。

avi.vs.analytics.gauge (metric_name, [operation], [value])

创建并操作计量器类型衡量指标。

avi.vs.analytics.get_metric (metric_name, metric_type)

如果存在具有给定名称和给定类型的用户定义的衡量指标,则返回该用户定义衡量的指标值。

avi.vs.analytics.get_counter()

返回衡量指标的值,无论是绝对值、计数器还是计量器类型。

avi.vs.client_ip()

返回客户端 IP 地址

avi.vs.client_port()

返回客户端源端口

avi.vs.close.conn([reset])

关闭当前 TCP/UDP 连接

avi.vs.ip()

返回 VS 的 IP 地址

avi.vs.log()

将自定义日志写入 VS > 客户端日志

avi.vs.name()

返回虚拟服务的名称。

avi.vs.port()

返回连接的 VS 端口。

avi.vs.persist(key, [lifetime], [pool])

使用负载均衡流量后使用的键创建持久性条目。

avi.vs.rate_limit( type, string_to_limit, [defer_action=False] )

限制各种实体的速率。

avi.vs.reqvar.*

设置在事件之间可用的全局变量。

avi.vs.table_insert( [table_name,] key, value [, lifetime] )

将自定义数据存储在基于时间的表中。

avi.vs.table_lookup( [table_name,] key [, lifetime_exten] )

查找表中的数据。

avi.vs.table_refresh( [table_name,] key [, lifetime_exten] )

更新表条目的过期时间。

avi.vs.rate.limit.exceed()

限制各种实体的速率。

avi.vs.table_remove( [table_name,] key )

从表中移除数据。

avi.vs.get_open_conns()

返回附加到当前虚拟服务的每个服务引擎的打开连接总数。

avi.vs.se_count()

返回附加到当前虚拟服务的服务引擎总数。

avi.vs.analytics.counter

函数

avi.vs.analytics.counter ( metric_name, [operation], [value] )

描述

增加或清除指定的计数器衡量指标。

有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题

事件

  • HTTP_REQ

  • HTTP_RESP

  • RESP_FAILED

参数

  1. metric_name 是用户为标识计数器衡量指标而选择的字符串值。

  2. operation 是数字,可能采用以下两个值之一:

    1. avi.vs.analytics.INCR - 按 value 递增计数器衡量指标。

    2. avi.vs.analytics.CLEAR - 将计数器衡量指标清除为 0。value 参数将被忽略。

  3. value 是递增计数器衡量指标的量。如果未指定值,则默认为 1。

注:
  • 如果未指定操作,则默认为 avi.vs.analytics.INCR

  • 以下内容适用于 avi.vs.analytics.counter 的所有调用。

    • 如果从未定义 metric_name,此函数将对其进行定义,并将 metric_type 设置为 avi.vs.analytics.METRICTYPE_COUNTER。之后,此函数将执行通过值修改的指定操作。

    • 如果之前已定义 metric_name,但 metric_type 不是 avi.vs.analytics.METRICTYPE_COUNTER,则此函数将记录错误,并且将取消导致此函数调用的请求/响应。

返回

不返回任何值

相关

avi.vs.analytics.get_metric()

示例

  1. 创建名称为“Foo”的计数器类型衡量指标,并向其添加 42。如果衡量指标不存在,则使用默认值 0 创建并初始化该衡量指标。

    avi.vs.analytics.counter(“Foo”, avi.vs.analytics.INCR, 42)
  2. 将名为“Foo”的计数器类型衡量指标递增 1。

    avi.vs.analytics.counter(“Foo”, avi.vs.analytics.INCR)
  3. 如果 SSL 协议为“TLSv1.2”,则递增名为“tls1_2”的计数器

    if avi.ssl.protocol() == "TLSv1.2" then
         avi.vs.analytics.counter("tls1_2", avi.vs.analytics.INCR, 1)

avi.vs.analytics.gauge

函数

avi.vs.analytics.gauge ( metric_name, [operation], [value] )

描述

递增、递减、设置或清除指定的计量器衡量指标。

有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题。

事件

  • HTTP_REQ

  • HTTP_RESP

  • RESP_FAILED

参数

  1. metric_name 是用户为标识计量器衡量指标而选择的字符串值。

  2. operation 是数字,可能采用以下两个值之一:

    1. avi.vs.analytics.INCR - 将计数器衡量指标递增 value

    2. avi.vs.analytics.DECR - 按计量器衡量指标递减 value。如果计量器衡量指标的当前值小于 value,则此操作会将计量器衡量指标重置为 0。

    3. avi.vs.analytics.SET - 将计量器衡量指标设置为 value

    4. avi.vs.analytics.CLEAR - 将计数器衡量指标清除为 0。value 参数将被忽略。

  3. value 是递增计数器衡量指标的量。如果未指定值,则默认为 1。

注:
  • 如果未指定操作,则默认为 avi.vs.analytics.INCR

  • 以下内容适用于 avi.vs.analytics.counter 的所有调用。

    • 如果从未定义 metric_name,此函数将对其进行定义,并将 metric_type 设置为 avi.vs.analytics.METRICTYPE_GAUGE。之后,此函数将执行通过值修改的指定操作。

    • 如果之前已定义 metric_name,但 metric_type 不是 avi.vs.analytics.METRICTYPE_GAUGE,则此函数将记录错误,并且将取消导致此函数调用的请求/响应。

返回

不返回任何值

相关

avi.vs.analytics.get_metric()

示例

  1. 创建名为“speedo”的计量器类型衡量指标,并向其添加 42。如果计量器类型衡量指标不存在,则使用默认值 0 创建并初始化该衡量指标。

    avi.vs.analytics.gauge(“speedo”, avi.vs.analytics.INCR, 42)
  2. 将名为“speedo”的计量器类型衡量指标递增 1。

    avi.vs.analytics.gauge(“speedo”, avi.vs.analytics.INCR)

avi.vs.analytics.get_metric

函数

avi.vs.analytics.get_metric ( metric_name, metric_type ) )

描述

返回衡量指标的值,无论是计数器还是计量器类型。在执行此操作之前,该函数将首先检查是否已定义 metric_name。如果已定义,该函数会将 metric_type 的值与先前存储的类型进行比较。如果从未定义 metric_name,或者类型不正确,该函数将在日志中报告错误,并且将取消导致此函数调用的请求/响应。

有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》“NSX Advanced Load Balancer 监控组件”主题中的“用户定义的衡量指标”一节。

事件

  • HTTP_REQ

  • HTTP_RESP

  • RESP_FAILED

参数

  1. metric_name 是用户为标识衡量指标而选择的字符串值。

  2. metric_type 是一个数字参数,可通过对 avi.vs.analytics.METRICTYPE_GAUGEavi.vs.analytics.METRICTYPE_COUNTER 进行符号引用来设置。

返回

衡量指标的值

相关

avi.vs.analytics.counter(), avi.vs.analytics.gauge()

示例

goo-current-val 设置为名为 goocounter-type 衡量指标的当前值(如果存在)。

goo-current-val = avi.vs.analytics.get_metric ("goo", avi.vs.analytics.METRICTYPE_COUNTER)

avi.vs.analytics.get_counter

函数

avi.vs.analytics.get_counter ( metric_name, metric_type )

描述

返回衡量指标的值,无论是绝对值、计数器还是计量器类型。在执行此操作之前,该函数将首先检查是否已定义 metric_name。如果已定义,该函数会将 metric_type 的值与先前存储的类型进行比较。如果从未定义 metric_name,或者类型不正确,该函数将在日志中报告错误。

事件

  • HTTP_REQ

  • HTTP_RESP

  • RESP_FAILED

参数

metric_name 是用户为标识衡量指标而选择的字符串值。

metric_type 是一个数字参数,可通过对以下参数进行符号引用来设置:

  • avi.vs.analytics.USERDEFINED_METRICTYPE_ABSOLUTE

  • avi.vs.analytics.USERDEFINED_METRICTYPE_GAUGE

  • avi.vs.analytics.USERDEFINED_METRICTYPE_COUNTER

返回

衡量指标的值

相关

  • avi.vs.analytics.absolute()

  • avi.vs.analytics.counter()

  • avi.vs.analytics.gauge()

示例

TBD

avi.vs.client_ip

函数

avi.vs.client_ip()

描述

返回客户端的 IPv4 或 IPv6 地址。

事件

全部

参数

返回

包含客户端的源 IP 地址的字符串。

示例

将客户端的源 IP 地址插入 HTTP 标头中。

avi.http.add_header("XFF", avi.vs.client_ip())

avi.vs.client_port

函数

avi.vs.client_port()

描述

返回客户端的源端口。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

返回

包含客户端源端口的字符串。

示例

提供 A/B 测试的简单方法是将十分之一的连接分发到 pool1。

if string.endswith(avi.vs.client_port(), "0") then
   avi.pool.select("Pool1")
else avi.pool.select("Pool2")
end

avi.vs.close.connection

函数

avi.vs.close_conn ( [reset] )

描述

关闭当前 TCP/UDP 连接。对于 UDP 连接,重置标记不会产生任何后果。

事件

  • VS_DATASCRIPT_EVT_L4_REQUEST

  • VS_DATASCRIPT_EVT_L4_RESPONSE

参数

reset 标记将重置连接,而不是使用默认 FIN。

返回

无返回值

示例

if avi.vs.client_ip() == "10.1.1.1" then
avi.vs.close_conn()
end
avi.vs.close_conn(1) 

avi.vs.ip

函数

avi.vs.ip()

描述

返回接受请求或连接的虚拟服务 IPv6 地址。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

reset 标记将重置连接,而不是使用默认 FIN。

返回

十六进制字符串格式的 IPv6 地址(以冒号分隔),例如,2001:db8::1122:ab12IPv4,或八进制格式的地址(以小数点分隔),例如 10.1.1.1

示例

插入标头,告知服务器流量来自哪个 VS。

avi.http.add_header("VS_IP", avi.vs.ip())

avi.vs.log

函数

avi.vs.log()

描述

生成与连接或请求关联的日志,并在虚拟服务 > 客户端日志页面中查看该日志。将创建一个名为 datascript_log 的日志字段,其中包含 DataScript 的名称和 avi.vs.log 命令的输出。如果多次调用 avi.vs.log,则每个调用的输出将记录在客户端日志中的同一个 datascript_log 字段。

事件

  • HTTP_REQ

  • HTTP_RESP

  • HTTP_RESP_DATA

  • HTTP_REQ_DATA

  • HTTP_RESP_FAILED

  • LB_DONE

  • LB_FAILED

  • AUTH

  • POST_AUTH

  • SSL_HANDSHAKE_DONE

  • SSL_CLIENT_HELLO

  • SSL_PRE_CONNECT

参数

  • 日志可以包含字符串、数字、布尔和 nil 值的任意组合。

  • 如果传递最后一个参数 avi.SIG_ENABLE,连接日志将转换为重要日志。

返回

示例

来自 DataScript“Log1”HTTP_REQ 事件:

avi.vs.log("Hello World!")

来自 DataScript“Log2”HTTP_RESP 事件:

num = 2
avi.vs.log("Hello " .. num .. " You!")

客户端日志中的输出:

DataScript 日志:[string "Log1"]:1: Hello World! DataScript 日志:[string "Log2"]:1: Hello 2 You!
注:

日志以元信息为前缀,元信息通常是调用 avi.vs.log() 的函数名称和行号。如果不是通过函数进行调用,则名称是脚本的名称(在我们的示例中,脚本是一个字符串,而不是一个名为 Log1 的文件)。

重要日志记录示例:

来自 DataScript“Log1”HTTP_REQ 事件:

avi.vs.log("Hello World!", avi.SIG_ENABLE)

客户端日志中的输出:

DataScript Log: [string "Log1"]:1: Hello World!
Significance: Datascript Significant Log.

avi.vs.name

函数

avi.vs.name()

描述

返回已接受请求或连接的虚拟服务的名称。

事件

HTTP_REQ

HTTP_RESP

参数

返回

包含虚拟服务名称的字符串。

示例

在发送到服务器的流量中插入标头:X-Source: www.avi.com-10.1.1.1

avi.http.add_header("X-Source", avi.vs.name() .. "-" .. avi.vs.ip())

avi.vs.port()

函数

avi.vs.port()

描述

返回已接收请求或连接的虚拟服务端口。

事件

HTTP_REQ

HTTP_RESP

参数

返回

包含虚拟服务端口号的字符串。

示例

如果 HTTP 请求未到达端口 443,将关闭连接。

if avi.vs.port() ~= "443" then
   avi.http.close_conn()
end

avi.vs.persist

函数

avi.vs.persist()

描述

将请求负载均衡到提供的可选池或连接到虚拟服务的池。

同样,此函数还会创建键值持久性条目。键是传递的参数,值是负载均衡 IP 和端口(例如:10.10.10.10-80)。

可选的生命周期可确保在传递的生命周期中创建持久性表条目。

默认值为 300 秒。

在后台,此 API 执行传统的负载均衡,并且自动创建一个持久性表条目,值为负载均衡的后端服务器。

反复调用此 API 将刷新超时。

事件

VS_DATASCRIPT_EVT_L4_REQUEST

参数

键、[生命周期]、[池]

返回

无返回值

示例

if username == “my_user” then
avi.vs.persist(username, 3600, “POOL_80”)
注:

此 API 从 DataScript 生成,运行此 API 后将不再有其他语句。这是一个终端 API。

avi.vs.rate.limit

函数

avi.vs.rate_limit( type, string_to_limit, [defer_action=False] )

描述

限制各种实体的速率。

事件

HTTP_REQ

参数

  • type 是指定速率限制器类型的字符串。当前,必须将 type 设置为 avi.RL_CUSTOM_STRING

  • string_to_limit 是应限制速率的实体的唯一标识符。这是一个字符串,例如 JsessionID、用户名或 IP 地址。

  • defer_action 是可选的 True/False 标记。如果为 True,则在速率限制超过阈值时,不会执行 given_action(如下所述)。如果将速率限制操作设置为丢弃连接,则不会进一步处理该规则。defer_action 参数可用于防止配置文件丢弃连接,从而允许在通过 DataScript 手动执行操作之前,进一步处理 DataScript 逻辑。

返回

该函数返回两个可选的纯信息变量:

  1. 当超出计数时,count_exceeded 为 true。

  2. given_action 是将速率限制配置文件配置为在未设置 defer_action 参数时执行的操作。可在速率限制配置文件中通过 CLI 配置 given_action。此信息可用于在 DataScript 中手动重新创建这些操作。

可能的选项包括:

  • avi.RL_ACTION_CLOSE_CONN - 关闭 TCP 连接。不会进一步处理规则。

  • avi.RL_ACTION_LOCAL_RSP – 返回静态配置的 HTTP 响应页面。不会进一步处理规则。

  • avi.RL_ACTION_REDIRECT – 将请求重定向到其他 URL。不会进一步处理规则。

  • avi.RL_ACTION_NONE – 不执行任何操作。将生成请求的重要日志,但会将该请求转发到选择的池服务器。

附加配置

必须将 DataScript 配置为引用速率限制配置文件,该配置文件嵌套在附加到一个或多个虚拟服务的 HTTP 应用程序配置文件中。可通过 CLI 或 API 进行此速率限制配置文件关联。以下 CLI 语法将显示如何修改配置文件:

configure applicationprofile <application_profile_name>
dos_rl_profile
rl_profile
custom_requests_rate_limit
count <max_number_of_requests_allowed>
period <time_period_during_which_those_requests_should_be_allowed>
-- Rate limiter allows requests as long as count is not exceeded within period seconds
action type <action_type>
-- Default for action_type is avi.RL_ACTION_CLOSE_CONN
save
-- Repeat until you exit the application profile 

要在 UI 上配置速率限制配置文件,请执行以下操作:

  1. 在控制器上,导航到模板

  2. 应用程序选项卡下,选择并编辑应用程序配置文件(或创建新的应用程序配置文件)。

  3. 选择 DDoS 选项卡。

  4. 添加速率限制下选择限制映射到任何自定义字符串并发送到虚拟服务的所有 URL 的所有 HTTP 请求的速率

  5. 输入阈值时间段的值。对于此特定用例,对操作选择发送 HTTP 本地响应,对状态代码选择 429。无需上载文件。

  6. 单击保存

基本速率限制

示例 1

  • 基于唯一 ID(在本例中为 HTTP 标头值),限制客户端的速率

  • 每个时间段的请求数在速率限制配置文件中定义

avi.vs.rate_limit(avi.RL_CUSTOM_STRING, avi.http.get_header("userID"))

使用罚分定时器限制速率

  • 通过添加惩罚盒 (penalty box) 来扩展速率限制逻辑

  • 通常,速率限制仅允许在 Y 时间段内使用

  • X 个连接。借助惩罚盒,当用户超出限制时,

  • 可能无法发送任何请求,直至罚分定时器过期。

userID = avi.http.get_header("userID")
penalty_time = 900
-- Check if the userID has been added to the table of blocked users
-- The table is used to create a "penalty box" of 900 seconds
-- If user is not in the list then given_action variable is nil
given_action, remaining_time = avi.vs.table_lookup(userID, 0)
if given_action then
   avi.http.close_conn()
else
-- if userID is not in the penalty box table
  count_exceeded, given_action = avi.vs.rate_limit(avi.RL_CUSTOM_STRING, userID, true)
  if count_exceeded then
-- user just crossed the threshold and is now added to the penalty box table
     avi.vs.table_insert(userID, given_action, penalty_time)
-- Since the optional defer_action flag from avi.vs.rate_limit() is set to true
-- The rate limit profile is not enforcing the limit, so it is enforced below
     avi.http.close_conn()
   end
 end

avi.vs.rate.limit.exceed

NSX Advanced Load Balancer 版本 18.2.9 开始,现有速率限制 DataScript API – avi.vs.rate_limit已弃用。用于速率限制的新 DataScript API 是 avi.vs.ratelimit.exceed

已弃用的 DataScript API - avi.vs.rate_limit( type, string_to_limit, [defer_action=False] )

新的 DataScript API – avi.vs.ratelimit.exceed(rl_name, request_key, [consume])

以下是新的 DataScript 速率限制器中使用的参数:

函数

avi.vs.ratelimit.exceed( (rl_name, request_key, [consume]) )

描述

限制各种实体的速率。

事件

HTTP_REQ

参数

  • rl_name 是指速率限制对象。它应与元数据中提供的速率限制对象之一的名称相匹配。

  • request_key 是由 DataScript 代码构造的任意字符串。例如,标头值或其他属性的串联。将为所有指定相同 request_key 的调用留出一个单独的存储桶,且该存储桶具有请求规则元数据中指定的速率。这将允许使用任何属性或属性组合来标识请求。

  • consume 是该 API 将消耗速率限制器存储桶的数量,默认值为 1。返回值是一个布尔值,指示是否达到速率限制。函数本身不应用任何操作;而仅指示用户是否高于阈值。由 DataScript 根据此信息执行操作。

返回

该函数将返回两个变量:

  • 当速率限制器超过配置的值时,rl_exceeds 为 true。

  • 当速率限制器未超过配置的值时,rl_does_not_exceed 为 true。

可以根据要求配置操作。在以下配置部分中,选择相应操作以将事件记录到虚拟服务日志中。

注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

附加配置

必须将 DataScript 配置为引用速率限制配置文件,该配置文件嵌套在附加到一个或多个虚拟服务的 HTTP 应用程序配置文件中。可通过 CLI 或 API 进行此速率限制配置文件关联。以下 CLI 语法将显示如何修改配置文件:

配置 DataScript 速率限制器

登录到 CLI,然后使用 configure vsdatascriptset <policy name> 命令配置速率限制器。提供策略名称,并分配所需的速率限制器值(计数、周期和突发大小),如下所示:

[admin]: > configure vsdatascriptset rate_limiter_test

[admin]: vsdatascriptset> rate_limiters

[admin]: vsdatascriptset:rate_limiters> count 1

[admin]: vsdatascriptset:rate_limiters> period 15

[admin]: vsdatascriptset:rate_limiters> burst_sz 0

[admin]: vsdatascriptset:rate_limiters> name rl1

[admin]: vsdatascriptset:rate_limiters> save

[admin]: vsdatascriptset> save

在 DataScript 中使用 avi.vs.ratelimit.exceed 函数以执行所需的操作。例如:

 result = avi.vs.ratelimit.exceed("rl1", "key1")
 if result == true then
 avi.vs.log("rl exceeds")
 else
 avi.vs.log("rl does not exceed")
 end

avi.vs.reqvar

函数

avi.vs.reqvar.*

描述

设置(写入)或获取(读取)变量。这些变量的范围涵盖 HTTP_REQ 和 HTTP_RESP 事件。它们的生命周期限制为 HTTP 请求/响应事务的生命周期,因此无需手动取消设置。任何 Lua 值都可以存储在此变量中。对于仅在当前事件期间需要的变量数据,请将变量映射到数据。

var = 1
if var == 1 then ...

对于需要在连接之间保存或镜像到虚拟服务其他服务引擎的变量数据,请使用 avi.vs.table_insert()

事件

  • HTTP_REQ

  • HTTP_RESP

参数

返回

刷新成功时,返回布尔值 true,刷新失败时返回 false。

HTTP 请求示例

HTTP_REQ 事件:

avi.vs.reqvar.foo = 10

HTTP_RESP 事件:

if avi.vs.reqvar.foo == 10 then
   avi.vs.log("Foo=" .. avi.vs.reqvar.foo)
end

avi.vs.table_insert

函数

avi.vs.table_lookup( [table_name,] key [, lifetime_exten] )

描述

表 API 用于存储和检索自定义数据。avi.vs.table_lookup API 将查找键并返回相应的值。此键值存储对于每个虚拟服务而言都是唯一的,并在托管 VS 的所有服务引擎之间进行镜像。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

如果未指定可选的 table_name,则将在 VS 的默认表中查找键。指定后,将搜索自定义表。

键用于查找值。

可选的 lifetime_exten 标记必须是正整数,表示应添加到键的当前 lifetime 参数的时间长度(以秒为单位)。如果未指定,则使用默认值 300 秒。这意味着,默认情况下,查找键的值将使键的生命周期再延长 300 秒。要在不影响过期的情况下查找键,请将 lifetime_exten 标记设置为 0。

返回

返回键的值字段。如果不存在值或键不存在,将返回 nil。剩余生命周期为非负整数,表示条目的剩余生命周期(以秒为单位)。

HTTP 请求示例

此用例还可以通过本机应用程序 Cookie 持久性模式执行:

if avi.http.get_cookie("OAM_JSESSIONID") then
    if avi.vs.table_lookup(avi.http.get_cookie("OAM_JSESSIONID")) then
        avi.pool.select(avi.vs.table_lookup(avi.http.get_cookie("JSESSIONID")))
     end                                                                        
 end

HTTP 响应示例

if avi.http.get_cookie("JSESSIONID") ~= "" then
   avi.vs.table_insert(avi.http.get_cookie("JSESSIONID"), avi.pool.server_ip(), 3600)                                                                        
  end

avi.vs.table_lookup

函数

avi.vs.table_lookup( [table_name,] key [, lifetime_exten] )

描述

表 API 用于存储和检索自定义数据。avi.vs.table_lookup API 将查找键并返回相应的值。此键值存储对于每个虚拟服务而言都是唯一的,并在托管 VS 的所有服务引擎之间进行镜像。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

如果未指定可选的 table_name,则将在 VS 的默认表中查找键。指定后,将搜索自定义表。

键用于查找值。

可选的 lifetime_exten 标记必须是正整数,表示应添加到键的当前 lifetime 参数的时间长度(以秒为单位)。如果未指定,则使用默认值 300 秒。这意味着,默认情况下,查找键的值将使键的生命周期再延长 300 秒。要在不影响过期的情况下查找键,请将 lifetime_exten 标记设置为 0。

返回

返回键的值字段。如果不存在值或键不存在,将返回 nil。剩余生命周期为非负整数,表示条目的剩余生命周期(以秒为单位)。

HTTP 请求示例

此用例还可以通过本机应用程序 Cookie 持久性模式执行:

if avi.http.get_cookie("OAM_JSESSIONID") then
    if avi.vs.table_lookup(avi.http.get_cookie("OAM_JSESSIONID")) then
        avi.pool.select(avi.vs.table_lookup(avi.http.get_cookie("JSESSIONID")))
     end                                                                        
 end

HTTP 响应示例

if avi.http.get_cookie("JSESSIONID") ~= "" then
   avi.vs.table_insert(avi.http.get_cookie("JSESSIONID"), avi.pool.server_ip(), 3600)                                                                        
  end

avi.vs.table_refresh

函数

avi.vs.table_refresh( [table_name,] key [, lifetime_exten] )

描述

刷新键/值存储中键条目的生命周期。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

除非通过可选的 table_name 指定其他表名称,否则将查找默认 VS 表中的键。

  • key 用于搜索所需的表条目。

  • 可选的 lifetime_exten 是正整数,是用于延长键/值存储中条目生命周期的值(以秒为单位)。如果未指定,将使用默认值 300 秒来延长条目的生命周期。

返回

刷新成功时,返回布尔值 true,刷新失败时返回 false

备注

将从托管 VS 的所有服务引擎中移除键/值条目。

示例

待定

avi.vs.table_remove

函数

avi.vs.table_remove( [table_name,] key )

描述

表 API 用于存储和检索自定义数据。avi.vs.table_remove API 将从指定键的数据存储中移除指定的键/值对。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

如果未指定可选的 table_name,则将在 VS 的默认表中查找键。指定后,将搜索自定义表。

key 用于搜索要删除的表条目。

返回

备注

将从托管 VS 的所有服务引擎中移除键/值条目。

示例

待定

avi.vs.get_open_conns

函数

avi.vs.get_open_conns()

描述

返回接收请求的 SE 上虚拟服务的打开连接总数

事件

所有事件

参数

返回

打开的连接总数

示例

以下 DataScript 示例将提供 SE 计数和打开的连接数:

local se_count = avi.vs.se_count() 
local open_conn = avi.vs.get_open_conns() 
avi.vs.log("Open conns: " .. open_conn .. " for Total SE: " .. se_count)

avi.vs.se_count

函数

avi.vs.get_se_count()

描述

返回附加到当前虚拟服务的服务引擎总数

事件

所有事件

参数

返回

相应虚拟服务的 SE 总数

示例

如果仅存在一个 SE,以下 DataScript 示例将输出 1:

-- scale-out SE open connection limit
MAX_OPEN_CON=50
local se_count = avi.vs.se_count() 
local open_conn = avi.vs.get_open_conns() 
per_se_max = MAX_OPEN_CON/se_count --Dividing the MAX count per SE, assuming equal distribution.
if (open_conn > per_se_max) then
	avi.vs.log("Current open conns: " .. open_conn .. "> MAX_OPEN_CON=" .. MAX_OPEN_CON .. " for Total SE: " .. se_count)
	avi.http.response(404, {content_type="text/html"}, "<html> MAX_OPEN_CON=" .. MAX_OPEN_CON .. " exceeded, please try later! </html>\n")
else
	avi.vs.log("Open conns: " .. open_conn .. " for Total SE: " .. se_count)
end