{
  "schemaVersion": "1.0",
  "item": {
    "slug": "prom",
    "name": "Prometheus",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/ivangdavila/prom",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/prom",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/prom",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=prom",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/prom"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/prom",
    "agentPageUrl": "https://openagent3.xyz/skills/prom/agent",
    "manifestUrl": "https://openagent3.xyz/skills/prom/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/prom/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Cardinality Explosions",
        "body": "Every unique label combination creates a new time series — user_id as label kills Prometheus\nAvoid high-cardinality labels: user IDs, email addresses, request IDs, timestamps, UUIDs\nCheck cardinality: prometheus_tsdb_head_series metric — above 1M series needs attention\nUse histograms for latency, not per-request labels — buckets are fixed cardinality\nRelabeling can drop dangerous labels before ingestion: labeldrop in scrape config"
      },
      {
        "title": "Histogram vs Summary",
        "body": "Histograms: use for SLOs, aggregatable across instances, buckets defined upfront\nSummaries: use when you need exact percentiles, cannot aggregate across instances\nHistogram bucket boundaries must be defined before data arrives — wrong buckets = wrong percentiles\nDefault buckets (.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10) assume HTTP latency — adjust for your use case"
      },
      {
        "title": "Rate and Increase",
        "body": "rate() requires range selector at least 4x scrape interval — rate(metric[1m]) with 30s scrape misses data\nrate() is per-second, increase() is total over range — don't confuse them\nCounter resets on restart — rate() handles this, raw delta doesn't\nirate() uses only last two samples — too spiky for alerting, use rate() for alerts"
      },
      {
        "title": "Alerting Mistakes",
        "body": "Alert on symptoms, not causes — \"high latency\" not \"high CPU\"\nfor clause prevents flapping: for: 5m means condition must hold 5 minutes before firing\nMissing for clause = fires immediately on first match = noisy\nAlerts need runbook_url label — on-call needs to know what to do, not just that something's wrong\nTest alerts with promtool check rules — syntax errors discovered at 3am are bad"
      },
      {
        "title": "PromQL Traps",
        "body": "and is intersection by labels, not boolean AND — results must have matching label sets\nor fills in missing series, doesn't do boolean OR on values\n{} without metric name is expensive — scans all metrics\noffset goes back in time: metric offset 1h is value from 1 hour ago\nComparison operators filter series: http_requests > 100 drops series below 100, doesn't return boolean"
      },
      {
        "title": "Scrape Configuration",
        "body": "honor_labels: true trusts source labels — use only when source is authoritative (e.g., Pushgateway)\nscrape_timeout must be less than scrape_interval — otherwise overlapping scrapes\nStatic configs don't reload without restart — use file_sd or service discovery for dynamic targets\nTLS verification disabled (insecure_skip_verify) should be temporary, never permanent"
      },
      {
        "title": "Pushgateway Pitfalls",
        "body": "Pushgateway is for batch jobs, not services — services should expose /metrics\nMetrics persist until deleted — stale metrics from dead jobs confuse dashboards\nAdd job and instance labels to distinguish sources — default grouping hides failures\nDelete metrics when job completes: curl -X DELETE http://pushgateway/metrics/job/myjob"
      },
      {
        "title": "Recording Rules",
        "body": "Pre-compute expensive queries: record: job:request_duration_seconds:rate5m\nNaming convention: level:metric:operations — helps identify what rules produce\nRecording rules update every evaluation interval — not instant, plan for slight delay\nReduce cardinality with recording rules: aggregate away labels you don't need for alerting"
      },
      {
        "title": "Federation and Remote Write",
        "body": "Federation for pulling from other Prometheus — use sparingly, adds latency\nRemote write for long-term storage — Prometheus local storage is not durable\nRemote write can buffer during outages — but buffer is finite, data loss on extended outages\nPrometheus is not highly available by default — run two instances scraping same targets"
      },
      {
        "title": "Common Operational Issues",
        "body": "TSDB corruption on unclean shutdown — use --storage.tsdb.wal-compression and monitor disk space\nMemory grows with series count — each series costs ~3KB RAM\nCompaction pauses during high load — leave 40% disk headroom\nScrape targets stuck \"Unknown\" — check network, firewall, target actually exposing /metrics"
      },
      {
        "title": "Label Best Practices",
        "body": "Use labels for dimensions you'll filter/aggregate by — environment, service, instance\nKeep label values low-cardinality — tens or hundreds, not thousands\nConsistent naming: snake_case, prefix with domain: http_requests_total, node_cpu_seconds_total\nle label is reserved for histogram buckets — don't use for other purposes"
      }
    ],
    "body": "Cardinality Explosions\nEvery unique label combination creates a new time series — user_id as label kills Prometheus\nAvoid high-cardinality labels: user IDs, email addresses, request IDs, timestamps, UUIDs\nCheck cardinality: prometheus_tsdb_head_series metric — above 1M series needs attention\nUse histograms for latency, not per-request labels — buckets are fixed cardinality\nRelabeling can drop dangerous labels before ingestion: labeldrop in scrape config\nHistogram vs Summary\nHistograms: use for SLOs, aggregatable across instances, buckets defined upfront\nSummaries: use when you need exact percentiles, cannot aggregate across instances\nHistogram bucket boundaries must be defined before data arrives — wrong buckets = wrong percentiles\nDefault buckets (.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10) assume HTTP latency — adjust for your use case\nRate and Increase\nrate() requires range selector at least 4x scrape interval — rate(metric[1m]) with 30s scrape misses data\nrate() is per-second, increase() is total over range — don't confuse them\nCounter resets on restart — rate() handles this, raw delta doesn't\nirate() uses only last two samples — too spiky for alerting, use rate() for alerts\nAlerting Mistakes\nAlert on symptoms, not causes — \"high latency\" not \"high CPU\"\nfor clause prevents flapping: for: 5m means condition must hold 5 minutes before firing\nMissing for clause = fires immediately on first match = noisy\nAlerts need runbook_url label — on-call needs to know what to do, not just that something's wrong\nTest alerts with promtool check rules — syntax errors discovered at 3am are bad\nPromQL Traps\nand is intersection by labels, not boolean AND — results must have matching label sets\nor fills in missing series, doesn't do boolean OR on values\n{} without metric name is expensive — scans all metrics\noffset goes back in time: metric offset 1h is value from 1 hour ago\nComparison operators filter series: http_requests > 100 drops series below 100, doesn't return boolean\nScrape Configuration\nhonor_labels: true trusts source labels — use only when source is authoritative (e.g., Pushgateway)\nscrape_timeout must be less than scrape_interval — otherwise overlapping scrapes\nStatic configs don't reload without restart — use file_sd or service discovery for dynamic targets\nTLS verification disabled (insecure_skip_verify) should be temporary, never permanent\nPushgateway Pitfalls\nPushgateway is for batch jobs, not services — services should expose /metrics\nMetrics persist until deleted — stale metrics from dead jobs confuse dashboards\nAdd job and instance labels to distinguish sources — default grouping hides failures\nDelete metrics when job completes: curl -X DELETE http://pushgateway/metrics/job/myjob\nRecording Rules\nPre-compute expensive queries: record: job:request_duration_seconds:rate5m\nNaming convention: level:metric:operations — helps identify what rules produce\nRecording rules update every evaluation interval — not instant, plan for slight delay\nReduce cardinality with recording rules: aggregate away labels you don't need for alerting\nFederation and Remote Write\nFederation for pulling from other Prometheus — use sparingly, adds latency\nRemote write for long-term storage — Prometheus local storage is not durable\nRemote write can buffer during outages — but buffer is finite, data loss on extended outages\nPrometheus is not highly available by default — run two instances scraping same targets\nCommon Operational Issues\nTSDB corruption on unclean shutdown — use --storage.tsdb.wal-compression and monitor disk space\nMemory grows with series count — each series costs ~3KB RAM\nCompaction pauses during high load — leave 40% disk headroom\nScrape targets stuck \"Unknown\" — check network, firewall, target actually exposing /metrics\nLabel Best Practices\nUse labels for dimensions you'll filter/aggregate by — environment, service, instance\nKeep label values low-cardinality — tens or hundreds, not thousands\nConsistent naming: snake_case, prefix with domain: http_requests_total, node_cpu_seconds_total\nle label is reserved for histogram buckets — don't use for other purposes"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/prom",
    "publisherUrl": "https://clawhub.ai/ivangdavila/prom",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/prom",
    "downloadUrl": "https://openagent3.xyz/downloads/prom",
    "agentUrl": "https://openagent3.xyz/skills/prom/agent",
    "manifestUrl": "https://openagent3.xyz/skills/prom/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/prom/agent.md"
  }
}