//============================================================================= // GRAFANA ALLOY - PUERTA DE ENTRADA ÚNICA DE OBSERVABILIDAD //============================================================================= //============================================================================= // PROMETHEUS - MÉTRICAS //============================================================================= // Scraping del propio Alloy prometheus.scrape "alloy" { targets = [{"__address__" = "localhost:12345"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "15s" metrics_path = "/metrics" job_name = "alloy" } // Scraping de Prometheus prometheus.scrape "prometheus" { targets = [{"__address__" = "prometheus:9090"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "15s" metrics_path = "/metrics" job_name = "prometheus" } // Scraping de Grafana prometheus.scrape "grafana" { targets = [{"__address__" = "grafana:3000"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "30s" metrics_path = "/metrics" job_name = "grafana" } // Scraping de Loki prometheus.scrape "loki" { targets = [{"__address__" = "loki:3100"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "15s" metrics_path = "/metrics" job_name = "loki" } // Scraping de Tempo prometheus.scrape "tempo" { targets = [{"__address__" = "tempo:3200"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "15s" metrics_path = "/metrics" job_name = "tempo" } // Receptor para métricas externas prometheus.receive_http "external_metrics" { http { listen_address = "0.0.0.0" listen_port = 9999 } forward_to = [prometheus.remote_write.prometheus.receiver] } // Remote write hacia Prometheus prometheus.remote_write "prometheus" { endpoint { url = "http://prometheus:9090/api/v1/write" } } //============================================================================= // LOKI - LOGS //============================================================================= // Descubrimiento de contenedores Docker discovery.docker "docker_logs" { host = "unix:///var/run/docker.sock" refresh_interval = "5s" } // Fuente de logs de contenedores Docker loki.source.docker "containers" { host = "unix:///var/run/docker.sock" targets = discovery.docker.docker_logs.targets refresh_interval = "5s" forward_to = [loki.relabel.docker.receiver] } // Relabel para contenedores Docker loki.relabel "docker" { forward_to = [loki.write.loki.receiver] rule { source_labels = ["__meta_docker_container_name"] target_label = "container" } rule { source_labels = ["__meta_docker_container_image"] target_label = "image" } } // Receptor HTTP para logs externos (como tus logs Python) loki.source.api "external_logs" { http { listen_address = "0.0.0.0" listen_port = 3101 } // ⚙️ Enviar los logs directamente al escritor Loki forward_to = [loki.write.loki.receiver] } // Receptor Syslog para logs del sistema loki.source.syslog "system_logs" { listener { address = "0.0.0.0:1514" protocol = "tcp" } forward_to = [loki.relabel.syslog.receiver] } // Relabel para logs del sistema loki.relabel "syslog" { forward_to = [loki.write.loki.receiver] rule { source_labels = ["__syslog_message_hostname"] target_label = "hostname" } } // Cliente Loki - destino final // ⚠️ Sin http_headers (no soportado aún en Alloy estable) loki.write "loki" { endpoint { url = "http://loki:3100/loki/api/v1/push" } } //============================================================================= // TEMPO - TRAZAS //============================================================================= // Receptor OTLP otelcol.receiver.otlp "tempo" { grpc { endpoint = "0.0.0.0:4317" } http { endpoint = "0.0.0.0:4318" } output { traces = [otelcol.processor.batch.tempo.input] } } // Receptor Jaeger otelcol.receiver.jaeger "jaeger_traces" { protocols { grpc { endpoint = "0.0.0.0:14250" } thrift_http { endpoint = "0.0.0.0:14268" } thrift_compact { endpoint = "0.0.0.0:6831" } } output { traces = [otelcol.processor.batch.tempo.input] } } // Receptor Zipkin otelcol.receiver.zipkin "zipkin_traces" { endpoint = "0.0.0.0:9411" output { traces = [otelcol.processor.batch.tempo.input] } } // Procesador batch otelcol.processor.batch "tempo" { send_batch_size = 1024 timeout = "1s" output { traces = [otelcol.exporter.otlp.tempo.input] } } // Exportador a Tempo otelcol.exporter.otlp "tempo" { client { endpoint = "http://tempo:4317" tls { insecure = true } } } //============================================================================= // CONFIGURACIÓN GENERAL //============================================================================= logging { level = "info" format = "logfmt" }