add plattform services
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
|
||||
services:
|
||||
sd_server:
|
||||
image: socheatsok78/dockerswarm_sd_server:latest
|
||||
networks:
|
||||
- sd_network
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
networks:
|
||||
monitoring:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.16.201.0/24
|
||||
sd_network:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.16.202.0/24
|
||||
@@ -0,0 +1,139 @@
|
||||
faro.receiver "stage_app_agent_receiver" {
|
||||
server {
|
||||
listen_address = "0.0.0.0"
|
||||
listen_port = 12347
|
||||
cors_allowed_origins = ["*"]
|
||||
// cors_allowed_origins = ["https://avicenna.genius.ceo"]
|
||||
api_key = "t3stK3y"
|
||||
max_allowed_payload_size = "10MiB"
|
||||
|
||||
rate_limiting {
|
||||
rate = 100
|
||||
}
|
||||
}
|
||||
|
||||
sourcemaps {}
|
||||
|
||||
output {
|
||||
logs = [loki.process.logs_process_client.receiver]
|
||||
traces = [otelcol.exporter.otlp.tempo.input]
|
||||
}
|
||||
}
|
||||
|
||||
loki.process "logs_process_client" {
|
||||
forward_to = [loki.write.to_loki.receiver]
|
||||
|
||||
stage.logfmt {
|
||||
mapping = { "kind" = "", "service_name" = "", "app_name" = "", "namespace" = "" }
|
||||
}
|
||||
|
||||
stage.labels {
|
||||
values = { "kind" = "kind", "service_name" = "service_name", "app" = "app_name", "namespace" = "namespace" }
|
||||
}
|
||||
}
|
||||
|
||||
otelcol.receiver.otlp "otel_collector" {
|
||||
grpc {
|
||||
endpoint = "0.0.0.0:4317"
|
||||
}
|
||||
http {
|
||||
endpoint = "0.0.0.0:4318"
|
||||
cors {
|
||||
allowed_origins = ["https://avicenna.genius.ceo/"]
|
||||
}
|
||||
}
|
||||
|
||||
// Definiert, wohin die empfangenen Daten weitergeleitet werden
|
||||
output {
|
||||
metrics = [otelcol.exporter.prometheus.otel_metrics.input]
|
||||
logs = [otelcol.exporter.loki.otel_logs.input]
|
||||
traces = [otelcol.exporter.otlp.tempo.input]
|
||||
}
|
||||
}
|
||||
|
||||
loki.write "to_loki" {
|
||||
endpoint {
|
||||
url = "http://loki:3100/loki/api/v1/push"
|
||||
}
|
||||
}
|
||||
|
||||
prometheus.remote_write "to_prometheus" {
|
||||
endpoint {
|
||||
url = "http://prometheus:9090/api/v1/write"
|
||||
}
|
||||
}
|
||||
|
||||
// Docker-Container auf dem Host entdecken
|
||||
discovery.docker "logs_integration_docker" {
|
||||
host = "unix:///var/run/docker.sock"
|
||||
refresh_interval = "5s"
|
||||
}
|
||||
discovery.relabel "logs_integration_docker" {
|
||||
targets = []
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_docker_container_label_com_docker_swarm_node_id"
|
||||
replacement = "node_id"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_docker_container_label_com_docker_stack_namespace"
|
||||
replacement = "namespace"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_docker_container_label_com_docker_swarm_service_name"
|
||||
replacement = "service_name"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_docker_container_name"
|
||||
replacement = "container_name"
|
||||
}
|
||||
}
|
||||
|
||||
loki.source.docker "logs_from_containers" {
|
||||
host = "unix:///var/run/docker.sock"
|
||||
targets = discovery.docker.logs_integration_docker.targets // Nutzt die entdeckten Container
|
||||
|
||||
relabel_rules = discovery.relabel.logs_integration_docker.rules
|
||||
|
||||
// Leitet die gesammelten Logs an den definierten Loki-Endpunkt weiter
|
||||
forward_to = [loki.write.to_loki.receiver]
|
||||
}
|
||||
|
||||
otelcol.exporter.otlp "tempo" { // Name kann variieren
|
||||
client {
|
||||
endpoint = "tempo:4317" // Ziel: Tempo Service auf Port 4317
|
||||
tls {
|
||||
insecure = true // Interne Kommunikation ohne TLS
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
otelcol.exporter.prometheus "otel_metrics" {
|
||||
forward_to = [prometheus.remote_write.to_prometheus.receiver]
|
||||
}
|
||||
|
||||
otelcol.exporter.loki "otel_logs" {
|
||||
forward_to = [loki.write.to_loki.receiver]
|
||||
}
|
||||
|
||||
// Logging für Alloy selbst konfigurieren
|
||||
logging {
|
||||
level = "info"
|
||||
format = "logfmt"
|
||||
}
|
||||
|
||||
// prometheus.scrape "alloy_self" {
|
||||
// targets = [
|
||||
// prometheus.target_group {
|
||||
// targets = [{"__address__" = "localhost:12345"}]
|
||||
// }
|
||||
// ]
|
||||
// forward_to = [...] // An Prometheus Remote Write oder lokalen Agent
|
||||
// }
|
||||
@@ -0,0 +1,76 @@
|
||||
auth_enabled: false # Einfachste Konfiguration ohne Authentifizierung
|
||||
analytics:
|
||||
reporting_enabled: false
|
||||
server:
|
||||
http_listen_port: 3100
|
||||
grpc_listen_port: 9096 # Standard gRPC Port für Loki
|
||||
|
||||
common:
|
||||
instance_addr: 127.0.0.1 # Adresse, unter der sich die Instanz meldet
|
||||
path_prefix: /loki # Wo Loki seine Daten speichert (im Volume)
|
||||
storage:
|
||||
filesystem: # Lokales Dateisystem für Indizes und Chunks
|
||||
chunks_directory: /loki/chunks
|
||||
rules_directory: /loki/rules
|
||||
replication_factor: 1 # Keine Replikation bei Einzelinstanz
|
||||
ring:
|
||||
kvstore:
|
||||
store: inmemory # Einfachster Ring-Speicher für Einzelinstanz
|
||||
|
||||
query_range:
|
||||
results_cache:
|
||||
cache:
|
||||
embedded_cache:
|
||||
enabled: true
|
||||
max_size_mb: 100
|
||||
|
||||
schema_config:
|
||||
configs:
|
||||
- from: 2020-10-24
|
||||
store: tsdb
|
||||
object_store: filesystem
|
||||
schema: v13
|
||||
index:
|
||||
prefix: index_
|
||||
period: 24h
|
||||
|
||||
pattern_ingester:
|
||||
enabled: true
|
||||
metric_aggregation:
|
||||
loki_address: localhost:3100
|
||||
|
||||
frontend:
|
||||
encoding: protobuf
|
||||
|
||||
limits_config:
|
||||
metric_aggregation_enabled: true
|
||||
reject_old_samples: true
|
||||
reject_old_samples_max_age: 168h # 7 Tage
|
||||
ingestion_rate_mb: 15 # Erlaube 15 MiB/Sekunde pro Tenant (Standard war 4)
|
||||
ingestion_burst_size_mb: 30 # Erlaube kurzfristige Bursts bis 30 MiB (Standard war 6)
|
||||
# Optional: Maximale Anzahl aktiver Log-Streams pro Tenant (Standard ist 10000)
|
||||
# max_global_streams_per_user: 10000
|
||||
# Optional: Maximale Größe einer Log-Zeile (Standard 256kB)
|
||||
# max_line_size: 262144
|
||||
|
||||
# --- Optional: Compactor (Bereinigt alte Daten) ---
|
||||
# compactor:
|
||||
# working_directory: /loki/compactor
|
||||
# shared_store: filesystem
|
||||
# compaction_interval: 10m
|
||||
# retention_enabled: true
|
||||
# retention_delete_delay: 2h
|
||||
# retention_delete_worker_count: 150
|
||||
|
||||
# --- Optional: Ruler (für Alerts basierend auf Logs) ---
|
||||
# ruler:
|
||||
# alertmanager_url: http://alertmanager:9093 # Pfad zu deinem Alertmanager
|
||||
# storage:
|
||||
# type: local
|
||||
# local:
|
||||
# directory: /loki/rules
|
||||
# rule_path: /tmp/loki/rules-temp
|
||||
# ring:
|
||||
# kvstore:
|
||||
# store: inmemory
|
||||
# enable_api: true
|
||||
@@ -0,0 +1,57 @@
|
||||
global:
|
||||
scrape_interval: 15s # Wie oft Ziele abgefragt werden
|
||||
evaluation_interval: 15s # Wie oft Regeln ausgewertet werden
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'prometheus'
|
||||
# Prometheus überwacht sich selbst
|
||||
static_configs:
|
||||
- targets: ['localhost:9090']
|
||||
|
||||
- job_name: 'node-exporter'
|
||||
# Docker Swarm Service Discovery für den Node Exporter
|
||||
dockerswarm_sd_configs:
|
||||
- host: unix:///var/run/docker.sock
|
||||
role: tasks
|
||||
port: 9100 # Standard-Port vom Node Exporter
|
||||
relabel_configs:
|
||||
# Nur Tasks im Zustand 'running' verwenden
|
||||
- source_labels: [__meta_dockerswarm_task_desired_state]
|
||||
regex: running
|
||||
action: keep
|
||||
# Nur Tasks des 'node-exporter' Services aus diesem Stack auswählen
|
||||
# Passe den Regex ggf. an, wenn dein Stack anders heißt (hier Annahme: Stack-Name enthält 'monitoring')
|
||||
- source_labels: [__meta_dockerswarm_service_name]
|
||||
regex: ^monitoring_node-exporter$ # Regex an Stack-Namen anpassen!
|
||||
action: keep
|
||||
# Verwende den Hostnamen des Swarm Nodes als Instance Label
|
||||
- source_labels: [__meta_dockerswarm_node_hostname]
|
||||
target_label: instance
|
||||
# Setze die Zieladresse korrekt auf IP:Port
|
||||
- source_labels: [__address__]
|
||||
regex: '(.*):.*' # Extrahiere die IP-Adresse
|
||||
replacement: '${1}:9100' # Setze den korrekten Port (9100)
|
||||
target_label: __address__
|
||||
|
||||
- job_name: 'cadvisor'
|
||||
dockerswarm_sd_configs:
|
||||
- host: unix:///var/run/docker.sock
|
||||
role: tasks
|
||||
port: 8080 # Standard-Port von cAdvisor
|
||||
relabel_configs:
|
||||
# Nur Tasks im Zustand 'running' verwenden
|
||||
- source_labels: [__meta_dockerswarm_task_desired_state]
|
||||
regex: running
|
||||
action: keep
|
||||
# Nur Tasks des 'cadvisor' Services aus diesem Stack auswählen
|
||||
# Passe den Regex an deinen Stack-Namen an!
|
||||
- source_labels: [__meta_dockerswarm_service_name]
|
||||
regex: .*(monitoring|mon)_cadvisor.* # Regex an Stack-Namen anpassen!
|
||||
action: keep
|
||||
# Verwende den Hostnamen des Swarm Nodes als Instance Label
|
||||
- source_labels: [__meta_dockerswarm_node_hostname]
|
||||
target_label: instance
|
||||
# WICHTIG: Setze den Metrik-Pfad, da cAdvisor ihn unter /metrics bereitstellt
|
||||
- action: replace
|
||||
target_label: __metrics_path__
|
||||
replacement: /metrics
|
||||
@@ -0,0 +1,38 @@
|
||||
server:
|
||||
http_listen_port: 9080
|
||||
grpc_listen_port: 0
|
||||
|
||||
positions:
|
||||
filename: /mnt/promtail/positions.yaml # Pfad im gemounteten Volume
|
||||
|
||||
clients:
|
||||
- url: http://loki:3100/loki/api/v1/push # Sendet Logs an den Loki-Service
|
||||
|
||||
scrape_configs:
|
||||
- job_name: docker_containers
|
||||
docker_sd_configs:
|
||||
- host: unix:///var/run/docker.sock
|
||||
refresh_interval: 5s
|
||||
relabel_configs:
|
||||
# Extrahiere Container-Name (ohne '/')
|
||||
- source_labels: ['__meta_docker_container_name']
|
||||
regex: '/(.*)'
|
||||
target_label: 'container_name'
|
||||
# Behalte den Log-Stream (stdout/stderr) als Label
|
||||
- source_labels: ['__meta_docker_container_log_stream']
|
||||
target_label: 'logstream'
|
||||
# Extrahiere Service-Name aus Swarm-Label
|
||||
- source_labels: ['__meta_docker_container_label_com_docker_swarm_service_name']
|
||||
target_label: 'service_name'
|
||||
# Extrahiere Task-Name aus Swarm-Label
|
||||
- source_labels: ['__meta_docker_container_label_com_docker_swarm_task_name']
|
||||
target_label: 'task_name'
|
||||
# Füge 'instance'-Label mit dem Hostnamen des Tasks hinzu (Annäherung an Node-Namen)
|
||||
- action: replace
|
||||
source_labels: ['container_name'] # Braucht ein existierendes Label als Quelle
|
||||
target_label: 'instance'
|
||||
replacement: ${HOSTNAME} # Nutzt Swarm HOSTNAME Variable
|
||||
# Verwerfe Logs von Promtail selbst (Regex ggf. an Stacknamen anpassen)
|
||||
- source_labels: ['container_name']
|
||||
regex: 'monitoring_promtail.*' # Passe 'monitoring' an deinen Stack-Namen an!
|
||||
action: drop
|
||||
@@ -0,0 +1,36 @@
|
||||
server:
|
||||
http_listen_port: 3200 # Standard API/UI Port
|
||||
|
||||
distributor:
|
||||
receivers: # OTLP receiver aktivieren (Tempo kann auch direkt empfangen)
|
||||
otlp:
|
||||
protocols:
|
||||
grpc:
|
||||
endpoint: 0.0.0.0:4317
|
||||
http:
|
||||
endpoint: 0.0.0.0:4318
|
||||
|
||||
# Grundlegende Konfiguration für Datenverarbeitung (meist ok für Start)
|
||||
ingester:
|
||||
trace_idle_period: 10s
|
||||
max_block_bytes: 1048576 # 1MB
|
||||
max_block_duration: 5m
|
||||
|
||||
compactor:
|
||||
compaction:
|
||||
block_retention: 1h # Wie lange Blöcke mindestens aufheben (geringer Wert für Test)
|
||||
|
||||
# WICHTIG: Storage explizit definieren!
|
||||
storage:
|
||||
trace:
|
||||
backend: local # Backend-Typ: lokales Dateisystem
|
||||
# Write Ahead Log (WAL) configuration.
|
||||
wal:
|
||||
path: /tmp/tempo/wal # Directory to store the the WAL locally.
|
||||
# Local configuration for filesystem storage.
|
||||
local:
|
||||
path: /tmp/tempo/blocks # Directory to store the TSDB blocks.
|
||||
# Pool used for finding trace IDs.
|
||||
pool:
|
||||
max_workers: 100 # Worker pool determines the number of parallel requests to the object store backend.
|
||||
queue_depth: 10000 # Maximum depth for the querier queue jobs. A job is required for each block searched.
|
||||
@@ -0,0 +1,226 @@
|
||||
configs:
|
||||
alloy-config-v3:
|
||||
file: /srv/monitoring/config/alloy.v3.alloy
|
||||
loki-config-v1:
|
||||
file: /srv/monitoring/config/loki.v1.yml
|
||||
prometheus-config-v3:
|
||||
file: /srv/monitoring/config/prometheus.v3.yml
|
||||
tempo-config-v1:
|
||||
file: /srv/monitoring/config/tempo.v1.yml
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
driver: local
|
||||
grafana-data:
|
||||
driver: local
|
||||
loki-data:
|
||||
driver: local
|
||||
alloy-data:
|
||||
driver: local
|
||||
tempo-data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
monitoring-net: # Internes Overlay-Netzwerk für die Monitoring-Komponenten
|
||||
driver: overlay
|
||||
attachable: true # Erlaubt anderen Containern/Stacks ggf. den Zugriff
|
||||
traefik_public: # Das externe Netzwerk, auf dem Traefik lauscht
|
||||
external: true # Wichtig: Dieses Netzwerk wird NICHT von diesem Stack erstellt
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
user: "65534:988"
|
||||
volumes:
|
||||
- prometheus-data:/prometheus
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
configs:
|
||||
- source: prometheus-config-v3 # Versionierte Config
|
||||
target: /etc/prometheus/prometheus.yml
|
||||
command:
|
||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||
- '--storage.tsdb.path=/prometheus'
|
||||
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
|
||||
- '--web.console.templates=/usr/share/prometheus/consoles'
|
||||
- '--web.enable-lifecycle'
|
||||
- '--web.enable-remote-write-receiver'
|
||||
networks:
|
||||
- monitoring-net
|
||||
- traefik_public # Nur wenn Traefik direkt auf Prometheus zugreifen soll (optional)
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager # Optional: An Manager-Nodes binden
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
# --- Router für Prometheus UI ---
|
||||
- "traefik.http.routers.prometheus.rule=Host(`prometheus.genius.ceo`)"
|
||||
- "traefik.http.routers.prometheus.entrypoints=https" # Entrypoint anpassen, falls anders
|
||||
- "traefik.http.routers.prometheus.tls.certresolver=main" # CertResolver anpassen!
|
||||
# --- Service für Prometheus UI ---
|
||||
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
|
||||
# --- Middleware (optional, z.B. für Authentifizierung) ---
|
||||
# - "traefik.http.routers.prometheus.middlewares=my-auth-middleware"
|
||||
# --- Netzwerk für Traefik ---
|
||||
# WICHTIG: Das Netzwerk muss existieren und Traefik muss darauf lauschen.
|
||||
- "traefik.swarm.network=traefik_public" # Traefik Netzwerkname anpassen!
|
||||
|
||||
loki:
|
||||
image: grafana/loki:latest
|
||||
volumes:
|
||||
- loki-data:/loki
|
||||
configs:
|
||||
- source: loki-config-v1
|
||||
target: /etc/loki/local-config.yaml
|
||||
command: "-config.file=/etc/loki/local-config.yaml"
|
||||
networks:
|
||||
- monitoring-net
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
|
||||
tempo:
|
||||
image: grafana/tempo:latest # Aktuelles Tempo Image
|
||||
volumes:
|
||||
- tempo-data:/tmp/tempo # Persistenter Speicher für Traces (Standardpfad)
|
||||
configs:
|
||||
- source: tempo-config-v1
|
||||
target: /etc/tempo/tempo.yaml
|
||||
command: [ "-config.file=/etc/tempo/tempo.yaml" ]
|
||||
user: root
|
||||
# Tempo lauscht intern auf verschiedenen Ports für verschiedene Protokolle:
|
||||
# - 4317 (OTLP gRPC - wird von Alloy genutzt)
|
||||
# - 4318 (OTLP HTTP)
|
||||
# - 14268 (Jaeger gRPC)
|
||||
# - 3200 (Tempo HTTP Frontend/API - für Grafana & UI)
|
||||
# Wir mappen sie vorerst nicht nach außen.
|
||||
networks:
|
||||
- monitoring-net
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager # Optional: An Manager-Nodes binden
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_USER=admin
|
||||
- GF_SECURITY_ADMIN_PASSWORD=admin # Besser über Docker Secrets lösen!
|
||||
# Weitere Grafana env vars nach Bedarf
|
||||
networks:
|
||||
- monitoring-net
|
||||
- traefik_public # Nur wenn Traefik direkt auf Grafana zugreifen soll (optional)
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager # Optional: An Manager-Nodes binden
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
# --- Router für Grafana ---
|
||||
- "traefik.http.routers.grafana.rule=Host(`grafana.genius.ceo`)"
|
||||
- "traefik.http.routers.grafana.entrypoints=https" # Entrypoint anpassen, falls anders
|
||||
- "traefik.http.routers.grafana.tls.certresolver=main" # CertResolver anpassen!
|
||||
# --- Service für Grafana ---
|
||||
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
|
||||
# --- Middleware (optional) ---
|
||||
# - "traefik.http.routers.grafana.middlewares=my-auth-middleware"
|
||||
# --- Netzwerk für Traefik ---
|
||||
- "traefik.swarm.network=traefik_public" # Traefik Netzwerkname anpassen!
|
||||
|
||||
alloy:
|
||||
image: grafana/alloy:latest # Offizielles Alloy Image
|
||||
volumes:
|
||||
- alloy-data:/var/lib/alloy/data # Persistenter Speicher für Alloy (WAL etc.)
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro # Für Docker Discovery
|
||||
configs:
|
||||
- source: alloy-config-v3
|
||||
target: /etc/alloy/config.alloy # S3-Pfad für Alloy Config
|
||||
environment:
|
||||
- HOSTNAME=${HOSTNAME}
|
||||
# Start mit root wegen Docker Socket / Volume Permissions, kann später optimiert werden (Socket Proxy)
|
||||
# user: root
|
||||
command: [
|
||||
"run",
|
||||
"--server.http.listen-addr=0.0.0.0:12345",
|
||||
"/etc/alloy/config.alloy",
|
||||
]
|
||||
networks:
|
||||
- monitoring-net
|
||||
- traefik_public
|
||||
deploy:
|
||||
mode: global # WICHTIG: Alloy muss auf jedem Node laufen!
|
||||
labels: # Traefik Labels für Alloy UI
|
||||
- "traefik.enable=true"
|
||||
# --- Router für Alloy UI ---
|
||||
- "traefik.http.routers.alloy-ui.rule=Host(`otlp.genius.ceo`)"
|
||||
- "traefik.http.routers.alloy-ui.entrypoints=https"
|
||||
- "traefik.http.routers.alloy-ui.tls.certresolver=main"
|
||||
- "traefik.http.routers.alloy-ui.service=alloy-ui@swarm"
|
||||
# --- Service für Alloy UI ---
|
||||
- "traefik.http.services.alloy-ui.loadbalancer.server.port=12345" # Ziel-Port ist 12345 (Alloy UI Standard)
|
||||
# # --- Router für OTLP HTTP ---
|
||||
# - "traefik.http.routers.otlp-http.rule=Host(`alloy.genius.ceo`)"
|
||||
# - "traefik.http.routers.otlp-http.entrypoints=https"
|
||||
# - "traefik.http.routers.otlp-http.tls.certresolver=main"
|
||||
# - "traefik.http.routers.otlp-http.service=otlp-http@swarm"
|
||||
# # --- Service für OTLP HTTP ---
|
||||
# - "traefik.http.services.otlp-http.loadbalancer.server.port=4318" # Ziel-Port ist 4318 (OTLP HTTP Standard)
|
||||
# --- Router für FARO RECEIVER ---
|
||||
- "traefik.http.routers.faro-receiver.rule=Host(`alloy.genius.ceo`)"
|
||||
- "traefik.http.routers.faro-receiver.entrypoints=https"
|
||||
- "traefik.http.routers.faro-receiver.tls.certresolver=main"
|
||||
- "traefik.http.routers.faro-receiver.service=faro-receiver@swarm"
|
||||
# --- Service für FARO RECEIVER ---
|
||||
- "traefik.http.services.faro-receiver.loadbalancer.server.port=12347" # Ziel-Port ist 12347 (FARO RECEIVER Standard)
|
||||
# # --- Middlewares ---
|
||||
# - "traefik.http.routers.otlp-http.middlewares=alloy-ratelimit@swarm"
|
||||
# - "traefik.http.middlewares.alloy-ratelimit.ratelimit.average=100" # z.B. 100 Anfragen pro Sekunde
|
||||
# - "traefik.http.middlewares.alloy-ratelimit.ratelimit.burst=50" # kurzfristig 50 mehr erlaubt
|
||||
# --- Netzwerk für Traefik ---
|
||||
- "traefik.swarm.network=traefik_public" # Traefik Netzwerkname prüfen/anpassen!
|
||||
|
||||
node-exporter:
|
||||
image: quay.io/prometheus/node-exporter:latest # Aktuelles Image verwenden
|
||||
volumes:
|
||||
- /proc:/host/proc:ro
|
||||
- /sys:/host/sys:ro
|
||||
- /:/rootfs:ro
|
||||
command:
|
||||
- '--path.procfs=/host/proc'
|
||||
- '--path.sysfs=/host/sys'
|
||||
- '--path.rootfs=/rootfs'
|
||||
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
|
||||
networks:
|
||||
- monitoring-net # Nur internes Netzwerk nötig
|
||||
deploy:
|
||||
mode: global # Läuft auf JEDEM Node im Swarm
|
||||
|
||||
cadvisor:
|
||||
image: gcr.io/cadvisor/cadvisor:latest # Google's cAdvisor Image
|
||||
volumes:
|
||||
# cAdvisor braucht Zugriff auf Host-System-Infos und Docker
|
||||
- /:/rootfs:ro
|
||||
- /var/run:/var/run:ro
|
||||
- /sys:/sys:ro
|
||||
- /var/lib/docker/:/var/lib/docker:ro
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
networks:
|
||||
- monitoring-net # Nur internes Netzwerk nötig
|
||||
deploy:
|
||||
mode: global # Läuft auf JEDEM Node im Swarm
|
||||
resources: # Optional: Limitiert Ressourcen, cAdvisor kann hungrig sein
|
||||
limits:
|
||||
memory: 512M
|
||||
reservations:
|
||||
memory: 256M
|
||||
Reference in New Issue
Block a user