Sentry 트라이어지
Composio CLI를 통해 Sentry 이슈, 이벤트, 및 의심스러운 커밋을 에이전트로 직접 가져옵니다. 스택 트레이스를 복사-붙여넣기하는 번거로움을 건너뛰세요.
사용 시기
- 새로운 Sentry 알림이 왔을 때, 에이전트가 단순히 제목만 인용하는 것이 아니라 직접 조사하길 원할 때.
- 회귀(regression) 진단: 릴리스, 의심스러운 커밋, 영향을 받은 파일을 찾습니다.
- 재현 힌트가 포함된 "상위 10개 미해결 이슈" 요약을 작성할 때.
사전 요구 사항
curl -fsSL https://composio.dev/install | bash
composio login
composio link sentry # event:read + project:read 권한이 있는 인증 토큰
도구 검색
composio search "get sentry issue" --toolkits sentry
composio search "list events for issue" --toolkits sentry
composio tools list sentry
일반적인 슬러그 (--get-schema로 확인):
SENTRY_GET_AN_ISSUESENTRY_LIST_AN_ISSUES_EVENTSSENTRY_RETRIEVE_AN_EVENT_FOR_A_PROJECTSENTRY_LIST_A_PROJECTS_ISSUESSENTRY_UPDATE_AN_ISSUE
단일 이슈 진단
- 이슈 가져오기 (짧은 ID
PROJ-1F4또는 숫자 ID 사용):composio execute SENTRY_GET_AN_ISSUE -d '{"issue_id":"PROJ-1F4"}' - 최신 이벤트 가져오기 (전체 스택 + 브레드크럼 포함):
composio execute SENTRY_LIST_AN_ISSUES_EVENTS \ -d '{"issue_id":"PROJ-1F4","full":true,"limit":1}' - 각 프레임을 로컬 소스에 매핑합니다. 스택의 각
filename+lineno에 대해 에이전트가 파일을 열고 ±20줄을 읽습니다. 수동 복사-붙여넣기가 필요 없습니다. - 의심스러운 커밋 확인 (릴리스 추적이 설정된 경우 Sentry가 첨부) — 로컬에서
git show <sha>로 엽니다. - 수정 제안 (diff 포함), 테스트 실행, 그리고 통과하면 이슈를 해결로 표시:
composio execute SENTRY_UPDATE_AN_ISSUE \ -d '{"issue_id":"PROJ-1F4","status":"resolved","statusDetails":{"inNextRelease":true}}'
배치 처리
composio execute SENTRY_LIST_A_PROJECTS_ISSUES -d '{
"organization_slug":"acme",
"project_slug":"api",
"query":"is:unresolved age:-24h",
"sort":"freq",
"limit":20
}'
jq로 파이핑하여 순위 요약:
composio execute SENTRY_LIST_A_PROJECTS_ISSUES -d '{"organization_slug":"acme","project_slug":"api","query":"is:unresolved"}' \
| jq -r '.[] | "\(.count)\t\(.shortId)\t\(.title)"' | sort -rn | head
워크플로우 파일
scripts/sentry-diag.ts, 실행: composio run --file scripts/sentry-diag.ts -- --id PROJ-1F4:
const id = process.argv[process.argv.indexOf("--id") + 1];
const issue = await execute("SENTRY_GET_AN_ISSUE", { issue_id: id });
const [event] = await execute("SENTRY_LIST_AN_ISSUES_EVENTS", {
issue_id: id, full: true, limit: 1
});
const frames = (event?.entries ?? [])
.filter(e => e.type === "exception")
.flatMap(e => e.data.values.flatMap(v => v.stacktrace?.frames ?? []))
.filter(f => f.inApp)
.map(f => ({ file: f.filename, line: f.lineno, fn: f.function }));
console.log(JSON.stringify({ title: issue.title, culprit: issue.culprit, frames }, null, 2));
에이전트는 각 file을 line ± 20 위치에서 읽고 패치를 초안으로 작성합니다.
Linear / Slack으로 연결
도구를 체인하여 상위 미해결 이슈에 대한 티켓을 엽니다:
composio run '
const [top] = await execute("SENTRY_LIST_A_PROJECTS_ISSUES", {
organization_slug: "acme", project_slug: "api",
query: "is:unresolved", sort: "freq", limit: 1
});
await execute("LINEAR_CREATE_ISSUE", {
teamId: "TEAM_ID",
title: `[Sentry] ${top.title}`,
description: `Short ID: ${top.shortId}\nPermalink: ${top.permalink}\nCount: ${top.count}`
});
'
문제 해결
404 on issue_id→ URL 슬러그가 아닌 짧은 ID (PROJ-1F4)를 사용하세요.- 빈 이벤트 → 이슈가 해결/보관되었습니다.
query:"is:resolved"로 쿼리하거나limit를 늘리세요. - 의심스러운 커밋 누락 → Sentry에 릴리스 추적이 설정되지 않았습니다. CI에서
sentry-cli releases를 설정하세요. inApp프레임 없음 → 소스 맵이 업로드되지 않았습니다. 스택은 벤더 코드만 표시됩니다.
전체 CLI 참조: docs.composio.dev/docs/cli