Transportadores de registros: ELK y Loki
1) Por qué y cuándo: objetivos de la lógica
Observabilidad y RCA: aceleración del debag, post mortem, control SLO/SLA.
Seguridad y auditoría: rastros de acceso, anomalías, investigaciones.
Métricas de negocio: conversión, flow de pago, errores PSP, comportamiento del usuario.
Cumplimiento: almacenamiento, enmascaramiento de PII, políticas de retiro, Legal Hold.
Tipos de registros: aplicaciones, infraestructura (kubelet, kube-proxy, CNI, ingress), red, auditoría, pago, eventos web, Nginx/Envoy, DB.
2) Arquitecturas de alto nivel
Opción A: ELK
Producers → Logshipper (Filebeat/Fluent Bit/Vector) → Logstash/Beats input → Elasticsearch → Kibana/Алертинг
Opción B: Loki
Producers → Promtail/Fluent Bit → Loki distributor/ingester/querier → Grafana/Алертинг
Híbrido
ELK para búsqueda de texto completo/facetas, Loki para almacenamiento escalable barato y consultas rápidas similares a grep; corea con métricas/pistas en Grafana.
3) Flujo de datos y niveles de procesamiento
1. Colección: archivos de tail, journald, syslog, contenedores stdout, HTTP.
2. Enriquecimiento: normalización timestamp, host/pod/namespace, env (prod/stage), release, commit SHA, trace/span id.
3. Parking: JSON → flat fields; grok/regex; Nginx/Envoy formatos; esquemas de pago (códigos de error PSP).
4. Filtrar/editar: cortar PII (PAN, CVV, e-mail, direcciones), secretos, tokens.
5. Enrutamiento: por tenant/servicio/nivel de registro; hot/warm/cold; en S3/almacenamiento de objetos.
6. Almacenamiento y retiro: política TTL por clase de datos.
7. Acceso/Análisis/Alertas.
4) ELK: soluciones clave
4. 1 Logstash/Beats
Utilice Beats/Fluent Bit en los nodos para el ensamblador ligero, Logstash - como ETL central (grok, dissect, mutate, geoip, translate).
Grupos Logstash: ingest-ETL, security-ETL, payments-ETL - para el aislamiento de cargas.
4. 2 Elasticsearch
Charding: centrarse en la ~ de 20-50 GB por shard; evite la «explosión shard».
Estrategia de índices: 'logs- <tenant> - <service> -YYYY. MM. DD 'o streams de datos; rollover por tamaño/tiempo.
- hot: SSD, 1-7 días; warm: HDD, 7-30 días; cold: volumétrico; frozen: costo mínimo con acceso más lento.
- Mappings: tipifique los campos con rigor, limite la 'fielddata' y cree campos dinámicos.
- Caché y consultas: filtros por keyword-campos, agregados - suavemente; pin-to-hot para búsqueda de alta frecuencia.
4. 3 Kibana
Espacios (Spaces) para multi-tenencia.
Búsquedas ahorradas, Lens/TSVB, threshold/métricas-alertas.
RBAC por índice-patrones ('logs-tenant-').
5) Loki: soluciones clave
5. 1 Modelo de etiquetas
Las etiquetas son el «índice» Loki. Use cardinalidad baja: 'cluster', 'namespace', 'app', 'level', 'env', 'tenant'.
Campos de alta cardinalidad (uid, request_id) - en línea; extraer al solicitarlo a través de LogQL '|=', '| json', '| regexp'.
5. 2 Componentes
Promtail: сбор stdout, files, journald; parsers (JSON, regex, cri).
Distribuidor/Ingeniero/Querier/Query-frontend: escalar por roles; caché de consultas.
Almacenamiento de objetos (S3/GCS/MinIO) para almacenamiento a largo plazo de registros de chunks.
5. 3 recepciones LogQL
Rápido grep: '{app = «payments», nivel =» error»} |= «declined»
Парсинг JSON: `{app="api"} | json | code="5xx" | unwrap duration | avg()`
Correlación con métricas: 'rate ({app = «nginx»} |= «200» [5m])'
6) Comparación de ELK vs Loki (en resumen)
Búsqueda/agregaciones: ELK es más fuerte para consultas complejas de texto completo y facetas; Loki - grep-like, rápido y barato.
Costo: Loki es a menudo más barato en grandes volúmenes (almacenamiento de objetos + índice más pequeño).
Complejidad de operación: ELK requiere disciplina en índices/ILM, Javu-hips; Loki - disciplinas por etiquetas.
Correlación con métricas/pistas: Loki se integra naturalmente con la pila Grafana/OTel; ELK también sabe, pero más a menudo a través de las integraciones.
7) Seguridad y cumplimiento
Edición PII en el borde (shipper): enmascarar PAN, correo electrónico, teléfono, direcciones, tokens.
TLS en tránsito, mTLS entre agentes y buses.
RBAC: índices/etiquetas per-tenant; Aislamiento de espacios/espacios no espaciales.
Secrets hygiene: variables de entorno sin secretos, gestores de secretos individuales.
Legal Hold: mecanismo de congelación de segmentos/índices; write-once para los períodos controvertidos.
Eliminación/retiro: políticas TTL por clase de datos (prod/stateful/pagos/auditoría).
Trails de auditoría de acceso a logs.
8) Fiabilidad y ancho de banda
Búfering y backpressure: los archivos/discos locales de los agentes; retraídas con retroceso exponencial.
Idempotency: campos 'ingest _ id '/' log _ id' para evitar tomas en repeticiones.
HA: un mínimo de 3 nodos para los maestros/ingenieros de ES Loki; antiaffinity по AZ.
Cuotas y ratios-límites por tenant/service; protección contra «tormentas» de lógica.
Esquema de nivel de registro: 'ERROR' limitado, 'DEBUG' sólo temporalmente a través de banderas dinámicas.
9) Rendimiento y afinación
ELK:- JVM heap 50% RAM (pero ≤ ~ 30-32 GB por nodo), page cache es importante.
- Rollover inteligente (20-50 GB/shard), 'refresh _ interval' ↑ para índices de ingest.
- En Logstash, evitar el grok «pesado»; si es posible, la lógica JSON en la fuente.
- La etiqueta correcta es la clave de velocidad.
- Las chancas más grandes → son más baratas de almacenar, pero más caras que la memoria del ingester; equilibra.
- Query-frontend + caché (meme/Redis) para consultas repetidas.
10) FinOps para registros (costo)
Reducción de la cardinalidad de los campos/etiquetas.
Sampling DEBUG y «logs-swiches» dinámicos.
Rotación: corto hot, largo cold a objeto.
Deduplicación y mensajes consolidados (batch).
Archive registros raramente utilizados en clases de almacenamiento de información baratas.
Dashbord del coste: ob'em/data-strimy/leybly/indeksy/tenanty.
11) Correlación con métricas y pistas (Observabilidad 3 en 1)
Trace-ID/Span-ID en cada registro (middleware en API gateways y servicios).
OpenTelemetry: contexto único; exportadores a Tempo/Jaeger, métricas a Prometheus/Mimir, registros a Loki/ELK.
Escenarios rápidos: «alerta métrica → saltar a los registros correspondientes → saltar a la pista».
12) Multi-tenencia y aislamiento
Aislamiento basado en namespace (K8s labels), patrones de índice/etiquetas individuales 'tenant'.
Separación de alertas/dashboards/retenshn por tenant.
Facturación por consumo: volumen ingest, almacenamiento, consultas.
13) Monitoreo y SLO para el propio transportador
SLO ingest: «99. 9% de los registros entregados <X segundos".
SLO de búsqueda: «p95 consultas <Y segundos».
Métricas técnicas: queue depth, dropped logs, reprocess rate, error rate parsers, fallo ingester/ES nod.
14) Esquemas de despliegue estándar
Managed: Elasticsearch Service/Opensearch, Grafana Cloud Loki.
Self-hosted K8s: StatefulSets para ES/Loki, anti-affinity por AZ, PersistentVolumes, almacenamiento de objetos.
Agentes Edge (aplicaciones en regiones): buffer local + canal TLS al ingest central.
15) Ejemplos de configuraciones
15. 1 Promtail (K8s, CRI JSON)
yaml scrape_configs:
- job_name: kubernetes-pods kubernetes_sd_configs:
- role: pod pipeline_stages:
- cri: {}
- json:
expressions:
level: level msg: message trace: trace_id
- labels:
level:
app:
namespace:
- match:
selector: '{namespace="prod"}'
stages:
- regex:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
- replace:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
replace: '[REDACTED_PAN]'
relabel_configs:
- action: replace source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- action: replace source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- action: replace source_labels: [__meta_kubernetes_pod_node_name]
target_label: node
15. 2 Logstash (ingest y enmascaramiento)
ruby input {
beats { port => 5044 }
}
filter {
json { source => "message" skip_on_invalid_json => true }
mutate { add_field => { "env" => "%{[kubernetes][labels][env]}" } }
PII mutate {
gsub => [
"message", "\b[0-9]{12,19}\b", "[REDACTED_PAN]",
"message", "(?i)(authorization: Bearer)([A-Za-z0-9\.\-_]+)", "\1[REDACTED_TOKEN]"
]
}
}
output {
elasticsearch {
hosts => ["https://es-hot-1:9200","https://es-hot-2:9200"]
index => "logs-%{[fields][tenant]}-%{[app]}-%{+YYYY. MM. dd}"
ilm_enabled => true ssl => true cacert => "/etc/ssl/certs/ca. crt"
user => "${ES_USER}"
password => "${ES_PASS}"
}
}
16) Alertas y dashboards (patrones)
Ошибки API: `rate({app="api",level="error"}[5m]) > threshold` → PagerDuty/Telegram.
Una explosión de 5xx en Nginx/Envoy; drop ingest en agentes; crecimiento de la búsqueda latency.
- Volumen de registros por servicios/tenantes.
- Patrones de error superiores (código/excepción/endpoint).
- Costo por retén/clases de almacenamiento.
17) Control de calidad (registro-QA)
Contratos de lógica: formato JSON, campos obligatorios ('ts',' level ',' service ',' env ',' trace _ id ',' msg ').
Linter de registros en CI: prohibición de nuevos campos con alta cardinalidad sin acuerdo.
Servicios canarios: generación de registros de referencia para la detección precoz de regresiones.
18) Errores frecuentes y anti-patrones
Las etiquetas Loki de alta cardinalidad ('user _ id', 'request _ id') → una explosión de memoria.
Los campos dinámicos en ES sin mappings → una «explosión de índices».
DEBUG en venta «para siempre». Activar por banderas y con TTL.
Falta de revisión PII.
Un transportador «monolítico» común para todo es mejor segmentos por dominio.
19) Plan de implementación (iteraciones)
1. MVP: agentes + una pipeline (aplicaciones), dashboards básicos, edición PII.
2. Extensión: networking/infra-logs, alertas SLO, corea con pistas.
3. FinOps: matriz de retén, informe de valor, optimización de etiquetas/índices.
4. Multi-tenant: espacios, RBAC, facturación de consumo.
5. Fiabilidad: HA, disaster-drills, Legal Hold.
20) Lista de comprobación de inicio en el prod
- Formato JSON y campos obligatorios en todos los servicios.
- Enmascarar PII en el agente/ingest.
- Políticas de retiro/ILM o bucket-lifecycle.
- RBAC/espacios/tenantes.
- SLO ingest/búsqueda y alertas.
- Registros canarios y prueba de carga.
- Dashboards de valor y un informe sobre los propietarios de los servicios.
- Runbooks: «¿Qué hacer si ingest cayó/buscar lento/charda rojo».
21) Mini preguntas frecuentes
¿Qué elegir - ELK o Loki?