{"id":"1774779a-ce8a-4ce6-a255-b716ffafbcbe","shortId":"FY3CU6","kind":"skill","title":"sentry-instrumentation","tagline":"Rules and examples for adding Sentry metrics the right way. Covers how to name a counter, gauge, or duration metric; which tags are safe versus which will blow up your Sentry bill; how to track failures with a small fixed list of error types instead of raw exception strings; and ","description":"# Sentry Instrumentation\n\n**Scope:** Sentry (system behavior) only. Product analytics metrics\n(button clicks, funnel events, feature-flag exposure) belong in your\nproduct-analytics tool — never mix them into Sentry instrumentation.\nIf the change touches a user-facing funnel event, stop and use the\nright tool for it.\n\n**Canonical reference:** Python, under `examples/python/`. The rules\nin `references/` are language-neutral — ports to TypeScript, Go,\nRuby, Java, etc. keep the same shapes (same constructors, same 13\nCI checks, same `FailureClass` taxonomy) under idiomatic names. When\nno reference implementation exists for the target language yet, use\nPython as the architectural spec and port the shapes.\n\n## Where to start (5 bullets for the agent)\n\n1. **Identify the project's language and workflow conventions.** Look\n   for `pyproject.toml` / `package.json` / `go.mod` / `Gemfile` /\n   `pom.xml`. Note the test runner, linter, and CI wiring — they're\n   how the instrumentation gate will be enforced.\n2. **Grep for an existing observability layer first.** Extend it\n   rather than creating a parallel one. A file named\n   `observability.py` / `observability.ts` / `observability.go`, or a\n   `metrics/` package, is the prime signal.\n3. **Pick the constructor that matches the metric's purpose** (see\n   `references/signal-model.md` + `references/metric-classes.md`). Do\n   not open-code a counter / distribution / gauge literal.\n4. **Use the matching surface pattern** (middleware, decorator, base\n   class) from `references/surface-patterns.md` — don't hand-roll\n   emissions at call sites. Using the pattern is always less code.\n5. **Register in the project's `MetricDef` registry.** CI gate\n   enforces identity + lifecycle rules on the registry contents.\n\n## Charter (read before writing any metric)\n\nEvery metric emitted by this service must be:\n\n1. **Semantically precise** — exactly one of five purposes\n   (outcome / latency / load / resource / correctness), exactly one\n   kind (counter / gauge / distribution), a mandatory unit.\n2. **Bounded** — tag values come from a small enumerated set or an\n   approved bucket function. No raw user ids, URLs, exception strings,\n   or timestamps.\n3. **Enforceable** — defined once as a `MetricDef`, emitted via the\n   validating helper API, checked by CI against the registry before\n   merge.\n4. **Versioned** — identity tuple is immutable under the same name.\n   Meaning change = new name with a `.v2` suffix, 14-day overlap,\n   `retired_at` date.\n5. **Cost-aware** — declares its `emit_frequency`, `sampling_rate`,\n   `max_rate_hz`, and `loop_policy`. Distributions on hot paths sample;\n   counters in loops aggregate.\n6. **Ergonomic** — the correct path is the easiest path. Build\n   `MetricDef`s through `.counter` / `.latency` / `.gauge` / `.resource`\n   / `.failure_counter`. Emit through `emit_counter` / `emit_latency` /\n   `emit_failure` / `time_latency`. Use the surface patterns\n   (`ObservabilityMiddleware`, `InstrumentedHttpClient`,\n   `@instrumented_step`, `retry_with_instrumentation`, `record_fallback`)\n   — they bake in the right emissions so call sites never hand-roll\n   them.\n\n**Does NOT define:** dashboards, alert rules, SLO thresholds, on-call\npolicy, or product analytics. Those depend on this layer being clean.\n\n## When this skill applies (auto-invocation triggers)\n\nInvoke for any change that:\n\n- Adds or modifies code that emits a Sentry metric.\n- Measures a duration, counts failures, or reports a resource amount\n  (tokens, bytes, API units).\n- Wraps a workflow step (Hatchet, Celery, Temporal, Sidekiq, Inngest,\n  BullMQ, or equivalent).\n- Adds a route, middleware, or external-API client.\n- Adds a retry loop, fallback path, or degradation branch.\n- Contains the words \"instrument\", \"emit a metric\", \"add a\n  gauge/counter/distribution\", \"add a span\", \"observe\", \"track system\n  behavior\", \"record timing\", or \"count failures\".\n\nDo **not** invoke for product-analytics changes (button click counts,\nfunnel events, feature-flag exposure). Those belong in your product-\nanalytics tool, not in Sentry instrumentation.\n\n## Decision rules\n\n1. **New metric?** Read `references/signal-model.md` + pick a\n   classmethod constructor (`MetricDef.counter|latency|gauge|resource|failure_counter`).\n   Register in the project's metric registry. **Never** call an emission\n   helper with a raw string or a dynamically-assembled name.\n2. **Tag values?** Either enumerate them in `MetricDef.tag_constraints`\n   or route through a bucket function from\n   `references/tagging-and-cardinality.md`.\n3. **Inside a loop?** Use `AggregatingCounter` or `DurationAccumulator`\n   (see `references/cost-model.md`). If the metric's `loop_policy` is\n   `\"forbidden\"` the CI gate refuses any emission inside a `for`/`while`\n   body for that metric.\n4. **New surface (HTTP route / external API / workflow step / retry /\n   fallback)?** Use the matching reusable pattern from\n   `references/surface-patterns.md`. Don't hand-roll the emissions.\n5. **Changing a metric's meaning, unit, or tag shape?** It's a new\n   versioned metric. See `references/naming-and-lifecycle.md`.\n6. **Failure counter?** Build with `MetricDef.failure_counter(...)` and\n   emit with `emit_failure(metric, failure=classify(exc), tags=...)`.\n   Never pass `str(exc)` as a tag. See\n   `references/failure-taxonomy.md`.\n\n## Detect-or-create\n\nDetect the project language first, then look for an existing\nobservability layer matching that language's conventions. If you find\none, extend it. If not, scaffold from the matching example under\n`examples/<language>/` and rename `yourapp` to the project's package\nroot.\n\n```\npyproject.toml / setup.py  → Python. Use examples/python/.\npackage.json (TS or JS)    → TypeScript/JavaScript. v0.2 — port from\n                             examples/python/ shapes.\ngo.mod                     → Go. v0.2 — port from examples/python/\n                             shapes.\nGemfile                    → Ruby. port from examples/python/ shapes.\npom.xml / build.gradle     → Java/Kotlin. port from examples/python/\n                             shapes.\n```\n\nFor ports: preserve the five constructors, the `FailureClass`\ntaxonomy values, the 13 CI gate checks, and the emission-boundary\nrules. Names become idiomatic (`emit_counter` → `emitCounter`,\n`@instrumented_step` → `instrumentedStep(fn)` higher-order fn, etc.).\n\n## Sections (detailed references)\n\n| Topic | Reference | Example |\n|---|---|---|\n| Charter & scope | `references/charter.md` | — |\n| `MetricDef` schema + constructors | `references/signal-model.md` | `examples/python/metric_def.py` |\n| Five metric classes by purpose | `references/metric-classes.md` | — |\n| Kind semantic rules (counter/gauge/distribution) | `references/semantic-rules.md` | — |\n| Naming + lifecycle (version suffix, retired_at) | `references/naming-and-lifecycle.md` | — |\n| Tagging + cardinality policy + bucket fns | `references/tagging-and-cardinality.md` | `examples/python/metric_tags.py` |\n| Cost model (sampling, rate limit, aggregation) | `references/cost-model.md` | `examples/python/emission_module.py` |\n| Emission boundaries (where to emit) | `references/emission-boundaries.md` | — |\n| Failure taxonomy (`FailureClass` + `classify`) | `references/failure-taxonomy.md` | `examples/python/failure_taxonomy.py` |\n| Reusable surface patterns | `references/surface-patterns.md` | `examples/python/http_middleware.py`, `examples/python/external_api_client.py`, `examples/python/workflow_decorator.py`, `examples/python/retry_loop.py`, `examples/python/fallback_path.py` |\n| Emission helpers + validators | — | `examples/python/emission_module.py` |\n| CI enforcement gate (13 AST checks) | `references/enforcement.md` | `examples/python/ci_gate.py` |\n| Test gates | `references/enforcement.md` | `examples/python/test_gates.py` |\n| PR review rubric | `references/review-rubric.md` | — |\n\n## Project-specific overrides\n\nOn first use in a new project, fill these in once so subsequent\ninvocations know where to land code. The skill's example files use\n`yourapp` placeholders; replace with the actual package root.\n\n### Python (canonical reference — v0.1)\n\n```\nEmission module:    yourapp/observability.py\nRegistry:           yourapp/shared/metrics.py\nTag buckets:        yourapp/shared/metric_tags.py\nFailure taxonomy:   yourapp/shared/failure_taxonomy.py\nHTTP middleware:    yourapp/middleware/observability.py\nWorkflow decorator: yourapp/services/<workflow>/instrumentation.py\nExternal API base:  yourapp/services/providers/instrumented_http_client.py\nRetry helper:       yourapp/services/retry.py\nFallback helper:    yourapp/observability.py (or yourapp/shared/fallback.py)\nCI gate:            scripts/check_metrics.py\n```\n\n### TypeScript / Node (v0.2 — port from Python shapes)\n\n```\nEmission module:    src/observability.ts\nRegistry:           src/shared/metrics.ts\nTag buckets:        src/shared/metricTags.ts\nFailure taxonomy:   src/shared/failureTaxonomy.ts\nHTTP middleware:    src/middleware/observability.ts       (Express/Koa)\n                    src/fastify-plugins/observability.ts  (Fastify)\nWorkflow pattern:   src/workflows/<workflow>/instrumentation.ts\nExternal API base:  src/providers/instrumentedHttpClient.ts\nCI gate:            scripts/check-metrics.ts              (ts-morph / ast-grep)\n```\n\n### Go (v0.2 — port from Python shapes)\n\n```\nEmission package:   internal/observability/metrics.go\nRegistry:           internal/metrics/registry.go\nTag buckets:        internal/metrics/tags.go\nFailure taxonomy:   internal/metrics/failure.go\nHTTP middleware:    internal/middleware/observability.go  (net/http / chi / echo)\nWorker pattern:     internal/workers/<worker>/instrumentation.go\nExternal API:       internal/providers/roundtripper.go    (http.RoundTripper wrapper)\nCI gate:            scripts/check_metrics.go              (go/ast)\n```\n\n## Quality-gate checklist\n\nBefore finalizing a PR that touches instrumentation, walk the review\nrubric (full version in `references/review-rubric.md`):\n\n- [ ] Right `kind` for the meaning (counter / gauge / distribution)?\n- [ ] Name matches `<domain>.<object>.<action>[.<type-suffix>]` and fits\n      `purpose`?\n- [ ] All tag keys in `MetricDef.allowed_tags`; values enumerated or\n      from an approved bucket function?\n- [ ] Emission at a documented boundary / uses a canonical surface\n      pattern?\n- [ ] Duplicative with an existing `MetricDef`? (Search the registry.)\n- [ ] `operational_meaning` unambiguous; will it be interpretable in\n      six months?\n- [ ] `cardinality=\"medium\"` justified in `means=`?\n- [ ] Failure metric uses `emit_failure(...)` + a `FailureClass` value?\n- [ ] Inside a loop → uses `AggregatingCounter` / `DurationAccumulator`?\n- [ ] Hot path → `sampling_rate` / `max_rate_hz` set?\n- [ ] Changing an existing metric → is it actually a new versioned\n      entry, with `retired_at` on the old one?","tags":["sentry","instrumentation","tortastudios","agent-skills","claude-skills","codex-skill","monitoring","observability","telemetry"],"capabilities":["skill","source-tortastudios","skill-sentry-instrumentation","topic-agent-skills","topic-claude-skills","topic-codex-skill","topic-instrumentation","topic-monitoring","topic-observability","topic-sentry","topic-telemetry"],"categories":["sentry-instrumentation"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tortastudios/sentry-instrumentation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tortastudios/sentry-instrumentation","source_repo":"https://github.com/tortastudios/sentry-instrumentation","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (10,885 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T13:03:28.779Z","embedding":null,"createdAt":"2026-04-19T00:40:49.261Z","updatedAt":"2026-04-22T13:03:28.779Z","lastSeenAt":"2026-04-22T13:03:28.779Z","tsv":"'/instrumentation.go':1125 '/instrumentation.py':1042 '/instrumentation.ts':1085 '1':167,313,625 '13':130,871,971 '14':398 '2':200,335,662 '3':230,359,679 '4':253,380,711 '5':162,281,404,736 '6':429,754 'actual':1018,1242 'ad':8 'add':520,555,564,580,583 'agent':166 'aggreg':428,940 'aggregatingcount':684,1226 'alert':489 'alway':278 'amount':538 'analyt':62,77,499,601,617 'api':371,541,562,717,1044,1087,1127 'appli':510 'approv':347,1178 'architectur':153 'assembl':660 'ast':972,1097 'ast-grep':1096 'auto':512 'auto-invoc':511 'awar':407 'bake':472 'base':261,1045,1088 'becom':882 'behavior':59,589 'belong':72,613 'bill':35 'blow':31 'bodi':707 'bound':336 'boundari':879,944,1185 'branch':572 'bucket':348,675,931,1031,1071,1111,1179 'build':438,757 'build.gradle':854 'bullet':163 'bullmq':552 'button':64,603 'byte':540 'call':272,478,495,648 'canon':103,1022,1188 'cardin':929,1209 'celeri':548 'chang':87,391,518,602,737,1236 'charter':299,902 'check':132,372,874,973 'checklist':1138 'chi':1120 'ci':131,189,289,374,698,872,968,1055,1090,1131 'class':262,912 'classifi':768,952 'classmethod':632 'clean':506 'click':65,604 'client':563 'code':247,280,523,1006 'come':339 'constraint':670 'constructor':128,233,633,865,907 'contain':573 'content':298 'convent':175,800 'correct':325,432 'cost':406,935 'cost-awar':405 'count':532,593,605 'counter':19,249,329,425,442,447,451,639,756,760,885,1159 'counter/gauge/distribution':919 'cover':14 'creat':212,783 'dashboard':488 'date':403 'day':399 'decis':623 'declar':408 'decor':260,1040 'defin':361,487 'degrad':571 'depend':501 'detail':897 'detect':781,784 'detect-or-cr':780 'distribut':250,331,420,1161 'document':1184 'duplic':1191 'durat':22,531 'durationaccumul':686,1227 'dynam':659 'dynamically-assembl':658 'easiest':436 'echo':1121 'either':665 'emiss':270,476,650,702,735,878,943,964,1025,1065,1105,1181 'emission-boundari':877 'emit':307,366,410,448,450,452,454,525,577,762,764,884,947,1217 'emitcount':886 'enforc':199,291,360,969 'entri':1246 'enumer':343,666,1174 'equival':554 'ergonom':430 'error':46 'etc':122,895 'event':67,94,607 'everi':305 'exact':316,326 'exampl':6,813,815,901,1010 'examples/python':107,829,838,845,851,858 'examples/python/ci_gate.py':975 'examples/python/emission_module.py':942,967 'examples/python/external_api_client.py':960 'examples/python/failure_taxonomy.py':954 'examples/python/fallback_path.py':963 'examples/python/http_middleware.py':959 'examples/python/metric_def.py':909 'examples/python/metric_tags.py':934 'examples/python/retry_loop.py':962 'examples/python/test_gates.py':979 'examples/python/workflow_decorator.py':961 'exc':769,774 'except':51,355 'exist':143,204,793,1194,1238 'exposur':71,611 'express/koa':1079 'extend':208,805 'extern':561,716,1043,1086,1126 'external-api':560 'face':92 'failur':39,446,455,533,594,638,755,765,767,949,1033,1073,1113,1214,1218 'failureclass':134,867,951,1220 'fallback':470,568,721,1050 'fastifi':1081 'featur':69,609 'feature-flag':68,608 'file':217,1011 'fill':995 'final':1140 'find':803 'first':207,788,989 'fit':1165 'five':319,864,910 'fix':43 'flag':70,610 'fn':890,894 'fns':932 'forbidden':696 'frequenc':411 'full':1150 'function':349,676,1180 'funnel':66,93,606 'gate':196,290,699,873,970,977,1056,1091,1132,1137 'gaug':20,251,330,444,636,1160 'gauge/counter/distribution':582 'gemfil':181,847 'go':119,841,1099 'go.mod':180,840 'go/ast':1134 'grep':201,1098 'hand':268,482,732 'hand-rol':267,481,731 'hatchet':547 'helper':370,651,965,1048,1051 'higher':892 'higher-ord':891 'hot':422,1228 'http':714,1036,1076,1116 'http.roundtripper':1129 'hz':416,1234 'id':353 'ident':292,382 'identifi':168 'idiomat':137,883 'immut':385 'implement':142 'inngest':551 'insid':680,703,1222 'instead':48 'instrument':3,55,84,195,464,468,576,622,887,1145 'instrumentedhttpcli':463 'instrumentedstep':889 'internal/metrics/failure.go':1115 'internal/metrics/registry.go':1109 'internal/metrics/tags.go':1112 'internal/middleware/observability.go':1118 'internal/observability/metrics.go':1107 'internal/providers/roundtripper.go':1128 'internal/workers':1124 'interpret':1205 'invoc':513,1001 'invok':515,597 'java':121 'java/kotlin':855 'js':833 'justifi':1211 'keep':123 'key':1169 'kind':328,916,1155 'know':1002 'land':1005 'languag':114,147,172,787,798 'language-neutr':113 'latenc':322,443,453,457,635 'layer':206,504,795 'less':279 'lifecycl':293,922 'limit':939 'linter':187 'list':44 'liter':252 'load':323 'look':176,790 'loop':418,427,567,682,693,1224 'mandatori':333 'match':235,256,724,796,812,1163 'max':414,1232 'mean':390,741,1158,1200,1213 'measur':529 'medium':1210 'merg':379 'metric':10,23,63,224,237,304,306,528,579,627,645,691,710,739,751,766,911,1215,1239 'metricdef':287,365,439,905,1195 'metricdef.allowed':1171 'metricdef.counter':634 'metricdef.failure':759 'metricdef.tag':669 'middlewar':259,558,1037,1077,1117 'mix':80 'model':936 'modifi':522 'modul':1026,1066 'month':1208 'morph':1095 'must':311 'name':17,138,218,389,393,661,881,921,1162 'net/http':1119 'neutral':115 'never':79,480,647,771 'new':392,626,712,749,993,1244 'node':1059 'note':183 'observ':205,586,794 'observability.go':221 'observability.py':219 'observability.ts':220 'observabilitymiddlewar':462 'old':1252 'on-cal':493 'one':215,317,327,804,1253 'open':246 'open-cod':245 'oper':1199 'order':893 'outcom':321 'overlap':400 'overrid':987 'packag':225,823,1019,1106 'package.json':179,830 'parallel':214 'pass':772 'path':423,433,437,569,1229 'pattern':258,276,461,726,957,1083,1123,1190 'pick':231,630 'placehold':1014 'polici':419,496,694,930 'pom.xml':182,853 'port':116,156,836,843,849,856,861,1061,1101 'pr':980,1142 'precis':315 'preserv':862 'prime':228 'product':61,76,498,600,616 'product-analyt':75,599 'project':170,285,643,786,821,985,994 'project-specif':984 'purpos':239,320,914,1166 'pyproject.toml':178,825 'python':105,150,827,1021,1063,1103 'qualiti':1136 'quality-g':1135 'rate':413,415,938,1231,1233 'rather':210 'raw':50,351,654 're':192 'read':300,628 'record':469,590 'refer':104,111,141,898,900,1023 'references/charter.md':904 'references/cost-model.md':688,941 'references/emission-boundaries.md':948 'references/enforcement.md':974,978 'references/failure-taxonomy.md':779,953 'references/metric-classes.md':242,915 'references/naming-and-lifecycle.md':753,927 'references/review-rubric.md':983,1153 'references/semantic-rules.md':920 'references/signal-model.md':241,629,908 'references/surface-patterns.md':264,728,958 'references/tagging-and-cardinality.md':678,933 'refus':700 'regist':282,640 'registri':288,297,377,646,1028,1068,1108,1198 'renam':817 'replac':1015 'report':535 'resourc':324,445,537,637 'retir':401,925,1248 'retri':466,566,720,1047 'reusabl':725,955 'review':981,1148 'right':12,99,475,1154 'roll':269,483,733 'root':824,1020 'rout':557,672,715 'rubi':120,848 'rubric':982,1149 'rule':4,109,294,490,624,880,918 'runner':186 'safe':27 'sampl':412,424,937,1230 'scaffold':809 'schema':906 'scope':56,903 'scripts/check-metrics.ts':1092 'scripts/check_metrics.go':1133 'scripts/check_metrics.py':1057 'search':1196 'section':896 'see':240,687,752,778 'semant':314,917 'sentri':2,9,34,54,57,83,527,621 'sentry-instrument':1 'servic':310 'set':344,1235 'setup.py':826 'shape':126,158,745,839,846,852,859,1064,1104 'sidekiq':550 'signal':229 'site':273,479 'six':1207 'skill':509,1008 'skill-sentry-instrumentation' 'slo':491 'small':42,342 'source-tortastudios' 'span':585 'spec':154 'specif':986 'src/fastify-plugins/observability.ts':1080 'src/middleware/observability.ts':1078 'src/observability.ts':1067 'src/providers/instrumentedhttpclient.ts':1089 'src/shared/failuretaxonomy.ts':1075 'src/shared/metrics.ts':1069 'src/shared/metrictags.ts':1072 'src/workflows':1084 'start':161 'step':465,546,719,888 'stop':95 'str':773 'string':52,356,655 'subsequ':1000 'suffix':397,924 'surfac':257,460,713,956,1189 'system':58,588 'tag':25,337,663,744,770,777,928,1030,1070,1110,1168,1172 'target':146 'taxonomi':135,868,950,1034,1074,1114 'tempor':549 'test':185,976 'threshold':492 'time':456,591 'timestamp':358 'token':539 'tool':78,100,618 'topic':899 'topic-agent-skills' 'topic-claude-skills' 'topic-codex-skill' 'topic-instrumentation' 'topic-monitoring' 'topic-observability' 'topic-sentry' 'topic-telemetry' 'touch':88,1144 'track':38,587 'trigger':514 'ts':831,1094 'ts-morph':1093 'tupl':383 'type':47 'typescript':118,1058 'typescript/javascript':834 'unambigu':1201 'unit':334,542,742 'url':354 'use':97,149,254,274,458,683,722,828,990,1012,1186,1216,1225 'user':91,352 'user-fac':90 'v0.1':1024 'v0.2':835,842,1060,1100 'v2':396 'valid':369,966 'valu':338,664,869,1173,1221 'version':381,750,923,1151,1245 'versus':28 'via':367 'walk':1146 'way':13 'wire':190 'word':575 'worker':1122 'workflow':174,545,718,1039,1082 'wrap':543 'wrapper':1130 'write':302 'yet':148 'yourapp':818,1013 'yourapp/middleware/observability.py':1038 'yourapp/observability.py':1027,1052 'yourapp/services':1041 'yourapp/services/providers/instrumented_http_client.py':1046 'yourapp/services/retry.py':1049 'yourapp/shared/failure_taxonomy.py':1035 'yourapp/shared/fallback.py':1054 'yourapp/shared/metric_tags.py':1032 'yourapp/shared/metrics.py':1029","prices":[{"id":"b4ef9f60-563f-4c5e-8997-e10be28c962d","listingId":"1774779a-ce8a-4ce6-a255-b716ffafbcbe","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tortastudios","category":"sentry-instrumentation","install_from":"skills.sh"},"createdAt":"2026-04-19T00:40:49.261Z"}],"sources":[{"listingId":"1774779a-ce8a-4ce6-a255-b716ffafbcbe","source":"github","sourceId":"tortastudios/sentry-instrumentation","sourceUrl":"https://github.com/tortastudios/sentry-instrumentation","isPrimary":false,"firstSeenAt":"2026-04-19T00:40:49.261Z","lastSeenAt":"2026-04-22T13:03:28.779Z"}],"details":{"listingId":"1774779a-ce8a-4ce6-a255-b716ffafbcbe","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tortastudios","slug":"sentry-instrumentation","github":{"repo":"tortastudios/sentry-instrumentation","stars":13,"topics":["agent-skills","claude-skills","codex-skill","instrumentation","monitoring","observability","sentry","telemetry"],"license":"mit","html_url":"https://github.com/tortastudios/sentry-instrumentation","pushed_at":"2026-04-17T08:59:54Z","description":"Sentry instrumentation skill for system-behavior tracking","skill_md_sha":"d7e9be73bddb169fc64c421c358d7b1f6e4f5300","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tortastudios/sentry-instrumentation"},"layout":"root","source":"github","category":"sentry-instrumentation","frontmatter":{"name":"sentry-instrumentation","description":"Rules and examples for adding Sentry metrics the right way. Covers how to name a counter, gauge, or duration metric; which tags are safe versus which will blow up your Sentry bill; how to track failures with a small fixed list of error types instead of raw exception strings; and how to add metrics around HTTP routes, external API calls, workflow steps, retry loops, and fallback paths without copy-pasting emit calls everywhere. Ships a CI check that blocks bad metrics before merge. Use this when someone asks to \"instrument\" code, \"add a metric\", \"track duration\", \"count failures\", \"emit a counter/gauge/distribution\", \"add a span\", \"observe\" a workflow step, or add a route, external API client, retry loop, or fallback path. Python reference examples included; the same shapes work in any language."},"skills_sh_url":"https://skills.sh/tortastudios/sentry-instrumentation"},"updatedAt":"2026-04-22T13:03:28.779Z"}}