add plattform services

This commit is contained in:
Marcel Arndt
2026-01-05 16:01:40 +01:00
parent e25d8dd5d9
commit 193319fa52
65 changed files with 4240 additions and 39 deletions
@@ -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.