{"id":26517,"date":"2025-12-05T04:25:43","date_gmt":"2025-12-05T04:25:43","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=26517"},"modified":"2025-12-05T04:25:43","modified_gmt":"2025-12-05T04:25:43","slug":"%e4%bd%9c%e3%81%a3%e3%81%a6%e3%82%8f%e3%81%8b%e3%82%8bopentelemetry%e3%81%ae%e3%82%bc%e3%83%ad%e3%82%b3%e3%83%bc%e3%83%89%e8%a8%88%e8%a3%85-go%e8%a8%80%e8%aa%9eebpf%e7%b7%a8-mackerel-%e3%83%96","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/26517\/","title":{"rendered":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 &#8211; Mackerel \u30d6\u30ed\u30b0 #mackerelio"},"content":{"rendered":"\n<\/p>\n<div>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251127\/20251127233405.png\" width=\"1200\" height=\"630\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p><strong>OpenTelemetry\u3067\u306feBPF\u3068\u3044\u3046\u6280\u8853\u3092\u7528\u3044\u308b\u3053\u3068\u3067\u3001Go\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u89b3\u6e2c\u53ef\u80fd\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001\u305d\u306e\u624b\u6cd5\u3068\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\u5b9f\u969b\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u306a\u304c\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002<\/strong><\/p>\n<p>\u3053\u3093\u306b\u3061\u306f\u3002Mackerel\u30c1\u30fc\u30e0\u3067\u30a2\u30eb\u30d0\u30a4\u30c8\u3092\u3057\u3066\u3044\u308b\u30a8\u30f3\u30b8\u30cb\u30a2\u306e <a target=\"_blank\" href=\"http:\/\/blog.hatena.ne.jp\/appare45\/\" class=\"hatena-id-icon\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cdn.profile-image.st-hatena.com\/users\/appare45\/profile.png\" width=\"16\" height=\"16\" alt=\"\" class=\"hatena-id-icon\"\/>id:appare45<\/a> \u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306fOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3092\u3001Go\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5bfe\u3057\u3066eBPF\u3092\u7528\u3044\u3066\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u5b9f\u969b\u306b\u5b9f\u88c5\u3057\u306a\u304c\u3089\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h2 id=\"\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3068\u306f\">\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3068\u306f<\/h2>\n<p>\u30aa\u30d6\u30b6\u30fc\u30d0\u30d3\u30ea\u30c6\u30a3\u306b\u304a\u3051\u308b<strong>\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5<\/strong>\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u3001\u30c8\u30ec\u30fc\u30b9\u3084\u30e1\u30c8\u30ea\u30c3\u30af\u306e\u3088\u3046\u306a\u30b7\u30b0\u30ca\u30eb\u3092\u751f\u6210\u3059\u308b\u6280\u8853\u3067\u3059\u3002\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u3057\u305f\u308a\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u76f4\u3057\u305f\u308a\u3059\u308b\u5fc5\u8981\u304c\u306a\u3044\u305f\u3081\u3001\u624b\u9593\u304c\u5c11\u306a\u304f\u624b\u8efd\u306b\u30aa\u30d6\u30b6\u30fc\u30d0\u30d3\u30ea\u30c6\u30a3\u3092\u59cb\u3081\u3089\u308c\u308b\u3053\u3068\u304c\u7279\u5fb4\u3067\u3059\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5bfe\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u3092\u53d6\u5f97\u3059\u308b\u5834\u5408\u3001\u901a\u5e38\u306f\u6b21\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3092\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">\n<span class=\"synStatement\">func<\/span> initTracerProvider(ctx context.Context) (<span class=\"synType\">func<\/span>(context.Context) <span class=\"synType\">error<\/span>, <span class=\"synType\">error<\/span>) {\n  client := otlptracehttp.NewClient(\n    otlptracehttp.WithEndpoint(<span class=\"synConstant\">\"otlp-vaxila.mackerelio.com\"<\/span>),\n    otlptracehttp.WithHeaders(<span class=\"synType\">map<\/span>[<span class=\"synType\">string<\/span>]<span class=\"synType\">string<\/span>{\n      <span class=\"synConstant\">\"Accept\"<\/span>:         <span class=\"synConstant\">\"*\/*\"<\/span>,\n      <span class=\"synConstant\">\"Mackerel-Api-Key\"<\/span>: os.Getenv(<span class=\"synConstant\">\"MACKEREL_API_KEY\"<\/span>),\n    }),\n    otlptracehttp.WithCompression(otlptracehttp.GzipCompression),\n  )\n  exporter, err := otlptrace.New(ctx, client)\n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">nil<\/span>, err\n  }\n  tp := trace.NewTracerProvider(\n    trace.WithBatcher(exporter),\n  )\n  otel.SetTracerProvider(tp)\n  otel.SetTextMapPropagator(propagation.TraceContext{})\n  <span class=\"synStatement\">return<\/span> tp.Shutdown, <span class=\"synStatement\">nil<\/span>\n}\n\n<span class=\"synStatement\">func<\/span> main() {\n  ctx := context.Background()\n  shutdown, err := initTracerProvider(ctx)\n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    <span class=\"synStatement\">panic<\/span>(err)\n  }\n  <span class=\"synStatement\">defer<\/span> shutdown(ctx)\n  otelHandler := otelhttp.NewHandler( \n    http.HandlerFunc(awesomeActionHandler),\n    <span class=\"synConstant\">\"awesome_span_name\"<\/span>,\n  )\n  http.Handle(<span class=\"synConstant\">\"\/awesome_path\/\"<\/span>, otelHandler)\n  http.ListenAndServe(<span class=\"synConstant\">\":80\"<\/span>, <span class=\"synStatement\">nil<\/span>)\n}\n...\n<\/pre>\n<p>\u4e00\u65b9\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3092\u4f7f\u3046\u3068\u3001\u6b21\u306e\u3088\u3046\u306a\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3060\u3051\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u30c8\u30ec\u30fc\u30b9\u3092\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code bash\" data-lang=\"bash\" data-unlink=\"\"># https:\/\/github.com\/open-telemetry\/opentelemetry-go-instrumentation\/blob\/main\/docs\/getting-started.md#steps\n$ sudo OTEL_GO_AUTO_TARGET_EXE=\/home\/bin\/service_executable OTEL_SERVICE_NAME=my_service OTEL_EXPORTER_OTLP_ENDPOINT=http:\/\/localhost:4318 .\/otel-go-instrumentation <\/pre>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3069\u306e\u3088\u3046\u306b\u3057\u3066\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u304c\u5b9f\u73fe\u3055\u308c\u3066\u3044\u308b\u306e\u304b\u3001eBPF\u3092\u7528\u3044\u305f\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<h2 id=\"eBPF\u3068\u306f\">eBPF\u3068\u306f<\/h2>\n<p><strong>eBPF<\/strong>\u3068\u306fLinux\u30ab\u30fc\u30cd\u30eb\u306b\u7d44\u307f\u8fbc\u307e\u308c\u3066\u3044\u308b\u3001\u30ab\u30fc\u30cd\u30eb\u306e\u6319\u52d5\u3092\u52d5\u7684\u306b\u5909\u66f4\u3067\u304d\u308b\u4ed5\u7d44\u307f\u3067\u3059\u3002eBPF\u3092\u7528\u3044\u308b\u3053\u3068\u3067\u3001\u30ab\u30fc\u30cd\u30eb\u306e\u30b3\u30fc\u30c9\u3092\u76f4\u63a5\u66f8\u304d\u63db\u3048\u308b\u3053\u3068\u306a\u304f\u3001\u7c21\u5358\u304b\u3064\u5b89\u5168\u306bOS\u306e\u6319\u52d5\u3092\u5909\u66f4\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u30e6\u30fc\u30b6\u30fc\u304ceBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u3001\u95a2\u6570\u306e\u547c\u3073\u51fa\u3057\u3084\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30d1\u30b1\u30c3\u30c8\u306e\u5230\u9054\u306a\u3069\u306e\u30a4\u30d9\u30f3\u30c8\u306b\u767b\u9332\uff08<strong>\u30a2\u30bf\u30c3\u30c1<\/strong>\uff09\u3059\u308b\u3068\u3001\u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3057\u305f\u3068\u304d\u306b\u81ea\u52d5\u3067eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u547c\u3070\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251203\/20251203125328.png\" width=\"2000\" height=\"1073\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>OpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3067\u306fGo\u8a00\u8a9e\u306e\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u542b\u307e\u308c\u308bnet\/http\u3084\u3001database\/sql\u306e\u95a2\u6570\u547c\u3073\u51fa\u3057\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3001\u5b9f\u884c\u6642\u9593\u3084\u5f15\u6570\u3092\u30c8\u30ec\u30fc\u30b9\u3068\u3057\u3066\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2 id=\"Go\u8a00\u8a9e\u3067eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u304f\">Go\u8a00\u8a9e\u3067eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u304f<\/h2>\n<p>\u3053\u3053\u304b\u3089\u306f\u3001\u5b9f\u969b\u306bGo\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5bfe\u3057\u3066\u3001eBPF\u3092\u7528\u3044\u3066\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3092\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002\u3053\u3053\u304b\u3089\u306e\u30b3\u30fc\u30c9\u306f\u4e0b\u8a18\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306b\u307e\u3068\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/github.com\/appare45\/go-auto-instrument-ebpf\/tree\/64b75cbea37932d9ea72d8ab1cf23d042be04dd0\">https:\/\/github.com\/appare45\/go-auto-instrument-ebpf\/tree\/64b75cbea37932d9ea72d8ab1cf23d042be04dd0<\/a><\/p>\n<p>\u672c\u8a18\u4e8b\u306e\u57f7\u7b46\u6642\u70b9\uff082025\u5e7411\u6708\uff09\u3067eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u30b3\u30f3\u30d1\u30a4\u30eb\u3067\u304d\u308b\u8a00\u8a9e\u306f\u3001\u79c1\u306e\u77e5\u308b\u9650\u308aC\u8a00\u8a9e\u3068Rust\u8a00\u8a9e\u306e\u307f\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306fOpenTelemetry\u306e\u516c\u5f0f\u5b9f\u88c5\u3068\u540c\u3058\u304f\u8a08\u88c5\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u90e8\u5206\u3092Go\u8a00\u8a9e\u3067\u3001eBPF\u306e\u30b3\u30fc\u30c9\u306fC\u8a00\u8a9e\u3067\u66f8\u304f\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u74b0\u5883\u69cb\u7bc9\u306e\u65b9\u6cd5\u306a\u3069\u306b\u3064\u3044\u3066\u306f\u300c<a target=\"_blank\" href=\"#Appendix-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\">Appendix: \u74b0\u5883\u69cb\u7bc9\u306b\u3064\u3044\u3066<\/a>\u300d\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u672c\u8a18\u4e8b\u4e2d\u306e\u30b3\u30fc\u30c9\u306fArm\u74b0\u5883\u3067\u306eUbuntu\u3067\u52d5\u4f5c\u78ba\u8a8d\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>C\u8a00\u8a9e\u3067\u66f8\u3044\u305feBPF\u306e\u30b3\u30fc\u30c9\u306f\u3001<a target=\"_blank\" href=\"https:\/\/github.com\/cilium\/ebpf\/tree\/main\/cmd\/bpf2go#readme\"><strong>bpf2go<\/strong><\/a>\u3068\u3044\u3046\u30c4\u30fc\u30eb\u3092\u4f7f\u3046\u3068\u3001Go\u8a00\u8a9e\u5411\u3051\u306e\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u751f\u6210\u3068eBPF\u30b3\u30fc\u30c9\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251203\/20251203125225.png\" width=\"1924\" height=\"1164\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u4eca\u56de\u306feBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092<code>tracer.c<\/code>\u306b\u66f8\u304f\u3053\u3068\u306b\u3057\u307e\u3059\u3002<a target=\"_blank\" href=\"https:\/\/go.dev\/blog\/generate\"><code>go generate<\/code><\/a>\u3092\u4f7f\u3063\u3066\u3001<code>tracer.c<\/code>\u304b\u3089eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3078\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u3092\u751f\u6210\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\"><span class=\"synStatement\">package<\/span> main\n\n\n<\/pre>\n<h2 id=\"\u95a2\u6570\u306e\u5b9f\u884c\u958b\u59cb\u3068\u7d42\u4e86\u3092\u8a18\u9332\u3059\u308b\">\u95a2\u6570\u306e\u5b9f\u884c\u958b\u59cb\u3068\u7d42\u4e86\u3092\u8a18\u9332\u3059\u308b<\/h2>\n<p>\u307e\u305a\u95a2\u6570\u306e\u958b\u59cb\u3068\u7d42\u4e86\u3092\u3001\u6b21\u306e\u3088\u3046\u306a\u6d41\u308c\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5916\u304b\u3089\u89b3\u6e2c\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<ol>\n<li>\u95a2\u6570\u306e\u958b\u59cb\u3068\u7d42\u4e86\u6642\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u547c\u3070\u308c\u308b\u3088\u3046\u306b\u3059\u308b<\/li>\n<li>eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u547c\u3070\u308c\u305f\u3089\u73fe\u5728\u6642\u523b\u3092BPF Map\u306b\u4fdd\u5b58\u3059\u308b<\/li>\n<li>\u76e3\u8996\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306fBPF Map\u3092\u76e3\u8996\u3057\u3001\u30a4\u30d9\u30f3\u30c8\u304c\u8ffd\u52a0\u3055\u308c\u305f\u3089\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u8868\u793a\u3059\u308b<\/li>\n<\/ol>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251203\/20251203125257.png\" width=\"2000\" height=\"730\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p><strong>BPF Map<\/strong>\u306f\u3001eBPF\u304b\u3089\u3082\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d7\u30ed\u30b0\u30e9\u30e0\u304b\u3089\u3082\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u9818\u57df\u3067\u3059\u3002BPF Map\u306b\u306f\u5faa\u74b0\u30ea\u30b9\u30c8\u3084\u30cf\u30c3\u30b7\u30e5\u30de\u30c3\u30d7\u306a\u3069\u3055\u307e\u3056\u307e\u306a\u30c7\u30fc\u30bf\u69cb\u9020\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4eca\u56de\u306f\u30b7\u30f3\u30d7\u30eb\u306a\u30ea\u30b9\u30c8<code>BPF_MAP_TYPE_PERF_EVENT_ARRAY<\/code>\u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p><code>tracer.c<\/code>\u306b\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u66f8\u3044\u3066\u3001\u5b9f\u969b\u306b\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\"><span class=\"synPreProc\">#include <\/span><span class=\"synConstant\"><asm ptrace.h=\"\"\/><\/span>\n<span class=\"synPreProc\">#include <\/span><span class=\"synConstant\"><linux bpf.h=\"\"\/><\/span>\n<span class=\"synPreProc\">#include <\/span><span class=\"synConstant\"><bpf bpf_helpers.h=\"\"\/><\/span>\n<span class=\"synPreProc\">#include <\/span><span class=\"synConstant\"><bpf bpf_tracing.h=\"\"\/><\/span>\n\n<span class=\"synType\">struct<\/span> event {\n  __u64 pid;\n  __u64 tid;\n  __u64 timestamp;\n};\n\n<span class=\"synType\">struct<\/span> {\n  <span class=\"synIdentifier\">__uint<\/span>(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); \n  <span class=\"synIdentifier\">__type<\/span>(value, <span class=\"synType\">struct<\/span> event);\n} events <span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\".maps\"<\/span>);\n\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/start_event\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_start_event<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  <span class=\"synType\">struct<\/span> event event;\n  __u64 id = <span class=\"synIdentifier\">bpf_get_current_pid_tgid<\/span>();\n  event.pid = id &gt;&gt; <span class=\"synConstant\">32<\/span>; \n  event.tid = (__u32)id; \n  event.start_time = <span class=\"synIdentifier\">bpf_ktime_get_ns<\/span>(); \n  <span class=\"synIdentifier\">bpf_perf_event_output<\/span>(ctx, &amp;events, BPF_F_CURRENT_CPU, &amp;event, <span class=\"synStatement\">sizeof<\/span>(event)); \n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uretprobe\/end_event\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uretprobe_end_event<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  <span class=\"synType\">struct<\/span> event event;\n  __u64 id = <span class=\"synIdentifier\">bpf_get_current_pid_tgid<\/span>();\n\n  event.pid = id &gt;&gt; <span class=\"synConstant\">32<\/span>; \n  event.tid = (__u32)id; \n  event.end_time = <span class=\"synIdentifier\">bpf_ktime_get_ns<\/span>(); \n\n  <span class=\"synIdentifier\">bpf_perf_event_output<\/span>(ctx, &amp;events, BPF_F_CURRENT_CPU, &amp;event, <span class=\"synStatement\">sizeof<\/span>(event)); \n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n\n<span class=\"synType\">char<\/span> LICENSE[] <span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"license\"<\/span>) = <span class=\"synConstant\">\"GPL\"<\/span>; \n<\/pre>\n<p>Go\u8a00\u8a9e\u5074\uff08\u8a08\u88c5\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\uff09\u3067\u306f\u3001\u4f5c\u6210\u3057\u305fBPF Map\u3092\u76e3\u8996\u3057\u3066\u3001\u30a4\u30d9\u30f3\u30c8\u304c\u8ffd\u52a0\u3055\u308c\u305f\u3089\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u51fa\u529b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">\n<span class=\"synStatement\">func<\/span> main() {\n  <span class=\"synStatement\">if<\/span> <span class=\"synStatement\">len<\/span>(os.Args) &lt; <span class=\"synConstant\">3<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"usage: %s <binary_path> <symbol_name>\"<\/symbol_name><\/binary_path><\/span>, os.Args[<span class=\"synConstant\">0<\/span>])\n    <span class=\"synStatement\">return<\/span>\n  }\n\n  binPath := os.Args[<span class=\"synConstant\">1<\/span>]\n\n  <span class=\"synStatement\">if<\/span> _, err := os.Stat(binPath); os.IsNotExist(err) {\n    log.Fatalf(<span class=\"synConstant\">\"binary path does not exist: %s\"<\/span>, binPath)\n    <span class=\"synStatement\">return<\/span>\n  }\n\n  symbol := os.Args[<span class=\"synConstant\">2<\/span>]\n  <span class=\"synStatement\">if<\/span> symbol == <span class=\"synConstant\">\"\"<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"symbol name is required\"<\/span>)\n    <span class=\"synStatement\">return<\/span>\n  }\n\n  <span class=\"synStatement\">if<\/span> err := rlimit.RemoveMemlock(); err != <span class=\"synStatement\">nil<\/span> {\n    log.Fatal(<span class=\"synConstant\">\"Removing memlock:\"<\/span>, err)\n  }\n\n  objs := tracerObjects{} \n  <span class=\"synStatement\">if<\/span> err := loadTracerObjects(&amp;objs, <span class=\"synStatement\">nil<\/span>); err != <span class=\"synStatement\">nil<\/span> { \n    log.Fatalf(<span class=\"synConstant\">\"loading objects: %s\"<\/span>, err)\n  }\n  <span class=\"synStatement\">defer<\/span> objs.Close()\n\n  ex, err := link.OpenExecutable(binPath) \n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"opening executable: %s\"<\/span>, err)\n  }\n\n  up, err := ex.Uprobe(symbol, objs.UprobeStartEvent, <span class=\"synStatement\">nil<\/span>) \n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"creating uprobe: %s\"<\/span>, err)\n  }\n  <span class=\"synStatement\">defer<\/span> up.Close()\n\n  uretp, err := ex.Uretprobe(symbol, objs.UretprobeEndEvent, <span class=\"synStatement\">nil<\/span>) \n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"creating uretprobe: %s\"<\/span>, err)\n  }\n  <span class=\"synStatement\">defer<\/span> uretp.Close()\n\n  rd, err := perf.NewReader(objs.Events, os.Getpagesize()) \n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    log.Fatalf(<span class=\"synConstant\">\"creating perf event reader: %s\"<\/span>, err)\n  }\n  <span class=\"synStatement\">defer<\/span> rd.Close()\n\n  stopper := <span class=\"synStatement\">make<\/span>(<span class=\"synType\">chan<\/span> os.Signal, <span class=\"synConstant\">1<\/span>)\n  signal.Notify(stopper, os.Interrupt, syscall.SIGTERM)\n\n  <span class=\"synStatement\">go<\/span> <span class=\"synType\">func<\/span>() {\n    &lt;-stopper\n    log.Println(<span class=\"synConstant\">\"Received signal, exiting program..\"<\/span>)\n    <span class=\"synStatement\">if<\/span> err := rd.Close(); err != <span class=\"synStatement\">nil<\/span> {\n      log.Fatalf(<span class=\"synConstant\">\"closing perf event reader: %s\"<\/span>, err)\n    }\n  }()\n\n  log.Printf(<span class=\"synConstant\">\"Listening for events..\"<\/span>)\n  <span class=\"synStatement\">for<\/span> {\n    record, err := rd.Read()\n    <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n      <span class=\"synStatement\">if<\/span> errors.Is(err, perf.ErrClosed) {\n        <span class=\"synStatement\">return<\/span>\n      }\n      log.Printf(<span class=\"synConstant\">\"reading from perf event reader: %s\"<\/span>, err)\n      <span class=\"synStatement\">continue<\/span>\n    }\n    <span class=\"synStatement\">if<\/span> record.LostSamples != <span class=\"synConstant\">0<\/span> {\n      log.Printf(<span class=\"synConstant\">\"perf event ring buffer full, dropped %d samples\"<\/span>, record.LostSamples)\n      <span class=\"synStatement\">continue<\/span>\n    }\n    <span class=\"synStatement\">var<\/span> event tracerEvent\n    <span class=\"synStatement\">if<\/span> err := binary.Read(bytes.NewBuffer(record.RawSample), binary.LittleEndian, &amp;event); err != <span class=\"synStatement\">nil<\/span> { \n      log.Printf(<span class=\"synConstant\">\"parsing perf event: %s\"<\/span>, err)\n      <span class=\"synStatement\">continue<\/span>\n    }\n    log.Printf(<span class=\"synConstant\">\"pid %d, tid %d, timestamp %d\"<\/span>, event.Pid, event.Tid, event.Timestamp)\n  }\n}\n<\/pre>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f7f\u3063\u3066\u5b9f\u969b\u306b\u95a2\u6570\u306e\u5b9f\u884c\u6642\u9593\u3092\u8a08\u6e2c\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u8a08\u6e2c\u5bfe\u8c61\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092<a target=\"_blank\" href=\"https:\/\/go.dev\/play\/p\/qGm_dMJAPnO\">\u3053\u3061\u3089\u306b\u7528\u610f\u3057\u307e\u3057\u305f<\/a>\u3002<\/p>\n<p><code>go generate &amp;&amp; go build &amp;&amp; sudo .\/auto-instrument-go-ebpf .\/example\/hello-world main.hello<\/code> \u306e\u3088\u3046\u306b\u5b9f\u884c\u3059\u308b\u3068\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u30d3\u30eb\u30c9\u3055\u308c\u3066\u3001\u5b9f\u969b\u306b\u95a2\u6570\u306e\u958b\u59cb\u3068\u7d42\u4e86\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u51fa\u529b\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002Go\u8a00\u8a9e\u3067\u306f\u30d0\u30a4\u30ca\u30ea\u306b\u542b\u307e\u308c\u308b\u95a2\u6570\u306e\u30b7\u30f3\u30dc\u30eb\u540d\u306f\u3001<code>&lt;\u30d1\u30c3\u30b1\u30fc\u30b8\u540d&gt;.&lt;\u95a2\u6570\u540d&gt;<\/code> \u3068\u3044\u3046\u5f62\u5f0f\u306b\u306a\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">$ sudo .\/otel-go-auto .\/examples\/hello-world\/hello-world main.hello\n2025\/11\/11 16:42:01 PID: 3644, Duration: 122207 ns<\/pre>\n<h2 id=\"uretprobe\u3092\u4f7f\u308f\u305a\u306b\u95a2\u6570\u306e\u7d42\u4e86\u3092\u77e5\u308b\">uretprobe\u3092\u4f7f\u308f\u305a\u306b\u95a2\u6570\u306e\u7d42\u4e86\u3092\u77e5\u308b<\/h2>\n<p>\u5148\u307b\u3069\u306e\u30b3\u30fc\u30c9\u3067\u306f<code>uretprobe<\/code>\u3092\u4f7f\u3063\u3066\u95a2\u6570\u306e\u7d42\u4e86\u6642\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c\u3057\u307e\u3057\u305f\u3002\u3057\u304b\u3057Go\u8a00\u8a9e\u3067<code>uretprobe<\/code>\u3092\u4f7f\u3046\u3068\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u305f\u3073\u305f\u3073\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001<code>uretprobe<\/code>\u304c\u95a2\u6570\u306e\u30ea\u30bf\u30fc\u30f3\u30a2\u30c9\u30ec\u30b9\u3092\u4e0a\u66f8\u304d\u3057\u3066\u3057\u307e\u3044\u3001Go\u8a00\u8a9e\u306e\u30e9\u30f3\u30bf\u30a4\u30e0\u306b\u3088\u3063\u3066\u30b9\u30bf\u30c3\u30af\u304c\u5909\u66f4\u3055\u308c\u308b\u3068\u3001\u6b63\u3057\u304f\u30ea\u30bf\u30fc\u30f3\u30a2\u30c9\u30ec\u30b9\u306b\u623b\u308c\u306a\u304f\u306a\u308b\u305f\u3081\u3067\u3059 <a target=\"_blank\" href=\"#f-f8e1b769\" id=\"fn-f8e1b769\" name=\"fn-f8e1b769\" title=\"\u8a73\u3057\u304f\u306f\u3053\u3061\u3089\u306eissue\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\">*1<\/a> \u3002<\/p>\n<p>\u305d\u3053\u3067\u672c\u7bc0\u3067\u306f<code>uretprobe<\/code>\u3092\u4f7f\u308f\u305a\u306b\u95a2\u6570\u306e\u7d42\u4e86\u3092\u77e5\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<code>uretprobe<\/code>\u3092\u4f7f\u308f\u305a\u306b\u95a2\u6570\u306e\u7d42\u4e86\u3092\u77e5\u308b\u305f\u3081\u306b\u306f\u3001\u30d0\u30a4\u30ca\u30ea\u3092\u89e3\u6790\u3057\u3066\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u9759\u7684\u306b\u7279\u5b9a\u3057\u3001<strong><code>uprobe<\/code><\/strong>\u3092\u4f7f\u3063\u3066\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u307e\u3059\u3002<\/p>\n<p>\u524d\u7bc0\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001<code>uprobe<\/code>\u306e\u8a2d\u5b9a\u306b\u30d0\u30a4\u30ca\u30ea\u306e\u30d1\u30b9\u3068\u30b7\u30f3\u30dc\u30eb\u540d\u3092<a target=\"_blank\" href=\"https:\/\/pkg.go.dev\/github.com\/cilium\/ebpf\/link#Executable.Uprobe\"><code>func(*Executable) Uprobe<\/code><\/a>\u306b\u6e21\u3057\u3066\u3044\u307e\u3057\u305f\u3002<code>Uprobe<\/code>\u306e\u5185\u90e8\u3067\u306f\u6e21\u3055\u308c\u305f\u30b7\u30f3\u30dc\u30eb\u306e\u3001\u4f4d\u7f6e\uff08<strong>\u30d5\u30a1\u30a4\u30eb\u30aa\u30d5\u30bb\u30c3\u30c8<\/strong>\uff09\u3092\u63a2\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u30dd\u30a4\u30f3\u30c8\u3092\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059 <a target=\"_blank\" href=\"#f-9d41e27e\" id=\"fn-9d41e27e\" name=\"fn-9d41e27e\" title=\"https:\/\/github.com\/cilium\/ebpf\/blob\/main\/link\/uprobe.go#L167\">*2<\/a> \u3002\u3064\u307e\u308a\u3001<code>uprobe<\/code>\u306f\u95a2\u6570\u306e\u958b\u59cb\u4f4d\u7f6e\u306b\u9650\u3089\u305a\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4efb\u610f\u306e\u4f4d\u7f6e\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u7279\u6027\u3092\u4f7f\u3044\u3001\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u4e8b\u524d\u306b\u30d0\u30a4\u30ca\u30ea\u3092\u89e3\u6790\u3057\u3066\u7279\u5b9a\u3057\u3001<code>uprobe<\/code>\u3092\u4f7f\u3063\u3066eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5b9f\u884c\u3055\u308c\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u7279\u5b9a\u3059\u308b\u524d\u306b\u3001\u95a2\u6570\u306e\u958b\u59cb\u4f4d\u7f6e\u3092\u8abf\u3079\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002Go\u8a00\u8a9e\u306e\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea<a target=\"_blank\" href=\"https:\/\/pkg.go.dev\/debug\/elf\"><code>debug\/elf<\/code><\/a>\u3092\u4f7f\u3063\u3066\u30d0\u30a4\u30ca\u30ea\u3092\u89e3\u6790\u3057\u307e\u3059\u3002<\/p>\n<p>\u624b\u9806\u3068\u3057\u3066\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<ol>\n<li>ELF\u30d0\u30a4\u30ca\u30ea\u306e\u30b7\u30f3\u30dc\u30eb\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u95a2\u6570\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u30b5\u30a4\u30ba\u3092\u53d6\u5f97\u3059\u308b<\/li>\n<li>\u30d7\u30ed\u30b0\u30e9\u30e0\u30d8\u30c3\u30c0\u304b\u3089\u95a2\u6570\u304c\u5c5e\u3059\u308b\u30bb\u30b0\u30e1\u30f3\u30c8\u3092\u63a2\u3057\u51fa\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u30aa\u30d5\u30bb\u30c3\u30c8\u3092\u7279\u5b9a\u3059\u308b\uff08\u8a73\u3057\u304f\u306f\u6b21\u306e\u56f3\u3092\u53c2\u7167\uff09<\/li>\n<\/ol>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251112\/20251112092702.png\" width=\"1159\" height=\"861\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u307e\u305a\u3001ELF\u30d0\u30a4\u30ca\u30ea\u306e\u30b7\u30f3\u30dc\u30eb\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u8a08\u88c5\u3057\u305f\u3044\u95a2\u6570\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u30b5\u30a4\u30ba\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">symbol := <span class=\"synConstant\">\"main.hello\"<\/span>\n<span class=\"synStatement\">var<\/span> va <span class=\"synType\">int<\/span>\n<span class=\"synStatement\">var<\/span> size <span class=\"synType\">int<\/span>\n\n<span class=\"synStatement\">for<\/span> _, sym := <span class=\"synStatement\">range<\/span> symbols {\n  <span class=\"synStatement\">if<\/span> elf.ST_TYPE(sym.Info) != elf.STT_FUNC { \n    <span class=\"synStatement\">continue<\/span>\n  }\n  <span class=\"synStatement\">if<\/span> (sym.Name == symbol) { \n    va = sym.Value\n    size = sym.Size\n    <span class=\"synStatement\">break<\/span>\n  }\n}\n<\/pre>\n<p>\u6b21\u306b\u5148\u307b\u3069\u8abf\u3079\u305f\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3092\u3082\u3068\u306b\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u30d8\u30c3\u30c0\u304b\u3089\u95a2\u6570\u304c\u5c5e\u3059\u308b\u30bb\u30b0\u30e1\u30f3\u30c8\u3092\u63a2\u3057\u51fa\u3057\u307e\u3059\u3002\u898b\u3064\u304b\u3063\u305f\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\u306b\u30b7\u30f3\u30dc\u30eb\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\uff08\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306e\u5dee\u304b\u3089\u8a08\u7b97\uff09\u3092\u52a0\u3048\u308b\u3053\u3068\u3067\u3001\u30d5\u30a1\u30a4\u30eb\u30aa\u30d5\u30bb\u30c3\u30c8\u3092\u7279\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\"><span class=\"synStatement\">var<\/span> offset <span class=\"synType\">int<\/span>\n<span class=\"synStatement\">for<\/span> _, ph := <span class=\"synStatement\">range<\/span> elfFile.Progs {\n    <span class=\"synStatement\">if<\/span> ph.Type != elf.PT_LOAD || (ph.Flags&amp;elf.PF_X) == <span class=\"synConstant\">0<\/span> { \n      <span class=\"synStatement\">continue<\/span>\n    }\n    <span class=\"synStatement\">if<\/span> (ph.Vaddr &lt;= <span class=\"synType\">uint64<\/span>(va) &amp;&amp; <span class=\"synType\">uint64<\/span>(va) &lt; ph.Vaddr + ph.Memsz) { \n      offset = <span class=\"synType\">int<\/span>(ph.Off + (<span class=\"synType\">uint64<\/span>(va) - ph.Vaddr)) \n      <span class=\"synStatement\">break<\/span>\n    }\n  }\n<\/pre>\n<p>\u3053\u3053\u307e\u3067\u3067\u95a2\u6570\u306e\u958b\u59cb\u4f4d\u7f6e\u3092\u7279\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u6b21\u306b\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u7279\u5b9a\u3057\u307e\u3059\u3002\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u306f\u3001\u95a2\u6570\u306e\u30d0\u30a4\u30ca\u30ea\u3092\u30c7\u30a3\u30b9\u30a2\u30bb\u30f3\u30d6\u30eb\u3057\u3001<code>RET<\/code>\u547d\u4ee4\u306e\u4f4d\u7f6e\u3092\u63a2\u3059\u3053\u3068\u3067\u7279\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u3001\u95a2\u6570\u306b\u5bfe\u5fdc\u3059\u308b\u30d0\u30a4\u30ca\u30ea\u3092\u63a2\u3057\u51fa\u3057\u307e\u3059\u3002\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30d0\u30a4\u30ca\u30ea\u306fELF\u30d5\u30a1\u30a4\u30eb\u306e<code>.text<\/code>\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u306e\u3067\u3001<code>.text<\/code>\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u95a2\u6570\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u30b5\u30a4\u30ba\u304b\u3089\u3001\u95a2\u6570\u306b\u5bfe\u5fdc\u3059\u308b\u30d0\u30a4\u30ca\u30ea\u3092\u62bd\u51fa\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">buf := <span class=\"synStatement\">make<\/span>([]<span class=\"synType\">byte<\/span>, size)\nreadbytes, err := e.TextSection.ReadAt(buf, <span class=\"synType\">int64<\/span>(va-e.TextSection.Addr))\nreadBuf := buf[:readbytes]\n<\/pre>\n<p>\u62bd\u51fa\u3057\u305f\u30d0\u30a4\u30ca\u30ea\u3092\u30c7\u30a3\u30b9\u30a2\u30bb\u30f3\u30d6\u30eb\u3057\u3001<code>RET<\/code>\u547d\u4ee4\u306e\u4f4d\u7f6e\u3092\u5217\u6319\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">retOffsets := <span class=\"synStatement\">make<\/span>([]<span class=\"synType\">uint64<\/span>, <span class=\"synConstant\">0<\/span>)\n<span class=\"synStatement\">const<\/span> arm64RetInstructionSize = <span class=\"synConstant\">4<\/span>\n<span class=\"synStatement\">for<\/span> i := <span class=\"synConstant\">0<\/span>; i &lt; <span class=\"synStatement\">len<\/span>(readBuf); i += arm64RetInstructionSize {\n  instruction, err := arm64asm.Decode(readBuf[i:])\n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    <span class=\"synStatement\">continue<\/span>\n  }\n  <span class=\"synStatement\">if<\/span> instruction.Op == arm64asm.RET {\n    retOffsets = <span class=\"synStatement\">append<\/span>(retOffsets, offset+<span class=\"synType\">uint64<\/span>(i))\n  }\n}\n<\/pre>\n<p>\u3053\u308c\u3067\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u3059\u3079\u3066\u7279\u5b9a\u3067\u304d\u307e\u3057\u305f\u3002\u3053\u308c\u3089\u306e\u5024\u3092\u3082\u3068\u306b<code>uprobe<\/code>\u3092\u4f7f\u3063\u3066\u95a2\u6570\u306e\u958b\u59cb\u30fb\u7d42\u4e86\u306b\u30a2\u30bf\u30c3\u30c1\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">up, err := ex.Uprobe(<span class=\"synConstant\">\"\"<\/span>, start, &amp;link.UprobeOptions{Address: startAddr}) \n<span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n  <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">nil<\/span>, err\n}\n\n<span class=\"synStatement\">for<\/span> _, retOffset := <span class=\"synStatement\">range<\/span> endAddrs {\n  uretp, err := ex.Uprobe(<span class=\"synConstant\">\"\"<\/span>, end, &amp;link.UprobeOptions{Address: retOffset}) \n  <span class=\"synStatement\">if<\/span> err != <span class=\"synStatement\">nil<\/span> {\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">nil<\/span>, err\n  }\n}\n<\/pre>\n<p>\u3053\u308c\u3067\u3001uretprobe\u3092\u4f7f\u308f\u305a\u306b\u95a2\u6570\u306e\u7d42\u4e86\u306beBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<h2 id=\"Goroutine\u3092\u8ffd\u3046\">Goroutine\u3092\u8ffd\u3046<\/h2>\n<p>Go\u8a00\u8a9e\u306e\u975e\u540c\u671f\u51e6\u7406\u3067\u306f\u3001<a target=\"_blank\" href=\"https:\/\/go.dev\/tour\/concurrency\/1\"><strong>Goroutine<\/strong><\/a>\u3068\u3044\u3046\u8a00\u8a9e\u72ec\u81ea\u306e\u4ed5\u7d44\u307f\u304c\u4f7f\u308f\u308c\u307e\u3059\u3002Goroutine\u3067\u306f\u975e\u540c\u671f\u3067\u5b9f\u884c\u3057\u305f\u3044\u51e6\u7406\u304c\u8a00\u8a9e\u306e\u30e9\u30f3\u30bf\u30a4\u30e0\u306b\u3088\u308aOS\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u3055\u308c\u307e\u3059<a target=\"_blank\" href=\"#f-b21720ed\" id=\"fn-b21720ed\" name=\"fn-b21720ed\" title=\"M:N\u30b9\u30ec\u30c3\u30c9\u30e2\u30c7\u30eb\">*3<\/a>\u3002\u305d\u306e\u305f\u3081\u3001\u30b9\u30ec\u30c3\u30c9ID\u3092\u4f7f\u3063\u3066eBPF\u304b\u3089\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u305fGoroutine\u3092\u7279\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u305fGoroutine\u304c\u308f\u304b\u3089\u306a\u3044\u3068\u3001\u95a2\u6570\u306e\u5b9f\u884c\u958b\u59cb\u3068\u5b9f\u884c\u7d42\u4e86\u3092\u7d10\u3065\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u6b63\u3057\u3044\u30c8\u30ec\u30fc\u30b9\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251112\/20251112092725.png\" width=\"1448\" height=\"595\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u5b9f\u969b\u306b<a target=\"_blank\" href=\"https:\/\/go.dev\/play\/p\/nnwWtkexcU4\">\u95a2\u6570\u306e\u958b\u59cb\u6642\u3068\u7d42\u4e86\u6642\u306b\u30b9\u30ec\u30c3\u30c9ID\u3092\u51fa\u529b\u3059\u308b\u30b3\u30fc\u30c9<\/a>\u3092\u7528\u610f\u3057\u307e\u3057\u305f\u3002\u5b9f\u884c\u3057\u3066\u307f\u308b\u3068TID1\u3068TID2\u306b\u8868\u793a\u3055\u308c\u308b\u958b\u59cb\u6642\u30fb\u7d42\u4e86\u6642\u306e\u30b9\u30ec\u30c3\u30c9\u306eID\u304c\u3001\u540c\u3058\u95a2\u6570\u3067\u3082\u7570\u306a\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">2009\/11\/10 23:00:00 Goroutine 0 - PID: 10, TID1: 12, TID2: 12\n2009\/11\/10 23:00:00 Goroutine 1 - PID: 10, TID1: 14, TID2: 10\n2009\/11\/10 23:00:00 Goroutine 2 - PID: 10, TID1: 10, TID2: 14<\/pre>\n<p>\u305d\u3053\u3067\u3001OpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u3067\u306f<strong>\u30ec\u30b8\u30b9\u30bf<\/strong>\u3092\u4f7f\u3063\u3066\u3001\u547c\u3073\u51fa\u3057\u305fGoroutine\u3092\u7279\u5b9a\u3057\u307e\u3059\u3002<a target=\"_blank\" href=\"https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/runtime2.go#L473\">Goroutine\u69cb\u9020\u4f53\uff08<code>g<\/code>\uff09<\/a>\u306e\u30a2\u30c9\u30ec\u30b9\u306f<a target=\"_blank\" href=\"https:\/\/go.googlesource.com\/go\/+\/refs\/heads\/master\/src\/cmd\/compile\/abi-internal.md#arm64-architecture\">Go\u8a00\u8a9e\u306eABI<\/a>\u306b\u57fa\u3065\u304d\u3001Arm64\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u5834\u5408\u306fR28\u30ec\u30b8\u30b9\u30bf\u306b\u7f6e\u304b\u308c\u307e\u3059 <a target=\"_blank\" href=\"#f-eda9864d\" id=\"fn-eda9864d\" name=\"fn-eda9864d\" title=\"GDB\u3092\u4f7f\u3046\u3068\u7c21\u5358\u306b\u4efb\u610f\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u30ec\u30b8\u30b9\u30bf\u306e\u4e2d\u8eab\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002\">*4<\/a>\u3002<\/p>\n<p>R28\u30ec\u30b8\u30b9\u30bf\u306fArm64\u7279\u6709\u306e\u30ec\u30b8\u30b9\u30bf\u306a\u306e\u3067\u3001<code>ctx<\/code>\u3092<code>__PT_REGS_CAST<\/code>\u3092\u7528\u3044\u3066\u5909\u63db\u3057\u53d6\u5f97\u3057\u307e\u3059\u3002\u6b21\u306e\u3088\u3046\u306a\u30de\u30af\u30ed <a target=\"_blank\" href=\"#f-c00b1fda\" id=\"fn-c00b1fda\" name=\"fn-c00b1fda\" title=\"eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u5185\u90e8\u3067\u95a2\u6570\u3092\u5b9a\u7fa9\u3067\u304d\u306a\u3044\u306e\u3067\u3001\u518d\u5229\u7528\u3059\u308b\u51e6\u7406\u306f\u30de\u30af\u30ed\u3067\u5b9a\u7fa9\u3057\u307e\u3059\u3002\">*5<\/a>\u3067\u3001<strong>GoroutineID<\/strong>\u3092eBPF\u304b\u3089\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\"><span class=\"synPreProc\">#define <\/span><span class=\"synIdentifier\">goroutine_id<\/span><span class=\"synPreProc\">(ctx) (<\/span><span class=\"synIdentifier\">__PT_REGS_CAST<\/span><span class=\"synPreProc\">(ctx)-&gt;regs[<\/span><span class=\"synConstant\">28<\/span><span class=\"synPreProc\">])<\/span>\n<\/pre>\n<p>BPF Map\u306e\u30cf\u30c3\u30b7\u30e5\u30de\u30c3\u30d7\u3092\u7528\u3044\u3066\u3001GoroutineID\u3092\u30ad\u30fc\u3068\u3057\u3066\u30a4\u30d9\u30f3\u30c8\u3092\u4fdd\u5b58\u3059\u308b\u3053\u3068\u3067\u3001\u95a2\u6570\u306e\u547c\u3073\u51fa\u3057\u3068\u7d42\u4e86\u3092\u7d10\u3065\u3051\u3089\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u76e3\u8996\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u7d42\u4e86\u6e08\u307f\u306e\u95a2\u6570\u3060\u3051\u3092\u53c2\u7167\u3067\u304d\u308b\u3088\u3046\u3001\u95a2\u6570\u304c\u7d42\u4e86\u3057\u305f\u3089\u914d\u5217\u306bevent\u3092\u8ffd\u52a0\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\"><span class=\"synPreProc\">#define <\/span><span class=\"synIdentifier\">goroutine_id<\/span><span class=\"synPreProc\">(ctx) (<\/span><span class=\"synIdentifier\">__PT_REGS_CAST<\/span><span class=\"synPreProc\">(ctx)-&gt;regs[<\/span><span class=\"synConstant\">28<\/span><span class=\"synPreProc\">]) <\/span>\n\n<span class=\"synType\">struct<\/span> event {\n  __u64 start_time;\n  __u64 end_time;\n};\n\n<span class=\"synType\">struct<\/span> {\n  <span class=\"synIdentifier\">__uint<\/span>(type, BPF_MAP_TYPE_HASH); \n  <span class=\"synIdentifier\">__type<\/span>(key, __u64);\n  <span class=\"synIdentifier\">__type<\/span>(value, <span class=\"synType\">struct<\/span> event);\n  <span class=\"synIdentifier\">__uint<\/span>(max_entries, <span class=\"synConstant\">1024<\/span>);\n} traces <span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\".maps\"<\/span>);\n\n<span class=\"synType\">struct<\/span> {\n  <span class=\"synIdentifier\">__uint<\/span>(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); \n} events <span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\".maps\"<\/span>);\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/start_trace\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_start_trace<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  <span class=\"synType\">struct<\/span> event event = {<span class=\"synConstant\">0<\/span>};\n  __u64 key = <span class=\"synIdentifier\">goroutine_id<\/span>(ctx); \n\n  event.start_time = <span class=\"synIdentifier\">bpf_ktime_get_ns<\/span>();\n\n  <span class=\"synStatement\">if<\/span> (<span class=\"synIdentifier\">bpf_map_update_elem<\/span>(&amp;traces, &amp;key, &amp;event, BPF_ANY) &lt; <span class=\"synConstant\">0<\/span>) { \n    <span class=\"synIdentifier\">bpf_printk<\/span>(<span class=\"synConstant\">\"bpf_map_update_elem failed<\/span><span class=\"synSpecial\">\\n<\/span><span class=\"synConstant\">\"<\/span>);\n  }\n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/end_trace\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_end_trace<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  <span class=\"synType\">struct<\/span> event *event;\n\n  __u64 key = <span class=\"synIdentifier\">goroutine_id<\/span>(ctx);\n  event = <span class=\"synIdentifier\">bpf_map_lookup_elem<\/span>(&amp;traces, &amp;key); \n  <span class=\"synStatement\">if<\/span> (event == <span class=\"synConstant\">NULL<\/span>) {\n    <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n  }\n\n  event-&gt;end_time = <span class=\"synIdentifier\">bpf_ktime_get_ns<\/span>(); \n  <span class=\"synIdentifier\">bpf_perf_event_output<\/span>(ctx, &amp;events, BPF_F_CURRENT_CPU, event, <span class=\"synStatement\">sizeof<\/span>(*event));\n\n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n<\/pre>\n<p>\u3053\u308c\u3067\u3001Goroutine\u5185\u306e\u5b9f\u884c\u3067\u3082\u95a2\u6570\u306e\u958b\u59cb\u3068\u7d42\u4e86\u3092\u6b63\u3057\u304f\u89b3\u6e2c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<h2 id=\"Mackerel\u3078\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3059\u308b\">Mackerel\u3078\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3059\u308b<\/h2>\n<p>OpenTelemetry\u3067\u306f\u30c8\u30ec\u30fc\u30b9\u306e\u958b\u59cb\u6642\u523b\u3068\u7d42\u4e86\u6642\u523b\u306f<strong>UNIX\u6642\u9593<\/strong>\u3067\u5b9a\u7fa9\u3055\u308c\u307e\u3059<a target=\"_blank\" href=\"#f-51aa8a52\" id=\"fn-51aa8a52\" name=\"fn-51aa8a52\" title=\"https:\/\/opentelemetry.io\/docs\/specs\/otel\/trace\/api\/#timestamp\">*6<\/a> \u3002\u3053\u308c\u306b\u5bfe\u3057\u3001eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u6642\u523b\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306b\u547c\u3093\u3067\u3044\u308b<code>bpf_ktime_get_ns()<\/code>\u306f\u30b7\u30b9\u30c6\u30e0\u306e\u8d77\u52d5\u304b\u3089\u306e\u7d4c\u904e\u6642\u9593<code>CLOCK_MONOTONIC<\/code>\u3092\u8fd4\u3059\u305f\u3081<a target=\"_blank\" href=\"#f-f9e47b93\" id=\"fn-f9e47b93\" name=\"fn-f9e47b93\" title=\"https:\/\/docs.ebpf.io\/linux\/helper-function\/bpf_ktime_get_ns\/\">*7<\/a>\u3001\u305d\u306e\u307e\u307e\u4f7f\u3046\u3053\u3068\u306f\u3067\u304d\u305a\u3001UNIX\u6642\u9593\u306b\u5909\u63db\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u672c\u7bc0\u3067\u306f\u8a08\u88c5\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067UNIX\u6642\u9593\u306b\u5909\u63db\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<p>Go\u8a00\u8a9e\u3067\u306feBPF\u3067\u53d6\u5f97\u3057\u3066\u3044\u308b\u5024\u3092<code>unix.ClockGettime(unix.CLOCK_MONOTONIC, &amp;now)<\/code>\u3067\u53d6\u5f97\u3067\u304d\u308b\u306e\u3067\u3001<a target=\"_blank\" href=\"https:\/\/go.dev\/play\/p\/V04VcjyRn99\">\u3053\u308c\u3092\u4f7f\u3063\u3066\u5909\u63db\u3057\u307e\u3059<\/a>\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\"><span class=\"synStatement\">func<\/span> GetRealTimestamp(timeNanosec <span class=\"synType\">int64<\/span>) (time.Time, <span class=\"synType\">error<\/span>) {\n  <span class=\"synStatement\">var<\/span> now unix.Timespec\n  <span class=\"synStatement\">if<\/span> err := unix.ClockGettime(unix.CLOCK_MONOTONIC, &amp;now); err != <span class=\"synStatement\">nil<\/span> {\n    <span class=\"synStatement\">return<\/span> time.Time{}, err\n  }\n  offset := time.Nanosecond * time.Duration(now.Nano()-timeNanosec)\n  <span class=\"synStatement\">return<\/span> time.Now().Add(-<span class=\"synConstant\">1<\/span> * offset), <span class=\"synStatement\">nil<\/span>\n}\n<\/pre>\n<p>\u3053\u3053\u307e\u3067\u3067Mackerel\u306b\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3059\u308b\u6e96\u5099\u304c\u6574\u3044\u307e\u3057\u305f\u3002\u5b9f\u969b\u306b\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3057\u3066\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002Go\u8a00\u8a9e\u3067OpenTelemetry\u3092\u4f7f\u3063\u3066\u3001Mackerel\u306b\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3059\u308b\u65b9\u6cd5\u306f<a target=\"_blank\" href=\"https:\/\/mackerel.io\/ja\/docs\/entry\/tracing\/installations\/go\">\u30d8\u30eb\u30d7\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u3067\u89e3\u8aac\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u89e3\u8aac\u306b\u5f93\u3063\u3066TraceProvider\u3092\u4f5c\u6210\u3057\u305f\u3089\u3001\u6b21\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3067\u30c8\u30ec\u30fc\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u30c8\u30ec\u30fc\u30b9\u306e\u958b\u59cb\u6642\u523b\u3068\u7d42\u4e86\u6642\u523b\u306f\u3001\u5148\u307b\u3069\u5909\u63db\u3057\u305fUNIX\u6642\u9593\u3067\u5f15\u6570\u306b\u6e21\u3057\u3066\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">_, span := tracer.Start(context.TODO(), <span class=\"synConstant\">\"function call\"<\/span>,\n  trace.WithTimestamp(starttime),\n)\nspan.End(trace.WithTimestamp(endTime))\n<\/pre>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251112\/20251112092751.png\" width=\"1652\" height=\"2000\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u5b9f\u969b\u306b\u30c8\u30ec\u30fc\u30b9\u304cMackerel\u306b\u6295\u7a3f\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<h2 id=\"\u5f15\u6570\u306e\u5024\u3092\u53d6\u5f97\u3059\u308b\">\u5f15\u6570\u306e\u5024\u3092\u53d6\u5f97\u3059\u308b<\/h2>\n<p>\u524d\u7bc0\u307e\u3067\u3067\u95a2\u6570\u306e\u5b9f\u884c\u6642\u9593\u3092Mackerel\u306b\u6295\u7a3f\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u672c\u7bc0\u3067\u306f\u3001Mackerel\u306eAPM\u3092\u6d3b\u7528\u3059\u308b\u305f\u3081\u306b\u3001eBPF\u3067\u547c\u3073\u51fa\u3055\u308c\u305f\u95a2\u6570\u306e\u5f15\u6570\u306e\u5024\u3092\u30ec\u30b8\u30b9\u30bf\u3084\u30e1\u30e2\u30ea\u304b\u3089\u53d6\u5f97\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u306b\u542b\u3081\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306fHTTP\u30b5\u30fc\u30d0\u30fc\u306e\u5206\u6790\u6a5f\u80fd\u3092\u6d3b\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u3087\u3046\u3002<a target=\"_blank\" href=\"https:\/\/mackerel.io\/ja\/docs\/entry\/tracing\/features\/http-performance\">\u30d8\u30eb\u30d7\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u306b\u8a18\u8f09\u304c\u3042\u308a\u307e\u3059\u304c\u3001Mackerel\u306eAPM\u3067HTTP\u30b5\u30fc\u30d0\u30fc\u3092\u5206\u6790\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u6b21\u306e\u5c5e\u6027\u3092\u6301\u3063\u305f\u30c8\u30ec\u30fc\u30b9\u3092\u9001\u4fe1\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li><code>http.route<\/code>: \u30eb\u30fc\u30c8\u30d1\u30b9<\/li>\n<li><code>http.method<\/code>: HTTP\u30e1\u30bd\u30c3\u30c9<\/li>\n<li><code>http.status_code<\/code>: HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9<\/li>\n<\/ul>\n<p>HTTP\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u8a08\u88c5\u306b\u306f\u3001OpenTelemetry\u306e\u516c\u5f0f\u5b9f\u88c5\u306b\u306a\u3089\u3063\u3066\u3001<code>net\/http<\/code>\u30d1\u30c3\u30b1\u30fc\u30b8\u306e<code>net\/http.serverHandler.ServeHTTP<\/code>\u95a2\u6570\u306e\u5f15\u6570\u3084\u5b9f\u884c\u6642\u9593\u3092\u30c8\u30ec\u30fc\u30b9\u3068\u3057\u3066\u9001\u4fe1\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059 <a target=\"_blank\" href=\"#f-ebad44c1\" id=\"fn-ebad44c1\" name=\"fn-ebad44c1\" title=\"\u3053\u306e\u95a2\u6570\u306e\u8a73\u7d30\u306f\u6b21\u306e\u8a18\u4e8b\u304c\u5927\u5909\u8a73\u3057\u3044\u3067\u3059\uff1ahttp\u30b5\u30fc\u30d0\u30fc\u8d77\u52d5\u306e\u88cf\u5074\uff5cDeep Dive into The Go's Web Server \">*8<\/a> \u3002<\/p>\n<p>\u3053\u3053\u304b\u3089\u306f\u3001\u6b21\u306e\u624b\u9806\u3067\u5fc5\u8981\u306a\u5c5e\u6027\u3092eBPF\u3067\u53d6\u5f97\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u306b\u542b\u3081\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<ol>\n<li><code>ServeHTTP<\/code>\u95a2\u6570\u306e\u5f15\u6570\u3092\u30ec\u30b8\u30b9\u30bf\u304b\u3089\u53d6\u5f97\u3059\u308b<\/li>\n<li><code>Request<\/code>\u69cb\u9020\u4f53\u306e\u4e2d\u8eab\u304b\u3089\u30eb\u30fc\u30c8\u30d1\u30b9\u3068HTTP\u30e1\u30bd\u30c3\u30c9\u3092\u53d6\u5f97\u3059\u308b<\/li>\n<li>Go\u8a00\u8a9e\u306e<code>string<\/code>\u578b\u306e\u5024\u3092eBPF\u304b\u3089\u53d6\u5f97\u3059\u308b<\/li>\n<li>\u95a2\u6570\u306e\u5f15\u6570\u304b\u3089\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b<code>ResponseWriter<\/code>\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u4fdd\u5b58\u3059\u308b<\/li>\n<li>\u95a2\u6570\u306e\u7d42\u4e86\u6642\u306b<code>ResponseWriter<\/code>\u304b\u3089\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u53d6\u5f97\u3059\u308b<\/li>\n<\/ol>\n<p><code>ServeHTTP<\/code>\u95a2\u6570\u306f\u6b21\u306e\u3088\u3046\u306a\u30b7\u30b0\u30cd\u30c1\u30e3\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\"><span class=\"synStatement\">func<\/span> (h *serverHandler) ServeHTTP(w ResponseWriter, r *Request)\n<\/pre>\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u30eb\u30fc\u30c8\u306a\u3069\u306f<code>ServeHttp<\/code>\u306e\u5f15\u6570<code>r *Request<\/code>\u304b\u3089\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002Go\u8a00\u8a9e\u3067\u306e\u5f15\u6570\u306f<a target=\"_blank\" href=\"https:\/\/go.googlesource.com\/go\/+\/refs\/heads\/dev.regabi\/src\/cmd\/compile\/internal-abi.md\">\u8a00\u8a9e\u306eABI<\/a>\u306b\u5f93\u3063\u3066\u30ec\u30b8\u30b9\u30bf\u306b\u914d\u7f6e\u3055\u308c\u307e\u3059\u3002Arm64\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u5834\u5408\u306fR0\u304b\u3089\u9806\u306b\u5f15\u6570\u304c\u914d\u7f6e\u3055\u308c\u307e\u3059\u3002\u307e\u305f\u3001\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u578b\u306f2\u3064\u306e\u30ec\u30b8\u30b9\u30bf\u306b\u5206\u3051\u3066\u914d\u7f6e\u3055\u308c\u308b\u305f\u3081\u3001<code>w ResponseWriter<\/code>\u5f15\u6570\u3082R2\u3068R2\u30ec\u30b8\u30b9\u30bf\u306b\u5206\u3051\u3066\u914d\u7f6e\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251112\/20251112092831.png\" width=\"1141\" height=\"259\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u69cb\u9020\u4f53\u306e\u4e2d\u8eab\u3092\u53d6\u5f97\u3059\u308b\u306b\u306f\u3001\u30ec\u30b8\u30b9\u30bf\u306b\u7f6e\u304b\u308c\u305f\u30dd\u30a4\u30f3\u30bf\u3068\u3001\u77e5\u308a\u305f\u3044\u30d5\u30a3\u30fc\u30eb\u30c9\u307e\u3067\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\u3092\u8db3\u3057\u5408\u308f\u305b\u3066\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u69cb\u9020\u4f53\u306e\u5404\u30d5\u30a3\u30fc\u30eb\u30c9\u3078\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u306e<a target=\"_blank\" href=\"https:\/\/pkg.go.dev\/reflect\">reflect\u30d1\u30c3\u30b1\u30fc\u30b8<\/a>\u3067<a target=\"_blank\" href=\"https:\/\/go.dev\/play\/p\/MBLZlr7mRqg\">\u8abf\u3079\u3089\u308c\u307e\u3059<\/a>\u3002\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u8a00\u8a9e\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u3088\u308a\u5909\u5316\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308b\u306e\u3067\u3001OpenTelemetry\u306e\u516c\u5f0f\u5b9f\u88c5\u3067\u306f\u69cb\u9020\u4f53\u306e\u5404\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30aa\u30d5\u30bb\u30c3\u30c8\u3092<a target=\"_blank\" href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-go-instrumentation\/blob\/0412caddef5c081baeb6864b923b7a02f27aae55\/internal\/pkg\/inject\/offset_results.json\">JSON\u30d5\u30a1\u30a4\u30eb<\/a>\u306b\u4fdd\u5b58\u3057\u3001\u30d3\u30eb\u30c9\u6642\u306b\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002\u4eca\u56de\u306f\u3001\u5fc5\u8981\u306a\u30aa\u30d5\u30bb\u30c3\u30c8\u3092\u6b21\u306e\u3088\u3046\u306b\u624b\u52d5\u3067\u8abf\u3079\u3066\u30b3\u30fc\u30c9\u306b\u57cb\u3081\u8fbc\u3080\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">The layout of net\/http.Request (exported fields only):\nMethod               offset: 0x0, type: string                          size: 16\nURL                  offset: 0x10, type: *url.URL                       size: 8\nProto                offset: 0x18, type: string                         size: 16\nProtoMajor           offset: 0x28, type: int                            size: 8\nProtoMinor           offset: 0x30, type: int                            size: 8\nHeader               offset: 0x38, type: http.Header                    size: 8\nBody                 offset: 0x40, type: io.ReadCloser                  size: 16\nGetBody              offset: 0x50, type: func() (io.ReadCloser, error)  size: 8\nContentLength        offset: 0x58, type: int64                          size: 8\nTransferEncoding     offset: 0x60, type: []string                       size: 24\nClose                offset: 0x78, type: bool                           size: 1\nHost                 offset: 0x80, type: string                         size: 16\nForm                 offset: 0x90, type: url.Values                     size: 8\nPostForm             offset: 0x98, type: url.Values                     size: 8\nMultipartForm        offset: 0xa0, type: *multipart.Form                size: 8\nTrailer              offset: 0xa8, type: http.Header                    size: 8\nRemoteAddr           offset: 0xb0, type: string                         size: 16\nRequestURI           offset: 0xc0, type: string                         size: 16\nTLS                  offset: 0xd0, type: *tls.ConnectionState           size: 8\nCancel               offset: 0xd8, type: &lt;-chan struct {}               size: 8\nResponse             offset: 0xe0, type: *http.Response                 size: 8\nPattern              offset: 0xe8, type: string                         size: 16\nctx                  offset: 0xf8, type: context.Context                size: 16\npat                  offset: 0x108, type: *http.pattern                 size: 8\nmatches              offset: 0x110, type: []string                      size: 24\notherValues          offset: 0x128, type: map[string]string             size: 8<\/pre>\n<p>\u307e\u305f\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u30eb\u30fc\u30c8\u306e\u3088\u3046\u306bGo\u8a00\u8a9e\u306e<code>string<\/code>\u578b\u3067\u8868\u3055\u308c\u308b\u5024\u306f\u3001<strong>\u53d6\u308a\u6271\u3044\u306b\u6ce8\u610f\u304c\u5fc5\u8981<\/strong>\u3067\u3059\u3002Go\u8a00\u8a9e\u306e<code>string<\/code>\u578b\u306f\u6587\u5b57\u5217\u9577\u3068\u5148\u982d\u3078\u306e\u30dd\u30a4\u30f3\u30bf\u306e\u69cb\u9020\u4f53\u3068\u3057\u3066\u8868\u3055\u308c\u307e\u3059 <a target=\"_blank\" href=\"#f-43e7990a\" id=\"fn-43e7990a\" name=\"fn-43e7990a\" title=\"https:\/\/github.com\/golang\/go\/blob\/8111104a2120e14ef068b9cfbda91965473ab345\/src\/runtime\/string.go#L290-L293\">*9<\/a> \u3002\u305d\u306e\u305f\u3081\u3001<code>string<\/code>\u306e\u4e2d\u8eab\u3092eBPF\u304b\u3089\u53d6\u5f97\u3059\u308b\u306b\u306f\u30012\u6bb5\u968e\u306e\u30dd\u30a4\u30f3\u30bf\u53c2\u7167\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u3053\u308c\u3092\u5b9f\u73fe\u3059\u308b\u30de\u30af\u30ed\u3092<code>COPY_GO_STR<\/code>\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\">\n<span class=\"synType\">typedef<\/span> <span class=\"synType\">struct<\/span> go_str {\n  <span class=\"synType\">char<\/span> *str;\n  <span class=\"synType\">unsigned<\/span> <span class=\"synType\">int<\/span> len;\n} go_str_t;\n\n\n<span class=\"synPreProc\">#define <\/span><span class=\"synIdentifier\">COPY_GO_STR<\/span><span class=\"synPreProc\">(dst, go_str_var, src_ptr)                           \\<\/span>\n<span class=\"synPreProc\">  <\/span><span class=\"synStatement\">do<\/span><span class=\"synPreProc\"> {                                                                  \\<\/span>\n<span class=\"synPreProc\">    <\/span><span class=\"synType\">struct<\/span><span class=\"synPreProc\"> go_str go_str_var = {<\/span><span class=\"synConstant\">0<\/span><span class=\"synPreProc\">};                                     \\<\/span>\n<span class=\"synPreProc\">    <\/span><span class=\"synIdentifier\">bpf_probe_read<\/span><span class=\"synPreProc\">(&amp;go_str_var, <\/span><span class=\"synStatement\">sizeof<\/span><span class=\"synPreProc\">(go_str_var), src_ptr);           \\<\/span>\n<span class=\"synPreProc\">    (dst)[<\/span><span class=\"synConstant\">0<\/span><span class=\"synPreProc\">] = <\/span><span class=\"synSpecial\">'\\0'<\/span><span class=\"synPreProc\">;                                                    \\<\/span>\n<span class=\"synPreProc\">    <\/span><span class=\"synType\">int<\/span><span class=\"synPreProc\"> _len = (go_str_var.len &gt; <\/span><span class=\"synStatement\">sizeof<\/span><span class=\"synPreProc\">(dst) - <\/span><span class=\"synConstant\">1<\/span><span class=\"synPreProc\">)                       \\ <\/span>\n      ? (<span class=\"synStatement\">sizeof<\/span>(dst) - <span class=\"synConstant\">1<\/span>)                                               \\\n      : go_str_var.len;                                                 \\\n    <span class=\"synIdentifier\">bpf_probe_read_user<\/span>(&amp;(dst), _len, go_str_var.str);                  \\ \n  } <span class=\"synStatement\">while<\/span> (<span class=\"synConstant\">0<\/span>)\n<\/pre>\n<p>\u3053\u3053\u307e\u3067\u306e\u8aac\u660e\u3092\u8e0f\u307e\u3048\u308b\u3068\u3001<code>http.method<\/code>\u3068<code>http.route<\/code>\u3092eBPF\u3067\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\">\n<span class=\"synType\">const<\/span> <span class=\"synType\">int<\/span> net_http_Request_URL_offset = <span class=\"synConstant\">0x10<\/span>;\n\n<span class=\"synType\">const<\/span> <span class=\"synType\">int<\/span> net_url_URL_Path_offset = <span class=\"synConstant\">0x38<\/span>;\n\n<span class=\"synType\">const<\/span> <span class=\"synType\">int<\/span> net_http_Request_Method_offset = <span class=\"synConstant\">0x0<\/span>;\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/start_trace\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_start_trace<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  <span class=\"synType\">struct<\/span> event event = {<span class=\"synConstant\">0<\/span>};\n  \n  <span class=\"synType\">void<\/span> *req = (<span class=\"synType\">void<\/span> *)<span class=\"synIdentifier\">PT_REGS_PARM4<\/span>(ctx); \n\n  \n  <span class=\"synType\">void<\/span> *url = <span class=\"synConstant\">NULL<\/span>;\n  <span class=\"synIdentifier\">bpf_probe_read<\/span>(&amp;url, <span class=\"synStatement\">sizeof<\/span>(url), req + net_http_Request_URL_offset);\n  <span class=\"synIdentifier\">COPY_GO_STR<\/span>(event.path, path, url + net_url_URL_Path_offset); \n\n  <span class=\"synIdentifier\">COPY_GO_STR<\/span>(event.method, method, req + net_http_Request_Method_offset); \n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n<\/pre>\n<p>\u6700\u5f8c\u306b\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<code>ServeHttp<\/code>\u306e\u7b2c\u4e00\u5f15\u6570\u3001<code>ResponseWriter<\/code>\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u95a2\u6570\u306e\u958b\u59cb\u6642\u306b\u4fdd\u5b58\u3057\u3001\u95a2\u6570\u306e\u7d42\u4e86\u6642\u306b\u4fdd\u5b58\u3057\u3066\u3044\u305f<code>ResponseWriter<\/code>\u306e<code>StatusCode<\/code>\u304b\u3089\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n<p><code>ResponseWriter<\/code>\u306f\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u578b\u3067\u3059\u304c\u3001\u5b9f\u4f53\u306f<code>http.response<\/code>\u578b\u3067\u3059<a target=\"_blank\" href=\"#f-5af135af\" id=\"fn-5af135af\" name=\"fn-5af135af\" title=\"https:\/\/zenn.dev\/hsaki\/books\/golang-httpserver-internal\/viewer\/httphandler#http.responsewriter%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AE%E5%AE%9F%E4%BD%93%E5%9E%8B\">*10<\/a>\u3002\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306f\u3053\u306e<code>http.response<\/code>\u578b\u304b\u3089\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u95a2\u6570\u7d42\u4e86\u6642\u306b\u306f\u958b\u59cb\u6642\u304b\u3089\u30ec\u30b8\u30b9\u30bf\u306e\u4e2d\u8eab\u304c\u5909\u5316\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u95a2\u6570\u958b\u59cb\u6642\u306b<code>ResponseWriter<\/code>\u3078\u306e\u30dd\u30a4\u30f3\u30bf\u3092BPF Map\u306b\u4fdd\u5b58\u3057\u3001\u95a2\u6570\u7d42\u4e86\u6642\u306bBPF Map\u304b\u3089\u53d6\u5f97\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-c\" data-lang=\"c\" data-unlink=\"\">\n<span class=\"synType\">const<\/span> <span class=\"synType\">int<\/span> net_http_Response_StatusCode_offset = <span class=\"synConstant\">120<\/span>;\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/start_trace\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_start_trace<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  \n   event.resp_ptr = (__u64)<span class=\"synIdentifier\">PT_REGS_PARM3<\/span>(ctx); \n   \n}\n\n<span class=\"synIdentifier\">SEC<\/span>(<span class=\"synConstant\">\"uprobe\/end_trace\"<\/span>)\n<span class=\"synType\">int<\/span> <span class=\"synIdentifier\">uprobe_end_trace<\/span>(<span class=\"synType\">struct<\/span> pt_regs *ctx) {\n  \n  <span class=\"synType\">void<\/span> *resp = (<span class=\"synType\">void<\/span> *)event-&gt;resp_ptr; \n  <span class=\"synIdentifier\">bpf_probe_read<\/span>(&amp;event-&gt;status_code, <span class=\"synStatement\">sizeof<\/span>(event-&gt;status_code), resp + net_http_Response_StatusCode_offset); \n  \n  <span class=\"synStatement\">return<\/span> <span class=\"synConstant\">0<\/span>;\n}\n<\/pre>\n<p>\u3053\u308c\u3067\u3001HTTP\u30b5\u30fc\u30d0\u30fc\u306e\u5206\u6790\u306b\u5fc5\u8981\u306a\u5c5e\u6027\u3092eBPF\u304b\u3089\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u3053\u308c\u3089\u306e\u60c5\u5831\u3092\u30c8\u30ec\u30fc\u30b9\u306e\u5c5e\u6027\u3068\u3057\u3066Mackerel\u306b\u9001\u4fe1\u3059\u308b\u3053\u3068\u3067\u3001APM\u3092\u4f7f\u3063\u3066HTTP\u30b5\u30fc\u30d0\u30fc\u3092\u5206\u6790\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-go\" data-lang=\"go\" data-unlink=\"\">_, span := tracer.Start(context.TODO(), fmt.Sprintf(<span class=\"synConstant\">\"%s: %s\"<\/span>, methodStr, pathStr),\n  trace.WithTimestamp(starttime),\n  trace.WithAttributes(\n    semconv.HTTPRoute(pathStr),\n    semconv.HTTPResponseStatusCode(<span class=\"synType\">int<\/span>(event.StatusCode)),\n    attribute.String(<span class=\"synType\">string<\/span>(semconv.HTTPRequestMethodKey), methodStr),\n  ),\n)\nspan.End(trace.WithTimestamp(endTime))\n<\/pre>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/m\/mackerelio\/20251112\/20251112092857.png\" width=\"1259\" height=\"231\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<h2 id=\"eBPF\u3092\u7528\u3044\u305fGo\u8a00\u8a9e\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u306e\u307e\u3068\u3081\">eBPF\u3092\u7528\u3044\u305fGo\u8a00\u8a9e\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u306e\u307e\u3068\u3081<\/h2>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001eBPF\u3092\u7528\u3044\u305fGo\u8a00\u8a9e\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3057\u305f\u3002\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u3001OpenTelemetry\u306e\u30c8\u30ec\u30fc\u30b9\u3092\u9001\u4fe1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>eBPF\u306b\u3088\u308b\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u306b\u306f\u3001\u6b21\u306e\u3088\u3046\u306a\u4ed5\u7d44\u307f\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u304a\u308f\u304b\u308a\u3044\u305f\u3060\u3051\u305f\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li><strong>eBPF\u30d7\u30ed\u30b0\u30e9\u30e0\u3092Go\u8a00\u8a9e\u304b\u3089\u64cd\u4f5c\u3059\u308b<\/strong><\/li>\n<li><strong>\u30d0\u30a4\u30ca\u30ea\u89e3\u6790\u3067\u95a2\u6570\u306e\u7d42\u4e86\u4f4d\u7f6e\u3092\u7279\u5b9a\u3059\u308b<\/strong><\/li>\n<li><strong>Goroutine\u306e\u8ffd\u8de1\u306e\u305f\u3081\u306b\u30ec\u30b8\u30b9\u30bf\u3092\u4f7f\u3046<\/strong><\/li>\n<li><strong>Go\u8a00\u8a9e\u306e\u69cb\u9020\u4f53\u3084\u578b\u306e\u4e2d\u8eab\u3092eBPF\u304b\u3089\u53d6\u5f97\u3059\u308b<\/strong><\/li>\n<li><strong>\u958b\u59cb\u6642\u523b\u3068\u7d42\u4e86\u6642\u523b\u3092\u6307\u5b9a\u3057\u3066OpenTelemetry\u306e\u30c8\u30ec\u30fc\u30b9\u3092\u6295\u7a3f\u3059\u308b<\/strong><\/li>\n<\/ul>\n<p>\u6700\u8fd1\u3067\u306fOpenTelemetry\u306b\u3088\u308aeBPF\u3092\u7528\u3044\u3066\u4efb\u610f\u306e\u8a00\u8a9e\u306b\u8a08\u88c5\u3059\u308b<a target=\"_blank\" href=\"https:\/\/opentelemetry.io\/blog\/2025\/obi-announcing-first-release\/\">OBI<\/a>\u3068\u3044\u3046\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u308b\u306a\u3069\u3001\u307e\u3059\u307e\u3059eBPF\u3092\u7528\u3044\u305f\u30aa\u30d6\u30b6\u30fc\u30d0\u30d3\u30ea\u30c6\u30a3\u3078\u306e\u6ce8\u76ee\u5ea6\u304c\u9ad8\u307e\u3063\u3066\u3044\u307e\u3059\u3002eBPF\u3092\u7528\u3044\u305f\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5\u306f\u5965\u304c\u6df1\u3044\u5206\u91ce\u3067\u3059\u304c\u3001\u672c\u8a18\u4e8b\u304c\u7406\u89e3\u306e\u4e00\u52a9\u3068\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<h2 id=\"Appendix-\u74b0\u5883\u69cb\u7bc9\u306b\u3064\u3044\u3066\">Appendix: \u74b0\u5883\u69cb\u7bc9\u306b\u3064\u3044\u3066<\/h2>\n<p>\u672c\u8a18\u4e8b\u3067\u306f<a target=\"_blank\" href=\"https:\/\/github.com\/lima-vm\/lima\">lima<\/a>\u3092\u7528\u3044\u3066\u4eee\u60f3\u74b0\u5883\u3092macOS\u4e0a\u3067\u7528\u610f\u3057\u3066\u3044\u307e\u3059\u3002\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7528\u610f\u3057\u3066\u3001<a target=\"_blank\" href=\"https:\/\/lima-vm.io\/docs\/reference\/limactl_create\/\"><code>limactl create<\/code>\u30b3\u30de\u30f3\u30c9<\/a>\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002bpf2go\u3092\u7528\u3044\u3066eBPF\u3078\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u306b\u306f\u3001clang\u3084libbpf\u306a\u3069\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"code lang-yaml\" data-lang=\"yaml\" data-unlink=\"\"><span class=\"synIdentifier\">base<\/span><span class=\"synSpecial\">:<\/span>\n  <span class=\"synStatement\">- <\/span>template:\/\/_images\/ubuntu\n\n<span class=\"synIdentifier\">provision<\/span><span class=\"synSpecial\">:<\/span>\n  <span class=\"synStatement\">- <\/span><span class=\"synIdentifier\">mode<\/span><span class=\"synSpecial\">:<\/span> system\n    <span class=\"synIdentifier\">script<\/span><span class=\"synSpecial\">:<\/span> |\n     \n      apt update\n      apt install -y make clang libbpf-dev llvm\n  <span class=\"synStatement\">- <\/span><span class=\"synIdentifier\">mode<\/span><span class=\"synSpecial\">:<\/span> system\n    <span class=\"synIdentifier\">script<\/span><span class=\"synSpecial\">:<\/span> |\n     \n      GOARCH=$(dpkg --print-architecture)\n      GOVERSION=1.25.3\n      curl -L https:\/\/go.dev\/dl\/go$GOVERSION.linux-$GOARCH.tar.gz | tar -C \/usr\/local -xzf -\n  <span class=\"synStatement\">- <\/span><span class=\"synIdentifier\">mode<\/span><span class=\"synSpecial\">:<\/span> user\n    <span class=\"synIdentifier\">script<\/span><span class=\"synSpecial\">:<\/span> |\n     \n      echo <span class=\"synConstant\">'export PATH=$PATH:\/usr\/local\/go\/bin:$HOME\/go\/bin'<\/span> &gt;&gt; $HOME\/.bashrc\n      echo <span class=\"synConstant\">'export GOPATH=$HOME\/go'<\/span> &gt;&gt; $HOME\/.bashrc\n      source $HOME\/.bashrc\n<\/pre>\n<p>lima\u3092\u7528\u3044\u3066\u4f5c\u6210\u3057\u305fVM\u306b\u306f<a target=\"_blank\" href=\"https:\/\/lima-vm.io\/docs\/usage\/ssh\/\">\u7c21\u5358\u306bSSH\u3067\u63a5\u7d9a\u3067\u304d\u308b<\/a>\u306e\u3067\u3001Visual Studio Code\u306e\u300cRemote &#8211; SSH\u300d\u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u958b\u767a\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n<p><script>(function(d, s, id) {\n  var js, fjs = d.getElementsByTagName(s)[0];\n  if (d.getElementById(id)) return;\n  js = d.createElement(s); js.id = id;\n  js.src = \"\/\/connect.facebook.net\/ja_JP\/sdk.js#xfbml=1&version=v17.0\";\n  fjs.parentNode.insertBefore(js, fjs);\n}(document, 'script', 'facebook-jssdk'));<\/script><br \/>\n<br \/>\n<br \/><a href=\"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"OpenTelemetry\u3067\u306feBPF\u3068\u3044\u3046\u6280\u8853\u3092\u7528\u3044\u308b\u3053\u3068\u3067\u3001Go\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u89b3\u6e2c\u53ef\u80fd\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001\u305d\u306e\u624b\u6cd5\u3068\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\u5b9f\u969b\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u306a\u304c\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002  [&hellip;]","protected":false},"author":1,"featured_media":26518,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-26517","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-company-tec"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"OpenTelemetry\u3067\u306feBPF\u3068\u3044\u3046\u6280\u8853\u3092\u7528\u3044\u308b\u3053\u3068\u3067\u3001Go\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u89b3\u6e2c\u53ef\u80fd\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001\u305d\u306e\u624b\u6cd5\u3068\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\u5b9f\u969b\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u306a\u304c\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-05T04:25:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26517\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 &#8211; Mackerel \u30d6\u30ed\u30b0 #mackerelio\",\"datePublished\":\"2025-12-05T04:25:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26517\\\/\"},\"wordCount\":214,\"image\":{\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png\",\"articleSection\":[\"\u4f01\u696d\u30c6\u30c3\u30af\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26517\\\/\",\"url\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf\",\"name\":\"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png\",\"datePublished\":\"2025-12-05T04:25:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png\",\"width\":1300,\"height\":683},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mackerel.io\\\/ja\\\/blog\\\/entry\\\/tech\\\/auto-instrument-with-golang-ebpf#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 &#8211; Mackerel \u30d6\u30ed\u30b0 #mackerelio\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf","og_locale":"ja_JP","og_type":"article","og_title":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3","og_description":"OpenTelemetry\u3067\u306feBPF\u3068\u3044\u3046\u6280\u8853\u3092\u7528\u3044\u308b\u3053\u3068\u3067\u3001Go\u8a00\u8a9e\u3067\u3067\u304d\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u306b\u89b3\u6e2c\u53ef\u80fd\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001\u305d\u306e\u624b\u6cd5\u3068\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\u5b9f\u969b\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u306a\u304c\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002 [&hellip;]","og_url":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-12-05T04:25:43+00:00","og_image":[{"width":1300,"height":683,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"9\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/26517\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 &#8211; Mackerel \u30d6\u30ed\u30b0 #mackerelio","datePublished":"2025-12-05T04:25:43+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/26517\/"},"wordCount":214,"image":{"@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png","articleSection":["\u4f01\u696d\u30c6\u30c3\u30af"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/26517\/","url":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf","name":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 - Mackerel \u30d6\u30ed\u30b0 #mackerelio - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#primaryimage"},"image":{"@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png","datePublished":"2025-12-05T04:25:43+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fm2Fmackerelio2F202511272F2025112723340.png","width":1300,"height":683},{"@type":"BreadcrumbList","@id":"https:\/\/mackerel.io\/ja\/blog\/entry\/tech\/auto-instrument-with-golang-ebpf#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"\u4f5c\u3063\u3066\u308f\u304b\u308bOpenTelemetry\u306e\u30bc\u30ed\u30b3\u30fc\u30c9\u8a08\u88c5 Go\u8a00\u8a9eeBPF\u7de8 &#8211; Mackerel \u30d6\u30ed\u30b0 #mackerelio"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=26517"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26517\/revisions"}],"predecessor-version":[{"id":26519,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26517\/revisions\/26519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/26518"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=26517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=26517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=26517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}