这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.

1 宏函数

概述

宏函数提供自定义[Macro](/manual/config/macros)值的功能。

有时宏可能解析为一个不一定容易使用的值。它可能很长,或者包含您想要提取的特定感兴趣的子字符串。这就是宏函数可以发挥作用的地方。

宏函数的语法是:

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

其中:

  • <macro> - 要自定义的宏(例如{ITEM.VALUE}或{#LLDMACRO})
  • <func> - 要应用的函数
  • <params> - 以逗号分隔的函数参数列表。如果参数以“'”(空格)、“或包含”开头,则必须将其引用。

例如:

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

支持的宏函数

函数
说明 参数 支持
fmtnum(<digits>)
数字格式,用于控制小数点后打印的位数 位数-小数点后的位数。不会产生尾随零 {ITEM.VALUE}
{ITEM.LASTVALUE}
表达式宏
fmttime(<format>,<time\u shift>)
时间格式 格式-强制格式字符串,与strftime函数格式化兼容
time\u shift-应用于格式化前时间的时间移位;应以
-<N><time\u unit>+<N><time\u unit>开头,其中
N——要加或减的时间单位数
时间_单位-小时、天、周、月或年
自Zabbix 5.4以来,time\u shift参数支持多步时间操作,可能包括“/<time>”以切换到时间单位的开头(“/d”-午夜,“/w”-一周的第一天(周一),“/M”-一个月的第一天,等等)。示例:
“-1w”-正好7天前
“-1w/w”-前一周的星期一
“-1w/w+1d”-前一周的星期二
注意,时间运算是从左到右计算的,没有优先级。例如,“-1M/d+1h/w”将被解析为“(-1M/d)+1h)/w”
{TIME}
iregsub(<pattern>,<output>)
通过正则表达式匹配提取子字符串(不区分大小写) 模式匹配的正则表达式
输出输出选项\1-\9支持占位符来捕获组\0返回匹配的文本
{ITEM.VALUE}
{ITEM.LASTVALUE}
底层自动发现宏(底层自动发现规则筛选器中除外)
regsub(<pattern>,<output>)
通过正则表达式匹配提取子字符串(区分大小写) 模式匹配的正则表达式
输出输出选项\1-\9支持占位符来捕获组\0返回匹配的文本
{ITEM.VALUE}
{ITEM.LASTVALUE}
底层自动发现宏(底层自动发现规则筛选器中除外)

如果函数在支持的位置中使用,但应用于不支持宏函数的宏,则宏的计算结果为“未知”。

如果模式不是正确的正则表达式,则宏的计算结果为“未知”(不包括底层自动发现宏,在这种情况下,函数将被忽略,宏将保持未展开)

如果在不支持宏函数的位置将宏函数应用于宏,则该函数将被忽略。

例子

以下示例说明了使用宏函数自定义宏值的方法:

收到的值 宏变量 输出
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* (invalid regular expression)
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)} (invalid regular expression)
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)}"} (invalid regular expression)
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)}\"}") (invalid regular expression)
查看完整的监控项值

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

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

另请参阅:{ITEM.VALUE} 和 {ITEM.LASTVALUE} 宏详细信息