1 宏函数

概述

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

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

宏函数的语法是:

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

其中:

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

例如:

  1. {{TIME}.fmttime(format,time_shift)}
  2. {{ITEM.VALUE}.regsub(pattern, output)}
  3. {{#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
customername1{{#IFALIAS}.regsub(“(.*)([0-9]+)”, \2)}1
customername1{{#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”}
customername1{$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\”}”)
customername1“{$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} 宏详细信息