HTTP JSON 输入
编辑HTTP JSON 输入编辑
使用 httpjson
输入从具有 JSON 有效负载的 HTTP API 读取消息。
如果您要开始开发新的自定义 HTTP API 输入,建议您使用 通用表达式语言输入,它提供了更大的灵活性和改进的开发者体验。
此输入支持
-
身份验证
- 基本
- OAuth2
- 以可配置的间隔检索
- 分页
- 重试
- 速率限制
- 代理
- 请求转换
- 响应转换
示例配置
filebeat.inputs: # Fetch your public IP every minute. - type: httpjson interval: 1m request.url: https://api.ipify.org/?format=json processors: - decode_json_fields: fields: ["message"] target: "json"
filebeat.inputs: - type: httpjson request.url: https://127.0.0.1:9200/_search?scroll=5m request.method: POST response.split: target: body.hits.hits response.pagination: - set: target: url.value value: https://127.0.0.1:9200/_search/scroll - set: target: url.params.scroll_id value: '[[.last_response.body._scroll_id]]' - set: target: body.scroll value: 5m
此外,它还支持通过基本身份验证、HTTP 标头或 oauth2 进行身份验证。
使用身份验证的示例配置
filebeat.inputs: - type: httpjson request.url: https://127.0.0.1 request.transforms: - set: target: header.Authorization value: 'Basic aGVsbG86d29ybGQ='
filebeat.inputs: - type: httpjson auth.oauth2: client.id: 12345678901234567890abcdef client.secret: abcdef12345678901234567890 token_url: https://127.0.0.1/oauth2/token request.url: https://127.0.0.1
filebeat.inputs: - type: httpjson auth.oauth2: client.id: 12345678901234567890abcdef client.secret: abcdef12345678901234567890 token_url: https://127.0.0.1/oauth2/token user: [email protected] password: P@$$W0₹D request.url: https://127.0.0.1
输入状态编辑
httpjson
输入在请求之间保持运行时状态。此状态可以通过某些配置选项和转换进行访问。
该状态具有以下元素
-
last_response.url.value
:来自上次请求的完整 URL,包含参数和片段,并具有成功的响应。 -
last_response.url.params
:last_response.url.value
中 URL 参数的url.Values
。可以使用Get
函数进行查询。 -
last_response.header
:包含来自上次成功响应的标头的映射。 -
last_response.body
:包含来自上次成功响应的已解析 JSON 正文的映射。这是来自远程服务器的响应。 -
last_response.page
:指示最后一个响应的页码的数字。它在每个间隔处以值0
开始。 -
first_event
:表示发送到输出的第一个事件的映射(对last_response.body
应用转换的结果)。 -
last_event
:表示请求链中当前请求的最后一个事件的映射(对last_response.body
应用转换的结果)。 -
url
:最后一个请求的 URL,作为原始的url.URL
Go 类型。 -
header
:包含标头的映射。在request.rate_limit.early_limit
或response.pagination
配置部分中使用时引用下一个请求标头,在response.transforms
、response.split
或request.rate_limit.limit
配置部分中使用时引用最后一个响应标头。 -
body
:包含正文的映射。在request.rate_limit.early_limit
或response.pagination
配置部分中使用时引用下一个请求正文,在response.transforms
或response.split
配置部分中使用时引用最后一个响应正文。 -
cursor
:包含用户配置为在重新启动之间存储的任何数据的映射(请参阅cursor
)。
所有提到的对象仅在定期请求执行期间在运行时存储,cursor
除外,它包含在定期请求和重新启动之间持久化的值。
转换编辑
转换是一种允许用户修改 输入状态 的操作。根据定义转换的位置,它将具有读取或写入 状态 不同元素的权限。
访问限制在相应的配置部分中描述。
append
编辑
将值追加到数组。如果该字段不存在,则第一个条目将创建一个新数组。如果该字段存在,则将该值追加到现有字段并转换为列表。
- append: target: body.foo.bar value: '[[.cursor.baz]]' default: "a default value"
-
target
定义存储该值的目的地字段。 -
value
定义要存储的值,它是一个 值模板。 -
default
定义在value
为空或模板解析失败时使用的默认值。默认模板无法访问任何状态,只能访问函数。 -
value_type
定义结果值的类型。可能的值为:string
、json
和int
。默认值为string
。 -
fail_on_template_error
如果设置为true
,则在模板评估失败时将返回错误并中止请求。默认值为false
。
delete
编辑
删除目标字段。
- delete: target: body.foo.bar
-
target
定义要删除的目的地字段。如果target
是一个列表而不是单个元素,则将删除整个列表。
set
编辑
设置一个值。
- set: target: body.foo.bar value: '[[.cursor.baz]]' default: "a default value"
-
target
定义存储该值的目的地字段。 -
value
定义要存储的值,它是一个 值模板。 -
default
定义在value
为空或模板解析失败时使用的默认值。默认模板无法访问任何状态,只能访问函数。 -
value_type
定义如何处理结果值。可能的值为:string
、json
和int
。默认值为string
。 -
fail_on_template_error
如果设置为true
,则在模板评估失败时将返回错误并中止请求。默认值为false
。
值模板编辑
某些配置选项和转换可以使用值模板。值模板是 Go 模板,可以访问输入状态和一些内置函数。请注意,分隔符已从默认的 {{ }}
更改为 [[ ]]
,以提高与其他模板机制的互操作性。
要查看哪些 状态元素 和操作可用,请参阅您要使用值模板的选项或 转换 的文档。
值模板如下所示
- set: target: body.foo.bar value: '[[.cursor.baz]] more data' default: "a default value"
将评估括号 [[
]]
内的内容。有关 Go 模板的更多信息,请参阅 Go 文档。
提供了一些内置帮助器函数,用于在值模板中使用输入状态
-
add
:添加一个整数列表并返回它们的总和。 -
base64DecodeNoPad
:解码不带填充的 base64 字符串。任何二进制输出都将转换为 UTF8 字符串。 -
base64Decode
:解码 base64 字符串。任何二进制输出都将转换为 UTF8 字符串。 -
base64EncodeNoPad
:连接所有提供的字符串并对其进行 base64 编码,不带填充。示例[[base64EncodeNoPad "string1" "string2"]]
-
base64Encode
:连接所有提供的字符串并对其进行 base64 编码。示例[[base64Encode "string1" "string2"]]
-
beatInfo
:返回一个包含有关 Beat 信息的映射。映射中可用的键为goos
(运行的操作系统)、goarch
(运行的系统体系结构)、commit
(当前版本的 git 提交)、buildtime
(当前版本的编译时间)、version
(当前版本的版本)。示例:[[ beatInfo.version ]]
返回{version}
。 -
div
:执行两个整数值的整数除法。 -
formatDate
:格式化time.Time
。默认情况下,格式布局为RFC3339
,但可以选择接受任何 Golang 预定义的布局或自定义布局。格式化时它将默认为 UTC 时区,但您可以指定不同的时区。如果时区不正确,它将默认为 UTC。示例:[[ formatDate (now) "UnixDate" ]]
、[[ formatDate (now) "UnixDate" "America/New_York" ]]
。 -
getRFC5988Link
:从 RFC5988 链接列表中提取特定关系。这在解析用于分页的标头值时很有用。示例:[[ getRFC5988Link "next" .last_response.header.Link ]]
。 -
hashBase64
:计算连接在一起的字符串列表的哈希值。返回 base64 编码的哈希值。支持 sha1 或 sha256。示例[[hash "sha256" "string1" "string2" (formatDate (now) "RFC1123")]]
-
hash
:计算连接在一起的字符串列表的哈希值。返回十六进制编码的哈希值。支持 sha1 或 sha256。示例[[hash "sha256" "string1" "string2" (formatDate (now) "RFC1123")]]
-
hexDecode
:解码十六进制字符串。任何十六进制字符串都将转换为其字节表示形式。示例[[hexDecode "b0a92a08a9b4883aa3aa2d0957be12a678cbdbb32dc5db09fe68239a09872f96"]]
;预期输出:"\xb0\xa9*\b\xa9\xb4\x88:\xa3\xaa-\tW\xbe\x12\xa6x\xcb۳-\xc5\xdb\t\xfeh#\x9a\t\x87/\x96"
-
hmacBase64
:计算连接在一起的字符串列表的 hmac 签名。返回 base64 编码的签名。支持 sha1 或 sha256。示例[[hmac "sha256" "secret" "string1" "string2" (formatDate (now) "RFC1123")]]
-
hmac
:计算连接在一起的字符串列表的 hmac 签名。返回十六进制编码的签名。支持 sha1 或 sha256。示例:[[hmac "sha256" "secret" "string1" "string2" (formatDate (now) "RFC1123")]]
-
join
:使用指定的分隔符连接列表。示例:[[join .body.arr ","]]
-
max
:返回两个值中的最大值。 -
min
:返回两个值中的最小值。 -
mul
:将两个整数相乘。 -
now
:以 UTC 时间返回当前的time.Time
对象。可以选择接收一个time.Duration
作为参数。示例:[[now (parseDuration "-1h")]]
返回 1 小时前的当前时间。 -
parseDate
:解析日期字符串并以 UTC 时间返回一个time.Time
。默认情况下,预期的布局是RFC3339
,但可以选择接受任何 Golang 预定义的布局或自定义布局。注意:解析时区缩写可能会导致歧义。对于显式时区处理,建议使用parseDateInTZ
。示例:[[ parseDate "2020-11-05T12:25:32Z" ]]
、[[ parseDate "2020-11-05T12:25:32.1234567Z" "RFC3339Nano" ]]
、[[ (parseDate "Thu Nov 5 12:25:32 +0000 2020" "Mon Jan _2 15:04:05 -0700 2006").UTC ]]
。 -
parseDateInTZ
:在指定的时区 (TZ) 内解析日期字符串,以 UTC 时间返回一个time.Time
。指定的时区将覆盖输入日期中的隐式时区。接受时区偏移量(“-07:00”、“-0700”、“-07”)或 IANA 时区名称(“America/New_York”)。如果 TZ 无效,则默认为 UTC。可选的布局参数与 parseDate 中的一样。示例:[[ parseDateInTZ "2020-11-05T12:25:32" "America/New_York" ]]
、[[ parseDateInTZ "2020-11-05T12:25:32" "-07:00" "RFC3339" ]]
。 -
parseDuration
:解析持续时间字符串并返回time.Duration
。示例:[[parseDuration "1h"]]
。 -
parseTimestampMilli
:解析以毫秒为单位的时间戳,并以 UTC 时间返回一个time.Time
。示例:[[parseTimestamp 1604582732000]]
返回2020-11-05 13:25:32 +0000 UTC
。 -
parseTimestampNano
:解析以纳秒为单位的时间戳,并以 UTC 时间返回一个time.Time
。示例:[[parseTimestamp 1604582732000000000]]
返回2020-11-05 13:25:32 +0000 UTC
。 -
parseTimestamp
:解析以秒为单位的时间戳,并以 UTC 时间返回一个time.Time
。示例:[[parseTimestamp 1604582732]]
返回2020-11-05 13:25:32 +0000 UTC
。 -
replaceAll(old, new, s)
:将s
中所有不重叠的old
实例替换为new
。示例:[[ replaceAll "some" "my" "some value" ]]
返回my value
。 -
sprintf
:根据格式说明符进行格式化并返回结果字符串。有关用法,请参阅 Go 文档。示例:[[sprintf "%d:%q" 34 "quote this"]]
-
toInt
:尽可能将任何类型的值转换为整数。如果转换失败,则返回 0。 -
toJSON
:将值转换为 JSON 字符串。这可以与value_type: json
一起使用,以从模板创建对象。示例:[[ toJSON .last_response.body.pagingIdentifiers ]]
。 -
urlEncode
:对提供的字符串进行 URL 编码。示例:[[urlEncode "string1"]]
。示例:[[urlEncode "<string1>"]]
将返回%3Cstring1%3E
。 -
userAgent
:生成 User Agent,可以选择添加其他值。如果没有提供参数,它将生成默认的 User Agent,该 User Agent 默认添加到所有请求中。建议在设置新的 User-Agent 标头之前删除现有的 User-Agent 标头。示例:[[ userAgent "integration/1.2.3" ]]
将生成Elastic-Filebeat/8.1.0 (darwin; amd64; 9b893e88cfe109e64638d65c58fd75c2ff695402; 2021-12-15 13:20:00 +0000 UTC; integration_name/1.2.3)
-
uuid
:返回一个随机 UUID,例如a11e8780-e3e7-46d0-8e76-f66e75acf019
。示例:[[ uuid ]]
除了提供的函数之外,任何用于 time.Time
、http.Header
和 url.Values
类型的原生函数都可以用于相应的对象。示例:[[(now).Day]]
、[[.last_response.header.Get "key"]]
配置选项编辑
httpjson
输入支持以下配置选项以及稍后描述的通用选项。
interval
编辑
重复请求之间的持续时间。如果启用了分页,它可能会根据初始请求发出额外的分页请求。默认值:60 秒
。
auth.basic.enabled
编辑
设置为 false
时,禁用基本身份验证配置。默认值:true
。
如果 enabled
设置为 false
或缺少 auth.basic
部分,则禁用基本身份验证设置。
auth.basic.user
编辑
要进行身份验证的用户。
auth.basic.password
编辑
要使用的密码。
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
。
grant_type 密码需要用户名和密码。如果不使用用户名和密码,它将自动使用 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: httpjson 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.okta.jwk_file
编辑
您的 Okta 服务应用程序的 RSA JWK 私钥文件,用于与 Okta 组织身份验证服务器交互以使用 okta.* 范围生成令牌。
一次只能设置其中一个凭据设置。有关更多信息,请参阅 https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/
auth.oauth2.okta.jwk_json
编辑
您的 Okta 服务应用程序的 RSA JWK 私钥 JSON,用于与 Okta 组织身份验证服务器交互以使用 okta.* 范围生成令牌。
auth.oauth2.okta.jwk_pem
编辑
您的 Okta 服务应用程序的 RSA JWK 私钥 PEM 块,用于与 Okta 组织身份验证服务器交互以使用 okta.* 范围生成令牌。
一次只能设置其中一个凭据设置。有关更多信息,请参阅 https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/
auth.oauth2.google.delegated_account
编辑
用于创建凭据的委派帐户的电子邮件地址(通常是管理员)。与 auth.oauth2.google.jwt_file
、auth.oauth2.google.jwt_json
结合使用,并在默认使用 ADC 时使用。
request.url
编辑
HTTP API 的 URL。必需。
可以通过在 URL 方案中添加 +unix
或 +npipe
来通过 Unix 套接字和 Windows 命名管道访问 API 端点,例如 http+unix:///var/socket/
。
request.method
编辑
发出请求时使用的 HTTP 方法。选项包括 GET
或 POST
。默认值:GET
。
request.encode_as
编辑
用于编码请求正文的 ContentType。如果设置,它将强制以指定的格式进行编码,而不管 Content-Type
标头值是什么,否则它将尽可能遵循该值或回退到 application/json
。默认情况下,请求使用 Content-Type: application/json
发送。支持的值:application/json
和 application/x-www-form-urlencoded
。application/x-www-form-urlencoded
将对 url.params
进行 URL 编码,并将它们设置为正文。默认情况下不设置。
request.body
编辑
可选的 HTTP POST 正文。配置值必须是一个对象,它将被编码为 JSON。这仅在 request.method
为 POST
时有效。默认为 null
(无 HTTP 正文)。
- type: httpjson request.method: POST request.body: query: bool: filter: term: type: authentication
request.timeout
编辑
在声明 HTTP 客户端连接超时之前的持续时间。有效的时间单位为 ns
、us
、ms
、s
、m
、h
。默认值:30s
。
request.ssl
编辑
这指定了 SSL/TLS 配置。如果缺少 ssl 部分,则主机的 CA 将用于 HTTPS 连接。有关更多信息,请参阅 SSL。
request.proxy_url
编辑
这以 http[s]://<user>:<password>@<server name/ip>:<port>
的形式指定代理配置
filebeat.inputs: # Fetch your public IP every minute. - type: httpjson interval: 1m request.url: https://api.ipify.org/?format=json request.proxy_url: http://proxy.example:8080
request.keep_alive.disable
编辑
这指定是否禁用 HTTP 端点的 keep-alive。默认值:true
。
request.keep_alive.max_idle_connections
编辑
所有主机上的最大空闲连接数。零表示没有限制。默认值:0
。
request.keep_alive.max_idle_connections_per_host
编辑
每个主机保持的最大空闲连接数。如果为零,则默认为 2。默认值:0
。
request.keep_alive.idle_connection_timeout
编辑
空闲连接在关闭自身之前保持空闲状态的最长时间。有效的时间单位为 ns
、us
、ms
、s
、m
、h
。零表示没有限制。默认值:0s
。
request.retry.max_attempts
编辑
HTTP 客户端的最大重试次数。默认值:5
。
request.retry.wait_min
编辑
尝试重试之前的最短等待时间。默认值:1s
。
request.retry.wait_max
编辑
尝试重试之前的最长等待时间。默认值:60s
。
request.redirect.forward_headers
编辑
设置为 true
时,如果发生重定向,则转发请求标头。默认值:false
。
request.redirect.headers_ban_list
编辑
当 redirect.forward_headers
设置为 true
时,将转发除本列表中定义的标头之外的所有标头。默认值:[]
。
request.redirect.max_redirects
编辑
请求要遵循的最大重定向次数。默认值:10
。
request.rate_limit.limit
编辑
指定总限制的响应值。它使用 Go 模板值定义。可以从以下位置读取状态:[.last_response.header
]
request.rate_limit.remaining
编辑
指定速率限制剩余配额的响应值。它使用 Go 模板值定义。可以从以下位置读取状态:[.last_response.header
] 如果响应中缺少 remaining
标头,则不会进行速率限制。
request.rate_limit.reset
编辑
指定速率限制何时重置的纪元时间的响应值。它使用 Go 模板值定义。可以从以下位置读取状态:[.last_response.header
]
request.rate_limit.early_limit
编辑
(可选)在响应中指定的值之前开始速率限制。
在默认行为下,当 remaining
值不为零时,请求将继续。指定 early_limit
意味着将在达到 0
之前进行速率限制。
- 如果为
early_limit
指定的值小于1
,则该值将被视为响应提供的limit
的百分比。例如,指定0.9
意味着请求将持续进行,直到达到速率限制的 90% — 对于limit
值为120
,当remaining
达到12
时,速率限制开始生效。如果响应中缺少limit
标头,则将发生默认的速率限制(当remaining
达到0
时)。 - 如果为
early_limit
指定的值大于或等于1
,则该值将被视为remaining
的目标值。例如,速率限制不是在remaining
达到0
时发生,而是在remaining
达到指定值时发生。
默认情况下不设置它(默认情况下遵循响应中指定的速率限制)。
request.transforms
编辑
在每次执行之前应用于请求的转换列表。
可用于请求的转换:[append
、delete
、set
]。
可以从以下位置读取状态:[.first_response.*
、.last_response.*
、.parent_last_response.*
.last_event.*
、.cursor.*
、.header.*
、.url.*
、.body.*
]。
可以将状态写入:[body.*
、header.*
、url.*
]。
filebeat.inputs: - type: httpjson request.url: https://127.0.0.1:9200/_search?scroll=5m request.method: POST request.transforms: - set: target: body.from value: '[[now (parseDuration "-1h")]]'
子句 .parent_last_response.
只能在链式步骤中使用,并且当根请求级别存在分页时。如果根级别不存在分页,请使用子句 .first_response.
从链中访问父响应对象。您可以查看下面的这个 示例 以获得更好的理解。
示例配置
filebeat.inputs: - type: httpjson enabled: true id: my-httpjson-id request.url: http://xyz.com/services/data/v1.0/export_ids/page request.method: POST interval: 1h request.retry.max_attempts: 2 request.retry.wait_min: 5s request.transforms: - set: target: body.page value: 0 response.request_body_on_pagination: true response.pagination: - set: target: body.page value: '[[ .last_response.body.page ]]' fail_on_template_error: true chain: - step: request.url: http://xyz.com/services/data/v1.0/$.exportId/export_ids/$.files[:].id/info request.method: POST request.transforms: - set: target: body.exportId value: '[[ .parent_last_response.body.exportId ]]' replace: $.files[:].id replace_with: '$.exportId,.parent_last_response.body.exportId'
在这里我们可以看到,链式步骤仅在父(根)请求存在 response.pagination
时才使用 .parent_last_response.body.exportId
。但是,如果父(根)请求中不存在 response.pagination
,则 replace_with
子句应该使用 .first_response.body.exportId
。这是因为当父级不存在分页时,parent_last_response
对象不会填充所需的值以提高性能,但 first_response
对象始终存储进程链中的第一个响应。
first_response
对象目前只能存储扁平的 JSON 结构(即不支持根级别为数组的 JSON、NDJSON 或 Gzipped JSON),因此它只能在这种情况下使用。不能对 first_response
执行拆分。需要通过在 httpjson 配置中将标志 response.save_first_response
设置为 true
来显式启用它。
request.tracer.filename
编辑
可以将 httpjson 请求和响应记录到本地文件系统以调试配置。可以通过设置 request.tracer.filename
值来启用此选项。还有其他选项可用于调整日志轮换行为。
为了区分从不同输入实例生成的跟踪文件,可以在文件名中添加占位符 *
,并将其替换为输入实例 ID。例如,http-request-trace-*.ndjson
。
启用此选项会危及安全性,因此仅应用于调试。
request.tracer.maxsize
编辑
此值设置日志文件在轮换之前达到的最大大小(以兆字节为单位)。默认情况下,日志文件允许达到 1MB 后再进行轮换。
request.tracer.maxage
编辑
这指定要保留轮换日志文件的天数。如果未设置,则无限期保留日志文件。
request.tracer.maxbackups
编辑
要保留的旧日志数。如果未设置,则根据 request.tracer.maxage
设置保留所有旧日志。
request.tracer.localtime
编辑
是使用主机的本地时间还是使用 UTC 时间为轮换后的日志文件名添加时间戳。
request.tracer.compress
编辑
这决定是否应 gzip 压缩轮换的日志。
response.decode_as
编辑
用于解码响应主体的 ContentType。如果设置,它将强制以指定的格式进行解码,而不管 Content-Type
标头值如何,否则它将在可能的情况下遵循它或回退到 application/json
。支持的值:application/json、application/x-ndjson
、text/csv
、application/zip
、application/xml
和 text/xml
。默认情况下不设置。
对于 text/csv
,将为每一行创建一个事件,使用标题值作为对象键。因此,始终假定存在标题。
对于 application/zip
,zip
文件应包含一个或多个 .json
或 .ndjson
文件。它们的所有内容都将合并到一个 JSON
对象列表中。
对于 application/xml
和 text/xml
,可以通过 response.xsd
选项提供用于解码 XML 文档的类型信息。
response.xsd
编辑
XML 文档可能需要额外的类型信息才能进行正确的解析和提取。可以使用 response.xsd
选项将此信息作为文档的 XML 模式定义 (XSD) 提供。
response.transforms
编辑
收到响应后要应用的转换列表。
可用于响应的转换:[append
、delete
、set
]。
可以从以下位置读取状态:[.last_response.*
、.last_event.*
、.cursor.*
、.header.*
、.url.*
]。
可以将状态写入:[body.*
]。
filebeat.inputs: - type: httpjson request.url: https://127.0.0.1:9200/_search?scroll=5m request.method: POST response.transforms: - delete: target: body.very_confidential response.split: target: body.hits.hits response.pagination: - set: target: url.value value: https://127.0.0.1:9200/_search/scroll - set: target: url.params.scroll_id value: '[[.last_response.body._scroll_id]]' - set: target: body.scroll value: 5m
response.split
编辑
在收到响应后应用于响应的拆分操作。拆分可以将映射、数组或字符串转换为多个事件。如果拆分目标为空,则将保留父文档。如果应删除具有空拆分的文档,则应将 ignore_empty_value
选项设置为 true
。
response.split[].target
编辑
定义将执行拆分操作的目标字段。
response.split[].type
编辑
定义目标的字段类型。允许的值:array
、map
、string
。string
需要使用 delimiter
选项来指定用于拆分字符串的字符。delimiter
的行为始终如同将 keep_parent
设置为 true
。默认值:array
。
response.split[].transforms
编辑
可以定义一组转换。此列表将在 response.transforms 之后以及根据 response.split[].keep_parent
和 response.split[].key_field
修改对象之后应用。
可用于响应的转换:[append
、delete
、set
]。
可以从以下位置读取状态:[.last_response.*
、.first_event.*
、.last_event.*
、.cursor.*
、.header.*
、.url.*
]。
可以将状态写入:[body.*
]。
在这种情况下,body.*
将是所有先前转换的结果。
response.split[].keep_parent
编辑
如果设置为 true,则将保留来自父文档(与 target
处于同一级别)的字段。否则,将使用 target
作为根创建一个新文档。默认值:false
。
response.split[].delimiter
编辑
在使用 string
拆分类型时需要。这是用于拆分字符串的子字符串。例如,如果 delimiter
为“\n”,而字符串为“第 1 行\n第 2 行”,则拆分后的结果为“第 1 行”和“第 2 行”。
response.split[].key_field
编辑
与 type: map
一起使用时有效。当不为空时,定义一个新字段,用于存储原始键值。
response.split[].ignore_empty_value
编辑
如果设置为 true,则忽略空值或缺失值,处理将传递到下一个嵌套拆分操作,而不是因错误而失败。默认值:false
。
response.split[].split
编辑
嵌套拆分操作。拆分操作可以随意嵌套。在应用最深的拆分操作之前,不会创建事件。
response.request_body_on_pagination
编辑
如果设置为 true,则 request.body
中的值将用于分页请求。默认值:false
。
response.pagination
编辑
将应用于每个新页面请求的响应的转换列表。将执行 request.transform
中的所有转换,然后添加 response.pagination
以根据需要修改下一个请求。对于后续响应,将正常执行通常的 response.transforms 和 response.split。
可用于分页的转换:[append
、delete
、set
]。
可以从以下位置读取状态:[.last_response.*
、.first_event.*
、.last_event.*
、.cursor.*
、.header.*
、.url.*
、.body.*
]。
可以将状态写入:[body.*
、header.*
、url.*
]。
使用拆分的示例
-
我们有一个包含两个嵌套数组的响应,我们希望为内部数组的每个元素创建一个文档
{ "this": "is kept", "alerts": [ { "this_is": "also kept", "entities": [ { "something": "something" }, { "else": "else" } ] }, { "this_is": "also kept 2", "entities": [ { "something": "something 2" }, { "else": "else 2" } ] } ] }
配置如下所示
filebeat.inputs: - type: httpjson interval: 1m request.url: https://example.com response.split: target: body.alerts type: array keep_parent: true split: # paths in nested splits need to represent the state of body, not only their current level of nesting target: body.alerts.entities type: array keep_parent: true
这将输出
[ { "this": "is kept", "alerts": { "this_is": "also kept", "entities": { "something": "something" } } }, { "this": "is kept", "alerts": { "this_is": "also kept", "entities": { "else": "else" } } }, { "this": "is kept", "alerts": { "this_is": "also kept 2", "entities": { "something": "something 2" } } }, { "this": "is kept", "alerts": { "this_is": "also kept 2", "entities": { "else": "else 2" } } } ]
-
我们有一个包含两个对象的数组的响应,我们希望为每个对象键创建一个文档,同时保留键值
{ "this": "is not kept", "alerts": [ { "this_is": "kept", "entities": { "id1": { "something": "something" } } }, { "this_is": "kept 2", "entities": { "id2": { "something": "something 2" } } } ] }
配置如下所示
filebeat.inputs: - type: httpjson interval: 1m request.url: https://example.com response.split: target: body.alerts type: array keep_parent: false split: # this time alerts will not exist because previous keep_parent is false target: body.entities type: map keep_parent: true key_field: id
这将输出
[ { "this_is": "kept", "entities": { "id": "id1", "something": "something" } }, { "this_is": "kept 2", "entities": { "id": "id2", "something": "something 2" } } ]
-
我们有一个包含两个对象的数组的响应,我们希望为每个对象键创建一个文档,同时对每个对象应用转换
{ "this": "is not kept", "alerts": [ { "this_is": "also not kept", "entities": { "id1": { "something": "something" } } }, { "this_is": "also not kept", "entities": { "id2": { "something": "something 2" } } } ] }
配置如下所示
filebeat.inputs: - type: httpjson interval: 1m request.url: https://example.com response.split: target: body.alerts type: array split: transforms: - set: target: body.new value: will be added to each target: body.entities type: map
这将输出
[ { "something": "something", "new": "will be added for each" }, { "something": "something 2", "new": "will be added for each" } ]
-
我们有一个响应,其键的值是一个字符串。我们希望将字符串在分隔符处拆分,并为每个子字符串创建一个文档。
{ "this": "is kept", "lines": "Line 1\nLine 2\nLine 3" }
配置如下所示
filebeat.inputs: - type: httpjson interval: 1m request.url: https://example.com response.split: target: body.lines type: string delimiter: "\n"
这将输出
[ { "this": "is kept", "lines": "Line 1" }, { "this": "is kept", "lines": "Line 2" }, { "this": "is kept", "lines": "Line 3" } ]
chain
编辑
链是在第一个请求之后要进行的一系列请求。
chain[].step
编辑
包含链式调用的基本请求和响应配置。
chain[].step.request
编辑
请参阅 请求参数。需要。
示例
第一次调用:https://example.com/services/data/v1.0/
第二次调用:https://example.com/services/data/v1.0/1/export_ids
第三次调用:https://example.com/services/data/v1.0/export_ids/file_1/info
chain[].step.response.split
编辑
请参阅 响应拆分参数。
+
chain[].step.replace
编辑
一个 JSONPath 字符串,用于解析从响应 JSON 中解析的值,这些值是从先前的链步骤中收集的。在 URL 中放置相同的替换字符串,其中应放置从先前调用中收集的值。需要。
示例
filebeat.inputs: - type: httpjson enabled: true # first call request.url: https://example.com/services/data/v1.0/records interval: 1h chain: # second call - step: request.url: https://example.com/services/data/v1.0/$.records[:].id/export_ids request.method: GET replace: $.records[:].id # third call - step: request.url: https://example.com/services/data/v1.0/export_ids/$.file_name/info request.method: GET replace: $.file_name
示例
-
第一次调用以收集记录 ID
request_url:https://example.com/services/data/v1.0/records
response_json
{ "records": [ { "id": 1, }, { "id": 2, }, { "id": 3, }, ] }
-
第二次调用,使用从第一次调用中收集的 ID 收集
file_name
。使用 id 作为 *1* 的 request_url:https://example.com/services/data/v1.0/1/export_ids
使用 id 作为 *1* 的 response_json
{ "file_name": "file_1" }
使用 id 作为 *2* 的 request_url:https://example.com/services/data/v1.0/2/export_ids
使用 id 作为 *2* 的 response_json
{ "file_name": "file_2" }
-
第三次调用,使用从第二次调用中收集的
file_name
收集files
。使用 file_name 作为 *file_1* 的 request_url:https://example.com/services/data/v1.0/export_ids/file_1/info
使用 file_name 作为 *file_2* 的 request_url:https://example.com/services/data/v1.0/export_ids/file_2/info
收集并从所有调用的 httpjson 支持的任何格式的响应中创建事件。
请注意,由于
request.url
必须是有效的 URL,如果 API 返回完整的 URL 而不是像上面示例中的标识符,则不可能使用 JSON 路径语法。要在这种情况下实现所需的结果,可以使用不透明 URI 语法。不透明 URI 具有由冒号分隔的任意方案和不透明文本。完成替换后,在替换之前从 URI 中剥离方案和冒号,并使用剩余的不透明文本作为替换目标。在以下示例中,方案为“placeholder”。
filebeat.inputs: - type: httpjson enabled: true # first call request.url: https://example.com/services/data/v1.0/records interval: 1h chain: # second call - step: request.url: placeholder:$.records[:] request.method: GET replace: $.records[:] # third call - step: request.url: placeholder:$.file_name request.method: GET replace: $.file_name
+
chain[].step.replace_with
编辑
replace_with: "pattern,value"
子句用于将 request.url
中定义的固定模式字符串替换为给定值。固定模式必须具有 $.
前缀,例如:$.xyz
。value
可以是硬编码的,也可以从上下文变量中提取,例如 [.last_response.*
、.first_response.*
、.parent_last_response.*
] 等。replace_with
子句可以与 replace
子句结合使用,从而在链请求的逻辑中提供很大的灵活性。
示例
filebeat.inputs: - type: httpjson enabled: true # first call request.url: https://example.com/services/data/v1.0/exports interval: 1h chain: # second call - step: request.url: https://example.com/services/data/v1.0/$.exportId/files request.method: GET replace_with: '$.exportId,.first_response.body.exportId'
示例
-
第一次调用以获取 exportId
request_url:https://example.com/services/data/v1.0/exports
response_json
{ "exportId" : "2212" }
-
第二次调用,使用第一次调用中的 exportId 获取
file ids
。使用 exportId 作为 *2212* 的 request_url:https://example.com/services/data/v1.0/2212/files
使用 exportId 作为 *2212* 的 response_json
{ "files": [ { "id": 1, }, { "id": 2, }, { "id": 3, }, ] }
url 中的目标固定模式替换的这种行为有助于解决各种用例。
要记住的一些有用要点:-
- 如果您希望将
value
视为要评估的表达式以从上下文变量中提取数据,则它应始终具有 单个 *.*(点)前缀。示例:replace_with: '$.exportId,.first_response.body.exportId'
。任何更多或更少的内容都将使内部处理器将其视为硬编码值,replace_with: '$.exportId,..first_response.body.exportId'
(多个 *.*(点)作为前缀)或replace_with:'$.exportId,first_response.body.exportId'
(没有 *.* 点作为前缀) - 不完整的
value expressions
将导致处理时出错。示例:replace_with: '$.exportId,.first_response.'
、replace_with: '$.exportId,.last_response.'
等。这些表达式不完整,因为它们没有评估到可以从上下文变量中提取的有效键。值表达式:.first_response.
在处理时将导致数组[first_response ""]
,其中要提取的键变为""(空字符串)
,这在任何上下文变量中都没有定义。
固定模式的定义中不得包含逗号。字符串替换模式由 replace_with
处理器使用精确字符串匹配进行匹配。first_response
对象目前只能存储扁平的 JSON 结构(即不支持根级别为数组的 JSON、NDJSON 或 Gzipped JSON),因此它应该仅在以下情况下使用:这是这种情况。无法在 first_response
上执行拆分。需要通过在 httpjson 配置中将标志 response.save_first_response
设置为 true
来显式启用它。
chain[].while
编辑
包含链式 while 调用的基本请求和响应配置。链式 while 调用将继续发出给定次数的请求,直到满足条件或达到最大尝试次数。while 链具有一个属性 until
,该属性保存要评估的表达式。理想情况下,until
字段应始终与属性 request.retry.max_attempts
和 request.retry.wait_min
一起使用,它们指定在放弃之前评估 until
的最大尝试次数以及此类请求之间的最大等待时间。如果未指定 request.retry.max_attempts
,它将仅尝试评估表达式一次,如果失败则放弃。如果未指定 request.retry.wait_min
,则默认等待时间将始终为 0
,因为将立即进行连续调用。
chain[].while.request
编辑
请参阅 请求参数 。
示例
第一次调用:http://example.com/services/data/v1.0/exports
第二次调用:http://example.com/services/data/v1.0/9ef0e6a5/export_ids/status
第三次调用:http://example.com/services/data/v1.0/export_ids/1/info
chain[].while.response.split
编辑
请参阅 响应拆分参数 。
chain[].while.replace
编辑
请参阅 chain[].step.replace 。
示例
filebeat.inputs: - type: httpjson enabled: true # first call id: my-httpjson-id request.url: http://example.com/services/data/v1.0/exports interval: 1h chain: # second call - while: request.url: http://example.com/services/data/v1.0/$.exportId/export_ids/status request.method: GET replace: $.exportId until: '[[ eq .last_response.body.status "completed" ]]' request.retry.max_attempts: 5 request.retry.wait_min: 5s # third call - step: request.url: http://example.com/services/data/v1.0/export_ids/$.files[:].id/info request.method: GET replace: $.files[:].id
示例
-
第一次调用以收集导出 ID
request_url:https://example.com/services/data/v1.0/exports
response_json
{ "exportId": "9ef0e6a5" }
-
第二次调用,当
response.body.sataus == "completed"
时,使用从第一次调用中收集的 ID 收集file_ids
。此调用将继续,直到满足条件或达到最大尝试次数。使用 id 作为 *9ef0e6a5* 的 request_url:https://example.com/services/data/v1.0/9ef0e6a5/export_ids/status
使用 id 作为 *9ef0e6a5* 的 response_json
{ "status": "completed", "files": [ { "id": 1 }, { "id": 2 }, { "id": 3 } ] }
-
第三次调用,使用从第二次调用中收集的
file_id
收集files
。使用 1 作为 file_id 的 request_url:https://example.com/services/data/v1.0/export_ids/1/info
使用 2 作为 file_id 的 request_url:https://example.com/services/data/v1.0/export_ids/2/info
使用 id 作为 *1* 的 response_json
{ "file_name": "file_1", "file_data": "some data" }
使用 id 作为 *2* 的 response_json
{ "file_name": "file_2", "file_data": "some data" }
收集并从所有调用的 httpjson 支持的任何格式的响应中创建事件。
请注意,由于
request.url
必须是有效的 URL,如果 API 返回完整的 URL 而不是像上面示例中的标识符,则不可能使用 JSON 路径语法。要在这种情况下实现所需的结果,可以使用不透明 URI 语法。不透明 URI 具有由冒号分隔的任意方案和不透明文本。完成替换后,在替换之前从 URI 中剥离方案和冒号,并使用剩余的不透明文本作为替换目标。在以下示例中,方案为“placeholder”。
filebeat.inputs: - type: httpjson enabled: true # first call id: my-httpjson-id request.url: http://example.com/services/data/v1.0/exports interval: 1h chain: # second call - while: request.url: placeholder:$.exportId request.method: GET replace: $.exportId until: '[[ eq .last_response.body.status "completed" ]]' request.retry.max_attempts: 5 request.retry.wait_min: 5s # third call - step: request.url: placeholder:$.files[:] request.method: GET replace: $.files[:]
httpjson 链只会从链式配置的最后一次调用中创建和提取事件。此外,当前链仅支持以下内容:所有 请求参数、response.transforms 和 response.split。
chain[].while.replace_with
编辑
请参阅 chain[].step.replace_with。
cursor
编辑
游标是一个键值对象列表,其中定义了任意值。这些值被解释为 值模板,并且可以设置默认模板。游标状态在输入重新启动之间保持,并在发布请求的所有事件后更新。
每个游标条目由以下内容构成
- 一个
value
模板,用于定义在评估时要存储的值。 - 一个
default
模板,用于定义在值模板失败或为空时要存储的值。 - 一个
ignore_empty_value
标志。如果设置为true
,则不会存储空值,而是保留之前的值(如果有)。默认值:true
。
可以从以下位置读取状态:[.last_response.*
、.first_event.*
、.last_event.*
]。
默认模板无法访问任何状态,只能访问函数。
filebeat.inputs: - type: httpjson interval: 1m request.url: https://api.ipify.org/?format=json response.transforms: - set: target: body.last_requested_at value: '[[.cursor.last_requested_at]]' default: "[[now]]" cursor: last_requested_at: value: '[[now]]' processors: - decode_json_fields: fields: ["message"] target: "json"
请求生命周期编辑
- 每隔定义的时间间隔就会创建一个新请求。
- 使用配置的 request.transforms 对请求进行转换。
- 执行生成的转换后的请求。
- 服务器响应(如果配置了任何重试或速率限制策略,则在此处执行)。
- 使用配置的 response.transforms 和 response.split 对响应进行转换。
- 如果配置了链步骤。每个步骤都将根据从响应中收集的 ID 生成新请求。将使用配置的 request.transforms 对请求进行转换,并将执行生成的转换后的请求。此过程将针对链中提到的所有步骤执行。
- 将每个生成的事件发布到输出。
- 如果配置了
response.pagination
并且还有更多页面,则使用它创建一个新请求,否则该过程将结束,直到下一个时间间隔。
- 将处理来自常规调用的响应。
- 从响应中提取数据并从响应生成新请求。
- 处理生成的请求并从服务器收集响应。
- 返回步骤 2 以进行下一步。
- 发布从最后一个链步骤收集的响应。
指标编辑
此输入在 HTTP 监控端点 下公开指标。这些指标在 /inputs
路径下公开。它们可用于观察输入的活动。
指标 | 说明 |
---|---|
|
已处理请求的总数。 |
|
请求错误的总数。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
请求正文大小的总和。 |
|
请求正文大小的直方图。 |
|
收到的响应总数。 |
|
响应错误的总数。 |
|
|
|
|
|
|
|
|
|
|
|
响应正文大小的总和。 |
|
响应正文大小的直方图。 |
|
往返时间的直方图。 |
|
已执行时间间隔的总数。 |
|
时间间隔错误的总数。 |
|
时间间隔执行时间的直方图。 |
|
每个时间间隔的总页数的直方图。 |
|
时间间隔页面执行时间的直方图。 |
通用选项编辑
以下配置选项受所有输入支持。
enabled
编辑
使用 enabled
选项启用和禁用输入。默认情况下,enabled 设置为 true。
tags
编辑
Filebeat 包含在每个已发布事件的 tags
字段中的标记列表。标记可以轻松地在 Kibana 中选择特定事件或在 Logstash 中应用条件过滤。这些标记将附加到常规配置中指定的标记列表中。
示例
filebeat.inputs: - type: httpjson . . . tags: ["json"]
fields
编辑
您可以指定可选字段,以向输出添加其他信息。例如,您可以添加可用于过滤日志数据的字段。字段可以是标量值、数组、字典或这些的任何嵌套组合。默认情况下,您在此处指定的字段将分组在输出文档中的 fields
子字典下。要将自定义字段存储为顶级字段,请将 fields_under_root
选项设置为 true。如果在常规配置中声明了重复字段,则其值将被此处声明的值覆盖。
filebeat.inputs: - type: httpjson . . . 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
。