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() int64Sigma
计算给定值与运行平均值的标准差数量。每次评估表达式时,运行平均值和标准差都会更新。
sigma(value float64) float64Spread
计算传递给它的所有值的运行范围。范围是接收到的最大值和最小值之间的差值。
spread(value float64) float64无状态函数
类型转换函数
Bool
通过 Golang 的 strconv.ParseBool 函数将字符串转换为布尔值。数字类型也可以转换为布尔值,其中 0 -> false,1 -> true。
bool(value) boolInt
通过 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) stringDuration
将 int64 或 float64 转换为持续时间,假设单位是指定的第二个参数。字符串将被转换为 TICKscript 中的持续时间字面量形式。
duration(value int64|float64, unit duration) duration
duration(value string) durationExistence
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 函数实现(仅为参考链接到下表)。
字符串函数
以下字符串操作函数可用。每个函数都通过等效的 Go 函数实现(仅为参考链接到下表)。
| 函数 | 描述 |
|---|---|
| strContains(s, substr string) bool | StrContains 报告 substr 是否包含在 s 中。 |
| strContainsAny(s, chars string) bool | StrContainsAny 报告 chars 中的任何 Unicode 代码点是否包含在 s 中。 |
| strCount(s, sep string) int64 | StrCount 计算 s 中 sep 的非重叠实例的数量。如果 sep 是空字符串,Count 返回 1 + s 中的 Unicode 代码点数量。 |
| strHasPrefix(s, prefix string) bool | StrHasPrefix 测试字符串 s 是否以 prefix 开头。 |
| strHasSuffix(s, suffix string) bool | StrHasSuffix 测试字符串 s 是否以 suffix 结尾。 |
| strIndex(s, sep string) int64 | StrIndex 返回 sep 在 s 中的第一个实例的索引,如果 sep 不存在于 s 中则返回 -1。 |
| strIndexAny(s, chars string) int64 | StrIndexAny 返回 chars 中的任何 Unicode 代码点在 s 中的第一个实例的索引,如果 chars 中的任何 Unicode 代码点不存在于 s 中则返回 -1。 |
| strLastIndex(s, sep string) int64 | StrLastIndex 返回 sep 在 s 中的最后一个实例的索引,如果 sep 不存在于 s 中则返回 -1。 |
| strLastIndexAny(s, chars string) int64 | StrLastIndexAny 返回 chars 中的任何 Unicode 代码点在 s 中的最后一个实例的索引,如果 chars 中的任何 Unicode 代码点不存在于 s 中则返回 -1。 |
| strLength(s string) int64 | StrLength 返回字符串的长度。 |
| strReplace(s, old, new string, n int64) string | StrReplace 返回字符串 s 的副本,其中 old 的前 n 个非重叠实例被替换为 new。 |
| strSubstring(s string, start, stop int64) string | StrSubstring 根据给定的索引返回一个子字符串,strSubstring(str, start, stop) 等同于 Go 中的 str[start:stop]。 |
| strToLower(s string) string | StrToLower 返回字符串 s 的副本,其中所有 Unicode 字母都映射到其小写形式。 |
| strToUpper(s string) string | StrToUpper 返回字符串 s 的副本,其中所有 Unicode 字母都映射到其大写形式。 |
| strTrim(s, cutset string) string | StrTrim 返回字符串 s 的切片,移除所有开头和结尾的包含在 cutset 中的 Unicode 代码点。 |
| strTrimLeft(s, cutset string) string | StrTrimLeft 返回字符串 s 的切片,移除所有开头包含在 cutset 中的 Unicode 代码点。 |
| strTrimPrefix(s, prefix string) string | StrTrimPrefix 返回 s,但移除提供的开头前缀字符串。如果 s 不以 prefix 开头,则 s 保持不变。 |
| strTrimRight(s, cutset string) string | StrTrimRight 返回字符串 s 的切片,移除所有结尾包含在 cutset 中的 Unicode 代码点。 |
| strTrimSpace(s string) string | StrTrimSpace 返回字符串 s 的切片,移除所有开头和结尾的空格,根据 Unicode 定义。 |
| strTrimSuffix(s, suffix string) string) | StrTrimSuffix 返回 s,但移除提供的结尾后缀字符串。如果 s 不以 suffix 结尾,则 s 保持不变。 |
| regexReplace(r regex, s, pattern string) string | RegexReplace 用输出字符串替换输入字符串中的正则表达式匹配项。例如 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 的值将是字符串 high 或 normal,具体取决于作为第一个参数传递的条件。
if 函数的返回类型与其第二个和第三个参数的类型相同。
if(condition, true expression, false expression)此页面是否有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 Kapacitor 和本文档提供反馈和错误报告。要获取支持,请使用以下资源: