{"id":49685,"date":"2025-10-17T15:36:32","date_gmt":"2025-10-17T19:36:32","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=49685"},"modified":"2025-10-17T15:36:32","modified_gmt":"2025-10-17T19:36:32","slug":"swift-profile-recorder","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2025\/10\/17\/swift-profile-recorder\/","title":{"rendered":"Swift Profile Recorder"},"content":{"rendered":"<p><a href=\"https:\/\/www.swift.org\/blog\/swift-profile-recorder\/\">Johannes Weiss and Mitchell Allison<\/a> (<a href=\"https:\/\/forums.swift.org\/t\/introducing-swift-profile-recorder-identifying-performance-bottlenecks-in-production\/82536\">forum<\/a>):<\/p>\n<blockquote cite=\"https:\/\/www.swift.org\/blog\/swift-profile-recorder\/\"><p><a href=\"https:\/\/github.com\/apple\/swift-profile-recorder\">Swift Profile Recorder<\/a>, an in-process sampling profiler for Swift services, is now available as an open source project.<\/p><p>[&#8230;]<\/p><p>Swift Profile Recorder enables you to:<\/p><ul><li><strong>Adopt profiling without extra privileges or system dependencies<\/strong>, allowing you to add profiling across a variety of compute environments with constrained permissions.<\/li><li><strong>Collect samples using <code>curl<\/code><\/strong>, allowing you to easily read profiler output via an HTTP endpoint without needing to learn specific tooling like perf, sample, DTrace, or eBPF (bpftrace).<\/li><li><strong>Integrate with existing tools for visualization and analysis<\/strong> by supporting multiple industry-standard formats, including Linux perf script format, both the pprof file format as well as the <code>\/debug\/pprof\/profile<\/code> endpoints, and also the collapsed format as used by the original FlameGraphs.<\/li><\/ul><p>Apple has used Swift Profile Recorder at scale for several years as a tool for operating and debugging Swift services in production. Alongside the recent announcement of <a href=\"https:\/\/forums.swift.org\/t\/announcing-swift-parca-low-overhead-continuous-profiling-for-swift-on-server\/81823\">swift-parca<\/a>, the Swift server ecosystem now has multiple profiling tools and approaches.<\/p><\/blockquote>\n<p>I&rsquo;m intrigued by the idea of an app being able to profile itself.<\/p>","protected":false},"excerpt":{"rendered":"<p>Johannes Weiss and Mitchell Allison (forum): Swift Profile Recorder, an in-process sampling profiler for Swift services, is now available as an open source project.[&#8230;]Swift Profile Recorder enables you to:Adopt profiling without extra privileges or system dependencies, allowing you to add profiling across a variety of compute environments with constrained permissions.Collect samples using curl, allowing you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2025-10-17T19:36:35Z","apple_news_api_id":"013d80a1-dda6-4aca-ad01-7c6aa3629ffd","apple_news_api_modified_at":"2025-10-17T19:36:35Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/AAT2Aod2mSsqtAXxqo2Kf_Q","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[75,74,138,71,901],"class_list":["post-49685","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-developertool","tag-opensource","tag-optimization","tag-programming","tag-swift-programming-language"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/49685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=49685"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/49685\/revisions"}],"predecessor-version":[{"id":49686,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/49685\/revisions\/49686"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=49685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=49685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=49685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}