mcpField
M
monitoring-expert

monitoring-expert

github.com/duck4nhCloud & DevOps1542 installsUpdated 37w ago
Repository

About monitoring-expert

A monitoring guidance skill for Node.js services, aimed at developers setting up logs, error tracking, health checks, and metrics. It combines code examples with shell commands for investigating running systems.

Key features

  1. 01Pino logging setup
  2. 02Sentry error tracking
  3. 03HTTP health checks
  4. 04Prometheus metrics
  5. 05Log and resource debug commands

Use cases

  1. 01Adding structured logging to a Node.js service
  2. 02Tracking application errors with Sentry
  3. 03Exposing health and metrics endpoints
  4. 04Investigating logs and host resource usage

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/duck4nh/antigravity-kit --skill monitoring-expert

After installing, type/monitoring-expertin Claude Code to confirm it loaded.

Details

From the project README

Monitoring Expert

Logging (Node.js)

// Using Pino (fast)
import pino from 'pino';

const logger = pino({
  level: process.env.LOG_LEVEL || 'info',
  transport: process.env.NODE_ENV !== 'production' 
    ? { target: 'pino-pretty' } 
    : undefined
});

// Usage
logger.info({ userId: 123 }, 'User logged in');
logger.error({ err, requestId }, 'Failed to process');

// Express middleware
import pinoHttp from 'pino-http';
app.use(pinoHttp({ logger }));

Error Tracking (Sentry)

import * as Sentry from '@sentry/node';

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  environment: process.env.NODE_ENV,
  tracesSampleRate: 0.1,
});

// Capture errors
try {
  riskyOperation();
} catch (error) {
  Sentry.captureException(error);
  throw error;
}

// Express error handler
app.use(Sentry.Handlers.errorHandler());

Health Checks

// /health endpoint
app.get('/health', async (req, res) => {
  const health = {
    status: 'ok',
    timestamp: new Date().toISOString(),
    uptime: process.uptime(),
    checks: {
      database: await checkDatabase(),
      redis: await checkRedis(),
    }
  };
  
  const isHealthy = Object.values(health.checks).every(v => v === 'ok');
  res.status(isHealthy ? 200 : 503).json(health);
});

async function checkDatabase() {
  try {
    await prisma.$queryRaw`SELECT 1`;
    return 'ok';
  } catch { return 'error'; }
}

Metrics (Prometheus)

import promClient from 'prom-client';

// Default metrics
promClient.collectDefaultMetrics();

// Custom metrics
const httpRequestDuration = new promClient.Histogram({
  name: 'http_request_duration_seconds',
  help: 'HTTP request duration',
  labelNames: ['method', 'route', 'status'],
});

// Middleware
app.use((req, res, next) => {
  const end = httpRequestDuration.startTimer();
  res.on('finish', () => {
    end({ method: req.method, route: req.path, status: res.statusCode });
  });
  next();
});

// Endpoint
app.get('/metrics', async (req, res) => {
  res.set('Content-Type', promClient.register.contentType);
  res.end(await promClient.register.metrics());
});

Quick Debug Commands

# Check logs
journalctl -u myapp -f --since "1 hour ago"
docker logs -f --tail 100 container_name

# Check resources
htop
df -h
free -m

# Network
netstat -tlnp
ss -tlnp
curl -I http://localhost:3000/health

Comments

Markdown supported