文档文档

Lambda 表达式

TICKscript 使用 lambda 表达式来定义数据点上的转换以及定义充当过滤器的布尔条件。Lambda 表达式封装了数学运算、布尔运算、内部函数调用或这三者的组合。TICKscript 试图在大多数你会在 InfluxQL WHERE 子句中使用的表达式也能在 TICKscript 中作为表达式工作,但具有自己的语法。

  • 所有字段或标签标识符都必须用双引号括起来。
  • 相等比较运算符是 == 而不是 =

TICKscript 中的所有 lambda 表达式都以 lambda: 关键字开头。

.where(lambda: "host" == 'server001.example.com')

在某些节点中,lambda 表达式的结果可以使用属性设置器 .as() 捕获到一个新字段中,并命名。通过这种方式,它们可以在管道下游的其他节点中使用。

lambda 表达式的内部函数可以是无状态的,也可以是有状态的。有状态意味着每次函数被评估时,内部状态都可以改变,并且会持续到下一次评估。

例如,内置函数 sigma 计算运行平均值和标准差,并返回当前数据点与平均值的标准差数量。

示例 1 – sigma 函数

sigma("value") > 3.0

每次评估表达式时,它都会更新运行统计数据,然后返回偏差。示例 1 中的简单表达式在它接收到的数据点流保持在运行平均值的 3.0 标准差以内时评估为 false。一旦处理了一个值,其距离平均值超过 3.0 标准差,它就会评估为 true。这样的表达式可以在 TICKscript 中用于定义强大的警报,如下面的示例 2 所示。

示例 2 – 带有 lambda 表达式的 TICKscript

stream
    |from()
    ...
    |alert()
        // use an expression to define when an alert should go critical.
        .crit(lambda: sigma("value") > 3.0)

关于无意类型转换的注意事项

请注意,在 TICKscript 中声明的数值遵循 语法 文档中引入的字面量解析规则。它们可能不是函数或操作的合适类型。包含小数点的数值将被解释为浮点数。不包含小数点的数值将被解释为整数。当整数和浮点数在同一个表达式中使用时,如果需要浮点数结果,整数值需要使用 float() 类型转换函数。如果不遵守此规则,可能会产生意外结果。例如,当使用 lambda 表达式计算类型为浮点数的 0 到 1 之间的比例以生成百分比时;当字段为整数类型时,可能会假定子字段可以被总数字段整除以获得比例(例如 subset/total * 100)。这种整数除以整数的运算将导致整数值 0。此外,将此类操作的结果乘以字面量 100(一个整数)也将导致 0。将整数值转换为浮点数将得到一个介于 0 和 1 之间的有效比例,然后乘以字面量 100.0(一个浮点数)将得到一个有效的百分比值。正确编写的操作应如下所示:

eval(lambda: float("total_error_responses")/float("total_responses") * 100.0).

如果在日志中出现 E! mismatched type to binary operator... 类型的错误,请检查确保运算符两侧的字段类型相同且符合预期。

简而言之,为了确保字段值的类型正确,请使用内置类型转换函数(参见 下方)。

内置函数

有状态函数

Count

Count 不接受任何参数,但返回表达式被评估的次数。

count() int64
Sigma

计算给定值与运行平均值的标准差数量。每次评估表达式时,运行平均值和标准差都会更新。

sigma(value float64) float64
Spread

计算传递给它的所有值的运行范围。范围是接收到的最大值和最小值之间的差值。

spread(value float64) float64

无状态函数

类型转换函数

Bool

通过 Golang 的 strconv.ParseBool 函数将字符串转换为布尔值。数字类型也可以转换为布尔值,其中 0 -> false,1 -> true。

bool(value) bool
Int

通过 Golang 的 strconv.ParseInt 或简单的 int64() 强制类型转换将字符串或 float64 转换为 int64。字符串假定为十进制数。持续时间将被转换为以纳秒为单位的 int64。布尔值将被转换为 int64,其中 false -> 0,true -> 1。

int(value) int64
浮点数

通过 Golang 的 strconv.ParseFloat 或简单的 float64() 强制类型转换将字符串或 int64 转换为 float64。布尔值将被转换为 float64,其中 false -> 0.0,true -> 1.0。

float(value) float64
字符串

通过 Golang 的 strconv.Format* 函数将 bool、int64 或 float64 转换为字符串。持续时间将被转换为持续时间的字符串表示形式。

string(value) string
Duration

将 int64 或 float64 转换为持续时间,假设单位是指定的第二个参数。字符串将被转换为 TICKscript 中的持续时间字面量形式。

duration(value int64|float64, unit duration) duration
duration(value string) duration

Existence

IsPresent

根据指定的字段或标签键是否存在返回布尔值。用于过滤掉缺少指定字段或标签的数据。

|where(lambda: isPresent("myfield"))

如果 myfield 是一个有效标识符,则返回 TRUE,否则返回 FALSE

时间函数

time 字段

在每个表达式中,time 字段包含当前数据点的时间。以下函数可用于 time 字段。每个函数都返回一个 int64。

函数描述
unixNano(t time) int64自 1970 年 1 月 1 日 UTC(Unix 时间)以来经过的纳秒数
minute(t time) int64一小时内的分钟数:范围 [0,59]
hour(t time) int64一天中的小时数:范围 [0,23]
weekday(t time) int64一周中的星期数:范围 [0,6],0 表示星期日
day(t time) int64一个月中的天数:范围 [1,31]
month(t time) int64一年中的月份:范围 [1,12]
year(t time) int64年份

示例用法

lambda: hour("time") >= 9 AND hour("time") < 19

如果数据点的小时数在 0900 小时到 1900 小时之间,则上述表达式评估为 true

Now

返回当前时间。

now() time

示例用法

lambda: "expiration" < unixNano(now())

数学函数

以下数学函数可用。每个函数都通过等效的 Go 函数实现(仅为参考链接到下表)。

函数描述
abs(x float64) float64Abs 返回 x 的绝对值。
acos(x float64) float64Acos 返回 x 的反余弦值(以弧度为单位)。
acosh(x float64) float64Acosh 返回 x 的反双曲余弦值。
asin(x float64) float64Asin 返回 x 的反正弦值(以弧度为单位)。
asinh(x float64) float64Asinh 返回 x 的反双曲正弦值。
atan(x float64) float64Atan 返回 x 的反正切值(以弧度为单位)。
atan2(y, x float64) float64Atan2 返回 y/x 的反正切值,使用两个参数的符号来确定返回值的象限。
atanh(x float64) float64Atanh 返回 x 的反双曲正切值。
cbrt(x float64) float64Cbrt 返回 x 的立方根。
ceil(x float64) float64Ceil 返回大于或等于 x 的最小整数值。
cos(x float64) float64Cos 返回弧度参数 x 的余弦值。
cosh(x float64) float64Cosh 返回 x 的双曲余弦值。
erf(x float64) float64Erf 返回 x 的误差函数。
erfc(x float64) float64Erfc 返回 x 的互补误差函数。
exp(x float64) float64Exp 返回 e**x,即 x 的以 e 为底的指数。
exp2(x float64) float64Exp2 返回 2**x,即 x 的以 2 为底的指数。
expm1(x float64) float64Expm1 返回 e**x - 1,即 x 的以 e 为底的指数减 1。当 x 接近零时,它比 Exp(x) - 1 更精确。
floor(x float64) float64Floor 返回小于或等于 x 的最大整数值。
gamma(x float64) float64Gamma 返回 x 的 Gamma 函数。
hypot(p, q float64) float64Hypot 返回 Sqrt(p*p + q*q),并注意避免不必要的溢出和下溢。
j0(x float64) float64J0 返回第一类零阶贝塞尔函数。
j1(x float64) float64J1 返回第一类一阶贝塞尔函数。
jn(n int64, x float64) float64Jn 返回第一类 n 阶贝塞尔函数。
log(x float64) float64Log 返回 x 的自然对数。
log10(x float64) float64Log10 返回 x 的常用对数。
log1p(x float64) float64Log1p 返回 1+x 的自然对数。当 x 接近零时,它比 Log(1 + x) 更精确。
log2(x float64) float64Log2 返回 x 的二进制对数。
logb(x float64) float64Logb 返回 x 的二进制指数。
max(x, y float64) float64Max 返回 x 或 y 中较大的一个。
min(x, y float64) float64Min 返回 x 或 y 中较小的一个。
mod(x, y float64) float64Mod 返回 x/y 的浮点余数。结果的绝对值小于 y,并且其符号与 x 相同。
pow(x, y float64) float64Pow 返回 x**y,即 y 的以 x 为底的指数。
pow10(x int64) float64Pow10 返回 10**e,即 e 的以 10 为底的指数。
sin(x float64) float64Sin 返回弧度参数 x 的正弦值。
sinh(x float64) float64Sinh 返回 x 的双曲正弦值。
sqrt(x float64) float64Sqrt 返回 x 的平方根。
tan(x float64) float64Tan 返回弧度参数 x 的正切值。
tanh(x float64) float64Tanh 返回 x 的双曲正切值。
trunc(x float64) float64Trunc 返回 x 的整数值。
y0(x float64) float64Y0 返回第二类零阶贝塞尔函数。
y1(x float64) float64Y1 返回第二类一阶贝塞尔函数。
yn(n int64, x float64) float64Yn 返回第二类 n 阶贝塞尔函数。

字符串函数

以下字符串操作函数可用。每个函数都通过等效的 Go 函数实现(仅为参考链接到下表)。

函数描述
strContains(s, substr string) boolStrContains 报告 substr 是否包含在 s 中。
strContainsAny(s, chars string) boolStrContainsAny 报告 chars 中的任何 Unicode 代码点是否包含在 s 中。
strCount(s, sep string) int64StrCount 计算 s 中 sep 的非重叠实例的数量。如果 sep 是空字符串,Count 返回 1 + s 中的 Unicode 代码点数量。
strHasPrefix(s, prefix string) boolStrHasPrefix 测试字符串 s 是否以 prefix 开头。
strHasSuffix(s, suffix string) boolStrHasSuffix 测试字符串 s 是否以 suffix 结尾。
strIndex(s, sep string) int64StrIndex 返回 sep 在 s 中的第一个实例的索引,如果 sep 不存在于 s 中则返回 -1。
strIndexAny(s, chars string) int64StrIndexAny 返回 chars 中的任何 Unicode 代码点在 s 中的第一个实例的索引,如果 chars 中的任何 Unicode 代码点不存在于 s 中则返回 -1。
strLastIndex(s, sep string) int64StrLastIndex 返回 sep 在 s 中的最后一个实例的索引,如果 sep 不存在于 s 中则返回 -1。
strLastIndexAny(s, chars string) int64StrLastIndexAny 返回 chars 中的任何 Unicode 代码点在 s 中的最后一个实例的索引,如果 chars 中的任何 Unicode 代码点不存在于 s 中则返回 -1。
strLength(s string) int64StrLength 返回字符串的长度。
strReplace(s, old, new string, n int64) stringStrReplace 返回字符串 s 的副本,其中 old 的前 n 个非重叠实例被替换为 new。
strSubstring(s string, start, stop int64) stringStrSubstring 根据给定的索引返回一个子字符串,strSubstring(str, start, stop) 等同于 Go 中的 str[start:stop]。
strToLower(s string) stringStrToLower 返回字符串 s 的副本,其中所有 Unicode 字母都映射到其小写形式。
strToUpper(s string) stringStrToUpper 返回字符串 s 的副本,其中所有 Unicode 字母都映射到其大写形式。
strTrim(s, cutset string) stringStrTrim 返回字符串 s 的切片,移除所有开头和结尾的包含在 cutset 中的 Unicode 代码点。
strTrimLeft(s, cutset string) stringStrTrimLeft 返回字符串 s 的切片,移除所有开头包含在 cutset 中的 Unicode 代码点。
strTrimPrefix(s, prefix string) stringStrTrimPrefix 返回 s,但移除提供的开头前缀字符串。如果 s 不以 prefix 开头,则 s 保持不变。
strTrimRight(s, cutset string) stringStrTrimRight 返回字符串 s 的切片,移除所有结尾包含在 cutset 中的 Unicode 代码点。
strTrimSpace(s string) stringStrTrimSpace 返回字符串 s 的切片,移除所有开头和结尾的空格,根据 Unicode 定义。
strTrimSuffix(s, suffix string) string)StrTrimSuffix 返回 s,但移除提供的结尾后缀字符串。如果 s 不以 suffix 结尾,则 s 保持不变。
regexReplace(r regex, s, pattern string) stringRegexReplace 用输出字符串替换输入字符串中的正则表达式匹配项。例如 regexReplace(/a(b*)c/, ‘abbbc’, ‘group is $1’) -> ‘group is bbb’。如果未找到匹配项,则返回原始字符串。

示例

.where(lambda: !strContains("fstype", 'nfs') OR !strContains("fstype", 'cifs'))

人类可读字符串函数

HumanBytes

将具有字节单位的 int64 或 float64 转换为表示字节数的、人类可读的字符串。

humanBytes(value) string

条件函数

If

根据第一个参数的值返回其操作数的结果。第二个和第三个参数必须返回相同类型。

示例

|eval(lambda: if("field" > threshold AND "field" != 0, 'high', 'normal'))
    .as('value')

在上面的示例中,字段 value 的值将是字符串 highnormal,具体取决于作为第一个参数传递的条件。

if 函数的返回类型与其第二个和第三个参数的类型相同。

if(condition, true expression, false expression)

此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2