# New Relic Infrastructure Agent -- Monitoring & Log-Forwarding

**Version:** 1.0
**Stand:** 2026-04-16
**Agent-Version:** 1.73.1

**Zugehoerige Docs:** [CLUSTER.md](CLUSTER.md) (Cluster-Topologie), [INFRASTRUCTURE.md](INFRASTRUCTURE.md) (Server-Standards), [DNS-MAINTENANCE.md](DNS-MAINTENANCE.md) (Drain/Restore).

---

## 1. Ueberblick

Auf allen 5 mTLS-Cluster-Servern laeuft der **New Relic Infrastructure Agent**. Er erfasst:

- **Infrastruktur-Metriken:** CPU, RAM, Disk, Netzwerk, Prozesse
- **Apache2 Access-Logs:** Alle VHost-Access-Logs mit automatischem Parsing (clientip, verb, response, bytes etc.)
- **Apache2 Error-Logs:** Alle VHost-Error-Logs mit automatischem Parsing
- **System-Logs:** Syslog (inkl. dns-maintenance), Auth-Log (SSH-Logins), Kern-Log

**Account:** New Relic EU-Datacenter (License Key Prefix `eu01`).

---

## 2. Installierte Komponenten

| Komponente | Pfad | Zweck |
|------------|------|-------|
| Agent-Binary | `/usr/bin/newrelic-infra-service` | Hauptprozess (systemd-managed) |
| Agent-Worker | `/usr/bin/newrelic-infra` | Datensammlung + Versand |
| Fluent Bit | `/opt/fluent-bit/bin/fluent-bit` | Log-Forwarding (intern vom Agent gestartet) |
| Hauptkonfiguration | `/etc/newrelic-infra.yml` | License Key, Display-Name, Custom Attributes |
| Apache-Log-Config | `/etc/newrelic-infra/logging.d/apache.yml` | Apache2 Access + Error Log-Forwarding |
| System-Log-Config | `/etc/newrelic-infra/logging.d/system.yml` | Syslog + Auth + Kern Log-Forwarding |
| Systemd-Unit | `/etc/systemd/system/newrelic-infra.service` | Auto-Start, von apt installiert |
| GPG Key | `/etc/apt/trusted.gpg.d/newrelic-infra.gpg` | Paket-Signierung |
| APT Repository | `/etc/apt/sources.list.d/newrelic-infra.list` | `noble main` (Ubuntu 24.04) |
| License Key | `/etc/environment` → `NEW_RELIC_LICENSE_KEY` | Auf allen 5 Servern hinterlegt |

---

## 3. Server-Konfiguration

Jeder Server hat eine individuelle `/etc/newrelic-infra.yml` mit server-spezifischen Attributen:

| # | Hostname / display_name | server_num | datacenter | VLAN IP |
|---|------------------------|------------|------------|---------|
| 1 | Cert-Server-1-NBG | 1 | nbg | 10.0.0.2 |
| 2 | Cert-Server-0-NBG | 2 | nbg | 10.0.0.3 |
| 3 | Cert-Server-0-FSN | 3 | fsn | 10.0.0.4 |
| 4 | Cert-Server-1-FSN | 4 | fsn | 10.0.0.5 |
| 5 | Cert-Server-HEL | 5 | hel | 10.0.0.6 |

### 3.1 Hauptkonfiguration (`/etc/newrelic-infra.yml`)

```yaml
license_key: <NEW_RELIC_LICENSE_KEY from /etc/environment>
display_name: Cert-Server-1-NBG          # <-- server-spezifisch
enable_process_metrics: false

custom_attributes:
  environment: production
  cluster: mtls-proxy
  server_num: "1"                         # <-- server-spezifisch
  datacenter: nbg                         # <-- server-spezifisch (nbg/fsn/hel)
```

**Hinweise:**
- `license_key` mit `eu01`-Prefix: Agent erkennt automatisch EU-Region
- `enable_process_metrics: false`: Reduziert Datenvolumen (bei Bedarf aktivierbar)
- `custom_attributes`: Erscheinen als Tags auf allen Metriken und Logs -- ermoeglichen Cluster-weites Filtern

### 3.2 Apache2 Log-Forwarding (`/etc/newrelic-infra/logging.d/apache.yml`)

```yaml
logs:
  - name: apache-access
    file: /var/log/apache2/*access.log
    attributes:
      logtype: apache
      application: apache2
      cluster: mtls-proxy

  - name: apache-error
    file: /var/log/apache2/*error.log
    attributes:
      logtype: apache_error
      application: apache2
      cluster: mtls-proxy
```

**Identisch auf allen 5 Servern.**

**Details:**
- **Glob-Pattern:** `*access.log` matcht sowohl `access.log` als auch `prd-access.log`, `abn-access.log` etc. (156 Access + 155 Error = 311 Dateien pro Server)
- **Parsing:** `logtype: apache` aktiviert New Relics eingebautes Apache Combined Log Format Parsing. Extrahierte Felder: `clientip`, `verb`, `ident`, `response`, `request`, `httpversion`, `bytes`, `referrer`, `agent`
- **Error-Parsing:** `logtype: apache_error` extrahiert: `level`, `pid`, `tid`, `clientip`, `port`, `message`
- **Leere Dateien:** Die meisten der 311 Dateien sind leer (Ghost-VHosts fuer Migration). Fluent Bit oeffnet sie (inotify-Watch), produziert aber keinen I/O
- **Berechtigungen:** Apache-Logs sind `640 root:adm`. Agent laeuft als root -- kein Berechtigungsproblem
- **Logrotate:** Fluent Bit erkennt rotierte Dateien automatisch. Keine Anpassung an logrotate noetig

**Apache Log-Format (Referenz):** Die mTLS-VHosts verwenden ein erweitertes Format:
```
LogFormat "%v:%p %{Host}i %h %{SSL_CLIENT_S_DN_CN}x %{SSL_CLIENT_M_SERIAL}x
           %{SSL_CLIENT_VERIFY}x %l %u %t \"%r\" %>s %O \"%{Referer}i\"
           \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %D" mtls_vhost
```
Das eingebaute `apache`-Parsing deckt die Standard-Felder ab. Die mTLS-spezifischen Felder (SSL_CLIENT_*, %D) werden als Rohtext im `message`-Feld mitgeliefert und koennen via New Relic Parsing Rules weiter extrahiert werden.

### 3.3 System-Log-Forwarding (`/etc/newrelic-infra/logging.d/system.yml`)

```yaml
logs:
  - name: syslog
    file: /var/log/syslog
    attributes:
      logtype: syslog
      cluster: mtls-proxy

  - name: auth-log
    file: /var/log/auth.log
    attributes:
      logtype: linux_auth
      cluster: mtls-proxy

  - name: kern-log
    file: /var/log/kern.log
    attributes:
      logtype: linux_kern
      cluster: mtls-proxy
```

**Identisch auf allen 5 Servern.**

| Log | Inhalt | Relevanz |
|-----|--------|----------|
| syslog | dns-maintenance, systemd, cron, allgemeine Services | Enthaelt alle `dns-maintenance` Logs (Drain/Restore/Peer-Check) |
| auth.log | SSH-Logins, sudo, PAM | Security-Monitoring |
| kern.log | Kernel-Meldungen, Hardware-Fehler | System-Stabilitaet |

**Hinweis zu dns-maintenance in Syslog:** Die dns-maintenance Eintraege enthalten ANSI-Farbcodes (z.B. `\033[0;32m[INFO]\033[0m`), da das Script sowohl auf die Konsole als auch in Syslog loggt. In New Relic erscheinen diese als sichtbare Escape-Sequenzen im `message`-Feld.

---

## 4. Ressourcenverbrauch

| Metrik | Wert | Bemerkung |
|--------|------|-----------|
| RAM | 25-30 MB | Hauptprozess + Fluent Bit |
| CPU | < 1% | Nur bei Log-Versand kurzfristig hoeher |
| Disk I/O | Minimal | Nur Lesen der Log-Dateien (kein Schreiben) |
| inotify Watches | ~315 pro Server | Weit unter OS-Limit (8192) |
| Netzwerk | ~1-5 MB/h | Abhaengig vom Log-Volumen |

**Kein Einfluss auf:**
- Apache2 (Agent liest nur Logs, kein Restart noetig)
- dns-maintenance (read-only)
- Wazuh Agent (unabhaengig)
- Cloudflared Tunnel (unabhaengig)

---

## 5. Administration

### 5.1 Service-Management

```bash
# Status pruefen
systemctl status newrelic-infra

# Agent neustarten (z.B. nach Config-Aenderung)
systemctl restart newrelic-infra

# Agent stoppen (temporaer)
systemctl stop newrelic-infra

# Agent deaktivieren (ueberlebt keinen Reboot)
systemctl disable newrelic-infra

# Agent komplett entfernen
apt-get remove newrelic-infra -y
```

### 5.2 Logs des Agents selbst

```bash
# Systemd Journal (primaere Log-Quelle)
journalctl -u newrelic-infra -n 50 --no-pager

# Oder: Agent-Log-Datei (falls vorhanden)
tail -50 /var/log/newrelic-infra/newrelic-infra.log
```

### 5.3 Agent-Version pruefen

```bash
newrelic-infra --version
# Oder:
dpkg -l newrelic-infra | grep newrelic
```

### 5.4 Agent aktualisieren

```bash
apt-get update && apt-get install --only-upgrade newrelic-infra -y
systemctl restart newrelic-infra
```

### 5.5 Konfiguration aendern

Config-Dateien in `/etc/newrelic-infra/logging.d/` werden automatisch erkannt (Hot-Reload). Ein Neustart ist trotzdem empfohlen nach groesseren Aenderungen:

```bash
# Neues Log-Target hinzufuegen (Beispiel: Cloudflare-Logs)
cat > /etc/newrelic-infra/logging.d/cloudflared.yml << 'EOF'
logs:
  - name: cloudflared
    systemd: cloudflared
    attributes:
      logtype: cloudflared
      cluster: mtls-proxy
EOF

systemctl restart newrelic-infra
```

### 5.6 Cluster-weiter Status-Check

Vom Referenz-Server (10.0.0.2) aus:

```bash
echo "=== Lokal ===" && systemctl is-active newrelic-infra
for ip in 10.0.0.3 10.0.0.4 10.0.0.5 10.0.0.6; do
  echo -n "$ip: " && ssh root@$ip "systemctl is-active newrelic-infra"
done
```

---

## 6. New Relic UI -- Wichtige Abfragen

### 6.1 Alle Cluster-Hosts anzeigen

**Navigation:** Infrastructure > Hosts > Filter: `cluster = 'mtls-proxy'`

### 6.2 NRQL-Queries

```sql
-- Alle Logs der letzten 10 Minuten, nach Server
SELECT count(*) FROM Log
WHERE cluster = 'mtls-proxy'
FACET hostname
SINCE 10 minutes ago

-- Apache Access Logs (nur aktive VHosts)
SELECT * FROM Log
WHERE logtype = 'apache' AND cluster = 'mtls-proxy'
LIMIT 20

-- Apache Error Logs
SELECT * FROM Log
WHERE logtype = 'apache_error' AND cluster = 'mtls-proxy'
SINCE 1 hour ago

-- dns-maintenance Logs aus Syslog
SELECT * FROM Log
WHERE logtype = 'syslog' AND message LIKE '%dns-maintenance%'
SINCE 1 hour ago

-- SSH-Logins
SELECT * FROM Log
WHERE logtype = 'linux_auth' AND message LIKE '%Accepted%'
SINCE 24 hours ago

-- Logs nach Datacenter filtern
SELECT count(*) FROM Log
WHERE cluster = 'mtls-proxy'
FACET datacenter
SINCE 1 hour ago

-- Apache HTTP Status Codes (wenn geparst)
SELECT count(*) FROM Log
WHERE logtype = 'apache'
FACET response
SINCE 1 hour ago
```

### 6.3 Nuetzliche Filter-Kombinationen

| Filter | Zweck |
|--------|-------|
| `cluster = 'mtls-proxy'` | Alle 5 Cluster-Server |
| `server_num = '1'` | Nur Referenz-Server (Cert-Server-1-NBG) |
| `datacenter = 'nbg'` | Nur Nuernberg (Server 1+2) |
| `datacenter = 'fsn'` | Nur Falkenstein (Server 3+4) |
| `datacenter = 'hel'` | Nur Helsinki (Server 5) |
| `logtype = 'apache'` | Nur Apache Access Logs |
| `logtype = 'apache_error'` | Nur Apache Error Logs |
| `logtype = 'syslog'` | Nur Syslog (dns-maintenance etc.) |
| `logtype = 'linux_auth'` | Nur Auth-Logs (SSH) |
| `application = 'apache2'` | Alle Apache-Logs (Access + Error) |

---

## 7. Neuen Server hinzufuegen

Falls ein 6. Cluster-Server hinzukommt:

### 7.1 Installieren

```bash
# Auf dem neuen Server als root:

# GPG Key + Repository
curl -fsSL https://download.newrelic.com/infrastructure_agent/gpg/newrelic-infra.gpg \
  | gpg --dearmor -o /etc/apt/trusted.gpg.d/newrelic-infra.gpg

echo "deb https://download.newrelic.com/infrastructure_agent/linux/apt/ noble main" \
  | tee /etc/apt/sources.list.d/newrelic-infra.list

# Installieren
apt-get update && apt-get install newrelic-infra -y
```

### 7.2 License Key

```bash
# In /etc/environment eintragen (falls nicht vorhanden):
echo 'NEW_RELIC_LICENSE_KEY="<NEW_RELIC_LICENSE_KEY from /etc/environment>"' >> /etc/environment
```

### 7.3 Konfigurieren

```bash
# Hauptkonfiguration (display_name, server_num, datacenter anpassen!)
cat > /etc/newrelic-infra.yml << 'EOF'
license_key: <NEW_RELIC_LICENSE_KEY from /etc/environment>
display_name: Cert-Server-NEW-HOSTNAME
enable_process_metrics: false

custom_attributes:
  environment: production
  cluster: mtls-proxy
  server_num: "6"
  datacenter: STANDORT
EOF

# Logging-Configs vom Referenz-Server kopieren:
scp root@10.0.0.2:/etc/newrelic-infra/logging.d/apache.yml /etc/newrelic-infra/logging.d/
scp root@10.0.0.2:/etc/newrelic-infra/logging.d/system.yml /etc/newrelic-infra/logging.d/

# Agent starten
systemctl restart newrelic-infra
systemctl status newrelic-infra
```

---

## 8. Troubleshooting

### Agent startet nicht

```bash
# Journal-Logs pruefen
journalctl -u newrelic-infra -n 30 --no-pager

# Haeufige Ursachen:
# 1. License Key fehlt oder falsch → /etc/newrelic-infra.yml pruefen
# 2. Netzwerk-Problem → curl -s https://infra-api.eu.newrelic.com/ping (muss "ok" liefern)
# 3. YAML-Syntaxfehler → yamllint /etc/newrelic-infra.yml
```

### Logs erscheinen nicht in New Relic

```bash
# 1. Fluent Bit laeuft?
pgrep -f fluent-bit || echo "Fluent Bit nicht gestartet!"

# 2. Log-Dateien lesbar?
ls -la /var/log/apache2/prd-access.log
# Muss root:adm 640 sein, Agent laeuft als root

# 3. Logging-Config korrekt?
cat /etc/newrelic-infra/logging.d/apache.yml
# YAML-Syntax pruefen: Einrueckung mit Leerzeichen, nicht Tabs

# 4. Agent neustarten
systemctl restart newrelic-infra
```

### Hoher Ressourcenverbrauch

```bash
# Memory pruefen
ps -p $(pgrep -f newrelic-infra-service | head -1) -o rss= | awk '{printf "%.0f MB\n", $1/1024}'

# Falls > 100 MB: Agent neustarten
systemctl restart newrelic-infra

# Falls persistent > 100 MB: inotify-Limits pruefen
cat /proc/sys/fs/inotify/max_user_watches   # Sollte >= 8192 sein
```

### Agent entfernen

```bash
systemctl stop newrelic-infra
systemctl disable newrelic-infra
apt-get remove --purge newrelic-infra -y
rm -f /etc/apt/sources.list.d/newrelic-infra.list
rm -f /etc/apt/trusted.gpg.d/newrelic-infra.gpg
rm -rf /etc/newrelic-infra/
rm -rf /var/db/newrelic-infra/
rm -rf /var/log/newrelic-infra/
# Optional: License Key aus /etc/environment entfernen
sed -i '/NEW_RELIC_LICENSE_KEY/d' /etc/environment
```

---

## 9. Deployment-Historie

| Datum | Aktion | Details |
|-------|--------|---------|
| 2026-04-16 | Erstinstallation | Agent v1.73.1 auf allen 5 Cluster-Servern. Log-Forwarding: Apache2 (311 Dateien via Glob) + Syslog + Auth + Kern. EU-Account. |

---

## 10. Offene Punkte

- **Alert-Policies:** NRQL-basierte Alerts konfigurieren (z.B. Apache 5xx Rate, Server-Down, Disk > 90%)
- **Custom Parsing Rules:** mTLS-spezifische Apache-Log-Felder (SSL_CLIENT_*, Latenz %D) extrahieren
- **ANSI-Farbcodes:** dns-maintenance Syslog-Eintraege enthalten ANSI-Escape-Sequenzen -- optional per Pipeline-Filter bereinigen
- **Dashboard:** Cluster-Dashboard bauen (5 Server, Apache-Traffic, Error-Rate, DNS-Maintenance Events)
- **Process Metrics:** `enable_process_metrics: true` bei Bedarf aktivieren (erhoehtes Datenvolumen)
