)]}'
{
  "commit": "0c0f9b9b833b18c94db3d3154bd42305d9ea8975",
  "tree": "1914332cade3c93536cba680c80f1662d6c5411e",
  "parents": [
    "54b94d57bbe92612969951f3a8f6c5246bbdf49e"
  ],
  "author": {
    "name": "Robert Pająk",
    "email": "pellared@hotmail.com",
    "time": "Fri Oct 30 14:55:04 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Oct 30 14:55:04 2026 +0000"
  },
  "message": "stdoutlog: use non-OTLP representation for log bodies and attributes (#9150)\n\nNaN and infinities in log bodies or attributes currently stop\nstdoutlog\u0027s JSON encoding and leave the rest of the batch unwritten.\nShare the attribute package\u0027s non-OTLP formatting for special floats,\nbytes, arrays, and nested maps.\n\nEncode log bodies directly as JSON values: strings, booleans, finite\nnumbers, arrays, objects, and `null` for empty values. For example, a\nstring body is `\"Body\":\"test\"` and a nested map is a JSON object. Scalar\nstrings and Base64 bytes receive normal JSON transport quoting; special\nfloats become `\"NaN\"`, `\"Infinity\"`, and `\"-Infinity\"`. JSON-looking\nstrings stay strings, and user map entries named `Type` or `Value`\nremain ordinary data.\n\nLog attributes remain an ordered array of single-attribute objects;\nresource and scope attribute sets become JSON objects. Empty sets are\n`{}`, nil resources remain `null`, and populated scope attributes are\nretained.\n\nUse `json.RawMessage` for the private body field and conversion helper\nso every body is encoded JSON before the record is marshaled. Formatting\nremains local to stdoutlog; shared attribute marshaling and other signal\nexporters are unaffected. Ordinary export errors still reach the caller.\n\nFixes #9127.\nFixes #9128.\n\nSix-sample benchmarks below isolate the `json.RawMessage` refactor\nagainst `deb62de8`, which already emits direct non-OTLP bodies. Scalar\nstrings, bytes, special floats, and empty bodies gain one allocation;\nfinite float and float-array cases use three fewer. Short strings\nmeasured 7.5% slower and escaped strings 16.7% slower; the finite float\nand small-array cases measured 8–11% faster in this run. This is an\nexplicit-type refactor with a performance tradeoff.\n\nBenchmark command: `GOMAXPROCS\u003d2 make\nbenchmark/./exporters/stdout/stdoutlog ARGS\u003d\u0027-bench\u003dBenchmarkExporter\n-benchmem -count\u003d6 -benchtime\u003d100ms\u0027`.\n\n\n```text\ngoos: linux\ngoarch: amd64\npkg: go.opentelemetry.io/otel/exporters/stdout/stdoutlog\ncpu: AMD EPYC 7571\n                                      │ before (deb62de8) │   RawMessage Body   │\n                                      │             sec/op              │   sec/op     vs base               │\nExporterObservability/Disabled-2                            8.639µ ± 5%   8.845µ ± 2%        ~ (p\u003d0.143 n\u003d6)\nExporterObservability/UploadSuccess-2                       10.95µ ± 1%   11.07µ ± 1%   +1.07% (p\u003d0.009 n\u003d6)\nExporterBody/short_string-2                                 4.312µ ± 1%   4.634µ ± 2%   +7.47% (p\u003d0.002 n\u003d6)\nExporterBody/escaped_string-2                               4.562µ ± 1%   5.322µ ± 1%  +16.66% (p\u003d0.002 n\u003d6)\nExporterBody/byte_slice-2                                   4.426µ ± 8%   4.686µ ± 1%        ~ (p\u003d0.065 n\u003d6)\nExporterBody/NaN-2                                          4.245µ ± 1%   4.593µ ± 0%   +8.20% (p\u003d0.002 n\u003d6)\nExporterBody/finite_float-2                                 4.892µ ± 1%   4.363µ ± 1%  -10.82% (p\u003d0.002 n\u003d6)\nExporterBody/empty-2                                        3.850µ ± 5%   3.975µ ± 1%        ~ (p\u003d0.061 n\u003d6)\nExporterFloat64Slice/finite/8-2                             6.476µ ± 1%   5.934µ ± 2%   -8.36% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/finite/1024-2                          175.8µ ± 2%   170.7µ ± 1%   -2.90% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/nonfinite/8-2                          6.247µ ± 1%   5.611µ ± 1%  -10.19% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/nonfinite/1024-2                       172.6µ ± 1%   172.0µ ± 1%        ~ (p\u003d0.310 n\u003d6)\ngeomean                                                     9.824µ        9.895µ        +0.72%\n\n                                      │ before (deb62de8) │   RawMessage Body    │\n                                      │              B/op               │     B/op      vs base               │\nExporterObservability/Disabled-2                           1.242Ki ± 0%   1.312Ki ± 0%   +5.66% (p\u003d0.002 n\u003d6)\nExporterObservability/UploadSuccess-2                      1.243Ki ± 0%   1.313Ki ± 0%   +5.66% (p\u003d0.002 n\u003d6)\nExporterBody/short_string-2                                  632.0 ± 0%     704.0 ± 0%  +11.39% (p\u003d0.002 n\u003d6)\nExporterBody/escaped_string-2                                632.0 ± 0%     760.0 ± 0%  +20.25% (p\u003d0.002 n\u003d6)\nExporterBody/byte_slice-2                                    640.0 ± 0%     712.0 ± 0%  +11.25% (p\u003d0.002 n\u003d6)\nExporterBody/NaN-2                                           632.0 ± 0%     704.0 ± 0%  +11.39% (p\u003d0.002 n\u003d6)\nExporterBody/finite_float-2                                  688.0 ± 0%     680.0 ± 0%   -1.16% (p\u003d0.002 n\u003d6)\nExporterBody/empty-2                                         600.0 ± 0%     672.0 ± 0%  +12.00% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/finite/8-2                              928.0 ± 0%     920.0 ± 0%   -0.86% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/finite/1024-2                         33.32Ki ± 0%   33.34Ki ± 0%        ~ (p\u003d1.000 n\u003d6)\nExporterFloat64Slice/nonfinite/8-2                           944.0 ± 0%     936.0 ± 0%   -0.85% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/nonfinite/1024-2                      33.32Ki ± 0%   33.35Ki ± 0%        ~ (p\u003d0.290 n\u003d6)\ngeomean                                                    1.445Ki        1.532Ki        +6.03%\n\n                                      │ before (deb62de8) │   RawMessage Body   │\n                                      │            allocs/op            │  allocs/op   vs base               │\nExporterObservability/Disabled-2                             25.00 ± 0%    26.00 ± 0%   +4.00% (p\u003d0.002 n\u003d6)\nExporterObservability/UploadSuccess-2                        25.00 ± 0%    26.00 ± 0%   +4.00% (p\u003d0.002 n\u003d6)\nExporterBody/short_string-2                                  9.000 ± 0%   10.000 ± 0%  +11.11% (p\u003d0.002 n\u003d6)\nExporterBody/escaped_string-2                                9.000 ± 0%   10.000 ± 0%  +11.11% (p\u003d0.002 n\u003d6)\nExporterBody/byte_slice-2                                    10.00 ± 0%    11.00 ± 0%  +10.00% (p\u003d0.002 n\u003d6)\nExporterBody/NaN-2                                           9.000 ± 0%   10.000 ± 0%  +11.11% (p\u003d0.002 n\u003d6)\nExporterBody/finite_float-2                                 12.000 ± 0%    9.000 ± 0%  -25.00% (p\u003d0.002 n\u003d6)\nExporterBody/empty-2                                         7.000 ± 0%    8.000 ± 0%  +14.29% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/finite/8-2                             12.000 ± 0%    9.000 ± 0%  -25.00% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/finite/1024-2                          12.000 ± 0%    9.000 ± 0%  -25.00% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/nonfinite/8-2                          12.000 ± 0%    9.000 ± 0%  -25.00% (p\u003d0.002 n\u003d6)\nExporterFloat64Slice/nonfinite/1024-2                       12.000 ± 0%    9.000 ± 0%  -25.00% (p\u003d0.002 n\u003d6)\ngeomean                                                      11.88         11.10        -6.57%\n```",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3fb1d674a13b67a6e921e1b372a979a85fb7a99f",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "b91b6be1f2742cdd84e2fe20975e300c4528c775",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "a598d4397dd6b5b93f64f7f1ceac8d9154cc7e78",
      "old_mode": 33188,
      "old_path": "exporters/stdout/stdoutlog/doc.go",
      "new_id": "00a6be490175efa75786b8b0c9a3bd559f3baf6c",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/doc.go"
    },
    {
      "type": "modify",
      "old_id": "a99886b78584b7cfaf79ccfd4153b5f5395afac7",
      "old_mode": 33188,
      "old_path": "exporters/stdout/stdoutlog/exporter_test.go",
      "new_id": "84099f8185aa93b096fbb7313acc3c0b2efef334",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/exporter_test.go"
    },
    {
      "type": "modify",
      "old_id": "82da2f50bbbf5eb83796acd1e31c475c2ad43aaa",
      "old_mode": 33188,
      "old_path": "exporters/stdout/stdoutlog/record.go",
      "new_id": "8373fbab08d66e5ca20a34636d5823eae15fc1ef",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/record.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2fece8de9a60cdb51bc7e764aa990b275771b954",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/record_test.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "253c0f6f03e20a922f8cb523b1ee31f8949c1a7a",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/value.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "94638148a74a09687568a311a9ff6445ac96d7d7",
      "new_mode": 33188,
      "new_path": "exporters/stdout/stdoutlog/value_test.go"
    }
  ]
}
