Datadog Grok 解析 - 从嵌套 JSON 中提取字段

2023-11-26

是否可以提取嵌套在日志中的 json 字段?

我一直在研究的示例:

thread-191555 app.main - [cid: 2cacd6f9-546d-41ew-a7ce-d5d41b39eb8f, uid: e6ffc3b0-2f39-44f7-85b6-1abf5f9ad970] Request: protocol=[HTTP/1.0] method=[POST] path=[/metrics] headers=[Timeout-Access: <function1>, Remote-Address: 192.168.0.1:37936, Host: app:5000, Connection: close, X-Real-Ip: 192.168.1.1, X-Forwarded-For: 192.168.1.1, Authorization: ***, Accept: application/json, text/plain, */*, Referer: https://google.com, Accept-Language: cs-CZ, Accept-Encoding: gzip, deflate, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko, Cache-Control: no-cache] entity=[HttpEntity.Strict application/json {"type":"text","extract": "text", "field2":"text2","duration": 451 }

我想要实现的是:

{
"extract": "text",
"duration": "451"
}

我尝试结合示例正则表达式("(extract)"\s*:\s*"([^"]+)",?) with example_parser %{data::json}(对于初学者来说,使用 JSON 作为日志示例数据)但我还没有设法让任何东西发挥作用。

提前致谢!


该示例文本的格式正确吗?最终的实体对象缺少一个]从最后。

entity=[HttpEntity.Strict application/json {"type":"text","extract": "text", "field2":"text2","duration": 451 }

应该

entity=[HttpEntity.Strict application/json {"type":"text","extract": "text", "field2":"text2","duration": 451 }]

我将继续这些说明,假设这是一个拼写错误并且实体字段实际上以]。如果没有,我认为您需要修复底层日志以使其格式正确并关闭括号。


我决定解析整个内容并显示最终结果,而不是跳过整个日志并仅解析该 json 位。因此,我们需要做的第一件事就是在请求对象之后提取该组键/值对:

输入示例:thread-191555 app.main - [cid: 2cacd6f9-546d-41ew-a7ce-d5d41b39eb8f, uid: e6ffc3b0-2f39-44f7-85b6-1abf5f9ad970] Request: protocol=[HTTP/1.0] method=[POST] path=[/metrics] headers=[Timeout-Access: <function1>, Remote-Address: 192.168.0.1:37936, Host: app:5000, Connection: close, X-Real-Ip: 192.168.1.1, X-Forwarded-For: 192.168.1.1, Authorization: ***, Accept: application/json, text/plain, */*, Referer: https://google.com, Accept-Language: cs-CZ, Accept-Encoding: gzip, deflate, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko, Cache-Control: no-cache] entity=[HttpEntity.Strict application/json {"type":"text","extract": "text", "field2":"text2","duration": 451 }]

Grok 解析器规则:app_log thread-%{integer:thread} %{notSpace:file} - \[%{data::keyvalue(": ")}\] Request: %{data:request:keyvalue("=","","[]")}

Result:

{
  "thread": 191555,
  "file": "app.main",
  "cid": "2cacd6f9-546d-41ew-a7ce-d5d41b39eb8f",
  "uid": "e6ffc3b0-2f39-44f7-85b6-1abf5f9ad970",
  "request": {
    "protocol": "HTTP/1.0",
    "method": "POST",
    "path": "/metrics",
    "headers": "Timeout-Access: <function1>, Remote-Address: 192.168.0.1:37936, Host: app:5000, Connection: close, X-Real-Ip: 192.168.1.1, X-Forwarded-For: 192.168.1.1, Authorization: ***, Accept: application/json, text/plain, */*, Referer: https://google.com, Accept-Language: cs-CZ, Accept-Encoding: gzip, deflate, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko, Cache-Control: no-cache",
    "entity": "HttpEntity.Strict application/json {\"type\":\"text\",\"extract\": \"text\", \"field2\":\"text2\",\"duration\": 451 }"
  }
}

app log parser

注意我们如何使用带有引用字符串的键值解析器[],这使我们能够轻松地从请求对象中提取所有内容。


现在的目标是从请求对象内部的实体字段中提取详细信息。使用 Grok 解析器,您可以指定特定属性来进一步解析。

因此,在同一个管道中,我们将在第一个解析器处理器之后添加另一个 grok 解析器处理器

enter image description here

然后配置高级选项部分运行request.entity,因为这就是我们所说的属性

enter image description here

输入示例:HttpEntity.Strict application/json {"type":"text","extract": "text", "field2":"text2","duration": 451 }

Grok 解析器规则:entity_rule %{notSpace:request.entity.class} %{notSpace:request.entity.media_type} %{data:request.entity.json:json}

Result:

{
  "request": {
    "entity": {
      "class": "HttpEntity.Strict",
      "media_type": "application/json",
      "json": {
        "duration": 451,
        "extract": "text",
        "type": "text",
        "field2": "text2"
      }
    }
  }
}

现在,当我们查看最终解析的日志时,它包含了我们需要的所有内容:

enter image description here


也正是因为它非常简单,我还为标头块添加了第三个 grok 处理器(高级设置设置为从request.headers):

输入示例:Timeout-Access: <function1>, Remote-Address: 192.168.0.1:37936, Host: app:5000, Connection: close, X-Real-Ip: 192.168.1.1, X-Forwarded-For: 192.168.1.1, Authorization: ***, Accept: application/json, text/plain, */*, Referer: https://google.com, Accept-Language: cs-CZ, Accept-Encoding: gzip, deflate, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko, Cache-Control: no-cache

Grok 解析器规则:headers_rule %{data:request.headers:keyvalue(": ", "/)(; :")}

Result:

{
  "request": {
    "headers": {
      "Timeout-Access": "function1",
      "Remote-Address": "192.168.0.1:37936",
      "Host": "app:5000",
      "Connection": "close",
      "X-Real-Ip": "192.168.1.1",
      "X-Forwarded-For": "192.168.1.1",
      "Accept": "application/json",
      "Referer": "https://google.com",
      "Accept-Language": "cs-CZ",
      "Accept-Encoding": "gzip",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
      "Cache-Control": "no-cache"
    }
  }
}

这里唯一棘手的一点是我必须定义一个 characterWhiteList/)(; :。主要是为了处理所有这些特殊字符User-Agent field.


参考:

只是文档和一些猜测并检查我的个人 Datadog 帐户。

https://docs.datadoghq.com/logs/processing/parsing/?tab=matcher#key-value-or-logfmt

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Datadog Grok 解析 - 从嵌套 JSON 中提取字段 的相关文章

随机推荐

  • 在Java流中添加多个字段(以及条件流操作)

    假设我有这门课 public class Thing private BigDecimal field1 private BigDecimal field2 private BigDecimal otherField1 private Bi
  • php中数组的右旋转

    例如我有一个数组 a 1 2 3 4 5 由此 a 如何获取最后一个并将其设置为第一个 5 1 2 3 4 我如何将最后两个数组变成这样 4 5 1 2 3 您可以结合使用array pop which pops数组的最后一个元素 以及ar
  • 通过 python 在脚本中使用密码 ssh 到远程计算机

    我正在使用远程机器 每次我需要验证文件更新时间时 我都必须使用 ssh 并且有多个脚本可以通过 ssh 连接到远程计算机 我在网上查了一下 但找不到符合我要求的 我试图找到一个使用 ssh 的 python 脚本 并且密码也在脚本中 因为我
  • 始终在 jQuery 自动完成中显示特定选择,即使它与输入不匹配

    我有一个 jQuery 自动完成 jquery ui 版本 1 8 我可以在其中输入一个名称 如果可用 我希望用户从列表中选择一个名称 因为这些是我们数据库中的所有者名称 但是 有时他们需要添加新的所有者名称 在这种情况下 我希望他们从自动
  • 为证书提供 EC 私钥以在 HttpClient C# 中使用

    我有一个可以使用 X509Certificate2 类读取的证书 如下所示 X509Certificate2 证书 new X509Certificate2 certificate pem 但我也有一个EC私钥 这是它的文件内容 BEGIN
  • 如何获取以毫秒为单位的时间差

    我无法解决这个问题 所以我希望有人能提供帮助 我有一首歌曲 歌曲长度以毫秒为单位 我还有以 DATETIME 格式播放歌曲的日期 我想做的是找出歌曲播放时间还剩多少毫秒 Example tracktime 219238 dateplayed
  • requiredFieldValidator 要求用户单击两次

    我有一个简单的网络表单 其中有一个文本框和一个连接到它的RequiredFieldValidator 当触发RequiredFieldValidator错误时 用户必须单击提交两次才能发布表单 第一次单击会清除错误 第二次单击实际上会触发按
  • Java 3 颜色渐变

    我有一个JPanel 我想在其中绘制渐变 我有下面的代码 但只绘制了 2 种颜色的渐变 我想添加第三个 但不知道如何 我想要的是将面板的左上角设置为白色 右上角设置为红色 两个底角设置为黑色 为了实现这一目标 我必须做什么 看起来像这样 p
  • OpenCV Java 将 VideoCapture 与失败的文件绑定

    我使用 OpenCV 2 4 8 和提供的 Windows 64 位 Java jar 到目前为止 我一直在当前环境中充分利用 OpenCV 我无法使用打开视频文件VideoCapture类但是网络摄像头工作正常 以下内容按预期工作vide
  • 从 SASS/LESS 文件中重构和删除未使用的 CSS

    我正在做一个大的工作单页应用程序 backbonejs和rails 它使用 LESS 作为 CSS 预处理器 并且生成的 css 文件已经增长到这样的程度 对于 IE 我们必须将其分成 3 个文件http blesscss com 尽管有工
  • Spring webflux:将http重定向到https

    如何在 spring webflux 中配置 http gt https 重定向 我需要全部http请求被重定向到https 据我了解任何http请求应该有301http 状态响应更改为 http gt https 没有找到任何相关信息文档
  • 需要更快的方法来获取缓冲图像的每个像素的 RGB 值

    获取每个像素的RGB值的最快方法是什么BufferedImage 现在我使用两个来获取 RGB 值for循环如下面的代码所示 但获取这些值花费的时间太长 因为嵌套循环对我的图像总共运行了 479999 次 如果我使用 16 位图像 这个数字
  • 对 HTML 文档进行分页以便使用基于 WebKit 的浏览器进行打印

    Internet Explorer 有打印模板 engine 我可以在哪里使用DEVICERECT元素来表示物理页面 然后使用LAYOUTRECT元素作为矩形视图 使 HTML 文档流入页面并驱动分页 这可以防止行在相邻页面之间的中间被切断
  • 免费、便宜或开源的 UML 和类似 Visio 的工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我们正在寻找免费 廉价或开
  • 在 PHP 中将 unix 时间戳转换为人类可读的日期?

    我有来自 PHP 的时间戳值 1188604800000 当我将时间格式化为人类可读的格式时 如下所示 date m d Y 1188604800000 它打印 05 21 39635 如果我将数字放入在线 Unix 时间戳转换器中 我会得
  • 两个(UIWebView 或 WKWebView)单独的 cookie 存储

    我想在不同的地方登录同一网站的多个帐户webView 例如我有Tab Bar Controller其中包含三个视图控制器和每个视图控制器包含webView 例如我嵌入stackoverflow网址为webView在每个班级 用户如何使用这三
  • 调用 platformBrowserDynamic().bootstrapModule(@NgModule) 返回 ASSERTION ERROR 传入的类型不是 NgModuleType,它没有 'ɵmod' 属性

    我对 platformBrowserDynamic bootstrapModule app app module 调用有问题 错误消息是 未捕获错误 断言错误 传入的类型不是 NgModuleType 它没有 mod 属性 但是我可以在调试
  • 如何将两个CSS类应用到单个元素[重复]

    这个问题在这里已经有答案了 我可以在一个课程中申请2个课程吗div or span或任何 HTML 元素 例如 a class c2 aa a 我尝试过 就我而言c2没有得到应用 我怎样才能同时申请两个课程 1 在class属性内使用多个类
  • 在 python 中创建圆形条形图

    我有兴趣在我的项目中使用圆形条形图可视化 但不知道如何用 Python 生成它 请参阅下面的 圆形条形图 含义的示例 数据将以 pandas 系列的形式出现 下面的虚拟示例模糊地反映了情节 A 33 B 62 C 56 D 70 任何想法
  • Datadog Grok 解析 - 从嵌套 JSON 中提取字段

    是否可以提取嵌套在日志中的 json 字段 我一直在研究的示例 thread 191555 app main cid 2cacd6f9 546d 41ew a7ce d5d41b39eb8f uid e6ffc3b0 2f39 44f7 8