1 宏函数

概述

宏函数提供了自定义 macro 值的能力。

有时宏可能解析为一个不太便于使用的值。该值可能过长,或包含您希望提取的特定子字符串。这正是宏函数可以发挥作用的地方。

宏函数的语法为:

{<macro>.<func>(<params>)}

其中:

  • <macro> - 待定制的宏(例如 {ITEM.VALUE} 或 {#LLDMACRO})
  • <func> - 要应用的函数
  • <params> - 以逗号分隔的函数参数列表

在以下情况下必须对参数加引号:

  • 以空格或双引号开头
  • 包含右括号或逗号

例如:

{{TIME}.fmttime(format,time_shift)}
       {{ITEM.VALUE}.regsub(pattern, output)}
       {{#LLDMACRO}.regsub(pattern, output)}

每个宏仅支持单个函数;不支持链式多重宏函数。

当宏函数用于其他上下文(函数、监控项 键、另一个宏等)时,请参阅 escaping examples

支持的宏函数

可选函数参数由< >表示。

函数
描述 参数 支持范围
fmtnum (digits)
控制小数点后显示位数的数字格式化功能。 digits - 小数点后的位数。有效范围:0-20(自Zabbix 6.0.21起)。不会产生尾随零。 {ITEM.VALUE}
{ITEM.LASTVALUE}
表达式宏
fmttime (format,<time_shift>)
时间格式化功能。 format - 必填的格式string,兼容strftime函数格式
time_shift - 应用于格式化前的时间偏移量;应以
-<N><time_unit>+<N><time_unit>开头,其中
N - 要加减的时间单位数量;
time_unit - h(小时)、d(天)、w(周)、M(月)或y(年)。
自Zabbix 5.4起,time_shift参数支持多步时间操作,可包含/<time_unit>用于偏移到时间单位的起始点(/d - 午夜,/w - 周的第一天(周一),/M - 月的第一天等)。示例:
-1w - 精确回溯7天;
-1w/w - 上周的周一;
-1w/w+1d - 上周的周二。
注意时间操作从左到右计算,无优先级。例如,-1M/d+1h/w将被解析为((-1M/d)+1h)/w
{TIME}
iregsub (pattern,output)
通过正则表达式匹配提取子字符串(不区分大小写)。 pattern - 要匹配的正则表达式
output - 输出选项。支持\1 - \9占位符捕获分组。\0返回匹配的文本。
{ITEM.VALUE}
{ITEM.LASTVALUE}
Low-level discovery macros(低级发现规则过滤器除外)
regsub (pattern,output)
通过正则表达式匹配提取子字符串(区分大小写)。 pattern - 要匹配的正则表达式
output - 输出选项。支持\1 - \9占位符捕获分组。\0返回匹配的文本。
{ITEM.VALUE}
{ITEM.LASTVALUE}
Low-level discovery macros(低级发现规则过滤器除外)

如果在supported location中使用函数,但应用于不支持宏函数的宏,则该宏将评估为'未知'。

如果pattern不是正确的正则表达式,则宏将评估为'未知'(低级发现宏除外,在这种情况下函数将被忽略,宏将保持未展开状态)

示例

以下示例展示了如何使用宏函数自定义接收值的宏值:

接收值 输出
24.3413523 {{ITEM.VALUE}.fmtnum(2)} 24.34
24.3413523 {{ITEM.VALUE}.fmtnum(0)} 24
12:36:01 {{TIME}.fmttime(%B)} October
12:36:01 {{TIME}.fmttime(%d %B,-1M/M)} 1 September
123Log line {{ITEM.VALUE}.regsub(^[0-9]+, Problem)} Problem
123 Log line {{ITEM.VALUE}.regsub("^([0-9]+)", "Problem")} Problem
123 Log line {{ITEM.VALUE}.regsub("^([0-9]+)", Problem ID: \1)} Problem ID: 123
Log line {{ITEM.VALUE}.regsub(".*", "Problem ID: \1")} ''Problem ID: ''
MySQL crashed errno 123 {{ITEM.VALUE}.regsub("^(\w+).*?([0-9]+)", " Problem ID: \1_\2 ")} '' Problem ID: MySQL_123 ''
123 Log line {{ITEM.VALUE}.regsub("([1-9]+", "Problem ID: \1")} *UNKNOWN* (无效正则表达式)
customername_1 {{#IFALIAS}.regsub("(.*)_([0-9]+)", \1)} customername
customername_1 {{#IFALIAS}.regsub("(.*)_([0-9]+)", \2)} 1
customername_1 {{#IFALIAS}.regsub("(.*)_([0-9]+", \1)} {{#IFALIAS}.regsub("(.*)_([0-9]+", \1)} (无效正则表达式)
customername_1 {$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+)\", \1)}"} {$MACRO:"customername"}
customername_1 {$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+)\", \2)}"} {$MACRO:"1"}
customername_1 {$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+\", \1)}"} {$MACRO:"{{#M}.regsub(\"(.*)_([0-9]+\", \1)}"} (无效正则表达式)
customername_1 "{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+)\\", \1)}\"}" "{$MACRO:\"customername\"}"
customername_1 "{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+)\\", \2)}\"}" "{$MACRO:\"1\"}")
customername_1 "{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+\\", \1)}\"}" "{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+\\", \1)}\"}") (无效正则表达式)
查看完整监控项值

在某些前端位置,解析后的{ITEM.VALUE}和{ITEM.LASTVALUE}宏的文本/日志监控项长值会被截断为20个字符。 要查看这些宏的完整值,可以使用宏函数,例如:

{{ITEM.VALUE}.regsub("(.*)", \1)}
{{ITEM.LASTVALUE}.regsub("(.*)", \1)}

另请参阅: {ITEM.VALUE}和{ITEM.LASTVALUE}macro details