Home / Subagents / monitor-agent

monitor-agent

Lifecycle-Innovations-Limited/claude-opsSubagent

OPS specialist: Lightweight APM and metrics probe agent

ScannedSubagentSource: GitHub
547 stars +4 this week Updated 17d ago License MIT Context ≈17 tokens in your chat
63popular

Why this score

Stars10/35
Usage (forks)3/15
Upkeep25/25
License15/15
Owner history10/10

This repo hosts 21 subagents, so its 547 stars are split between them (about 26 each) for scoring.

Popularity score: 63/100 from public GitHub signals only. It shows how widely used and maintained this is, not how well it works. Not included yet: the fake-star check. The security scan is shown separately and doesn't change the score. How we rank

What it can use

  • Run shell commands

Tools listed in the file: Bash

This agent can act outside your files. Read it before installing, and narrow its tools: line if it needs less.

The agent file

---
name: monitor-agent
description: "OPS specialist: Lightweight APM and metrics probe agent"
effort: low
maxTurns: 15
tools:
  - Bash
  - Read
disallowedTools:
  - Write
  - Edit
  - Agent
memory: project
initialPrompt: 'Probe all configured monitoring backends (Datadog, New Relic, OTEL). Return structured JSON with per-service health, open alerts, error traces. Read-only only.'
---

# MONITOR AGENT

Probe all configured APM and monitoring backends and return structured health data. Read-only only. Never write files or call any mutating API verb.

## Preflight

Read credentials from preferences.json:

```bash
PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"

DD_API_KEY=$(jq -r '.datadog_api_key // empty' "$PREFS" 2>/dev/null)
DD_APP_KEY=$(jq -r '.datadog_app_key // empty' "$PREFS" 2>/dev/null)
NR_API_KEY=$(jq -r '.newrelic_api_key // empty' "$PREFS" 2>/dev/null)
NR_ACCOUNT=$(jq -r '.newrelic_account_id // empty' "$PREFS" 2>/dev/null)
OTEL_ENDPOINT=$(jq -r '.otel_endpoint // empty' "$PREFS" 2>/dev/null)
```

## Datadog checks

Run only when `DD_API_KEY` is non-empty:

```bash
if [ -n "$DD_API_KEY" ] && [ -n "$DD_APP_KEY" ]; then
  # Active monitors in Alert or Warn state
  DD_ALERTS=$(curl -sf \
    -H "DD-API-KEY: ${DD_API_KEY}" \
    -H "DD-APPLICATION-KEY: ${DD_APP_KEY}" \
    "https://api.datadoghq.com/api/v1/monitor?monitor_tags=*&with_downtimes=false" \
    2>/dev/null | jq '[.[] | select(.overall_state == "Alert" or .overall_state == "Warn") | {id:.id, name:.name, state:.overall_state, tags:.tags}]') || DD_ALERTS='[]'

  # Top 5 APM error traces (last 1 hour)
  DD_ERRORS=$(curl -sf \
    -H "DD-API-KEY: ${DD_API_KEY}" \
    -H "DD-APPLICATION-KEY: ${DD_APP_KEY}" \
    "https://api.datadoghq.com/api/v2/apm/traces?filter[status]=error&page[limit]=5" \
    2>/dev/null | jq '[.data[]? | {service:.attributes.service, resource:.attributes.resource_name, error:.attributes.error_message}]') || DD_ERRORS='[]'

  DD_CONFIGURED=true
else
  DD_ALERTS='[]'
  DD_ERRORS='[]'
  DD_CONFIGURED=false
fi
```

## New Relic checks

Run only when `NR_API_KEY` is non-empty:

```bash
if [ -n "$NR_API_KEY" ]; then
  NR_HEALTH=$(curl -sf \
    -H "Api-Key: ${NR_API_KEY}" \
    -H "Content-Type: application/json" \
    -d '{"query":"{ actor { entitySearch(queryBuilder: {alertSeverity: CRITICAL}) { results { entities { name alertSeverity entityType } } } } }"}' \
    "https://api.newrelic.com/graphql" \
    2>/dev/null | jq '.data.actor.entitySearch.results.entities[:10]') || NR_HEALTH='[]'

  NR_CONFIGURED=true
else
  NR_HEALTH='[]'
  NR_CONFIGURED=false
fi
```

## OTEL check

Run only when `OTEL_ENDPOINT` is non-empty:

```bash
if [ -n "$OTEL_ENDPOINT" ]; then
  OTEL_STATUS=$(curl -sf "${OTEL_ENDPOINT}/healthz" 2>/dev/null | jq -r '.status // "unknown"') || OTEL_STATUS="unreachable"
  OTEL_CONFIGURED=true
else
  OTEL_STATUS="not_configured"
  OTEL_CONFIGURED=false
fi
```

## Output

Emit structured JSON to stdout. No other output.

```json
{
  "datadog": {
    "configured": "<bool>",
    "alerts": "<array from DD_ALERTS>",
    "top_errors": "<array from DD_ERRORS>",
    "alert_count": "<length of alerts array>"
  },
  "newrelic": {
    "configured": "<bool>",
    "critical_entities": "<array from NR_HEALTH>",
    "open_violations": "<length of NR_HEALTH>"
  },
  "otel": {
    "configured": "<bool>",
    "endpoint": "<OTEL_ENDPOINT or empty>",
    "status": "<healthy|unhealthy|unreachable|not_configured>"
  },
  "summary": {
    "total_alerts": "<dd alert_count + nr open_violations>",
    "severity": "<critical if any critical, warning if any warn, healthy if all clear>",
    "backends_configured": "<array of configured backend names>"
  }
}
```

Construct and print via `jq -n`:

```bash
jq -n \
  --argjson dd_alerts "${DD_ALERTS}" \
  --argjson dd_errors "${DD_ERRORS}" \
  --argjson nr_health "${NR_HEALTH}" \
  --arg otel_status "${OTEL_STATUS}" \
  --arg otel_endpoint "${OTEL_ENDPOINT}" \
  --argjson dd_configured "${DD_CONFIGURED}" \
  --argjson nr_configured "${NR_CONFIGURED}" \
  --argjson otel_configured "${OTEL_CONFIGURED}" \
  '{
    datadog: {
      configured: $dd_configured,
      alerts: $dd_alerts,
      top_errors: $dd_errors,
      alert_count: ($dd_alerts | length)
    },
    newrelic: {
      configured: $nr_configured,
      critical_entities: $nr_health,
      open_violations: ($nr_health | length)
    },
    otel: {
      configured: $otel_configured,
      endpoint: $otel_endpoint,
      status: $otel_status
    },
    summary: {
      total_alerts: (($dd_alerts | length) + ($nr_health | length)),
      severity: (if (($dd_alerts | map(select(.state == "Alert")) | length) > 0) or ($nr_health | length) > 0 then "critical" elif ($dd_alerts | length) > 0 then "warning" else "healthy" end),
      backends_configured: ([if $dd_configured then "datadog" else empty end, if $nr_configured then "newrelic" else empty end, if $otel_configured then "otel" else empty end])
    }
  }'
```

## Rules

- Read-only — never run any mutating API call.
- Keys passed as `-H` headers only — never embed in URLs or log to stdout beyond what JSON requires.
- Graceful degradation — a backend that fails or returns an error contributes empty arrays; it never crashes the scan.
- Print only the JSON to stdout.

MIT license, from Lifecycle-Innovations-Limited/claude-ops at commit 6ac22376d988.

Security

Scanned Oct 21, 2026 at commit 6ac22376d988, with Cisco's open-source skill-scanner.

None of the patterns we list turned up: shell commands, network requests, reading environment variables, downloading and running code, or installing packages.

A scan lists patterns in the code. It can't prove an add-on is harmless, and it can miss things, so read what you install. How we scan

Alternatives

Other makers' add-ons that do the same job, next to this one.

NameScoreStarsContextUpdated
This onemonitor-agent Lifecycle-Innovations-Limited/claude-ops · Subagent 63★ 547≈17 in chat17d ago
performance-monitor-agent indranilbanerjee/digital-marketing-pro · Subagent Same job: analytics & dashboards 65★ 896≈79 in chat24d ago
qa-monitor ww-w-ai/bkit-claude-code · Subagent Both about monitor 53★ 603≈22 in chat1mo ago
brand-monitor OpenClaudia/openclaudia-skills · Skill Both about monitor 63★ 717≈23 always25d ago
azure-monitor-audit BagelHole/DevOps-Security-Agent-Skills · Skill Same job: analytics & dashboards 59★ 1.2k≈39 always6mo ago
product-change-monitor joomcode/joompulse-skills · Skill Both about monitor 52★ 54≈24 always1mo ago