stackit.guru

Monitoring und Logging auf STACKIT

#general
monitoring logging observability

Monitoring und Logging auf STACKIT

Effektives Monitoring und Logging sind essentiell für den Betrieb zuverlässiger Cloud-Anwendungen.

Die drei Säulen der Observability

graph TD
    A[Observability] --> B[Metrics]
    A --> C[Logs]
    A --> D[Traces]
    B --> E[Dashboards]
    C --> F[Log Analysis]
    D --> G[Distributed Tracing]

Metrics (Metriken)

Numerische Zeitreihendaten über Systemzustände:

  • CPU-Auslastung
  • Speicherverbrauch
  • Request-Rate
  • Error-Rate

Logs (Protokolle)

Strukturierte oder unstrukturierte Ereignisdaten:

{
  "timestamp": "2024-02-10T14:30:00Z",
  "level": "ERROR",
  "service": "api-gateway",
  "message": "Database connection timeout",
  "duration_ms": 5000,
  "user_id": "user123"
}

Traces (Ablaufverfolgung)

Verfolgung von Requests durch verteilte Systeme.

STACKIT Monitoring Services

Prometheus für Metrics

# prometheus.yml
scrape_configs:
  - job_name: 'my-app'
    static_configs:
      - targets: ['app:8080']
    metrics_path: '/metrics'
    scrape_interval: 15s

Application Metrics

// Node.js mit Prometheus Client
const prometheus = require('prom-client');

const httpRequestDuration = new prometheus.Histogram({
  name: 'http_request_duration_seconds',
  help: 'Duration of HTTP requests in seconds',
  labelNames: ['method', 'route', 'status']
});

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    const duration = (Date.now() - start) / 1000;
    httpRequestDuration
      .labels(req.method, req.route?.path, res.statusCode)
      .observe(duration);
  });
  next();
});

Logging Best Practices

Strukturiertes Logging

// Strukturierte Logs mit Winston
const winston = require('winston');

const logger = winston.createLogger({
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

logger.info('User login', {
  userId: 'user123',
  ip: '192.168.1.1',
  duration: 245
});

:::tip Verwenden Sie strukturierte Logs (JSON) für bessere Analysierbarkeit und Filterung. :::

Log-Levels

LevelVerwendungBeispiel
ERRORFehler, die Aufmerksamkeit erfordernDatenbankverbindung fehlgeschlagen
WARNPotenzielle ProblemeHohe Latenz erkannt
INFOWichtige EreignisseBenutzer angemeldet
DEBUGDetaillierte InformationenSQL-Query ausgeführt

Alerting und Benachrichtigungen

Alert-Regeln definieren

# Prometheus Alert Rules
groups:
  - name: application_alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High error rate detected"
          description: "Error rate is {{ $value }} requests/sec"
      
      - alert: HighMemoryUsage
        expr: memory_usage_percent > 90
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage"

:::warning Vermeiden Sie Alert-Fatigue durch zu viele Benachrichtigungen. Fokussieren Sie auf kritische Metriken. :::

Dashboards erstellen

Grafana Dashboard

{
  "dashboard": {
    "title": "Application Overview",
    "panels": [
      {
        "title": "Request Rate",
        "targets": [{
          "expr": "rate(http_requests_total[5m])"
        }]
      },
      {
        "title": "Error Rate",
        "targets": [{
          "expr": "rate(http_requests_total{status=~\"5..\"}[5m])"
        }]
      }
    ]
  }
}

Log-Aggregation

Zentralisieren Sie Logs von allen Services:

# Logs an zentralen Service senden
docker run -d \
  --log-driver=fluentd \
  --log-opt fluentd-address=logs.stackit.cloud:24224 \
  --log-opt tag="docker.{{.Name}}" \
  my-app:latest

Distributed Tracing

Verfolgen Sie Requests durch Microservices:

// OpenTelemetry Tracing
const { trace } = require('@opentelemetry/api');

const tracer = trace.getTracer('my-service');

async function processOrder(orderId) {
  const span = tracer.startSpan('process_order');
  span.setAttribute('order.id', orderId);
  
  try {
    await validateOrder(orderId);
    await chargePayment(orderId);
    await shipOrder(orderId);
    span.setStatus({ code: SpanStatusCode.OK });
  } catch (error) {
    span.setStatus({ 
      code: SpanStatusCode.ERROR,
      message: error.message 
    });
    throw error;
  } finally {
    span.end();
  }
}

Performance Monitoring

Key Performance Indicators (KPIs)

  • Apdex Score: Benutzerzufriedenheit
  • Response Time: P50, P95, P99 Perzentile
  • Throughput: Requests pro Sekunde
  • Error Rate: Fehlerhafte Requests

:::info Überwachen Sie P95 und P99 Perzentile, nicht nur Durchschnittswerte, um Ausreißer zu erkennen. :::

Kostenoptimierung

  • Implementieren Sie Log-Retention-Policies
  • Filtern Sie unwichtige Logs
  • Verwenden Sie Sampling für Traces
  • Aggregieren Sie Metriken

Checkliste

  • Metriken für alle Services erfasst
  • Strukturiertes Logging implementiert
  • Alerts für kritische Metriken konfiguriert
  • Dashboards für Übersicht erstellt
  • Log-Retention konfiguriert
  • Distributed Tracing aktiviert
  • On-Call Rotation definiert