[{"data":1,"prerenderedAt":593},["ShallowReactive",2],{"\u002Fopentelemetry\u002Fprofiles-navigation":3,"\u002Fopentelemetry\u002Fprofiles":79},[4,8,12,16,20,24,28,32,36,40,63,67,71,75],{"title":5,"path":6,"stem":7},"What is OpenTelemetry?","\u002Fopentelemetry","opentelemetry\u002F01.index",{"title":9,"path":10,"stem":11},"OpenTelemetry APM","\u002Fopentelemetry\u002Fapm","opentelemetry\u002F02.apm",{"title":13,"path":14,"stem":15},"Architecture","\u002Fopentelemetry\u002Farchitecture","opentelemetry\u002F03.architecture",{"title":17,"path":18,"stem":19},"Distributed Tracing","\u002Fopentelemetry\u002Fdistributed-tracing","opentelemetry\u002F04.distributed-tracing",{"title":21,"path":22,"stem":23},"Timeseries Metrics","\u002Fopentelemetry\u002Fmetrics","opentelemetry\u002F05.metrics",{"title":25,"path":26,"stem":27},"Logs","\u002Fopentelemetry\u002Flogs","opentelemetry\u002F06.logs",{"title":29,"path":30,"stem":31},"Profiles","\u002Fopentelemetry\u002Fprofiles","opentelemetry\u002F07.profiles",{"title":33,"path":34,"stem":35},"Context Propagation","\u002Fopentelemetry\u002Fcontext-propagation","opentelemetry\u002F08.context-propagation",{"title":37,"path":38,"stem":39},"Sampling","\u002Fopentelemetry\u002Fsampling","opentelemetry\u002F09.sampling",{"title":41,"path":42,"stem":43,"children":44},"Collector","\u002Fopentelemetry\u002Fcollector","opentelemetry\u002F1.collector\u002F01.index",[45,47,51,55,59],{"title":46,"path":42,"stem":43},"Get started",{"title":48,"path":49,"stem":50},"Configuration","\u002Fopentelemetry\u002Fcollector\u002Fconfig","opentelemetry\u002F1.collector\u002F02.config",{"title":52,"path":53,"stem":54},"Exporters","\u002Fopentelemetry\u002Fcollector\u002Fexporters","opentelemetry\u002F1.collector\u002F03.exporters",{"title":56,"path":57,"stem":58},"Host metrics","\u002Fopentelemetry\u002Fcollector\u002Fhost-metrics","opentelemetry\u002F1.collector\u002F04.host-metrics",{"title":60,"path":61,"stem":62},"Prometheus","\u002Fopentelemetry\u002Fcollector\u002Fprometheus","opentelemetry\u002F1.collector\u002F05.prometheus",{"title":64,"path":65,"stem":66},"Semantic Conventions","\u002Fopentelemetry\u002Fsemconv","opentelemetry\u002F10.semconv",{"title":68,"path":69,"stem":70},"Operator","\u002Fopentelemetry\u002Foperator","opentelemetry\u002F11.operator",{"title":72,"path":73,"stem":74},"Env Variables","\u002Fopentelemetry\u002Fenv-vars","opentelemetry\u002F12.env-vars",{"title":76,"path":77,"stem":78},"Troubleshooting","\u002Fopentelemetry\u002Ftroubleshooting","opentelemetry\u002F13.troubleshooting",{"page":80,"surround":588},{"id":81,"title":82,"author":83,"body":84,"date":83,"description":574,"extension":575,"image":576,"meta":577,"navigation":584,"path":30,"seo":585,"stem":31,"surround_disabled":586,"__hash__":587},"opentelemetry\u002Fopentelemetry\u002F07.profiles.md","OpenTelemetry Profiles: The Fourth Signal",null,{"type":85,"value":86,"toc":564},"minimark",[87,100,103,115,120,180,183,186,190,193,196,230,233,236,240,251,254,259,267,272,275,280,283,312,315,347,358,362,381,384,423,433,437,440,466,470,514,521,524,528,560],[88,89,90,91,95,96,99],"p",{},"Profiles are the fourth OpenTelemetry signal, after traces, metrics, and logs. A profile is a stream of sampled stack traces showing where a process spends CPU time or allocates memory — the same data a profiler like ",[92,93,94],"code",{},"pprof"," or ",[92,97,98],{},"perf"," produces, carried over OTLP alongside the other signals.",[88,101,102],{},"The signal answers a question the other three cannot. Metrics say the service is slow, traces say which span is slow, logs say what the code reported while it happened — and profiles say which functions were executing on the CPU during that span.",[104,105,107],"alert",{"type":106},"warning",[88,108,109,110,114],{},"Profiles are in ",[111,112,113],"strong",{},"public alpha",". The signal should not be used for critical production workloads: the data model can still change, SDK APIs do not exist yet, and backend support is limited. Treat this page as an outline of what exists today, not as a deployment guide.",[116,117,119],"h2",{"id":118},"status","Status",[121,122,123,136],"table",{},[124,125,126],"thead",{},[127,128,129,133],"tr",{},[130,131,132],"th",{},"Component",[130,134,135],{},"State",[137,138,139,148,156,164,172],"tbody",{},[127,140,141,145],{},[142,143,144],"td",{},"Data model \u002F OTLP",[142,146,147],{},"Alpha, shipped in OTLP proto v1.10.0",[127,149,150,153],{},[142,151,152],{},"Collector support",[142,154,155],{},"Available from Collector v0.148.0, behind a feature gate",[127,157,158,161],{},[142,159,160],{},"eBPF profiler",[142,162,163],{},"Alpha, works on Linux",[127,165,166,169],{},[142,167,168],{},"Language SDK APIs",[142,170,171],{},"Not available — in-process profiling is still in design",[127,173,174,177],{},[142,175,176],{},"Backends",[142,178,179],{},"Limited; most vendors are still implementing ingestion",[88,181,182],{},"The next milestone is Beta. No GA date has been committed.",[88,184,185],{},"This is a different shape of rollout from the earlier signals. Traces and metrics arrived as SDK APIs first and collection agents later; profiles arrived as a whole-system agent first, with SDK APIs still ahead.",[116,187,189],{"id":188},"what-a-profile-contains","What a profile contains",[88,191,192],{},"The data model is built around deduplicated stack traces. A naive profile repeats the same function names in thousands of samples; the OTLP representation stores each location once and has samples reference it, which is where the reported ~40% reduction in wire size compared to raw pprof comes from.",[88,194,195],{},"Each sample carries:",[197,198,199,206,212,218],"ul",{},[200,201,202,205],"li",{},[111,203,204],{},"A stack trace"," — the chain of function calls executing when the sample was taken",[200,207,208,211],{},[111,209,210],{},"A value"," — CPU time, allocated bytes, or another measured quantity",[200,213,214,217],{},[111,215,216],{},"Attributes"," — the same key-value pairs used by the other signals",[200,219,220,229],{},[111,221,222,225,226],{},[92,223,224],{},"trace_id"," and ",[92,227,228],{},"span_id"," — the span that was active when the sample was captured, when one was",[88,231,232],{},"That last field is the reason profiles belong in OpenTelemetry rather than in a separate tool. It makes the link between a slow span and the functions running during it a lookup rather than a guess based on timestamps.",[88,234,235],{},"The format converts to and from pprof without data loss, so existing pprof tooling keeps working.",[116,237,239],{"id":238},"collecting-profiles-today","Collecting profiles today",[88,241,242,243,250],{},"Because there are no SDK APIs yet, profiles come from an external agent. The reference implementation is ",[244,245,249],"a",{"href":246,"rel":247},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-ebpf-profiler",[248],"nofollow","opentelemetry-ebpf-profiler",", contributed by Elastic.",[88,252,253],{},"It is a whole-system profiler: it samples every process on the host from the kernel, rather than being linked into one application. That means no code changes and no per-language agent, at the cost of requiring privileges and a recent kernel.",[88,255,256],{},[111,257,258],{},"Requirements",[197,260,261,264],{},[200,262,263],{},"Linux, kernel 5.10 or newer",[200,265,266],{},"Root or the equivalent capabilities, since it loads eBPF programs",[88,268,269],{},[111,270,271],{},"Runtime coverage",[88,273,274],{},"Native code — C, C++, Rust, Go, Zig — is unwound without debug symbols on the host. Interpreted and JIT runtimes are supported individually: HotSpot JVM, Python, Ruby, PHP, Node.js and V8, Perl, Erlang\u002FBEAM, and .NET.",[88,276,277],{},[111,278,279],{},"Running it",[88,281,282],{},"Standalone, sending to a collection agent:",[284,285,290],"pre",{"className":286,"code":287,"language":288,"meta":289,"style":289},"language-shell shiki shiki-themes github-light","sudo .\u002Febpf-profiler -collection-agent=127.0.0.1:11000 -disable-tls\n","shell","",[92,291,292],{"__ignoreMap":289},[293,294,297,301,305,309],"span",{"class":295,"line":296},"line",1,[293,298,300],{"class":299},"s7eDp","sudo",[293,302,304],{"class":303},"sYBdl"," .\u002Febpf-profiler",[293,306,308],{"class":307},"sYu0t"," -collection-agent=127.0.0.1:11000",[293,310,311],{"class":307}," -disable-tls\n",[88,313,314],{},"Or as a Collector receiver, which requires the profiles feature gate:",[284,316,318],{"className":286,"code":317,"language":288,"meta":289,"style":289},"sudo .\u002Fotelcol-ebpf-profiler \\\n  --feature-gates=+service.profilesSupport \\\n  --config local.example.yaml\n",[92,319,320,330,338],{"__ignoreMap":289},[293,321,322,324,327],{"class":295,"line":296},[293,323,300],{"class":299},[293,325,326],{"class":303}," .\u002Fotelcol-ebpf-profiler",[293,328,329],{"class":307}," \\\n",[293,331,333,336],{"class":295,"line":332},2,[293,334,335],{"class":307},"  --feature-gates=+service.profilesSupport",[293,337,329],{"class":307},[293,339,341,344],{"class":295,"line":340},3,[293,342,343],{"class":307},"  --config",[293,345,346],{"class":303}," local.example.yaml\n",[88,348,349,350,353,354,357],{},"The ",[92,351,352],{},"local.example.yaml"," in the profiler repository under ",[92,355,356],{},"cmd\u002Fotelcol-ebpf-profiler\u002F"," is the current reference for a working profiles pipeline. Profiles pipeline configuration is still changing between Collector releases, so copy from that file rather than from a tutorial.",[116,359,361],{"id":360},"collector-components","Collector components",[88,363,364,365,368,369,372,373,376,377,380],{},"Profiles reuse the Collector's existing pipeline model — receivers, processors, exporters — with a ",[92,366,367],{},"profiles"," pipeline type alongside ",[92,370,371],{},"traces",", ",[92,374,375],{},"metrics",", and ",[92,378,379],{},"logs",".",[88,382,383],{},"Available today:",[197,385,386,395,418],{},[200,387,388,391,392,394],{},[111,389,390],{},"Receivers"," — the eBPF profiler as a Collector receiver, and a ",[92,393,94],{}," receiver for ingesting profile files",[200,396,397,400,401,404,405,410,411,414,415],{},[111,398,399],{},"Processors"," — ",[92,402,403],{},"k8sattributes"," for attaching pod and namespace metadata, and ",[244,406,409],{"href":407,"rel":408},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-collector-contrib\u002Ftree\u002Fmain\u002Fpkg\u002Fottl",[248],"OTTL"," in the ",[92,412,413],{},"transform"," processor for custom rules, configured like any other ",[244,416,417],{"href":49},"Collector pipeline",[200,419,420,422],{},[111,421,52],{}," — OTLP, to any backend that accepts the profiles signal",[88,424,425,426,428,429,432],{},"The processor support matters more than it sounds. Because profiles carry the same resource and attribute model as the other signals, ",[92,427,403],{}," labels a profile with the same ",[92,430,431],{},"k8s.pod.name"," it puts on the traces from that pod, and the two join on those attributes.",[116,434,436],{"id":435},"what-is-not-ready","What is not ready",[88,438,439],{},"Being explicit about the gaps, since the signal is easy to over-plan around:",[197,441,442,448,454,460],{},[200,443,444,447],{},[111,445,446],{},"No SDK APIs."," You cannot start or stop profiling from application code, or attach application-level attributes at the point of capture. Everything comes from the external agent.",[200,449,450,453],{},[111,451,452],{},"Linux only."," The eBPF profiler does not run on macOS or Windows.",[200,455,456,459],{},[111,457,458],{},"Thin backend support."," The specification ships the wire format; storing and querying profiles is up to backends, and most are still building it. Uptrace does not ingest profiles yet.",[200,461,462,465],{},[111,463,464],{},"The model can still change."," Alpha means breaking changes are permitted between releases.",[116,467,469],{"id":468},"how-profiles-relate-to-the-other-signals","How profiles relate to the other signals",[121,471,472,482],{},[124,473,474],{},[127,475,476,479],{},[130,477,478],{},"Signal",[130,480,481],{},"Question it answers",[137,483,484,492,500,507],{},[127,485,486,489],{},[142,487,488],{},"Metrics",[142,490,491],{},"Is something wrong, and how much",[127,493,494,497],{},[142,495,496],{},"Traces",[142,498,499],{},"Where in the request path it is wrong",[127,501,502,504],{},[142,503,25],{},[142,505,506],{},"What the code reported while it happened",[127,508,509,511],{},[142,510,29],{},[142,512,513],{},"Which functions were running while it happened",[88,515,516,517,520],{},"The overlap with tracing is worth being precise about. A span tells you that ",[92,518,519],{},"checkout.processPayment"," took 400ms. It does not tell you whether that time went to JSON serialization, TLS handshakes, or garbage collection — the span would have to be instrumented at that granularity, which nobody does. A profile covering the same interval shows the function-level breakdown without any instrumentation at all.",[88,522,523],{},"They are complementary rather than alternatives: tracing gives you request-scoped causality, profiling gives you code-level cost.",[116,525,527],{"id":526},"whats-next","What's next?",[197,529,530,536,542,548,554],{},[200,531,532,535],{},[244,533,534],{"href":18},"OpenTelemetry distributed tracing"," — the signal profiles correlate with",[200,537,538,541],{},[244,539,540],{"href":42},"OpenTelemetry Collector"," — the pipeline profiles flow through",[200,543,544,547],{},[244,545,546],{"href":14},"OpenTelemetry architecture"," — how signals, SDK, and Collector fit together",[200,549,550,553],{},[244,551,552],{"href":22},"OpenTelemetry metrics"," — the signal that tells you something is wrong before you profile",[200,555,556,559],{},[244,557,558],{"href":77},"OpenTelemetry troubleshooting"," — when a profiles pipeline produces nothing",[561,562,563],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":289,"searchDepth":565,"depth":332,"links":566},4,[567,568,569,570,571,572,573],{"id":118,"depth":332,"text":119},{"id":188,"depth":332,"text":189},{"id":238,"depth":332,"text":239},{"id":360,"depth":332,"text":361},{"id":435,"depth":332,"text":436},{"id":468,"depth":332,"text":469},{"id":526,"depth":332,"text":527},"OpenTelemetry Profiles is the fourth telemetry signal, in public alpha since 2026. Covers the pprof-compatible data model, correlation with traces via trace_id, the eBPF profiler, and what is not ready yet.","md","\u002Fopentelemetry\u002Fcover\u002Fprofiles.webp",{"keyword_difficulty":578,"readingTime":579},"medium",{"text":580,"minutes":581,"time":582,"words":583},"5 min read",4.47,268200,894,{"title":29},{"title":82,"description":574},false,"0xzrqkt8R2q8MDd8C5AWDWk38T7e_GHEDXHT-dkrC5I",[589,591],{"title":25,"path":26,"stem":27,"description":590,"children":-1},"How OpenTelemetry Logs work: connect an existing logging library through a bridge, correlate logs with traces, collect logs with the Collector. Includes per-language SDK status and code examples for Go, Python, Node.js, and Java.",{"title":33,"path":34,"stem":35,"description":592,"children":-1},"How trace context travels between services - the W3C traceparent header, propagators, manual injection and extraction for HTTP and message queues, baggage, and how to diagnose traces that break at service boundaries.",1787234207060]