DataScript 中提供了以下虚拟服务函数:
函数 |
描述 |
---|---|
创建并操作计数器类型衡量指标。有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题。 |
|
创建并操作计量器类型衡量指标。 |
|
如果存在具有给定名称和给定类型的用户定义的衡量指标,则返回该用户定义衡量的指标值。 |
|
返回衡量指标的值,无论是绝对值、计数器还是计量器类型。 |
|
返回客户端 IP 地址 |
|
返回客户端源端口 |
|
关闭当前 TCP/UDP 连接 |
|
返回 VS 的 IP 地址 |
|
将自定义日志写入 。 |
|
返回虚拟服务的名称。 |
|
返回连接的 VS 端口。 |
|
使用负载均衡流量后使用的键创建持久性条目。 |
|
avi.vs.rate_limit( type, string_to_limit, [defer_action=False] ) |
限制各种实体的速率。 |
设置在事件之间可用的全局变量。 |
|
avi.vs.table_insert( [table_name,] key, value [, lifetime] ) |
将自定义数据存储在基于时间的表中。 |
查找表中的数据。 |
|
avi.vs.table_refresh( [table_name,] key [, lifetime_exten] ) |
更新表条目的过期时间。 |
限制各种实体的速率。 |
|
从表中移除数据。 |
|
返回附加到当前虚拟服务的每个服务引擎的打开连接总数。 |
|
返回附加到当前虚拟服务的服务引擎总数。 |
avi.vs.analytics.counter
函数 |
|
描述 |
增加或清除指定的计数器衡量指标。 有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题 |
事件 |
|
参数 |
注:
|
返回 |
不返回任何值 |
相关 |
|
示例 |
|
avi.vs.analytics.gauge
函数 |
|
描述 |
递增、递减、设置或清除指定的计量器衡量指标。 有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》中的“NSX Advanced Load Balancer 监控组件”主题。 |
事件 |
|
参数 |
注:
|
返回 |
不返回任何值 |
相关 |
|
示例 |
|
avi.vs.analytics.get_metric
函数 |
|
描述 |
返回衡量指标的值,无论是计数器还是计量器类型。在执行此操作之前,该函数将首先检查是否已定义 metric_name。如果已定义,该函数会将 metric_type 的值与先前存储的类型进行比较。如果从未定义 metric_name,或者类型不正确,该函数将在日志中报告错误,并且将取消导致此函数调用的请求/响应。 有关更多信息,请参阅《VMware NSX Advanced Load Balancer 监控和可操作性指南》的“NSX Advanced Load Balancer 监控组件”主题中的“用户定义的衡量指标”一节。 |
事件 |
|
参数 |
|
返回 |
衡量指标的值 |
相关 |
|
示例 |
将 goo-current-val 设置为名为 goo 的 counter-type 衡量指标的当前值(如果存在)。 goo-current-val = avi.vs.analytics.get_metric ("goo", avi.vs.analytics.METRICTYPE_COUNTER) |
avi.vs.analytics.get_counter
函数 |
|
描述 |
返回衡量指标的值,无论是绝对值、计数器还是计量器类型。在执行此操作之前,该函数将首先检查是否已定义 |
事件 |
|
参数 |
|
返回 |
衡量指标的值 |
相关 |
|
示例 |
TBD |
avi.vs.client_ip
函数 |
|
描述 |
返回客户端的 IPv4 或 IPv6 地址。 |
事件 |
全部 |
参数 |
无 |
返回 |
包含客户端的源 IP 地址的字符串。 |
示例 |
将客户端的源 IP 地址插入 HTTP 标头中。 avi.http.add_header("XFF", avi.vs.client_ip()) |
avi.vs.client_port
函数 |
|
描述 |
返回客户端的源端口。 |
事件 |
|
参数 |
无 |
返回 |
包含客户端源端口的字符串。 |
示例 |
提供 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
函数 |
|
描述 |
关闭当前 TCP/UDP 连接。对于 UDP 连接,重置标记不会产生任何后果。 |
事件 |
|
参数 |
|
返回 |
无返回值 |
示例 |
if avi.vs.client_ip() == "10.1.1.1" then avi.vs.close_conn() end avi.vs.close_conn(1) |
avi.vs.ip
函数 |
|
描述 |
返回接受请求或连接的虚拟服务 IPv6 地址。 |
事件 |
|
参数 |
|
返回 |
十六进制字符串格式的 IPv6 地址(以冒号分隔),例如, |
示例 |
插入标头,告知服务器流量来自哪个 VS。 avi.http.add_header("VS_IP", avi.vs.ip()) |
avi.vs.log
函数 |
|
描述 |
生成与连接或请求关联的日志,并在 |
事件 |
|
参数 |
|
返回 |
无 |
示例 |
来自 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!
注:
日志以元信息为前缀,元信息通常是调用 重要日志记录示例: 来自 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
函数 |
|
描述 |
返回已接受请求或连接的虚拟服务的名称。 |
事件 |
|
参数 |
无 |
返回 |
包含虚拟服务名称的字符串。 |
示例 |
在发送到服务器的流量中插入标头:X-Source: www.avi.com-10.1.1.1 avi.http.add_header("X-Source", avi.vs.name() .. "-" .. avi.vs.ip()) |
avi.vs.port()
函数 |
|
描述 |
返回已接收请求或连接的虚拟服务端口。 |
事件 |
|
参数 |
无 |
返回 |
包含虚拟服务端口号的字符串。 |
示例 |
如果 HTTP 请求未到达端口 443,将关闭连接。 if avi.vs.port() ~= "443" then avi.http.close_conn() end |
avi.vs.persist
函数 |
|
描述 |
将请求负载均衡到提供的可选池或连接到虚拟服务的池。 同样,此函数还会创建键值持久性条目。键是传递的参数,值是负载均衡 IP 和端口(例如:10.10.10.10-80)。 可选的生命周期可确保在传递的生命周期中创建持久性表条目。 默认值为 300 秒。 在后台,此 API 执行传统的负载均衡,并且自动创建一个持久性表条目,值为负载均衡的后端服务器。 反复调用此 API 将刷新超时。 |
事件 |
|
参数 |
键、[生命周期]、[池] |
返回 |
无返回值 |
示例 |
if username == “my_user” then avi.vs.persist(username, 3600, “POOL_80”) |
此 API 从 DataScript 生成,运行此 API 后将不再有其他语句。这是一个终端 API。
avi.vs.rate.limit
函数 |
|
描述 |
限制各种实体的速率。 |
事件 |
|
参数 |
|
返回 |
该函数返回两个可选的纯信息变量:
可能的选项包括:
|
必须将 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 上配置速率限制配置文件,请执行以下操作:
在控制器上,导航到模板。
在应用程序选项卡下,选择并编辑应用程序配置文件(或创建新的应用程序配置文件)。
选择 DDoS 选项卡。
在添加速率限制下选择限制映射到任何自定义字符串并发送到虚拟服务的所有 URL 的所有 HTTP 请求的速率。
输入阈值和时间段的值。对于此特定用例,对操作选择发送 HTTP 本地响应,对状态代码选择 429。无需上载文件。
单击保存。
基本速率限制
示例 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 速率限制器中使用的参数:
函数 |
|
描述 |
限制各种实体的速率。 |
事件 |
|
参数 |
|
返回 |
该函数将返回两个变量:
可以根据要求配置操作。在以下配置部分中,选择相应操作以将事件记录到虚拟服务日志中。 |
事件 SSL_PRECONNECT、SSL_CLIENTHELLO 和 SSL_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
函数 |
|
描述 |
设置(写入)或获取(读取)变量。这些变量的范围涵盖 HTTP_REQ 和 HTTP_RESP 事件。它们的生命周期限制为 HTTP 请求/响应事务的生命周期,因此无需手动取消设置。任何 Lua 值都可以存储在此变量中。对于仅在当前事件期间需要的变量数据,请将变量映射到数据。 var = 1 if var == 1 then ... 对于需要在连接之间保存或镜像到虚拟服务其他服务引擎的变量数据,请使用 avi.vs.table_insert() |
事件 |
|
参数 |
无 |
返回 |
刷新成功时,返回布尔值 true,刷新失败时返回 false。 |
HTTP 请求示例 |
avi.vs.reqvar.foo = 10
if avi.vs.reqvar.foo == 10 then avi.vs.log("Foo=" .. avi.vs.reqvar.foo) end |
avi.vs.table_insert
函数 |
|
描述 |
表 API 用于存储和检索自定义数据。avi.vs.table_lookup API 将查找键并返回相应的值。此键值存储对于每个虚拟服务而言都是唯一的,并在托管 VS 的所有服务引擎之间进行镜像。 |
事件 |
|
参数 |
如果未指定可选的 键用于查找值。 可选的 |
返回 |
返回键的值字段。如果不存在值或键不存在,将返回 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
函数 |
|
描述 |
表 API 用于存储和检索自定义数据。avi.vs.table_lookup API 将查找键并返回相应的值。此键值存储对于每个虚拟服务而言都是唯一的,并在托管 VS 的所有服务引擎之间进行镜像。 |
事件 |
|
参数 |
如果未指定可选的 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
函数 |
|
描述 |
刷新键/值存储中键条目的生命周期。 |
事件 |
|
参数 |
除非通过可选的
|
返回 |
刷新成功时,返回布尔值 |
备注 |
将从托管 VS 的所有服务引擎中移除键/值条目。 |
示例 |
待定 |
avi.vs.table_remove
函数 |
|
描述 |
表 API 用于存储和检索自定义数据。 |
事件 |
|
参数 |
如果未指定可选的
|
返回 |
无 |
备注 |
将从托管 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 |