//============================================================================= // 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" // } // // Scraping de Node Exporter (métricas del host Docker) // prometheus.scrape "node_exporter" { // targets = [{"__address__" = "node-exporter:9100"}] // forward_to = [prometheus.remote_write.prometheus.receiver] // scrape_interval = "15s" // metrics_path = "/metrics" // job_name = "node_exporter" // } // // Scraping de cAdvisor (métricas detalladas de Docker/containers) // prometheus.scrape "cadvisor" { // targets = [{"__address__" = "cadvisor:8080"}] // forward_to = [prometheus.remote_write.prometheus.receiver] // scrape_interval = "15s" // metrics_path = "/metrics" // job_name = "cadvisor" // } // Scraping fijo para métricas expuestas desde el host (scripts Python) // Corre por defecto en host.docker.internal:9102 para PrometheusMetric prometheus.scrape "app_metrics" { targets = [{"__address__" = "host.docker.internal:9102"}] forward_to = [prometheus.remote_write.prometheus.receiver] scrape_interval = "1s" scrape_timeout = "800ms" metrics_path = "/metrics" job_name = "app_metrics" } // 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 (COMENTADO - NO SE USA) //============================================================================= // // 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" }