[comment]: # ({c176fd71-2d9d6e33})
# 5 低级别自动发现宏

[comment]: # ({/c176fd71-2d9d6e33})

[comment]: # ({26d00724-bb12a85a})
#### 概述

在[低级发现](/manual/discovery/low_level_discovery)（LLD）功能中，会使用一种宏：

```default
{#MACRO} 
```

它是在 LLD 规则中使用的宏，返回文件系统名称、网络接口、SNMP OID 等的实际值。

这些宏可用于创建实体原型（监控项、触发器、图形、LLD 规则、主机和主机组原型）。
在发现实际的[文件系统](/manual/discovery/low_level_discovery/examples/mounted_filesystems)、[网络接口](/manual/discovery/low_level_discovery/examples/network_interfaces)、[虚拟机](/manual/vm_monitoring)等时，这些宏会被替换为实际值，并作为创建实际实体的基础。

有些低级发现宏是 Zabbix 中 LLD 功能“预置”的——{\#FSNAME}、{\#FSTYPE}、{\#IFNAME}、{\#SNMPINDEX}、{\#SNMPVALUE}。
但是，在创建[自定义](/manual/discovery/low_level_discovery/custom_rules)低级发现规则时，并不强制要求遵循这些名称。
此时，您可以使用任何其他 LLD 宏名称，并引用该名称。

[comment]: # ({/26d00724-bb12a85a})

[comment]: # ({fe3a506a-ab24d69c})
#### 支持的数据类型

在定义自定义发现规则时，JSON 对象中为 LLD 宏返回的属性值必须是以下原始类型之一：

-   string
-   number
-   boolean

不支持数组、对象和 null 值。  
任何引用此类值的 LLD 宏都将保持未展开状态，并会在监控项预处理和创建期间按字面显示（例如 `'{#MY_MACRO}'`）。

[comment]: # ({/fe3a506a-ab24d69c})

[comment]: # ({0f3a78fe-fc325ce1})
#### 支持的位置

LLD 宏可用于：

-   低级别发现规则过滤器中
-   嵌套的低级别发现规则中，在
    -   JSONPath 预处理参数中
    -   用于自定义 LLD 宏的 JSONPath 字段中
-   用于监控项原型和发现原型，在以下位置中
    -   名称
    -   键参数
    -   单位
    -   更新间隔^[1](lld_macros#footnotes)^
    -   超时^[1](lld_macros#footnotes)^
    -   历史数据存储期^[1](lld_macros#footnotes)^
    -   趋势数据存储期^[1](lld_macros#footnotes)^
    -   监控项值预处理步骤
    -   SNMP OID
    -   IPMI 传感器字段
    -   calculated/aggregate 监控项表达式中，在：
        -   表达式常量和函数参数中
        -   监控项键参数中
    -   aggregate 监控项过滤条件（主机组名称和标签名称）
    -   SSH 脚本和 Telnet 脚本
    -   数据库监控 SQL 查询
    -   JMX 监控项端点字段
    -   描述
    -   HTTP agent URL 字段
    -   HTTP agent HTTP 查询字段字段
    -   HTTP agent 请求体字段
    -   HTTP agent 所需状态码字段
    -   HTTP agent 标头字段键和值
    -   HTTP agent HTTP 认证用户名字段
    -   HTTP agent HTTP 认证密码字段
    -   HTTP agent HTTP proxy 字段
    -   HTTP agent HTTP SSL 证书文件字段
    -   HTTP agent HTTP SSL 密钥文件字段
    -   HTTP agent HTTP SSL 密钥密码字段
    -   标签
-   用于触发器原型，在以下位置中
    -   名称
    -   运行数据
    -   表达式（仅限常量和函数参数中）
    -   URL
    -   描述
    -   标签
-   用于图形原型，在以下位置中
    -   名称
-   用于主机原型，在以下位置中
    -   名称
    -   可见名称
    -   自定义接口字段：IP、DNS、端口、SNMP v1/v2 community、SNMP v3 上下文名称、SNMP v3 安全名称、SNMP v3 认证口令、SNMP v3 隐私口令
    -   主机组原型名称
    -   主机标签值
    -   主机宏值
    -   （请参见[完整列表](/manual/vm_monitoring/discovery_fields)）

在所有这些位置中，除了低级别发现规则过滤器外，LLD 宏还可在静态用户[宏上下文](/manual/config/macros/user_macros_context)中使用。

[comment]: # ({/0f3a78fe-fc325ce1})

[comment]: # ({eb8eceaa-5b26ab61})
#### 使用宏函数

宏函数支持与低级别发现宏一起使用（低级别发现规则的 [过滤器](/manual/discovery/low_level_discovery#filter) 除外），允许使用正则表达式提取宏值中的某一部分。

例如，出于事件标签的目的，您可能希望从以下 LLD 宏中提取客户名称和接口编号：

```default
{#IFALIAS}=customername_1
```

为此，可以在触发器原型的事件标签值字段中，将 `regsub` 宏函数与该宏一起使用：

![](../../../../assets/en/manual/config/macros/lld_macro_function.png)

请注意，在未加引号的监控项 [键参数](/manual/config/items/item/key#key-parameters) 中不允许使用逗号，因此包含宏函数的参数必须加引号。
参数内部的双引号应使用反斜杠（`\`）字符进行转义。
示例：

```default
net.if.in["{{#IFALIAS}.regsub(\"(.*)_([0-9]+)\", \1)}",bytes]
```

有关宏函数语法的更多信息，请参见：[宏函数](/manual/config/macros/macro_functions)

自 Zabbix 4.0 起，低级别发现宏支持宏函数。

[comment]: # ({/eb8eceaa-5b26ab61})

[comment]: # ({e463c54b-4ba4eb55})
##### 不带键参数的监控项原型

当未使用监控项键参数时，请将 LLD 宏放在[监控项键](/manual/config/items/item/key)参数方括号 `[...]` 内，这样它会被视为一个参数，并在发现期间被替换：

```default
v_[{#MACRO}]
```

[comment]: # ({/e463c54b-4ba4eb55})

[comment]: # ({47156e66-573cd0dc})
##### 注释

^**1**^ 在标有 ^[1](lld_macros#footnotes)^ 的字段中，单个宏必须填充整个字段。
不支持在一个字段中使用多个宏，也不支持将宏与文本混合使用。

[comment]: # ({/47156e66-573cd0dc})
