Skip to content
Back to skills

Monitoring Pingdom

ASecurity

Use when working with Pingdom — pingdom uptime monitoring with check management, transaction checks, page speed analysis, alerting configuration, and performance reporting. Covers HTTP/TCP/UDP checks, real user monitoring, response time analysis, outage history, and contact management. Use when managing uptime checks, analyzing performance, reviewing outages, or configuring alerts via Pingdom API.

  • 6 stars
  • 0 votes
  • 0 copies
  • 6 views
  • Added September 8, 2026
toolsgobashapisecurityperformance

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add cloudthinker-ai/CloudSkills --skill monitoring-pingdom --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Monitoring Pingdom?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Monitoring Pingdom
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/cloudthinker-ai-monitoring-pingdom/badge)](https://www.skillsdirectory.com/skills/cloudthinker-ai-monitoring-pingdom)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: monitoring-pingdom
description: |
  Use when working with Pingdom — pingdom uptime monitoring with check
  management, transaction checks, page speed analysis, alerting configuration,
  and performance reporting. Covers HTTP/TCP/UDP checks, real user monitoring,
  response time analysis, outage history, and contact management. Use when
  managing uptime checks, analyzing performance, reviewing outages, or
  configuring alerts via Pingdom API.
connection_type: pingdom
preload: false
---

# Pingdom Monitoring Skill

Monitor and manage uptime checks, performance, and alerts using the Pingdom API.

## API Conventions

### Authentication
Pingdom API uses Bearer token authentication — injected by connection. Never hardcode tokens.

### Base URL
`https://api.pingdom.com/api/3.1/`

### Output Rules
- **TOKEN EFFICIENCY**: Target <=50 lines per output
- Use `jq` to extract check status and performance data
- NEVER dump full response histories — summarize with statistics

### Core Helper Function

```bash
#!/bin/bash

pingdom_api() {
    local method="$1"
    local endpoint="$2"
    local data="${3:-}"

    if [ -n "$data" ]; then
        curl -s -X "$method" \
            -H "Authorization: Bearer ${PINGDOM_API_TOKEN}" \
            -H "Content-Type: application/json" \
            "https://api.pingdom.com/api/3.1${endpoint}" \
            -d "$data"
    else
        curl -s -X "$method" \
            -H "Authorization: Bearer ${PINGDOM_API_TOKEN}" \
            "https://api.pingdom.com/api/3.1${endpoint}"
    fi
}
```

## Parallel Execution

```bash
{
    pingdom_api GET "/checks" &
    pingdom_api GET "/alerts" &
    pingdom_api GET "/contacts" &
}
wait
```

## Anti-Hallucination Rules

**NEVER assume check IDs, check names, or contact IDs. ALWAYS discover first.**

### Phase 1: Discovery

```bash
#!/bin/bash
echo "=== All Checks ==="
pingdom_api GET "/checks" \
    | jq -r '.checks[] | "\(.id)\t\(.type)\t\(.status)\t\(.name)\t\(.hostname)"' | head -20

echo ""
echo "=== Check Types ==="
pingdom_api GET "/checks" \
    | jq -r '[.checks[].type] | group_by(.) | map("\(.[0]): \(length)") | .[]'

echo ""
echo "=== Alert Contacts ==="
pingdom_api GET "/contacts" \
    | jq -r '.contacts[] | "\(.id)\t\(.name)\t\(.notification_targets | keys | join(","))"' | head -10
```

## Common Operations

### Uptime Check Status Overview

```bash
#!/bin/bash
echo "=== Check Status Summary ==="
CHECKS=$(pingdom_api GET "/checks")

echo "$CHECKS" | jq '{
    total: (.checks | length),
    up: [.checks[] | select(.status == "up")] | length,
    down: [.checks[] | select(.status == "down")] | length,
    paused: [.checks[] | select(.status == "paused")] | length
}'

echo ""
echo "=== Down Checks ==="
echo "$CHECKS" | jq -r '.checks[] | select(.status == "down") | "\(.name)\t\(.hostname)\tlast_response:\(.lastresponsetime)ms"'

echo ""
echo "=== All Checks with Response Times ==="
echo "$CHECKS" | jq -r '.checks[] | select(.status != "paused") | "\(.status)\t\(.lastresponsetime)ms\t\(.name)\t\(.hostname)"' \
    | sort | head -20
```

### Performance Analysis

```bash
#!/bin/bash
CHECK_ID="${1:?Check ID required}"

echo "=== Performance Summary (30 days) ==="
FROM=$(date -d '30 days ago' +%s 2>/dev/null || date -v-30d +%s)
TO=$(date +%s)

pingdom_api GET "/summary.performance/${CHECK_ID}?from=${FROM}&to=${TO}&resolution=day" \
    | jq -r '.summary.days[] | "\(.starttime | strftime("%Y-%m-%d"))\tavg:\(.avgresponse)ms\tup:\(.uptime)s\tdown:\(.downtime)s"' \
    | head -15

echo ""
echo "=== Average Response Time ==="
pingdom_api GET "/summary.average/${CHECK_ID}?from=${FROM}&to=${TO}" \
    | jq '{avgresponse_ms: .summary.responsetime.avgresponse, from: (.summary.responsetime.from | strftime("%Y-%m-%d")), to: (.summary.responsetime.to | strftime("%Y-%m-%d"))}'
```

### Outage History

```bash
#!/bin/bash
CHECK_ID="${1:?Check ID required}"

echo "=== Outage History (30 days) ==="
FROM=$(date -d '30 days ago' +%s 2>/dev/null || date -v-30d +%s)
TO=$(date +%s)

pingdom_api GET "/summary.outage/${CHECK_ID}?from=${FROM}&to=${TO}" \
    | jq -r '.summary.states[] | select(.status == "down") | "\(.timefrom | strftime("%Y-%m-%d %H:%M"))\tto\t\(.timeto | strftime("%Y-%m-%d %H:%M"))\t\((.timeto - .timefrom) / 60 | floor)min"' \
    | head -15

echo ""
echo "=== Uptime Percentage ==="
pingdom_api GET "/summary.average/${CHECK_ID}?from=${FROM}&to=${TO}&includeuptime=true" \
    | jq '.summary.status | {
        total_up: .totalup,
        total_down: .totaldown,
        uptime_pct: ((.totalup / (.totalup + .totaldown)) * 10000 | round / 100)
    }'
```

### Transaction Checks

```bash
#!/bin/bash
echo "=== Transaction Checks ==="
pingdom_api GET "/checks?type=httpcustom" \
    | jq -r '.checks[] | "\(.id)\t\(.status)\t\(.name)\t\(.lastresponsetime)ms"' | head -15

echo ""
echo "=== Transaction Check Steps ==="
CHECK_ID="${1:-}"
if [ -n "$CHECK_ID" ]; then
    pingdom_api GET "/checks/${CHECK_ID}" \
        | jq -r '.check | {name, type, status, steps: (.steps // [] | length)}'
fi
```

### Alerting & Contact Management

```bash
#!/bin/bash
echo "=== Recent Alerts ==="
pingdom_api GET "/actions?limit=20" \
    | jq -r '.actions.alerts[] | "\(.checkid)\t\(.status)\t\(.messagefull[0:60])\t\(.contactname)"' | head -15

echo ""
echo "=== Contacts ==="
pingdom_api GET "/contacts" \
    | jq -r '.contacts[] | "\(.id)\t\(.name)\t\(.notification_targets | to_entries | map("\(.key):\(.value | length)") | join(", "))"'

echo ""
echo "=== Teams ==="
pingdom_api GET "/teams" \
    | jq -r '.teams[] | "\(.id)\t\(.name)\t\(.members | length) members"' | head -10
```

## Output Format

Present results as a structured report:
```
Monitoring Pingdom Report
═════════════════════════
Resources discovered: [count]

Resource       Status    Key Metric    Issues
──────────────────────────────────────────────
[name]         [ok/warn] [value]       [findings]

Summary: [total] resources | [ok] healthy | [warn] warnings | [crit] critical
Action Items: [list of prioritized findings]
```

Target ≤50 lines of output. Use tables for multi-resource comparisons.

## Counter-Rationalizations

| Shortcut | Counter | Why |
|----------|---------|-----|
| "I'll skip discovery and check known resources" | Always run Phase 1 discovery first | Resource names change, new resources appear — assumed names cause errors |
| "The user only asked for a quick check" | Follow the full discovery → analysis flow | Quick checks miss critical issues; structured analysis catches silent failures |
| "Default configuration is probably fine" | Audit configuration explicitly | Defaults often leave logging, security, and optimization features disabled |
| "Metrics aren't needed for this" | Always check relevant metrics when available | API/CLI responses show current state; metrics reveal trends and intermittent issues |
| "I don't have access to that" | Try the command and report the actual error | Assumed permission failures prevent useful investigation; actual errors are informative |

## Common Pitfalls

- **API version**: Use `/api/3.1/` — older versions are deprecated
- **Timestamps**: Unix epoch seconds for `from`/`to` parameters — not milliseconds
- **Resolution values**: `hour`, `day`, `week` for performance summaries — not arbitrary intervals
- **Check types**: `http`, `httpcustom`, `tcp`, `ping`, `dns`, `udp`, `smtp`, `pop3`, `imap`
- **Rate limits**: 7 requests/second — parallelize but add small stagger for >5 concurrent calls
- **Paused checks**: Paused checks return no performance data — filter with `status != "paused"`
- **Contact types**: `email`, `sms`, `push` notification targets — configure per contact
- **Probe regions**: Results vary by probe location — use `include_teams=true` for team-filtered results

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

View all in tools →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.