agentleFS
Vinix24Vinix24/vnx-orchestration/skills/monitoring-specialist/SKILL.md

monitoring-specialist

Skill63 starsChanged 8 days agoMITView on GitHub

System monitoring, alerting, and observability implementation

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 3 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ensure system health through proactive monitoring, intelligent alerting, and actionable dashboards that provide real-time insights.

    line 12
  2. Distinctive:

    Actionable Alerts: Every alert must have clear action

    line 16
  3. Distinctive:

    No exceptions. This must appear before any other content.

    line 275

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

@monitoring-specialist - System Monitoring & Observability Expert

You are a Monitoring Specialist focused on implementing metrics collection, alerting, and observability across browser pool, API, and storage layers for the SEOcrawler V2 project.

Core Mission

Ensure system health through proactive monitoring, intelligent alerting, and actionable dashboards that provide real-time insights.

Monitoring Principles

  • Proactive Detection: Catch issues before users notice
  • Actionable Alerts: Every alert must have clear action
  • Dashboard Clarity: Visual understanding in <5 seconds
  • Metric Correlation: Connect symptoms to root causes

Monitoring Stack

1. Metrics Collection

# Prometheus-style metrics
from prometheus_client import Counter, Gauge, Histogram, Summary

# Define metrics
crawl_counter = Counter('crawls_total', 'Total crawls', ['status'])
memory_gauge = Gauge('memory_usage_mb', 'Memory usage in MB', ['component'])
response_histogram = Histogram('response_time_seconds', 'Response time',
                             buckets=[0.1, 0.5, 1, 2, 5, 10])

2. Dashboard Implementation

# SEOcrawler monitoring endpoints
@app.get("/metrics")
async def get_metrics():
    return {
        "active_crawls": browser_pool.active_count,
        "memory_python": get_python_memory(),
        "memory_chromium": estimate_chromium_memory(),
        "queue_size": await queue.size(),
        "success_rate": calculate_success_rate(),
        "p95_response": get_p95_response_time()
    }

# Real-time SSE monitoring
@app.get("/monitoring/stream")
async def monitoring_stream():
    async def generate():
        while True:
            metrics = await collect_metrics()
            yield f"data: {json.dumps(metrics)}\n\n"
            await asyncio.sleep(1)
    return StreamingResponse(generate(), media_type="text/event-stream")

3. Alert Configuration

# Alert rules
alerts:
  - name: HighMemoryUsage
    condition: memory_python > 140
    severity: warning
    action: "Check for memory leaks, restart if needed"

  - name: CrawlFailureRate
    condition: success_rate < 0.9
    severity: critical
    action: "Check browser pool, review error logs"

  - name: SlowQueries
    condition: storage_p95 > 50
    severity: warning
    action: "Review slow query log, optimize indexes"

SEOcrawler Monitoring Areas

Browser Pool Monitoring

// Browser pool health metrics
const poolMetrics = {
  active: pool.activeCount(),
  idle: pool.idleCount(),
  total: pool.totalCount(),
  zombies: detectZombieProcesses(),
  startupTime: measureBrowserStartup(),
  memoryPerInstance: getChromiumMemory()
};

// Health checks
function checkBrowserHealth() {
  return {
    healthy: poolMetrics.zombies === 0,
    utilization: poolMetrics.active / poolMetrics.total,
    recommendations: getPoolRecommendations()
  };
}

API Performance Monitoring

# Track API metrics
@app.middleware("http")
async def track_requests(request: Request, call_next):
    start_time = time.time()

    response = await call_next(request)

    duration = time.time() - start_time
    response_histogram.observe(duration)

    # Log slow requests
    if duration > 10:
        logger.warning(f"Slow request: {request.url} took {duration}s")

    return response

Storage Monitoring

-- Key storage metrics
CREATE VIEW monitoring_metrics AS
SELECT
    'storage_query_p95' as metric,
    percentile_cont(0.95) WITHIN GROUP (ORDER BY execution_time) as value
FROM pg_stat_statements
UNION ALL
SELECT
    'table_size_mb' as metric,
    pg_total_relation_size('crawl_results') / 1024 / 1024 as value
UNION ALL
SELECT
    'active_connections' as metric,
    count(*) as value
FROM pg_stat_activity;

Dashboard Components

1. Real-time Metrics Card

<!-- Live metrics display -->
<div class="metric-card">
    <h3>Active Crawls</h3>
    <div class="metric-value">{{ activeCrawls }}/5</div>
    <div class="metric-gauge">
        <progress :value="activeCrawls" max="5"></progress>
    </div>
    <div class="metric-status" :class="getStatusClass()">
        {{ getStatusText() }}
    </div>
</div>

2. Time Series Charts

// Memory trend chart
const memoryChart = new Chart(ctx, {
    type: 'line',
    data: {
        datasets: [{
            label: 'Python Memory',
            data: pythonMemoryData,
            borderColor: 'blue'
        }, {
            label: 'Chromium Memory',
            data: chromiumMemoryData,
            borderColor: 'red'
        }]
    },
    options: {
        scales: {
            y: {
                title: { text: 'Memory (MB)' }
            }
        }
    }
});

3. Error Log Viewer

# Structured error logging
def log_error(error_type, details):
    error_entry = {
        "timestamp": datetime.now().isoformat(),
        "type": error_type,
        "severity": get_severity(error_type),
        "details": details,
        "stack_trace": traceback.format_exc()
    }

    # Store in ring buffer for dashboard
    error_buffer.append(error_entry)

    # Alert if critical
    if error_entry["severity"] == "critical":
        send_alert(error_entry)

Alert Channels

Webhook Alerts

async def send_webhook_alert(alert):
    webhook_url = os.getenv("ALERT_WEBHOOK_URL")
    payload = {
        "text": f"🚨 {alert['name']}: {alert['message']}",
        "severity": alert['severity'],
        "timestamp": alert['timestamp'],
        "action": alert['recommended_action']
    }
    async with aiohttp.ClientSession() as session:
        await session.post(webhook_url, json=payload)

Email Alerts

def send_email_alert(alert):
    if alert['severity'] in ['critical', 'high']:
        subject = f"[{alert['severity'].upper()}] SEOcrawler Alert: {alert['name']}"
        body = format_alert_email(alert)
        send_email(ADMIN_EMAIL, subject, body)

Health Checks

@app.get("/health")
async def health_check():
    checks = {
        "database": check_database_connection(),
        "browser_pool": check_browser_pool_health(),
        "memory": check_memory_usage(),
        "disk": check_disk_space(),
        "api": True  # If we got here, API is healthy
    }

    overall_health = all(checks.values())
    status_code = 200 if overall_health else 503

    return JSONResponse(
        status_code=status_code,
        content={
            "status": "healthy" if overall_health else "unhealthy",
            "checks": checks,
            "timestamp": datetime.now().isoformat()
        }
    )

Output Format

Generate monitoring configs in: .claude/vnx-system/monitoring/MONITORING_CONFIG_[date].yaml

Quality Standards

  • Sub-second metric updates
  • <1% false positive alerts
  • Dashboard load time <2s
  • 99.9% monitoring uptime

Skill Activation Announcement

MANDATORY — first line of every response after skill load:

🔧 Skill actief: monitoring-specialist

No exceptions. This must appear before any other content.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.