自定义过滤器
编辑自定义过滤器编辑
自定义过滤器允许您在摄取时过滤或编辑其他类型的 APM 数据
在摄取时应用。支持所有代理和字段。数据离开受监控的服务。对受监控的服务没有性能开销影响。 |
|
并非所有代理都支持。数据在离开受监控的服务之前被清理。对受监控的服务有潜在的开销影响 |
创建摄取管道过滤器编辑
摄取节点管道指定一系列以特定方式转换数据的处理器。转换发生在索引之前,不会对受监控的应用程序造成性能开销。管道是一种灵活且简单的方法来过滤或混淆 Elastic APM 数据。
教程:编辑敏感信息编辑
假设您决定 捕获 HTTP 请求正文,但很快注意到敏感信息正在 http.request.body.original
字段中被收集
{ "email": "[email protected]", "password": "hunter2" }
创建管道
要混淆存储在请求正文中的密码,您可以使用一系列 摄取处理器。首先,创建一个带有简单描述和空处理器数组的管道
添加 JSON 处理器
将您的第一个处理器添加到处理器数组中。因为代理将请求正文捕获为字符串,所以使用 JSON 处理器 将原始字段值转换为结构化 JSON 对象。将此 JSON 对象保存在一个新字段中
{ "json": { "field": "http.request.body.original", "target_field": "http.request.body.original_json", "ignore_failure": true } }
添加设置处理器
如果 body.original_json
不为 null
,即它存在,我们将使用 设置处理器 编辑 password
,方法是将 body.original_json.password
的值设置为 "redacted"
{ "set": { "field": "http.request.body.original_json.password", "value": "redacted", "if": "ctx?.http?.request?.body?.original_json != null" } }
添加转换处理器
使用 转换处理器 将 body.original_json
的 JSON 值转换为字符串,并将其设置为 body.original
值
{ "convert": { "field": "http.request.body.original_json", "target_field": "http.request.body.original", "type": "string", "if": "ctx?.http?.request?.body?.original_json != null", "ignore_failure": true } }
添加删除处理器
最后,使用 删除处理器 删除 body.original_json
字段
{ "remove": { "field": "http.request.body.original", "if": "ctx?.http?.request?.body?.original_json != null", "ignore_failure": true } }
注册管道
现在我们将把所有内容放在一起。使用 创建或更新管道 API 在 Elasticsearch 中注册新管道。将管道命名为 apm_redacted_body_password
PUT _ingest/pipeline/apm_redacted_body_password { "description": "redact http.request.body.original.password", "processors": [ { "json": { "field": "http.request.body.original", "target_field": "http.request.body.original_json", "ignore_failure": true } }, { "set": { "field": "http.request.body.original_json.password", "value": "redacted", "if": "ctx?.http?.request?.body?.original_json != null" } }, { "convert": { "field": "http.request.body.original_json", "target_field": "http.request.body.original", "type": "string", "if": "ctx?.http?.request?.body?.original_json != null", "ignore_failure": true } }, { "remove": { "field": "http.request.body.original_json", "if": "ctx?.http?.request?.body?.original_json != null", "ignore_failure": true } } ] }
测试管道
在启用此新管道之前,您可以使用 模拟管道 API 对其进行测试。此 API 允许您通过管道运行多个文档,以确保其正常工作。
以下请求模拟了通过管道运行三个不同的文档
POST _ingest/pipeline/apm_redacted_body_password/_simulate { "docs": [ { "_source": { "http": { "request": { "body": { "original": """{"email": "[email protected]", "password": "hunter2"}""" } } } } }, { "_source": { "some-other-field": true } }, { "_source": { "http": { "request": { "body": { "original": """["invalid json" """ } } } } } ] }
API 响应应与此类似
{ "docs" : [ { "doc" : { "_source" : { "http" : { "request" : { "body" : { "original" : { "password" : "redacted", "email" : "[email protected]" } } } } } } }, { "doc" : { "_source" : { "nobody" : true } } }, { "doc" : { "_source" : { "http" : { "request" : { "body" : { "original" : """["invalid json" """ } } } } } } ] }
正如预期的那样,只有第一个模拟文档具有编辑后的密码字段。所有其他文档均不受影响。
创建 @custom
管道
此过程的最后一步是从您要编辑的数据流的 @custom
管道调用新创建的 apm_redacted_body_password
管道。
@custom
管道特定于每个数据流,并遵循类似的命名约定:<type>-<dataset>@custom
。提醒一下,默认的 APM 数据流是
- 应用程序跟踪:
traces-apm-<namespace>
- RUM 和 iOS 代理应用程序跟踪:
traces-apm.rum-<namespace>
- APM 内部指标:
metrics-apm.internal-<namespace>
- APM 事务指标:
metrics-apm.transaction.<metricset.interval>-<namespace>
- APM 服务目标指标:
metrics-apm.service_destination.<metricset.interval>-<namespace>
- APM 服务事务指标:
metrics-apm.service_transaction.<metricset.interval>-<namespace>
- APM 服务摘要指标:
metrics-apm.service_summary.<metricset.interval>-<namespace>
- 应用程序指标:
metrics-apm.app.<service.name>-<namespace>
- APM 错误/异常日志记录:
logs-apm.error-<namespace>
- APM 应用程序日志记录:
logs-apm.app.<service.name>-<namespace>
要将自定义摄取管道与数据流匹配,请遵循 <type>-<dataset>@custom
模板,或在上表中将 -namespace
替换为 @custom
。例如,要定位应用程序跟踪,您将创建一个名为 traces-apm@custom
的管道。
使用 创建或更新管道 API 在 Elasticsearch 中注册新管道。将管道命名为 traces-apm@custom
PUT _ingest/pipeline/traces-apm@custom { "processors": [ { "pipeline": { "name": "apm_redacted_body_password" } } ] }
如果您更喜欢使用 GUI,则可以打开 Kibana 并导航到 堆栈管理 → 摄取管道 → 创建管道。使用前面解释的相同命名约定,以确保您的新管道与正确的 APM 数据流匹配。
就是这样!现在将从您的 APM HTTP 正文数据中编辑掉密码。
要详细了解摄取管道,请参阅 查看 Elasticsearch 索引模板。
APM 代理过滤器编辑
一些 APM 代理提供了一种在将 APM 事件发送到 APM 服务器之前对其进行操作或删除的方法。有关更多信息和示例,请参阅相关代理的文档
- .NET:过滤器 API。
- Node.js:
addFilter()
。 - Python:自定义处理器。
- Ruby:
add_filter()
。