{
  "issues": [
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/38",
      "id": 3496257743,
      "node_id": "I_kwDOPtl3ac7QZKjP",
      "number": 38,
      "title": "make Swift Profile Recorder work even if all Concurrency/Dispatch/NIO threads are stuck",
      "user": {
        "login": "weissi",
        "id": 624238,
        "node_id": "MDQ6VXNlcjYyNDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/624238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/weissi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-10-08T17:15:42Z",
      "updated_at": "2025-10-10T11:24:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Just yesterday we had an issue where enough Concurrency threads were stuck that we couldn't take a Profile Recorder trace -- because Profile Recorder's HTTP server & NIO File System require Concurrency to work.\n\nThe core of Profile Recorder was designed to work on a single thread & event loop that can be created purely for Profile Recorder itself. That way it could guarantee to not be blocked even if the user blocked all addressable threads.\n\nBut when I implemented `ProfileRecorderServer`'s HTTP server I took a shortcut in order to use `NIOFileSystem` and relied on Swift Concurrency. This shortcut however means that it's not possible to run `ProfileRecorderServer` in a guarantee-not-to-be-blocked mode.\n\nWe should reimplement the HTTP server in pure NIO on a user-provided single EventLoop in order to support this.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/38/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/26",
      "id": 3477049221,
      "node_id": "I_kwDOPtl3ac7PP4-F",
      "number": 26,
      "title": "option for on-CPU profiling only",
      "user": {
        "login": "weissi",
        "id": 624238,
        "node_id": "MDQ6VXNlcjYyNDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/624238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/weissi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9261401821,
          "node_id": "LA_kwDOPtl3ac8AAAACKAXG3Q",
          "url": "https://api.github.com/repos/apple/swift-profile-recorder/labels/kind/enhancement",
          "name": "kind/enhancement",
          "color": "CB9DB1",
          "default": false,
          "description": "Improvements to existing feature."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-10-02T10:53:53Z",
      "updated_at": "2025-10-07T11:58:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Swift Profile Recorder is an _on- and off-CPU_ profiler, this means that we record both waiting (blocked) and running/runnable threads. This can be really advantageous because lock contention will appear very obviously, so will accidentally blocking code.\n\nBut there are also use cases where it would be beneficial to exclude threads waiting for work. Examples of functions that are sometimes nice to exclude:\n- `epoll_(p)wait`: Linux epoll waiting for events\n- `sigsuspend`\n- `*futex*wait*`\n- `_workq_kreturn`\n- `kevent`\n\nExcluding functions by name is not really satisfying and maybe there's another way to get information like thread state before suspend or consumed cycles since last suspend.\n\nAn example where this would be useful: This is what you see by default\n\n<img width=\"1179\" height=\"311\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/2ff35acf-a2e0-4923-a8fa-47bfc95cfcba\" />\n\nhowever if you select `__workq_kreturn` and hit `d` in Firefox Profiler, you get to see the actual work\n\n<img width=\"1465\" height=\"342\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e74b250c-5f07-434d-a347-87ad53525569\" />\n\nIt's great that you can easily exclude unwanted frames in Firefox Profiler but it would be even better if you could ask Swift Profile Recorder to ignore waiting threads entirely.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/26/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/24",
      "id": 3469668718,
      "node_id": "I_kwDOPtl3ac7OzvFu",
      "number": 24,
      "title": "make it possible to _not_ separate by thread",
      "user": {
        "login": "weissi",
        "id": 624238,
        "node_id": "MDQ6VXNlcjYyNDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/624238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/weissi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9261401821,
          "node_id": "LA_kwDOPtl3ac8AAAACKAXG3Q",
          "url": "https://api.github.com/repos/apple/swift-profile-recorder/labels/kind/enhancement",
          "name": "kind/enhancement",
          "color": "CB9DB1",
          "default": false,
          "description": "Improvements to existing feature."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-30T14:05:50Z",
      "updated_at": "2025-10-04T11:24:40Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In most cases, I like that Swift Profile Recorder separates everything by thread. But for some tooling this isn't helpful.\n\nFor example, when running the demo\n\n```\nswipr-mini-demo --tsp true --threads 10 --output /tmp/raw.swipr\n```\n\nand then making a FlameGraph from that\n\n```\n.build/release/swipr-sample-conv /tmp/raw.swipr | ~/extsrc/FlameGraph/stackcollapse-perf.pl | swift demangle --simplified | ~/extsrc/FlameGraph/flamegraph.pl > /tmp/out.svg && open -a Safari /tmp/out.svg\n```\n\nyou get\n\n![Image](https://github.com/user-attachments/assets/0b63ea13-74f7-4390-b5e1-4f5b11bacf50)\n\nwhich doesn't look very pretty...\n\nOn the other hand, if we add a `sed -r 's/^[^ ]+-T[0-9]+/everything/g'` to make all the threads appear in just one thread called \"everything\"\n\n```\n.build/release/swipr-sample-conv /tmp/raw.swipr | sed -r 's/^[^ ]*-T[0-9]+/everything/g' | ~/extsrc/FlameGraph/stackcollapse-perf.pl | swift demangle --simplified | ~/extsrc/FlameGraph/flamegraph.pl > /tmp/out.svg && open -a Safari /tmp/out.svg\n```\n\nthe result is much prettier\n\n![Image](https://github.com/user-attachments/assets/a6aca5c1-41f4-49c1-b1a6-134041333fe1)\n\nBut instead of forcing our users to come up with a pretty difficult `sed` command, we could just offer `curl -sd {\"treadNames\": false, ...}` or similar\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/24/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/21",
      "id": 3462118680,
      "node_id": "I_kwDOPtl3ac7OW70Y",
      "number": 21,
      "title": "the raw (.swipr) file format should capture how long each sample took",
      "user": {
        "login": "weissi",
        "id": 624238,
        "node_id": "MDQ6VXNlcjYyNDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/624238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/weissi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9261401821,
          "node_id": "LA_kwDOPtl3ac8AAAACKAXG3Q",
          "url": "https://api.github.com/repos/apple/swift-profile-recorder/labels/kind/enhancement",
          "name": "kind/enhancement",
          "color": "CB9DB1",
          "default": false,
          "description": "Improvements to existing feature."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-28T15:41:36Z",
      "updated_at": "2025-09-28T15:41:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Swift Profile Recorder has an intermediate, raw format (containing lines such as `[SWIPR] VMAP {...}`) where all the raw information pre-symbolication lives.\n\nThis format should also capture how long it took to take each sample.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/21/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/12",
      "id": 3460459866,
      "node_id": "I_kwDOPtl3ac7OQm1a",
      "number": 12,
      "title": "Swift service lifecycle support",
      "user": {
        "login": "czechboy0",
        "id": 2182121,
        "node_id": "MDQ6VXNlcjIxODIxMjE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2182121?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/czechboy0",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9261401821,
          "node_id": "LA_kwDOPtl3ac8AAAACKAXG3Q",
          "url": "https://api.github.com/repos/apple/swift-profile-recorder/labels/kind/enhancement",
          "name": "kind/enhancement",
          "color": "CB9DB1",
          "default": false,
          "description": "Improvements to existing feature."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-09-27T15:45:17Z",
      "updated_at": "2025-10-04T11:25:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Could be worth considering adding a conformance to `Service` to make it easier to run in a `ServiceGroup`.\n\nHappy to open a PR if this is a change you'd take.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/12/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/6",
      "id": 3460166944,
      "node_id": "I_kwDOPtl3ac7OPfUg",
      "number": 6,
      "title": "optionally support automatic demangling",
      "user": {
        "login": "weissi",
        "id": 624238,
        "node_id": "MDQ6VXNlcjYyNDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/624238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/weissi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9261401821,
          "node_id": "LA_kwDOPtl3ac8AAAACKAXG3Q",
          "url": "https://api.github.com/repos/apple/swift-profile-recorder/labels/kind/enhancement",
          "name": "kind/enhancement",
          "color": "CB9DB1",
          "default": false,
          "description": "Improvements to existing feature."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-09-27T11:17:38Z",
      "updated_at": "2025-10-07T09:00:06Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "So far, Swift Profile Recorder only symbolises but never demangles. The rationale is threefold:\n\n1.  Demangling is a lossy operation that cannot be undone\n2. There are multiple different demangling modes (default, compat, simplified, strip serialisation)\n3. Applying demangling is easy in most formats (just `curl [...] | swift demangle --compatc`)\n4. `swift_demangle` is a private API and it doesn't accept the different modes yet\n\nI think these are solid reasons for demangling not to be the default. However, it should at least be supported. Maybe like this?\n\n```bash\ncurl -sd '{\"numberOfSamples\":100,\"timeInterval\":\"10 ms\", \"demange\": \"default\"}' http://localhost:7377 > /tmp/samples.perf\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/apple/swift-profile-recorder/issues/6/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    }
  ],
  "pulls": [],
  "discussions": [],
  "details": {
    "id": 1054439273,
    "node_id": "R_kgDOPtl3aQ",
    "name": "swift-profile-recorder",
    "full_name": "apple/swift-profile-recorder",
    "private": false,
    "owner": {
      "login": "apple",
      "id": 10639145,
      "node_id": "MDEyOk9yZ2FuaXphdGlvbjEwNjM5MTQ1",
      "avatar_url": "https://avatars.githubusercontent.com/u/10639145?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/apple",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "description": null,
    "fork": false,
    "url": "https://api.github.com/repos/apple/swift-profile-recorder",
    "created_at": "2025-09-10T20:51:52Z",
    "updated_at": "2025-10-15T03:45:29Z",
    "pushed_at": "2025-10-09T13:50:55Z",
    "homepage": null,
    "size": 1750,
    "stargazers_count": 127,
    "watchers_count": 127,
    "language": "Swift",
    "has_issues": true,
    "has_projects": false,
    "has_downloads": true,
    "has_wiki": false,
    "has_pages": false,
    "has_discussions": false,
    "forks_count": 4,
    "archived": false,
    "disabled": false,
    "open_issues_count": 6,
    "license": {
      "key": "apache-2.0",
      "name": "Apache License 2.0",
      "spdx_id": "Apache-2.0",
      "url": "https://api.github.com/licenses/apache-2.0",
      "node_id": "MDc6TGljZW5zZTI="
    },
    "allow_forking": true,
    "is_template": false,
    "web_commit_signoff_required": false,
    "topics": {},
    "visibility": "public",
    "forks": 4,
    "open_issues": 6,
    "watchers": 127,
    "default_branch": "main",
    "permissions": {
      "admin": false,
      "maintain": false,
      "push": false,
      "triage": false,
      "pull": true
    },
    "temp_clone_token": "",
    "custom_properties": {},
    "organization": {
      "login": "apple",
      "id": 10639145,
      "node_id": "MDEyOk9yZ2FuaXphdGlvbjEwNjM5MTQ1",
      "avatar_url": "https://avatars.githubusercontent.com/u/10639145?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/apple",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "network_count": 4,
    "subscribers_count": 10
  },
  "lastFetched": 1760500154273
}