通用表达式语言输入
编辑通用表达式语言输入
编辑使用 cel
输入,通过 通用表达式语言 (CEL) 和 mito CEL 扩展库,从文件路径或 HTTP API 读取具有各种有效负载的消息。
CEL 是一种非图灵完备的语言,可以对输入中的表达式进行求值,其中可以包括使用 mito 扩展库的文件和 API 端点。cel
输入定期运行一个 CEL 程序,该程序被赋予一个可以由用户配置的执行环境,并发布程序求值产生的一组事件。可选地,CEL 程序可以返回游标状态,这些状态将被提供给 CEL 程序的下一次执行。游标状态可用于控制程序的行为。
此输入支持
-
身份验证
- 基本
- 摘要
- OAuth2
- 以可配置的间隔检索
- 分页
- 重试
- 速率限制
- 代理
示例配置
filebeat.inputs: # Fetch your public IP every minute. - type: cel interval: 1m resource.url: https://api.ipify.org/?format=json program: | bytes(get(state.url).Body).as(body, { "events": [body.decode_json()] })
或等效地使用 ipify.org 的文本格式
filebeat.inputs: # Fetch your public IP every minute. - type: cel interval: 1m resource.url: https://api.ipify.org/?format=text program: | { "events": [{"ip": string(get(state.url).Body)}] }
filebeat.inputs: - type: cel resource.url: https://127.0.0.1:9200/_search state: scroll: 5m program: | ( !has(state.cursor) || !has(state.cursor.scroll_id) ? post(state.url+"?scroll=5m", "", "") : post( state.url+"/scroll?"+{"scroll_id": [state.cursor.scroll_id]}.format_query(), "application/json", {"scroll": state.scroll}.encode_json() ) ).as(resp, bytes(resp.Body).decode_json().as(body, { "events": body.hits.hits, "cursor": {"scroll_id": body._scroll_id}, }))
执行
编辑为输入提供的执行环境包括 mito 库提供的函数、宏和全局变量。单个 JSON 对象作为输入提供,可通过 state
变量访问。state
包含一个字符串 url
字段,并且可能包含通过输入的 state
配置配置的其他任意字段。如果 CEL 程序在程序执行之间保存游标状态,则配置的 state.cursor
值将在执行之前被保存的游标替换。
启动时,state
将如下所示
{ "url": <resource address>, "cursor": { ... }, ... }
state.url
字段将存在,并且可能是 HTTP 端点或文件路径。如果存在文件 URL,则 CEL 程序有责任从文件 URL 中删除方案。state.url
字段可以在程序执行期间被修改,但修改后的状态不会在重启之间持久化。state.url
字段必须存在于返回值中,以确保它在下一次求值中可用,除非程序在资源地址中硬编码或可从游标获得。
其他字段可能存在于对象的根目录,如果程序可以容忍,则游标值可能不存在。只有游标在重启时持久化,但状态中的所有字段都会在处理循环的迭代之间保留,除了生成的事件数组,请参见下文。
如果游标存在,程序应根据其值执行和处理请求。如果游标不存在,程序必须有备选逻辑来确定要发出的请求。
程序执行完成后,应返回一个具有如下结构的单个对象
{ "events": [ {...}, ... ], "cursor": [ {...}, ... ], "url": <resource address>, "status_code": <HTTP request status code if a network request>, "header": <HTTP response headers if a network request>, "rate_limit": <HTTP rate limit map if required by API>, "want_more": false }
|
|
如果 |
|
如果 |
|
如果在删除 events 字段后 “want_more” 字段存在且为 true,并且返回了非零事件数组,则使用新状态重复评估。如果在评估失败后 “want_more” 字段存在,则将其设置为 false。 |
如果程序不与 HTTP API 端点交互,则可以省略 status_code
、header
和 rate_limit
值,因此无需对程序控制做出贡献。
调试状态日志记录
编辑当以 DEBUG 级别记录时,CEL 输入将在评估后记录完整状态。这将包括保存在 state
对象中的任何敏感或机密信息,因此当敏感信息保留在 state
对象中时,不应在生产中使用 DEBUG 级别日志记录。有关从 DEBUG 日志中排除敏感字段的设置,请参见 redact
配置参数。
CEL 扩展库
编辑如上所述,cel
输入提供了函数、宏和全局变量来扩展语言。
-
文件 — 文件扩展使用 MIME 处理程序初始化,用于 “application/gzip”,“application/x-ndjson”,“application/zip”,“text/csv; header=absent” 和 “text/csv; header=present”。
-
XML — XML 扩展使用通过
xsd
配置选项提供的 XML 模式定义进行初始化。 -
限制 — 速率限制扩展使用 Okta(作为 “okta”) 和 草案速率限制(作为 “draft”)策略进行初始化。
-
MIME — MIME 扩展使用 MIME 处理程序进行初始化,用于 “application/gzip”,“application/x-ndjson”,“application/zip”,“text/csv; header=absent” 和 “text/csv; header=present”。
-
Regexp — 正则表达式扩展使用用户输入配置中通过
regexp
字段指定的模式进行初始化。 -
调试 — 调试处理程序使用名称扩展
cel_debug
注册一个记录器,并且对 CELdebug
函数的调用将发送到该记录器。
除了上面列出的包中提供的扩展之外,还提供了一个全局变量 useragent
,它允许用户 CEL 程序访问 filebeat 用户代理字符串。默认情况下,除非 CEL 程序已设置 user-agent 标头值,否则此值将分配给所有请求的用户代理标头。希望不提供用户代理的程序应将此标头设置为空字符串 ""
。
主机环境变量通过全局映射 env
提供。只有通过 allowed_environment
配置列表允许的环境变量对 CEL 程序可见。
此外,它还支持通过基本身份验证、摘要式身份验证或 OAuth2 进行身份验证。
带有身份验证的配置示例
filebeat.inputs: - type: cel auth.basic: user: [email protected] password: P@$$W0₹D resource.url: https://127.0.0.1
filebeat.inputs: - type: cel auth.digest: user: [email protected] password: P@$$W0₹D resource.url: https://127.0.0.1
filebeat.inputs: - type: cel auth.oauth2: client.id: 12345678901234567890abcdef client.secret: abcdef12345678901234567890 token_url: https://127.0.0.1/oauth2/token resource.url: https://127.0.0.1
filebeat.inputs: - type: cel auth.oauth2: client.id: 12345678901234567890abcdef client.secret: abcdef12345678901234567890 token_url: https://127.0.0.1/oauth2/token user: [email protected] password: P@$$W0₹D resource.url: https://127.0.0.1
输入状态
编辑cel
输入在请求之间保持运行时状态。此状态可以被 CEL 程序访问,并且可能包含任意对象。
状态必须包含一个 url
字符串,并且可以包含用户希望存储在其中的任何对象。
所有对象都存储在运行时,除了 cursor
,它的值会在重启之间持久保存。
配置选项
编辑cel
输入支持以下配置选项以及稍后描述的通用选项。
interval
编辑重复请求之间的时间间隔。如果启用了分页,它可能会响应初始请求发出额外的分页请求。默认值:60s
。
program
编辑在每个轮询周期执行的 CEL 程序。此字段为必填项。
max_executions
编辑max_executions
是 CEL 程序使用 want_more
字段请求重新运行的最大次数。这用于确保意外的无限循环不会停止处理。当执行预算超出时,执行将在下一个间隔重新启动,并且会在日志中写入警告。默认值:1000。
state
编辑state
是一个可选对象,在第一次执行时传递给 CEL 程序。它可以作为 state
变量供执行程序使用。在输入生命周期内,它作为先前执行的返回值提供给程序的后续执行,但删除了 state.events
字段。除了 state.cursor
字段外,state
不会在重启后持久存在。
state.cursor
编辑游标是一个可以作为 state.cursor
使用的对象,其中可以存储任意值。游标状态在输入重启之间保持,并在发布请求的每个事件后更新。当使用游标时,CEL 程序必须为程序返回的每个事件创建一个游标状态,或者创建一个反映完整事件集完成情况的游标。
filebeat.inputs: # Fetch your public IP every minute and note when the last request was made. - type: cel interval: 1m resource.url: https://api.ipify.org/?format=json program: | bytes(get(state.url).Body).as(body, { "events": [body.decode_json().with({ "last_requested_at": has(state.cursor) && has(state.cursor.last_requested_at) ? state.cursor.last_requested_at : now })], "cursor": {"last_requested_at": now} })
allowed_environment
编辑将对 CEL 执行环境可见的主机环境变量列表。默认情况下,没有环境变量可见。
filebeat.inputs: # Publish the list of files in $PATH every minute. - type: cel interval: 1m resource.url: "" allowed_environment: - PATH program: | { "events": { "message": env.?PATH.orValue("").split(":") .map(p, try(dir(p))) .filter(d, type(d) != type("")) .flatten() .collate("name") } }
regexp
编辑一组命名的正则表达式,可以在 CEL 程序执行期间使用 regexp
扩展库。正则表达式使用的语法是 RE2。
filebeat.inputs: - type: cel # Define two regular expressions, 'products' and 'solutions' for use during CEL execution. regexp: products: '(?i)(Elasticsearch|Beats|Logstash|Kibana)' solutions: '(?i)(Search|Observability|Security)'
xsd
编辑XML 文档可能需要额外的类型信息才能正确解析和摄取。可以使用 xsd
选项为 XML 文档提供 XML 架构定义 (XSD)。提供 XSD 信息的键可以通过 decode_xml
CEL 扩展访问。
filebeat.inputs: - type: cel # Provide an XSD, 'order', for use during CEL execution (truncated for example). xsd: order: | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="order"> <xs:complexType> <xs:sequence> <xs:element name="sender" type="xs:string"/> <xs:element name="address"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="company" type="xs:string"/>
auth.basic.enabled
编辑设置为 false
时,禁用基本身份验证配置。默认值:true
。
如果 enabled
设置为 false
或缺少 auth.basic
部分,则禁用基本身份验证设置。
auth.basic.user
编辑用于身份验证的用户。
auth.basic.password
编辑要使用的密码。
auth.digest.enabled
编辑设置为 false
时,禁用摘要式身份验证配置。默认值:true
。
如果 enabled
设置为 false
或缺少 auth.digest
部分,则禁用摘要式身份验证设置。
auth.digest.user
编辑用于身份验证的用户。
auth.digest.password
编辑要使用的密码。
auth.digest.no_reuse
编辑设置为 true
时,不重用摘要式身份验证质询。
auth.oauth2.enabled
编辑设置为 false
时,禁用 oauth2 配置。默认值:true
。
如果 enabled
设置为 false
或缺少 auth.oauth2
部分,则禁用 OAuth2 设置。
auth.oauth2.provider
编辑用于配置支持的 oauth2 提供程序。每个支持的提供程序都需要特定的设置。默认情况下未设置。支持的提供程序有:azure
、google
、okta
。
auth.oauth2.client.id
编辑在身份验证流程中使用的客户端 ID。除了使用 google
作为提供程序外,始终需要此项。提供程序需要:default
、azure
、okta
。
auth.oauth2.client.secret
编辑在身份验证流程中使用的客户端密钥。除了使用 google
或 okta
作为提供程序外,始终需要此项。提供程序需要:default
、azure
。
auth.oauth2.user
编辑在身份验证流程中使用的用户。身份验证 - 授权类型密码需要此项。它仅适用于提供程序 default
。
auth.oauth2.password
编辑在身份验证流程中使用的密码。身份验证 - 授权类型密码需要此项。它仅适用于提供程序 default
。
授权类型密码需要用户和密码。如果不使用用户和密码,它将自动使用 token_url
和 client credential
方法。
auth.oauth2.scopes
编辑在 oauth2 流程中将请求的作用域列表。所有提供程序均可选择使用此项。
auth.oauth2.token_url
编辑在 oauth2 流程中将用于生成令牌的端点。如果未指定提供程序,则需要此项。
对于 azure
提供程序,需要 token_url
或 azure.tenant_id
。
auth.oauth2.endpoint_params
编辑将在每次请求时发送到 token_url
的一组值。每个参数键可以有多个值。可以为除 google
以外的所有提供程序设置。
- type: cel auth.oauth2: endpoint_params: Param1: - ValueA - ValueB Param2: - Value
auth.oauth2.azure.tenant_id
编辑使用 azure
提供程序时用于身份验证。由于它用于生成 token_url
的过程中,因此不能与其组合使用。此项为非必需项。
有关在哪里查找它的信息,您可以参考 https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal。
auth.oauth2.azure.resource
编辑使用 azure
提供程序时访问的 WebAPI 资源。此项为非必需项。
auth.oauth2.google.credentials_file
编辑Google 的凭据文件。
凭据设置一次只能设置一个。如果未提供任何设置,将尝试通过 ADC 从环境中加载默认凭据。有关如何提供 Google 凭据的更多信息,请参阅 https://cloud.google.com/docs/authentication。
auth.oauth2.google.credentials_json
编辑您的凭据信息,采用原始 JSON 格式。
凭据设置一次只能设置一个。如果未提供任何设置,将尝试通过 ADC 从环境中加载默认凭据。有关如何提供 Google 凭据的更多信息,请参阅 https://cloud.google.com/docs/authentication。
auth.oauth2.google.jwt_file
编辑Google 的 JWT 帐户密钥文件。
凭据设置一次只能设置一个。如果未提供任何设置,将尝试通过 ADC 从环境中加载默认凭据。有关如何提供 Google 凭据的更多信息,请参阅 https://cloud.google.com/docs/authentication。
auth.oauth2.google.jwt_json
编辑JWT 帐户密钥文件,采用原始 JSON 格式。
凭据设置一次只能设置一个。如果未提供任何设置,将尝试通过 ADC 从环境中加载默认凭据。有关如何提供 Google 凭据的更多信息,请参阅 https://cloud.google.com/docs/authentication。
auth.oauth2.google.delegated_account
编辑用于创建凭据的委托帐户的电子邮件(通常是管理员)。与 auth.oauth2.google.jwt_file
或 auth.oauth2.google.jwt_json
组合使用。
auth.oauth2.okta.jwk_file
编辑用于与 Okta 组织身份验证服务器交互以使用 okta.* 作用域生成令牌的 Okta 服务应用程序的 RSA JWK 私钥文件。
凭据设置一次只能设置一个。有关更多信息,请参阅 https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/
auth.oauth2.okta.jwk_json
编辑用于与 Okta 组织身份验证服务器交互以使用 okta.* 作用域生成令牌的 Okta 服务应用程序的 RSA JWK 私钥 JSON。
凭据设置一次只能设置一个。有关更多信息,请参阅 https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/
auth.oauth2.okta.jwk_pem
编辑用于与 Okta 组织身份验证服务器交互以使用 okta.* 作用域生成令牌的 Okta 服务应用程序的 RSA JWK 私钥 PEM 块。
凭据设置一次只能设置一个。有关更多信息,请参阅 https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/
resource.url
编辑HTTP API 的 URL。必需。
可以通过向 URL 方案添加 +unix
或 +npipe
来通过 unix 套接字和 Windows 命名管道访问 API 端点,例如 http+unix:///var/socket/
。
resource.timeout
编辑声明 HTTP 客户端连接超时之前的时间长度。有效的时间单位为 ns
、us
、ms
、s
、m
、h
。默认值:30s
。
resource.ssl
编辑此配置指定 SSL/TLS 设置。如果缺少 ssl 部分,HTTPS 连接将使用主机的 CA。有关更多信息,请参阅SSL。
resource.keep_alive.disable
编辑此配置指定是否禁用 HTTP 端点的 keep-alive 连接。默认值:true
。
resource.keep_alive.max_idle_connections
编辑所有主机之间的最大空闲连接数。零表示无限制。默认值:0
。
resource.keep_alive.max_idle_connections_per_host
编辑每个主机要保留的最大空闲连接数。如果为零,则默认为两个。默认值:0
。
resource.keep_alive.idle_connection_timeout
编辑空闲连接在自行关闭之前保持空闲的最大时间量。有效的时间单位为 ns
、us
、ms
、s
、m
、h
。零表示无限制。默认值:0s
。
resource.retry.max_attempts
编辑HTTP 客户端的最大重试次数。默认值:5
。
resource.retry.wait_min
编辑尝试重试之前等待的最短时间。默认值:1s
。
resource.retry.wait_max
编辑尝试重试之前等待的最长时间。默认值:60s
。
resource.redirect.forward_headers
编辑设置为 true
时,会在重定向的情况下转发请求标头。默认值:false
。
resource.redirect.headers_ban_list
编辑当 redirect.forward_headers
设置为 true
时,将转发除此列表中定义的标头之外的所有标头。默认值:[]
。
resource.redirect.max_redirects
编辑一个请求要遵循的最大重定向次数。默认值:10
。
resource.rate_limit.limit
编辑指定最大整体资源请求速率的响应值。
resource.rate_limit.burst
编辑最大突发大小。突发是在总体速率限制之上可以发出的最大资源请求数。
resource.tracer.enable
编辑可以在 CEL 程序中将 HTTP 请求和响应记录到本地文件系统中,以进行调试配置。可以通过将 resource.tracer.enabled
设置为 true 并设置 resource.tracer.filename
值来启用此选项。还提供了其他选项来调整日志轮换行为。要删除现有日志,请在不取消设置文件名选项的情况下将 resource.tracer.enabled
设置为 false。
启用此选项会损害安全性,仅应用于调试。
resource.tracer.filename
编辑为了区分从不同输入实例生成的跟踪文件,可以在文件名中添加占位符 *
,它将被替换为输入实例 ID。例如,http-request-trace-*.ndjson
。将 resource.tracer.filename
设置为 resource.tracer.enable
且设置为 false 会导致删除与文件名选项匹配的任何现有跟踪日志。
resource.tracer.maxsize
编辑此值设置日志文件在轮换之前将达到的最大大小(以兆字节为单位)。默认情况下,日志在轮换之前允许达到 1MB。
resource.tracer.maxage
编辑此配置指定保留轮换日志文件的天数。如果未设置,则无限期保留日志文件。
resource.tracer.maxbackups
编辑要保留的旧日志数。如果未设置,则在 resource.tracer.maxage
设置的约束下保留所有旧日志。
resource.tracer.localtime
编辑是否使用主机本地时间而不是 UTC 来为轮换的日志文件名添加时间戳。
resource.tracer.compress
编辑这决定了是否应使用 gzip 压缩轮换的日志。
redact
编辑在调试级别日志记录期间,state
对象和生成的评估结果会包含在日志中。这可能会导致泄露机密。为了防止这种情况,可以从记录的 state
中编辑或删除字段。redact
配置允许用户配置此字段编辑行为。出于安全原因,如果缺少 redact
配置,则会记录警告。
在不需要编辑的情况下,应使用空的 redact.fields
配置来消除记录的警告。
- type: cel redact: fields: ~
例如,如果用户构造的基本身份验证请求在 CEL 程序中使用,则可以像这样编辑密码
filebeat.inputs: - type: cel resource.url: https://127.0.0.1:9200/_search state: user: [email protected] password: P@$$W0₹D redact: fields: - password delete: true
请注意,auth
配置层次结构下的字段不会暴露给 state
,因此不需要编辑。因此,最好尽可能将这些用于身份验证,而不是上面显示的请求构造。
redact.fields
编辑此配置指定在调试日志记录之前要编辑的 state
中的字段。此数组中列出的字段将被替换为 *
,或者从发送到调试日志的消息中完全删除。
redact.delete
编辑此配置指定字段应替换为 *
,还是从发送到调试日志的消息中完全删除。如果 delete 为 true
,则字段将被删除,而不是替换。
指标
编辑此输入在HTTP 监控端点下公开指标。这些指标在 /inputs
路径下公开。它们可用于观察输入的活动。
指标 | 说明 |
---|---|
|
输入资源的 URL 或路径。 |
|
CEL 程序执行的次数。 |
|
接收到的事件数组数。 |
|
接收到的事件数。 |
|
发布的事件数组数。 |
|
发布的事件数。 |
|
以纳秒为单位的已成功 CEL 程序处理时间直方图。 |
|
以纳秒为单位的已成功批处理时间直方图(从接收时间到非空批次的 ACK 时间)。 |
|
已处理请求的总数。 |
|
请求错误的总数。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
请求正文大小的总和。 |
|
请求正文大小的直方图。 |
|
接收到的响应总数。 |
|
响应错误的总数。 |
|
|
|
|
|
|
|
|
|
|
|
响应正文大小的总和。 |
|
响应正文大小的直方图。 |
|
往返时间的直方图。 |
开发人员工具
编辑在 Elastic Mito 存储库中提供了一个独立的 CEL 环境,该环境实现了 CEL 输入的大部分评论表达式语言功能。此工具可用于帮助开发输入使用的 CEL 程序。通过运行 go install github.com/elastic/mito/cmd/mito@latest
从源代码进行安装,并且需要 Go 工具链。
常用选项
编辑所有输入都支持以下配置选项。
enabled
编辑使用 enabled
选项来启用和禁用输入。默认情况下,enabled 设置为 true。
tags
编辑Filebeat 在每个发布的事件的 tags
字段中包含的标签列表。标签使您可以轻松地在 Kibana 中选择特定事件,或在 Logstash 中应用条件筛选。这些标签将附加到常规配置中指定的标签列表。
示例
filebeat.inputs: - type: cel . . . tags: ["json"]
fields
编辑您可以指定的可选字段,用于向输出添加其他信息。例如,您可以添加可用于筛选日志数据的字段。字段可以是标量值、数组、字典或这些的任何嵌套组合。默认情况下,您在此处指定的字段将在输出文档中的 fields
子字典下分组。要将自定义字段存储为顶级字段,请将 fields_under_root
选项设置为 true。如果在常规配置中声明了重复字段,则其值将被此处声明的值覆盖。
filebeat.inputs: - type: cel . . . fields: app_id: query_engine_12
fields_under_root
编辑如果将此选项设置为 true,则自定义的字段将作为输出文档中的顶级字段存储,而不是在 fields
子字典下分组。如果自定义字段名称与 Filebeat 添加的其他字段名称冲突,则自定义字段将覆盖其他字段。
processors
编辑要应用于输入数据的处理器列表。
有关在配置中指定处理器的信息,请参阅处理器。
pipeline
编辑要为此输入生成的事件设置的引入管道 ID。
管道 ID 也可以在 Elasticsearch 输出中配置,但此选项通常会生成更简单的配置文件。如果管道在输入和输出中都配置了,则使用输入中的选项。
keep_null
编辑如果此选项设置为 true,则具有 null
值的字段将发布在输出文档中。默认情况下,keep_null
设置为 false
。
index
编辑如果存在,则此格式化字符串会覆盖来自此输入的事件的索引(对于 Elasticsearch 输出),或者设置事件元数据的 raw_index
字段(对于其他输出)。此字符串只能引用代理名称和版本以及事件时间戳;要访问动态字段,请使用 output.elasticsearch.index
或处理器。
示例值:"%{[agent.name]}-myindex-%{+yyyy.MM.dd}"
可能会扩展为 "filebeat-myindex-2019.11.01"
。
publisher_pipeline.disable_host
编辑默认情况下,所有事件都包含 host.name
。可以将此选项设置为 true
以禁用将此字段添加到所有事件。默认值为 false
。