본문으로 건너뛰기
cccskills
무료GitHub에 공개

observability-triage

Investigate OpenSEO production errors in Cloudflare Workers Observability. Count worker invocations accurately, compare periods and deployment versions, and filter previously investigated noise to focus analysis on errors that need attention.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Triage OpenSEO production errors in Cloudflare Workers Observability — verified query recipes, counting gotchas, and a known-noise filter list applied automatically. Use when asked to review Cloudflare logs/observability, count OOMs or worker errors, compare error rates between periods, or investigate a prod error spike.

연동 도구Cloudflare
설치 방법 보기

이럴 때 유용합니다

  • Investigating a spike in production errors
  • Counting out-of-memory events and worker failures
  • Comparing error rates across periods or deployments
  • Filtering known noise from error logs

포함된 파일(1)

  • SKILL.md6.8 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Observability triage

Query Cloudflare Workers Observability for prod errors, count them correctly, and skip the noise that has already been investigated to a dead end. Apply the known-noise list below without re-investigating those entries.

Access

  • Resolve the account at runtime — never hardcode it: the cloudflare-api MCP server pre-binds accountId in mcp__cloudflare-api__execute, and npx wrangler whoami prints it. The workers to triage are the ones this repo deploys (see deploy/alchemy/alchemy.run.ts): the main app worker plus the aux workers (audit engine, landing, self-host).
  • Query via the cloudflare-api MCP server (mcp__cloudflare-api__execute). If its tools are absent, run its authenticate flow and give the user the URL — wrangler's OAuth token gets a 403 on the observability API (missing scope), so don't burn time on curl-with-wrangler-token.
  • PostHog is the second error source but cannot see exceededMemory / canceled / responseStreamDisconnected outcomes — worker-outcome questions are answerable only here.

Query recipes (verified shapes)

POST /accounts/{account_id}/workers/observability/telemetry/query. All of these are load-bearing; the API's 400s are opaque:

  • queryId: "adhoc" is required. Timeframe is epoch milliseconds: timeframe: { from, to }.

  • Count invocations by outcome:

    {
      "queryId": "adhoc",
      "timeframe": { "from": 0, "to": 0 },
      "parameters": {
        "datasets": ["cloudflare-workers"],
        "filters": [
          { "key": "$metadata.type", "operation": "eq", "value": "cf-worker-event", "type": "string" }
        ],
        "calculations": [{ "operator": "count", "alias": "count" }],
        "groupBys": [
          { "value": "$workers.scriptName", "type": "string" },
          { "value": "$workers.outcome", "type": "string" }
        ],
        "limit": 100
      },
      "view": "calculations",
      "limit": 100
    }
    
  • The cf-worker-event filter is what makes counts mean invocations; without it you count every log line.

  • Raw samples: view: "events", empty calculations/groupBys, small limit. Events carry $metadata (service, trigger, level, message, fingerprint, requestId) and $workers (outcome, scriptName, scriptVersion, wallTimeMs, cpuTimeMs, eventType).

  • Error-level app logs grouped by message: filter $metadata.level eq error, groupBy $metadata.message.

  • Verified filter operations: eq, neq. Percentiles: the API wants "median", not "p50". Filter for substrings client-side on fetched events.

  • Useful drill-downs: groupBy $metadata.trigger (route), $workers.scriptVersion (did a deploy change the rate mid-window), $workers.event.request.headers.user-agent.

Counting gotchas

  • Grouped results are unsorted and effectively capped (~10 rows returned regardless of limit). A missing group ≠ zero. To see error outcomes, add $workers.outcome neq ok instead of hoping the error rows make the cut; sort client-side.
  • One isolate death fans out. An OOM kills every request pinned to the isolate at the same instant — cluster raw OOM events by timestamp before reading the count as user impact.
  • Message prefixes fragment groups. Logs with leading timestamps (better-auth's format) split one error into N single-count groups; grouped-by-message counts badly understate them. Sample events and merge client-side.
  • Prod deploys are manual — main being fixed doesn't mean prod runs the fix. Check $workers.scriptVersion and the scripts' modified_on before concluding a fix didn't work.

Known noise — filter these out, do not re-investigate

Entries land here only after an investigation proved there is no first-party emit site to fix or demote. Each keeps the one condition that would make it real signal again.

1. SAM chat Durable Object lifecycle (close code 1006)

  • Messages (one phenomenon, counted three ways): Connection closed: this Durable Object instance is no longer active. Reconnect or retry the request. (hibernation/eviction), Durable Object reset because its code was updated. (deploy), plus the paired invocation summary whose $metadata.error is close.
  • Identify by: eventType: "hibernatableWebSocket", entrypoint SamChatAgent/OnboardingChatAgent, webSocketType: "close", code: 1006, wasClean: false, outcome: "exception", single-digit wallTimeMs, cpuTimeMs: 0, no stack. Fingerprints 3aa4cac26653d09a0a41100a33d413ae (exception), 0ae15457af49b4d9a117eeecf66b040a (summary).
  • Why unfixable: the DO is destroyed under the JS — its IoContext is already aborted when workerd delivers webSocketClose, so the first await never settles. partyserver already try/catches the whole close path; an onClose override would catch nothing.
  • Nothing breaks: transcripts persist per message in DO SQLite, PartySocket reconnects unconditionally, and credit metering (onChatResponse) never fires on an aborted turn.
  • Real signal: a sustained rise that does not correlate with a deploy (would mean mid-conversation evictions beyond hibernation).

2. Network connection lost.

  • Identify by: fingerprint be89d4ff7a64cb4d4dceae0f51cfe708, or the message verbatim. Runtime-generated shape: source.level absent, source.exception present, $metadata.origin: "fetch" — the opposite of every app log (source.level present, no exception).
  • Why unfixable: workerd's own record of a client disconnecting mid-stream; the exception never enters app code — the sibling request event for the same requestId has outcome: "ok". No emit site exists; wrangler.jsonc observability config has no per-message filter. Do not add try/catch around the stream handlers (dead ceremony).
  • Real signal: if the /mcp share of this group grows, treat it as a tool-call-latency symptom (clients timing out and cancelling) and route it to the /mcp performance track — not to this log group.

Runtime-vs-app litmus test

Before investigating any unfamiliar error event: source.level absent + source.exception present ⇒ the Workers runtime wrote it, not the app. There is no call site to grep for; judge it by the sibling request's outcome.

Adding an entry

Add to this list only after establishing there is no first-party emit site (grep the message; check the runtime-vs-app litmus above) and nothing is left in a wrong state. Every entry must include identify-by markers (fingerprint if stable) and its real-signal condition.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Research questions about a market, examine recorded ChatGPT answers and cited websites, and identify themes where a brand appears or is missing. Receive ranked prompt groups and suggested questions for future tracking.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Finding question themes related to a product category
  • Checking brand mentions and cited websites
  • Identifying themes with limited brand visibility
every-app/open-seo2.4만2026년 10월 14일 업데이트

Audit how a brand appears in AI answers by examining mentions, website citations, competitors, and cited pages. Receive one to three evidence-based priorities, such as improving a page, seeking inclusion in a relevant source, or fixing access barriers.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Investigate why AI answers recommend competitors
  • Check brand mentions and website citations
  • Prioritize pages to improve or create
every-app/open-seo2.4만2026년 10월 14일 업데이트

Compare several competitors to see which sites lead a search market, what content earns rankings, and where opportunities remain. The report covers keyword reach, links from other sites, and practical next steps.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Identifying leading sites in a search market
  • Comparing competitors' successful content themes
  • Finding underserved topics to target
every-app/open-seo2.4만2026년 10월 14일 업데이트

Analyze a named competitor's unpaid search traffic, ranking keywords, content themes, and links from other websites. Identify strengths, weaknesses, and relevant opportunities, with an optional comparison to your own site and a report of recommended actions.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Investigate a specific competitor's SEO strengths
  • Find pages and keywords worth targeting
  • Compare a competitor with your own site
every-app/open-seo2.4만2026년 10월 14일 업데이트

Create or update skills using OpenSEO's repository conventions. Keep one canonical source, distinguish internal and public workflows, maintain Claude Code links, and register public skills in documentation, the in-app agent, and plugin bundles.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Add a new skill to the OpenSEO repository
  • Turn a development workflow into an internal skill
  • Repair drift between skill directories
every-app/open-seo2.4만2026년 10월 14일 업데이트

deslop

무료

Edit blog posts, documentation, marketing copy, and PR descriptions to remove formulaic AI writing patterns. Replace filler, vague claims, and staged emphasis with plain statements while preserving concrete details and the writer's voice.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Editing AI-drafted blog posts
  • Removing wordy introductions from documentation
  • Toning down exaggerated marketing copy
every-app/open-seo2.4만2026년 10월 14일 업데이트

every-app의 스킬 모두 보기

이 스킬의 문제 신고