[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-sentry-instrumentation-guide":3,"mdc--hf8zjs-key":36,"related-org-sentry-sentry-instrumentation-guide":899,"related-repo-sentry-sentry-instrumentation-guide":1074},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":31,"sourceUrl":34,"mdContent":35},"sentry-instrumentation-guide","guide Sentry instrumentation decisions","Decide which Sentry signal to reach for when instrumenting code — error, span, span attribute, log, or metric. Use when adding instrumentation and unsure whether something should be a log vs a span vs a metric, when deciding \"what to instrument where\", when reviewing instrumentation for gaps, or when a coding agent needs a rule for choosing between errors, traces, logs, and metrics. This skill decides WHAT to emit; the sentry-*-sdk skills handle HOW to set each pillar up.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,23],{"name":14,"slug":15,"type":16},"Observability","observability","tag",{"name":18,"slug":19,"type":16},"Engineering","engineering",{"name":21,"slug":22,"type":16},"Technical Writing","technical-writing",{"name":9,"slug":8,"type":16},237,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai","2026-07-11T05:52:59.255157","Apache-2.0",30,[30],"tag-production",{"repoUrl":25,"stars":24,"forks":28,"topics":32,"description":33},[30],"Teach your AI coding assistant how to use Sentry - setup, debugging, alerts, and more","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai\u002Ftree\u002FHEAD\u002Fskills-legacy\u002Fsentry-instrumentation-guide","---\nname: sentry-instrumentation-guide\ndescription: Decide which Sentry signal to reach for when instrumenting code — error, span, span attribute, log, or metric. Use when adding instrumentation and unsure whether something should be a log vs a span vs a metric, when deciding \"what to instrument where\", when reviewing instrumentation for gaps, or when a coding agent needs a rule for choosing between errors, traces, logs, and metrics. This skill decides WHAT to emit; the sentry-*-sdk skills handle HOW to set each pillar up.\nlicense: Apache-2.0\ncategory: feature-setup\nparent: sentry-feature-setup\ndisable-model-invocation: true\nallowed-tools: Read, Grep, Glob\n---\n\n> [All Skills](..\u002F..\u002FSKILL_TREE.md) > [Feature Setup](..\u002Fsentry-feature-setup\u002FSKILL.md) > Instrumentation Guide\n\n# Sentry Instrumentation Guide: When to Reach for What\n\nErrors, traces, logs, and metrics are the four kinds of telemetry most apps run on, and they\noverlap enough that the choice is rarely obvious. You can stuff context into a span attribute\ninstead of logging it. You can count log lines instead of emitting a metric. You can add a\nduration to a log and call it a span.\n\nBut each signal exists because it answers a **different question** and feeds a **different\nworkflow** once it lands. Reaching for the wrong one means the data is technically there but\nuseless for the job you actually have later. This skill is the decision framework: given a value\nor an event in front of you, which signal should carry it, and why.\n\nIt decides **what** to emit. For **how** to turn each pillar on for a given stack, hand off to the\n`sentry-*-sdk` skills and `sentry-setup-ai-monitoring`.\n\n## Invoke This Skill When\n\n- You're instrumenting a piece of code and unsure whether something should be a log, a span, a\n  span attribute, or a metric\n- You're deciding \"what to instrument where\" across a service or request handler\n- You're reviewing existing instrumentation for gaps (e.g. an error feed that's empty while users\n  report problems)\n- A coding agent needs a consistent rule for choosing between errors, traces, logs, and metrics\n\n**Important:** The SDK APIs and code samples here are illustrative. Verify exact signatures and\nminimum versions against [docs.sentry.io](https:\u002F\u002Fdocs.sentry.io) and the relevant `sentry-*-sdk`\nskill before implementing.\n\n## The Four Signals, One Question Each\n\n| Signal | The question it answers | Docs |\n|--------|-------------------------|------|\n| **Errors** | \"What just broke?\" — a stack trace and exception type, grouped into a deduplicated Issue that gets assigned and tracked to resolution. If your code threw, it's an error. | [Issues](https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fissues\u002F) |\n| **Traces** | \"Did the request flow the way it was supposed to?\" — a waterfall of timed spans. Mostly auto-instrumented. | [Trace Explorer](https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Ftrace-explorer\u002F) |\n| **Logs** | \"What was true at this point in the code, and why?\" — the system's state at one moment as a structured event: config, flags, inputs\u002Foutputs, the decision that was made. | [Logs](https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Flogs\u002F) |\n| **Metrics** | \"How's this trending over time?\" — counters, gauges, distributions you can slice by attribute and chart, alert on, or compare across a deploy. | [Metrics](https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Fmetrics\u002F) |\n\nA useful mental split: a **log is one request's story** (the needle), a **metric is the aggregate**\n(whether the haystack is normal), a **trace is where the time went**, and an **error is the thing\nthat needs a stack trace and an owner**.\n\n## The Decision Table\n\nUse this as a gut check:\n\n| What you want to know | Reach for |\n|-----------------------|-----------|\n| Something crashed, show the stack trace | **Error** |\n| How long did this take? Which step is slow? | **Traces \u002F Spans** |\n| Did the request flow through the steps I expected? | **Traces \u002F Spans** |\n| What was the state when the code made this decision? | **Log** |\n| What did this function receive and return? | **Log** |\n| How often does X happen? Is the rate normal? | **Metric** |\n| Did something change after the deploy? | **Metric** |\n\n## Resolving the Overlaps\n\nThe same value can legitimately appear in more than one signal. These four tiebreakers cover almost\nevery real case. (Full reasoning, gotchas, and the \"why not just log everything \u002F emit one wide\nevent?\" arguments live in [`references\u002Fchoosing-signals.md`](references\u002Fchoosing-signals.md).)\n\n- **Span attribute or metric?** Context about *one request's flow* that you want while reading that\n  trace → **span attribute** (it rides on the span in the waterfall). A standalone value you want\n  to chart, alert on, or slice over time across *all* requests → **metric**. The same number can\n  warrant both: `candidate_count` on the span to read one request, `recommendations.served` as a\n  metric to watch the rate.\n- **Log or span?** The span is the timed node in the flow (mostly auto-instrumented, you rarely\n  write it). The log is the decision-point state *inside* that node (you always write it on\n  purpose). Span answers *where* and *how long*; log answers *what was true and why*.\n- **Log or metric?** A log finds the one specific request that went wrong (the needle). A metric\n  tells you how many requests went wrong (the haystack). Don't derive a rate by counting log lines —\n  emit the metric directly.\n- **Error or log?** Needs a stack trace and should be tracked as an Issue → **error**. An\n  unexpected-but-handled condition worth recording → **log**. Truly non-critical with a traceback →\n  `logger.warning(exc_info=True)` keeps the trace in logs without creating noise in the error feed.\n\n## Sampling vs Filtering — Match Retention to the Question\n\nEach signal's retention falls out of the question it answers:\n\n- **Traces are sampled.** You don't need every request to understand where time goes, so keep a\n  representative slice via `traces_sample_rate` (higher in dev, lower in production).\n- **Errors are captured by default.** No sampling to think about for the baseline.\n- **Logs and metrics are NOT sampled.** You keep every one and *filter* instead, with\n  `before_send_log` and `before_send_metric`. This is the point: the whole reason for a log is to\n  find the one rare request that went sideways, and you can't find what you sampled away.\n\n(For the exact sampling and filtering config in your language, see the matching SDK skill's\n`references\u002Ftracing.md` and `references\u002Fmetrics.md`.)\n\nBecause all four signals come from one SDK, they share a `trace_id` and correlate on their own —\nevery log and metric is tied to its trace, so you can drill from a metric spike straight into the\nsamples behind it.\n\n## What Deliberate Instrumentation Looks Like\n\nRoughly 80% of spans are auto-instrumented by your framework and database integrations — you write\nalmost none of them. The deliberate work is the other 20%: a span attribute or two to enrich the\nflow, a decision-point log, and a metric, placed at the spots where your code makes a choice worth\nquestioning later.\n\n[`references\u002Finstrumentation-examples.md`](references\u002Finstrumentation-examples.md) walks through a\nsingle request handler instrumented end to end, in both **Python** and **JavaScript\u002FTypeScript**,\nshowing the span attribute, the log, and the metric side by side on the same decision.\n\n## Handing Off to Setup\n\nThis skill tells you *what* to emit. To actually wire a pillar up:\n\n- **Install the SDK and turn on tracing, logs, and metrics** → the matching `sentry-\u003Cplatform>-sdk`\n  skill (e.g. `sentry-python-sdk`, `sentry-nextjs-sdk`, `sentry-node-sdk`). Each has per-feature\n  reference files for tracing, logging, metrics, and more.\n- **Instrument LLM \u002F agent calls** → `sentry-setup-ai-monitoring`.\n\nLogs and metrics are the two pillars most projects haven't turned on yet, and both are included on\nevery plan. If they aren't enabled, route to the SDK skill first, then come back here to decide\nwhat to put where.\n",{"data":37,"body":42},{"name":4,"description":6,"license":27,"category":38,"parent":39,"disable-model-invocation":40,"allowed-tools":41},"feature-setup","sentry-feature-setup",true,"Read, Grep, Glob",{"type":43,"children":44},"root",[45,72,79,84,104,140,147,172,199,205,340,372,378,383,514,520,536,673,679,684,747,766,779,785,790,817,823,834,894],{"type":46,"tag":47,"props":48,"children":49},"element","blockquote",{},[50],{"type":46,"tag":51,"props":52,"children":53},"p",{},[54,62,64,70],{"type":46,"tag":55,"props":56,"children":58},"a",{"href":57},"..\u002F..\u002FSKILL_TREE.md",[59],{"type":60,"value":61},"text","All Skills",{"type":60,"value":63}," > ",{"type":46,"tag":55,"props":65,"children":67},{"href":66},"..\u002Fsentry-feature-setup\u002FSKILL.md",[68],{"type":60,"value":69},"Feature Setup",{"type":60,"value":71}," > Instrumentation Guide",{"type":46,"tag":73,"props":74,"children":76},"h1",{"id":75},"sentry-instrumentation-guide-when-to-reach-for-what",[77],{"type":60,"value":78},"Sentry Instrumentation Guide: When to Reach for What",{"type":46,"tag":51,"props":80,"children":81},{},[82],{"type":60,"value":83},"Errors, traces, logs, and metrics are the four kinds of telemetry most apps run on, and they\noverlap enough that the choice is rarely obvious. You can stuff context into a span attribute\ninstead of logging it. You can count log lines instead of emitting a metric. You can add a\nduration to a log and call it a span.",{"type":46,"tag":51,"props":85,"children":86},{},[87,89,95,97,102],{"type":60,"value":88},"But each signal exists because it answers a ",{"type":46,"tag":90,"props":91,"children":92},"strong",{},[93],{"type":60,"value":94},"different question",{"type":60,"value":96}," and feeds a ",{"type":46,"tag":90,"props":98,"children":99},{},[100],{"type":60,"value":101},"different\nworkflow",{"type":60,"value":103}," once it lands. Reaching for the wrong one means the data is technically there but\nuseless for the job you actually have later. This skill is the decision framework: given a value\nor an event in front of you, which signal should carry it, and why.",{"type":46,"tag":51,"props":105,"children":106},{},[107,109,114,116,121,123,130,132,138],{"type":60,"value":108},"It decides ",{"type":46,"tag":90,"props":110,"children":111},{},[112],{"type":60,"value":113},"what",{"type":60,"value":115}," to emit. For ",{"type":46,"tag":90,"props":117,"children":118},{},[119],{"type":60,"value":120},"how",{"type":60,"value":122}," to turn each pillar on for a given stack, hand off to the\n",{"type":46,"tag":124,"props":125,"children":127},"code",{"className":126},[],[128],{"type":60,"value":129},"sentry-*-sdk",{"type":60,"value":131}," skills and ",{"type":46,"tag":124,"props":133,"children":135},{"className":134},[],[136],{"type":60,"value":137},"sentry-setup-ai-monitoring",{"type":60,"value":139},".",{"type":46,"tag":141,"props":142,"children":144},"h2",{"id":143},"invoke-this-skill-when",[145],{"type":60,"value":146},"Invoke This Skill When",{"type":46,"tag":148,"props":149,"children":150},"ul",{},[151,157,162,167],{"type":46,"tag":152,"props":153,"children":154},"li",{},[155],{"type":60,"value":156},"You're instrumenting a piece of code and unsure whether something should be a log, a span, a\nspan attribute, or a metric",{"type":46,"tag":152,"props":158,"children":159},{},[160],{"type":60,"value":161},"You're deciding \"what to instrument where\" across a service or request handler",{"type":46,"tag":152,"props":163,"children":164},{},[165],{"type":60,"value":166},"You're reviewing existing instrumentation for gaps (e.g. an error feed that's empty while users\nreport problems)",{"type":46,"tag":152,"props":168,"children":169},{},[170],{"type":60,"value":171},"A coding agent needs a consistent rule for choosing between errors, traces, logs, and metrics",{"type":46,"tag":51,"props":173,"children":174},{},[175,180,182,190,192,197],{"type":46,"tag":90,"props":176,"children":177},{},[178],{"type":60,"value":179},"Important:",{"type":60,"value":181}," The SDK APIs and code samples here are illustrative. Verify exact signatures and\nminimum versions against ",{"type":46,"tag":55,"props":183,"children":187},{"href":184,"rel":185},"https:\u002F\u002Fdocs.sentry.io",[186],"nofollow",[188],{"type":60,"value":189},"docs.sentry.io",{"type":60,"value":191}," and the relevant ",{"type":46,"tag":124,"props":193,"children":195},{"className":194},[],[196],{"type":60,"value":129},{"type":60,"value":198},"\nskill before implementing.",{"type":46,"tag":141,"props":200,"children":202},{"id":201},"the-four-signals-one-question-each",[203],{"type":60,"value":204},"The Four Signals, One Question Each",{"type":46,"tag":206,"props":207,"children":208},"table",{},[209,233],{"type":46,"tag":210,"props":211,"children":212},"thead",{},[213],{"type":46,"tag":214,"props":215,"children":216},"tr",{},[217,223,228],{"type":46,"tag":218,"props":219,"children":220},"th",{},[221],{"type":60,"value":222},"Signal",{"type":46,"tag":218,"props":224,"children":225},{},[226],{"type":60,"value":227},"The question it answers",{"type":46,"tag":218,"props":229,"children":230},{},[231],{"type":60,"value":232},"Docs",{"type":46,"tag":234,"props":235,"children":236},"tbody",{},[237,264,290,315],{"type":46,"tag":214,"props":238,"children":239},{},[240,249,254],{"type":46,"tag":241,"props":242,"children":243},"td",{},[244],{"type":46,"tag":90,"props":245,"children":246},{},[247],{"type":60,"value":248},"Errors",{"type":46,"tag":241,"props":250,"children":251},{},[252],{"type":60,"value":253},"\"What just broke?\" — a stack trace and exception type, grouped into a deduplicated Issue that gets assigned and tracked to resolution. If your code threw, it's an error.",{"type":46,"tag":241,"props":255,"children":256},{},[257],{"type":46,"tag":55,"props":258,"children":261},{"href":259,"rel":260},"https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fissues\u002F",[186],[262],{"type":60,"value":263},"Issues",{"type":46,"tag":214,"props":265,"children":266},{},[267,275,280],{"type":46,"tag":241,"props":268,"children":269},{},[270],{"type":46,"tag":90,"props":271,"children":272},{},[273],{"type":60,"value":274},"Traces",{"type":46,"tag":241,"props":276,"children":277},{},[278],{"type":60,"value":279},"\"Did the request flow the way it was supposed to?\" — a waterfall of timed spans. Mostly auto-instrumented.",{"type":46,"tag":241,"props":281,"children":282},{},[283],{"type":46,"tag":55,"props":284,"children":287},{"href":285,"rel":286},"https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Ftrace-explorer\u002F",[186],[288],{"type":60,"value":289},"Trace Explorer",{"type":46,"tag":214,"props":291,"children":292},{},[293,301,306],{"type":46,"tag":241,"props":294,"children":295},{},[296],{"type":46,"tag":90,"props":297,"children":298},{},[299],{"type":60,"value":300},"Logs",{"type":46,"tag":241,"props":302,"children":303},{},[304],{"type":60,"value":305},"\"What was true at this point in the code, and why?\" — the system's state at one moment as a structured event: config, flags, inputs\u002Foutputs, the decision that was made.",{"type":46,"tag":241,"props":307,"children":308},{},[309],{"type":46,"tag":55,"props":310,"children":313},{"href":311,"rel":312},"https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Flogs\u002F",[186],[314],{"type":60,"value":300},{"type":46,"tag":214,"props":316,"children":317},{},[318,326,331],{"type":46,"tag":241,"props":319,"children":320},{},[321],{"type":46,"tag":90,"props":322,"children":323},{},[324],{"type":60,"value":325},"Metrics",{"type":46,"tag":241,"props":327,"children":328},{},[329],{"type":60,"value":330},"\"How's this trending over time?\" — counters, gauges, distributions you can slice by attribute and chart, alert on, or compare across a deploy.",{"type":46,"tag":241,"props":332,"children":333},{},[334],{"type":46,"tag":55,"props":335,"children":338},{"href":336,"rel":337},"https:\u002F\u002Fdocs.sentry.io\u002Fproduct\u002Fexplore\u002Fmetrics\u002F",[186],[339],{"type":60,"value":325},{"type":46,"tag":51,"props":341,"children":342},{},[343,345,350,352,357,359,364,366,371],{"type":60,"value":344},"A useful mental split: a ",{"type":46,"tag":90,"props":346,"children":347},{},[348],{"type":60,"value":349},"log is one request's story",{"type":60,"value":351}," (the needle), a ",{"type":46,"tag":90,"props":353,"children":354},{},[355],{"type":60,"value":356},"metric is the aggregate",{"type":60,"value":358},"\n(whether the haystack is normal), a ",{"type":46,"tag":90,"props":360,"children":361},{},[362],{"type":60,"value":363},"trace is where the time went",{"type":60,"value":365},", and an ",{"type":46,"tag":90,"props":367,"children":368},{},[369],{"type":60,"value":370},"error is the thing\nthat needs a stack trace and an owner",{"type":60,"value":139},{"type":46,"tag":141,"props":373,"children":375},{"id":374},"the-decision-table",[376],{"type":60,"value":377},"The Decision Table",{"type":46,"tag":51,"props":379,"children":380},{},[381],{"type":60,"value":382},"Use this as a gut check:",{"type":46,"tag":206,"props":384,"children":385},{},[386,402],{"type":46,"tag":210,"props":387,"children":388},{},[389],{"type":46,"tag":214,"props":390,"children":391},{},[392,397],{"type":46,"tag":218,"props":393,"children":394},{},[395],{"type":60,"value":396},"What you want to know",{"type":46,"tag":218,"props":398,"children":399},{},[400],{"type":60,"value":401},"Reach for",{"type":46,"tag":234,"props":403,"children":404},{},[405,421,437,452,468,483,499],{"type":46,"tag":214,"props":406,"children":407},{},[408,413],{"type":46,"tag":241,"props":409,"children":410},{},[411],{"type":60,"value":412},"Something crashed, show the stack trace",{"type":46,"tag":241,"props":414,"children":415},{},[416],{"type":46,"tag":90,"props":417,"children":418},{},[419],{"type":60,"value":420},"Error",{"type":46,"tag":214,"props":422,"children":423},{},[424,429],{"type":46,"tag":241,"props":425,"children":426},{},[427],{"type":60,"value":428},"How long did this take? Which step is slow?",{"type":46,"tag":241,"props":430,"children":431},{},[432],{"type":46,"tag":90,"props":433,"children":434},{},[435],{"type":60,"value":436},"Traces \u002F Spans",{"type":46,"tag":214,"props":438,"children":439},{},[440,445],{"type":46,"tag":241,"props":441,"children":442},{},[443],{"type":60,"value":444},"Did the request flow through the steps I expected?",{"type":46,"tag":241,"props":446,"children":447},{},[448],{"type":46,"tag":90,"props":449,"children":450},{},[451],{"type":60,"value":436},{"type":46,"tag":214,"props":453,"children":454},{},[455,460],{"type":46,"tag":241,"props":456,"children":457},{},[458],{"type":60,"value":459},"What was the state when the code made this decision?",{"type":46,"tag":241,"props":461,"children":462},{},[463],{"type":46,"tag":90,"props":464,"children":465},{},[466],{"type":60,"value":467},"Log",{"type":46,"tag":214,"props":469,"children":470},{},[471,476],{"type":46,"tag":241,"props":472,"children":473},{},[474],{"type":60,"value":475},"What did this function receive and return?",{"type":46,"tag":241,"props":477,"children":478},{},[479],{"type":46,"tag":90,"props":480,"children":481},{},[482],{"type":60,"value":467},{"type":46,"tag":214,"props":484,"children":485},{},[486,491],{"type":46,"tag":241,"props":487,"children":488},{},[489],{"type":60,"value":490},"How often does X happen? Is the rate normal?",{"type":46,"tag":241,"props":492,"children":493},{},[494],{"type":46,"tag":90,"props":495,"children":496},{},[497],{"type":60,"value":498},"Metric",{"type":46,"tag":214,"props":500,"children":501},{},[502,507],{"type":46,"tag":241,"props":503,"children":504},{},[505],{"type":60,"value":506},"Did something change after the deploy?",{"type":46,"tag":241,"props":508,"children":509},{},[510],{"type":46,"tag":90,"props":511,"children":512},{},[513],{"type":60,"value":498},{"type":46,"tag":141,"props":515,"children":517},{"id":516},"resolving-the-overlaps",[518],{"type":60,"value":519},"Resolving the Overlaps",{"type":46,"tag":51,"props":521,"children":522},{},[523,525,534],{"type":60,"value":524},"The same value can legitimately appear in more than one signal. These four tiebreakers cover almost\nevery real case. (Full reasoning, gotchas, and the \"why not just log everything \u002F emit one wide\nevent?\" arguments live in ",{"type":46,"tag":55,"props":526,"children":528},{"href":527},"references\u002Fchoosing-signals.md",[529],{"type":46,"tag":124,"props":530,"children":532},{"className":531},[],[533],{"type":60,"value":527},{"type":60,"value":535},".)",{"type":46,"tag":148,"props":537,"children":538},{},[539,594,631,641],{"type":46,"tag":152,"props":540,"children":541},{},[542,547,549,555,557,562,564,569,571,576,578,584,586,592],{"type":46,"tag":90,"props":543,"children":544},{},[545],{"type":60,"value":546},"Span attribute or metric?",{"type":60,"value":548}," Context about ",{"type":46,"tag":550,"props":551,"children":552},"em",{},[553],{"type":60,"value":554},"one request's flow",{"type":60,"value":556}," that you want while reading that\ntrace → ",{"type":46,"tag":90,"props":558,"children":559},{},[560],{"type":60,"value":561},"span attribute",{"type":60,"value":563}," (it rides on the span in the waterfall). A standalone value you want\nto chart, alert on, or slice over time across ",{"type":46,"tag":550,"props":565,"children":566},{},[567],{"type":60,"value":568},"all",{"type":60,"value":570}," requests → ",{"type":46,"tag":90,"props":572,"children":573},{},[574],{"type":60,"value":575},"metric",{"type":60,"value":577},". The same number can\nwarrant both: ",{"type":46,"tag":124,"props":579,"children":581},{"className":580},[],[582],{"type":60,"value":583},"candidate_count",{"type":60,"value":585}," on the span to read one request, ",{"type":46,"tag":124,"props":587,"children":589},{"className":588},[],[590],{"type":60,"value":591},"recommendations.served",{"type":60,"value":593}," as a\nmetric to watch the rate.",{"type":46,"tag":152,"props":595,"children":596},{},[597,602,604,609,611,616,618,623,625,630],{"type":46,"tag":90,"props":598,"children":599},{},[600],{"type":60,"value":601},"Log or span?",{"type":60,"value":603}," The span is the timed node in the flow (mostly auto-instrumented, you rarely\nwrite it). The log is the decision-point state ",{"type":46,"tag":550,"props":605,"children":606},{},[607],{"type":60,"value":608},"inside",{"type":60,"value":610}," that node (you always write it on\npurpose). Span answers ",{"type":46,"tag":550,"props":612,"children":613},{},[614],{"type":60,"value":615},"where",{"type":60,"value":617}," and ",{"type":46,"tag":550,"props":619,"children":620},{},[621],{"type":60,"value":622},"how long",{"type":60,"value":624},"; log answers ",{"type":46,"tag":550,"props":626,"children":627},{},[628],{"type":60,"value":629},"what was true and why",{"type":60,"value":139},{"type":46,"tag":152,"props":632,"children":633},{},[634,639],{"type":46,"tag":90,"props":635,"children":636},{},[637],{"type":60,"value":638},"Log or metric?",{"type":60,"value":640}," A log finds the one specific request that went wrong (the needle). A metric\ntells you how many requests went wrong (the haystack). Don't derive a rate by counting log lines —\nemit the metric directly.",{"type":46,"tag":152,"props":642,"children":643},{},[644,649,651,656,658,663,665,671],{"type":46,"tag":90,"props":645,"children":646},{},[647],{"type":60,"value":648},"Error or log?",{"type":60,"value":650}," Needs a stack trace and should be tracked as an Issue → ",{"type":46,"tag":90,"props":652,"children":653},{},[654],{"type":60,"value":655},"error",{"type":60,"value":657},". An\nunexpected-but-handled condition worth recording → ",{"type":46,"tag":90,"props":659,"children":660},{},[661],{"type":60,"value":662},"log",{"type":60,"value":664},". Truly non-critical with a traceback →\n",{"type":46,"tag":124,"props":666,"children":668},{"className":667},[],[669],{"type":60,"value":670},"logger.warning(exc_info=True)",{"type":60,"value":672}," keeps the trace in logs without creating noise in the error feed.",{"type":46,"tag":141,"props":674,"children":676},{"id":675},"sampling-vs-filtering-match-retention-to-the-question",[677],{"type":60,"value":678},"Sampling vs Filtering — Match Retention to the Question",{"type":46,"tag":51,"props":680,"children":681},{},[682],{"type":60,"value":683},"Each signal's retention falls out of the question it answers:",{"type":46,"tag":148,"props":685,"children":686},{},[687,705,715],{"type":46,"tag":152,"props":688,"children":689},{},[690,695,697,703],{"type":46,"tag":90,"props":691,"children":692},{},[693],{"type":60,"value":694},"Traces are sampled.",{"type":60,"value":696}," You don't need every request to understand where time goes, so keep a\nrepresentative slice via ",{"type":46,"tag":124,"props":698,"children":700},{"className":699},[],[701],{"type":60,"value":702},"traces_sample_rate",{"type":60,"value":704}," (higher in dev, lower in production).",{"type":46,"tag":152,"props":706,"children":707},{},[708,713],{"type":46,"tag":90,"props":709,"children":710},{},[711],{"type":60,"value":712},"Errors are captured by default.",{"type":60,"value":714}," No sampling to think about for the baseline.",{"type":46,"tag":152,"props":716,"children":717},{},[718,723,725,730,732,738,739,745],{"type":46,"tag":90,"props":719,"children":720},{},[721],{"type":60,"value":722},"Logs and metrics are NOT sampled.",{"type":60,"value":724}," You keep every one and ",{"type":46,"tag":550,"props":726,"children":727},{},[728],{"type":60,"value":729},"filter",{"type":60,"value":731}," instead, with\n",{"type":46,"tag":124,"props":733,"children":735},{"className":734},[],[736],{"type":60,"value":737},"before_send_log",{"type":60,"value":617},{"type":46,"tag":124,"props":740,"children":742},{"className":741},[],[743],{"type":60,"value":744},"before_send_metric",{"type":60,"value":746},". This is the point: the whole reason for a log is to\nfind the one rare request that went sideways, and you can't find what you sampled away.",{"type":46,"tag":51,"props":748,"children":749},{},[750,752,758,759,765],{"type":60,"value":751},"(For the exact sampling and filtering config in your language, see the matching SDK skill's\n",{"type":46,"tag":124,"props":753,"children":755},{"className":754},[],[756],{"type":60,"value":757},"references\u002Ftracing.md",{"type":60,"value":617},{"type":46,"tag":124,"props":760,"children":762},{"className":761},[],[763],{"type":60,"value":764},"references\u002Fmetrics.md",{"type":60,"value":535},{"type":46,"tag":51,"props":767,"children":768},{},[769,771,777],{"type":60,"value":770},"Because all four signals come from one SDK, they share a ",{"type":46,"tag":124,"props":772,"children":774},{"className":773},[],[775],{"type":60,"value":776},"trace_id",{"type":60,"value":778}," and correlate on their own —\nevery log and metric is tied to its trace, so you can drill from a metric spike straight into the\nsamples behind it.",{"type":46,"tag":141,"props":780,"children":782},{"id":781},"what-deliberate-instrumentation-looks-like",[783],{"type":60,"value":784},"What Deliberate Instrumentation Looks Like",{"type":46,"tag":51,"props":786,"children":787},{},[788],{"type":60,"value":789},"Roughly 80% of spans are auto-instrumented by your framework and database integrations — you write\nalmost none of them. The deliberate work is the other 20%: a span attribute or two to enrich the\nflow, a decision-point log, and a metric, placed at the spots where your code makes a choice worth\nquestioning later.",{"type":46,"tag":51,"props":791,"children":792},{},[793,802,804,809,810,815],{"type":46,"tag":55,"props":794,"children":796},{"href":795},"references\u002Finstrumentation-examples.md",[797],{"type":46,"tag":124,"props":798,"children":800},{"className":799},[],[801],{"type":60,"value":795},{"type":60,"value":803}," walks through a\nsingle request handler instrumented end to end, in both ",{"type":46,"tag":90,"props":805,"children":806},{},[807],{"type":60,"value":808},"Python",{"type":60,"value":617},{"type":46,"tag":90,"props":811,"children":812},{},[813],{"type":60,"value":814},"JavaScript\u002FTypeScript",{"type":60,"value":816},",\nshowing the span attribute, the log, and the metric side by side on the same decision.",{"type":46,"tag":141,"props":818,"children":820},{"id":819},"handing-off-to-setup",[821],{"type":60,"value":822},"Handing Off to Setup",{"type":46,"tag":51,"props":824,"children":825},{},[826,828,832],{"type":60,"value":827},"This skill tells you ",{"type":46,"tag":550,"props":829,"children":830},{},[831],{"type":60,"value":113},{"type":60,"value":833}," to emit. To actually wire a pillar up:",{"type":46,"tag":148,"props":835,"children":836},{},[837,878],{"type":46,"tag":152,"props":838,"children":839},{},[840,845,847,853,855,861,863,869,870,876],{"type":46,"tag":90,"props":841,"children":842},{},[843],{"type":60,"value":844},"Install the SDK and turn on tracing, logs, and metrics",{"type":60,"value":846}," → the matching ",{"type":46,"tag":124,"props":848,"children":850},{"className":849},[],[851],{"type":60,"value":852},"sentry-\u003Cplatform>-sdk",{"type":60,"value":854},"\nskill (e.g. ",{"type":46,"tag":124,"props":856,"children":858},{"className":857},[],[859],{"type":60,"value":860},"sentry-python-sdk",{"type":60,"value":862},", ",{"type":46,"tag":124,"props":864,"children":866},{"className":865},[],[867],{"type":60,"value":868},"sentry-nextjs-sdk",{"type":60,"value":862},{"type":46,"tag":124,"props":871,"children":873},{"className":872},[],[874],{"type":60,"value":875},"sentry-node-sdk",{"type":60,"value":877},"). Each has per-feature\nreference files for tracing, logging, metrics, and more.",{"type":46,"tag":152,"props":879,"children":880},{},[881,886,888,893],{"type":46,"tag":90,"props":882,"children":883},{},[884],{"type":60,"value":885},"Instrument LLM \u002F agent calls",{"type":60,"value":887}," → ",{"type":46,"tag":124,"props":889,"children":891},{"className":890},[],[892],{"type":60,"value":137},{"type":60,"value":139},{"type":46,"tag":51,"props":895,"children":896},{},[897],{"type":60,"value":898},"Logs and metrics are the two pillars most projects haven't turned on yet, and both are included on\nevery plan. If they aren't enabled, route to the SDK skill first, then come back here to decide\nwhat to put where.",{"items":900,"total":1073},[901,926,940,953,965,982,998,1012,1022,1033,1043,1060],{"slug":902,"name":902,"fn":903,"description":904,"org":905,"tags":906,"stars":923,"repoUrl":924,"updatedAt":925},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[907,910,913,916,917,920],{"name":908,"slug":909,"type":16},"Debugging","debugging",{"name":911,"slug":912,"type":16},"iOS","ios",{"name":914,"slug":915,"type":16},"macOS","macos",{"name":9,"slug":8,"type":16},{"name":918,"slug":919,"type":16},"Testing","testing",{"name":921,"slug":922,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":927,"name":927,"fn":928,"description":929,"org":930,"tags":931,"stars":923,"repoUrl":924,"updatedAt":939},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[932,935,936,937,938],{"name":933,"slug":934,"type":16},"CLI","cli",{"name":911,"slug":912,"type":16},{"name":914,"slug":915,"type":16},{"name":918,"slug":919,"type":16},{"name":921,"slug":922,"type":16},"2026-04-06T18:13:36.13414",{"slug":941,"name":941,"fn":942,"description":943,"org":944,"tags":945,"stars":950,"repoUrl":951,"updatedAt":952},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[946,949],{"name":947,"slug":948,"type":16},"Documentation","documentation",{"name":18,"slug":19,"type":16},861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":954,"name":954,"fn":955,"description":956,"org":957,"tags":958,"stars":950,"repoUrl":951,"updatedAt":964},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[959,962,963],{"name":960,"slug":961,"type":16},"Communications","communications",{"name":9,"slug":8,"type":16},{"name":21,"slug":22,"type":16},"2026-05-15T06:16:33.38217",{"slug":966,"name":966,"fn":967,"description":968,"org":969,"tags":970,"stars":950,"repoUrl":951,"updatedAt":981},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[971,974,977,978],{"name":972,"slug":973,"type":16},"Branding","branding",{"name":975,"slug":976,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":979,"slug":980,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":983,"name":983,"fn":984,"description":985,"org":986,"tags":987,"stars":950,"repoUrl":951,"updatedAt":997},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[988,991,994],{"name":989,"slug":990,"type":16},"Claude Code","claude-code",{"name":992,"slug":993,"type":16},"Configuration","configuration",{"name":995,"slug":996,"type":16},"Security","security","2026-05-15T06:16:44.335977",{"slug":999,"name":999,"fn":1000,"description":1001,"org":1002,"tags":1003,"stars":950,"repoUrl":951,"updatedAt":1011},"code-review","perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1004,1006,1007,1010],{"name":1005,"slug":999,"type":16},"Code Review",{"name":18,"slug":19,"type":16},{"name":1008,"slug":1009,"type":16},"Performance","performance",{"name":995,"slug":996,"type":16},"2026-05-15T06:16:35.824864",{"slug":1013,"name":1013,"fn":1014,"description":1015,"org":1016,"tags":1017,"stars":950,"repoUrl":951,"updatedAt":1021},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1018],{"name":1019,"slug":1020,"type":16},"Code Analysis","code-analysis","2026-05-15T06:16:32.127981",{"slug":1023,"name":1023,"fn":1024,"description":1025,"org":1026,"tags":1027,"stars":950,"repoUrl":951,"updatedAt":1032},"commit","create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1028,1031],{"name":1029,"slug":1030,"type":16},"Git","git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":1034,"name":1034,"fn":1035,"description":1036,"org":1037,"tags":1038,"stars":950,"repoUrl":951,"updatedAt":1042},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1039,1040,1041],{"name":18,"slug":19,"type":16},{"name":1029,"slug":1030,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":1044,"name":1044,"fn":1045,"description":1046,"org":1047,"tags":1048,"stars":950,"repoUrl":951,"updatedAt":1059},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1049,1052,1053,1056,1058],{"name":1050,"slug":1051,"type":16},"Access Control","access-control",{"name":1019,"slug":1020,"type":16},{"name":1054,"slug":1055,"type":16},"Django","django",{"name":808,"slug":1057,"type":16},"python",{"name":995,"slug":996,"type":16},"2026-05-15T06:16:43.098698",{"slug":1061,"name":1061,"fn":1062,"description":1063,"org":1064,"tags":1065,"stars":950,"repoUrl":951,"updatedAt":1072},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1066,1067,1070,1071],{"name":1005,"slug":999,"type":16},{"name":1068,"slug":1069,"type":16},"Database","database",{"name":1054,"slug":1055,"type":16},{"name":1008,"slug":1009,"type":16},"2026-05-15T06:16:24.832813",88,{"items":1075,"total":1177},[1076,1092,1107,1123,1135,1149,1164],{"slug":1077,"name":1077,"fn":1078,"description":1079,"org":1080,"tags":1081,"stars":24,"repoUrl":25,"updatedAt":1091},"sentry-android-sdk","setup Sentry SDK for Android","Full Sentry SDK setup for Android. Use when asked to \"add Sentry to Android\", \"install sentry-android\", \"setup Sentry in Android\", or configure error monitoring, tracing, profiling, session replay, or logging for Android applications. Supports Kotlin and Java codebases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1082,1085,1086,1087,1090],{"name":1083,"slug":1084,"type":16},"Android","android",{"name":908,"slug":909,"type":16},{"name":14,"slug":15,"type":16},{"name":1088,"slug":1089,"type":16},"SDK","sdk",{"name":9,"slug":8,"type":16},"2026-07-12T06:08:32.396344",{"slug":1093,"name":1093,"fn":1094,"description":1095,"org":1096,"tags":1097,"stars":24,"repoUrl":25,"updatedAt":1106},"sentry-browser-sdk","setup Sentry error monitoring for browser applications","Full Sentry SDK setup for browser JavaScript. Use when asked to \"add Sentry to a website\", \"install @sentry\u002Fbrowser\", or configure error monitoring, tracing, session replay, or logging for vanilla JavaScript, jQuery, static sites, or WordPress.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1098,1099,1102,1105],{"name":908,"slug":909,"type":16},{"name":1100,"slug":1101,"type":16},"JavaScript","javascript",{"name":1103,"slug":1104,"type":16},"Monitoring","monitoring",{"name":9,"slug":8,"type":16},"2026-07-18T05:47:44.437436",{"slug":1108,"name":1108,"fn":1109,"description":1110,"org":1111,"tags":1112,"stars":24,"repoUrl":25,"updatedAt":1122},"sentry-cloudflare-sdk","setup Sentry monitoring for Cloudflare","Full Sentry SDK setup for Cloudflare Workers and Pages. Use when asked to \"add Sentry to Cloudflare Workers\", \"install @sentry\u002Fcloudflare\", or configure error monitoring, tracing, logging, crons, or AI monitoring for Cloudflare Workers, Pages, Durable Objects, Queues, Workflows, or Hono on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1113,1116,1119,1120,1121],{"name":1114,"slug":1115,"type":16},"Cloudflare","cloudflare",{"name":1117,"slug":1118,"type":16},"Edge Functions","edge-functions",{"name":1103,"slug":1104,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:25.361175",{"slug":1124,"name":1124,"fn":1125,"description":1126,"org":1127,"tags":1128,"stars":24,"repoUrl":25,"updatedAt":1134},"sentry-cocoa-sdk","integrate Sentry SDK into Apple applications","Full Sentry SDK setup for Apple platforms (iOS, macOS, tvOS, watchOS, visionOS). Use when asked to \"add Sentry to iOS\", \"add Sentry to Swift\", \"install sentry-cocoa\", or configure error monitoring, tracing, profiling, session replay, logging, or metrics for Apple applications. Supports SwiftUI and UIKit.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1129,1130,1131,1132,1133],{"name":911,"slug":912,"type":16},{"name":914,"slug":915,"type":16},{"name":1103,"slug":1104,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:52:57.042493",{"slug":1136,"name":1136,"fn":1137,"description":1138,"org":1139,"tags":1140,"stars":24,"repoUrl":25,"updatedAt":1148},"sentry-dotnet-sdk","setup Sentry SDK for .NET","Full Sentry SDK setup for .NET. Use when asked to \"add Sentry to .NET\", \"install Sentry for C#\", or configure error monitoring, tracing, profiling, logging, or crons for ASP.NET Core, MAUI, WPF, WinForms, Blazor, Azure Functions, or any other .NET application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1141,1144,1145,1146,1147],{"name":1142,"slug":1143,"type":16},".NET","net",{"name":908,"slug":909,"type":16},{"name":14,"slug":15,"type":16},{"name":1088,"slug":1089,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:33.793148",{"slug":1150,"name":1150,"fn":1151,"description":1152,"org":1153,"tags":1154,"stars":24,"repoUrl":25,"updatedAt":1163},"sentry-elixir-sdk","setup Sentry SDK for Elixir","Full Sentry SDK setup for Elixir. Use when asked to \"add Sentry to Elixir\", \"install sentry for Elixir\", or configure error monitoring, tracing, logging, or crons for Elixir, Phoenix, or Plug applications. Supports Phoenix, Plug, LiveView, Oban, and Quantum.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1155,1158,1161,1162],{"name":1156,"slug":1157,"type":16},"Backend","backend",{"name":1159,"slug":1160,"type":16},"Elixir","elixir",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:11.69581",{"slug":1165,"name":1165,"fn":1166,"description":1167,"org":1168,"tags":1169,"stars":24,"repoUrl":25,"updatedAt":1176},"sentry-fix-issues","fix production issues with Sentry","Find and fix issues from Sentry using MCP. Use when asked to fix Sentry errors, debug production issues, investigate exceptions, or resolve bugs reported in Sentry. Methodically analyzes stack traces, breadcrumbs, traces, and context to identify root causes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1170,1171,1174,1175],{"name":908,"slug":909,"type":16},{"name":1172,"slug":1173,"type":16},"Incident Response","incident-response",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:35.550824",27]