Agent: Grafana Alloy

Fecha publicación
Dificultad
Avanzado
#
5
3 more properties
Publicado
tags
IoT, Gateways, logs, métricas, plataforma, Grafana, Alloy, Docker, sistema, Mimir, Loki, MinIO, almacenamiento, AWS, S3, visualización, monitoreo, captura, servidores, integración, DB, BBDD, servers, integration, metrics, systems, logs, grafana Alloy

Descripción

Grafana Alloy ofrece pipelines nativas para OTel, Prometheus, Pyroscope, Loki y otras herramientas de monitoreo. Esto significa que puedes recopilar y procesar datos de múltiples fuentes de forma eficiente. Además, puedes utilizar Alloy para realizar diversas tareas, como configurar reglas de alerta en Loki y Mimir.
Alloy es totalmente compatible con OTel Collector, Prometheus Agent y Promtail. Puedes usar Alloy como una alternativa a estas soluciones o integrarlo en un sistema híbrido con múltiples colectores y agentes. Su flexibilidad te permite desplegarlo en cualquier lugar dentro de tu infraestructura de TI.
Alloy es más que solo señales de observabilidad como métricas, logs y trazas. Proporciona muchas características que te ayudan a encontrar y procesar rápidamente tus datos en entornos complejos. Algunas de estas características incluyen componentes personalizados, compatibilidad con GitOps, soporte para clústeres, seguridad y herramientas de depuración.

Resumen de funciones más importantes

Resumen del Uso de Recursos de Grafana Alloy

Instalación para equipo Ubuntu/Debian

Los paquetes disponibles estan aquí:
Para instalarlo es tan sencillo como:
Bash
# descargamos paquete
wget https://github.com/grafana/alloy/releases/download/v1.4.1/alloy-1.4.1-1.amd64.deb
# instalamos el paquete descargado
sudo dpkg -i alloy-1.4.1-1.amd64.deb

Cambiar usuario, lanzarlo como root

Aunque no requiere permisos de root para correr el demonio, el propio paquete lo hace como usuario alloy . En algunos casos puede ser necesario lanzarlo como root para hacer esto en Ubuntu podemos hacer:
Bash
sudo systemctl edit alloy.service
esto nos llevará a una pantalla como esta:
image.png
donde podemos escribir, por ejemplo:
Bash
[Service]
User=root
quedaría así:
image.png
Guardamos y esto habrá creado el fichero /etc/systemd/system/alloy.service.d/override.conf .
Seguidamente debemos recargar la configuración y reiniciar el servicio:
Bash
sudo systemctl daemon-reload

sudo systemctl restart alloy.service

Configuración de Grafana Alloy

Nuestro fichero de configuración
C
logging {
  level  = "warn"
  format = "logfmt"
}

livedebugging {
  enabled = true
}

prometheus.exporter.self "alloy" {}

prometheus.scrape "alloy" {
	targets    = prometheus.exporter.self.alloy.targets
	forward_to = [prometheus.remote_write.mimir.receiver]
}

discovery.docker "containers" {
  host = "unix:///var/run/docker.sock"
}

prometheus.scrape "containers_scraper" {
  targets    = discovery.docker.containers.targets
	forward_to = [prometheus.remote_write.mimir.receiver]
}

prometheus.exporter.cadvisor "cadvisor_export" {
  docker_host = "unix:///var/run/docker.sock"

  storage_duration = "1m"
}

// Configure a prometheus.scrape component to collect cadvisor metrics.
prometheus.scrape "cadvisor_scraper" {
  targets    = prometheus.exporter.cadvisor.cadvisor_export.targets
  forward_to = [ prometheus.remote_write.mimir.receiver ]
}

prometheus.exporter.unix "linux_exporter" { }

// Configure a prometheus.scrape component to collect unix metrics.
prometheus.scrape "linux_scraper" {
  targets    = prometheus.exporter.unix.linux_exporter.targets
  forward_to = [prometheus.remote_write.mimir.receiver]
}

discovery.relabel "logs_default_syslog" {
	targets = []

	rule {
		source_labels = ["__syslog_message_hostname"]
		target_label  = "instance"
    replacement   = "k5"
	}

	rule {
		source_labels = ["__syslog_message_severity"]
		target_label  = "level"
	}

	rule {
		source_labels = ["__syslog_message_app_name"]
		target_label  = "application"
	}

	rule {
		source_labels = ["__syslog_message_facility"]
		target_label  = "facility"
	}
}

loki.relabel "journal_relabel" {
  forward_to = []

  rule {
    source_labels = ["__journal__systemd_unit"]
    target_label  = "unit"
  }
}

loki.source.journal "journal_source"  {
  forward_to = [loki.write.logs_default.receiver]
  relabel_rules = loki.relabel.journal_relabel.rules
  labels        = {component = "loki.source.journal"}
}

loki.source.syslog "logs_default_syslog" {
	listener {
		address      = "127.0.0.1:1514"
		protocol     = "udp"
		idle_timeout = "60s"
		labels       = {
			job = "syslog",
		}
		max_message_length = 8192
	}
  // forward_to = [loki.write.logs_default.receiver]
  forward_to = [loki.process.logs_default_syslog.receiver]
	relabel_rules = discovery.relabel.logs_default_syslog.rules
}

loki.process "logs_default_syslog" {
  forward_to = [loki.write.logs_default.receiver]

  stage.drop {
    older_than = "24h"
    drop_counter_reason = "too old"
  }

  stage.drop {
    longer_than         = "8KB"
    drop_counter_reason = "too long"
  }
}

discovery.docker "logs_default_docker" {
	host = "unix:///var/run/docker.sock"
}


loki.process "logs_default_docker" {
	forward_to = [loki.write.logs_default.receiver]

  stage.drop {
    older_than = "24h"
    drop_counter_reason = "too old"
  }

  stage.drop {
    longer_than         = "8KB"
    drop_counter_reason = "too long"
  }

	stage.match {
		selector = "{container_name=\"emqx\"}"

		stage.json {
			expressions = {
				level = "level",
			}
		}

		stage.labels {
			values = {
				level = null,
			}
		}
	}

	stage.match {
		selector = "{container_name=\"hasura\"}"

		stage.json {
			expressions = {
				level = "level",
			}
		}

		stage.labels {
			values = {
				level = null,
			}
		}
	}

	stage.match {
		selector = "{container_name=\"influx2\"}"

		stage.regex {
			expression = "lvl=(?P<level>\\w+)"
		}

		stage.labels {
			values = {
				level = null,
			}
		}
	}
}

discovery.relabel "logs_default_docker" {
	targets = []

	rule {
		source_labels = ["__meta_docker_container_id"]
		target_label  = "container_id"
	}

	rule {
		source_labels = ["__meta_docker_container_name"]
		regex         = "/(.*)"
		target_label  = "container_name"
	}

	rule {
		source_labels = ["__meta_docker_network_ip"]
		target_label  = "container_ip"
	}

	rule {
		target_label = "instance"
		replacement  = "k5"
	}

	rule {
		target_label = "application"
		replacement  = "docker"
	}
}

loki.source.docker "logs_default_docker" {
	host          = "unix:///var/run/docker.sock"
	targets       = discovery.docker.logs_default_docker.targets
	forward_to    = [loki.process.logs_default_docker.receiver]
	relabel_rules = discovery.relabel.logs_default_docker.rules
}

prometheus.remote_write "mimir" {
	endpoint {
    url = "https://metrics.i40sys.com/api/v1/push"
	}
}

loki.write "logs_default" {
	endpoint {
		url = "https://logs.i40sys.com/loki/api/v1/push"
    min_backoff_period = "1s"
    max_backoff_period = "1m"
    max_backoff_retries = 10
	}
	external_labels = {}
  wal {
    enabled = true
    max_segment_age = "1h"
  }
}
Esta configuración hace una:

Interface Web de Grafana Alloy

Alloy dispone de una UI que nos permite debugar la configuración que se ha definido en el fichero de configuración.
image.png
La interface esta disponible en el puerto 12345 .