[{"data":1,"prerenderedAt":222},["ShallowReactive",2],{"seo-verification":3,"blog-grafana-tempo-opentelemetry-trazado-distribuido-vps-ma-es":6,"promo-bar-likely":221},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-grafana-tempo-opentelemetry-trazado-distribuido-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":152,"ctaBody":153,"ctaButton":154,"ctaUrl":155,"relatedPosts":156},220,"grafana-tempo-opentelemetry-trazado-distribuido-vps",{"fr":12,"en":13,"ar":14,"es":10},"opentelemetry-grafana-tempo-vps","grafana-tempo-and-opentelemetry-distributed-tracing-on-vps","grafana-tempo-وopentelemetry-التتبع-الموزع-على-خادم-vps","Grafana Tempo y OpenTelemetry: trazado distribuido en VPS","Despliega OpenTelemetry + Grafana Tempo en tu VPS: arquitectura completa, configuración paso a paso, instrumentación Node.js\u002FPython, retención S3 y consultas TraceQL.",12,2,false,"2026-08-04T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fopentelemetry-grafana-tempo-vps-poster.svg",{"categorySlug":34,"appSlug":35},"monitorizacion-observabilidad","grafana","Seguir una petición a través de múltiples servicios sin una herramienta de trazado significa revisar miles de líneas de logs manualmente. OpenTelemetry y Grafana Tempo forman un dúo open-source que convierte esa investigación en unos pocos clics. Esta guía explica cómo desplegar el stack completo en un VPS, instrumentar tus aplicaciones y usar TraceQL para diagnosticar problemas de latencia.",[38,42,53,56,59,84,87,90,93,142,145,149],{"type":39,"title":40,"body":41},"h2","Por qué elegir OpenTelemetry frente a un agente propietario","OpenTelemetry es un \u003Ca href=\"https:\u002F\u002Fwww.cncf.io\u002Fprojects\u002Fopentelemetry\u002F\">proyecto graduado de CNCF\u003C\u002Fa> que unifica los tres pilares de la observabilidad — trazas, métricas y logs — bajo un estándar neutral al proveedor. A diferencia de los agentes Datadog o New Relic que te encierran en un contrato y formato propietario, el OTel Collector recibe, transforma y exporta la telemetría a cualquier backend compatible. Puedes cambiar de almacenamiento sin tocar una sola línea de tu código.\n\nLos SDKs cubren Node.js, Python, Go, Java, PHP, Ruby y la mayoría de los lenguajes modernos. Los **propagadores de contexto** W3C TraceContext y B3 están incluidos: transmiten automáticamente el trace-id entre tus microservicios vía headers HTTP, sin configuración adicional.",{"type":43,"title":44,"items":45},"ul","Lo que te da el stack OTel + Grafana Tempo",[46,47,48,49,50,51,52],"**Trazado distribuido sin índice externo** — Grafana Tempo v2.x almacena las trazas en bloques comprimidos (parquet) en disco local o almacenamiento de objetos, sin Cassandra ni Elasticsearch.","**Consultas TraceQL** — el lenguaje nativo de Tempo permite filtrar trazas por duración, servicio, estado de error o atributos personalizados en segundos.","**Compatibilidad multi-protocolo** — Tempo acepta OTLP, Zipkin y Jaeger: tus aplicaciones existentes se conectan sin reinstrumentación completa.","**Stack ligero en VPS** — 2 GB de RAM son suficientes para un entorno de dev o staging; en producción bajo carga, 4 GB proporcionan margen cómodo.","**Coste controlado** — un VPS autohospedado desde 99 DH\u002Fmes reemplaza una suscripción a Datadog APM facturada a unos 23 $ por host y mes.","**Correlación trazas–logs–métricas** — vinculando Tempo con Loki y Prometheus en Grafana, saltas de una traza a sus logs y métricas en un solo clic.","**Sin vendor lock-in** — si migras a Jaeger mañana, reconfiguras un exportador en el Collector; tus SDKs y código no cambian.",{"type":39,"title":54,"body":55},"Requisitos previos del VPS","Tu VPS necesita al menos **2 GB de RAM** (4 GB recomendados en producción) y acceso root o sudo. Docker Engine ≥ 24 y Docker Compose v2 deben estar instalados.\n\nPlanifica un subdominio dedicado — por ejemplo `grafana.tu-dominio.com` — para exponer la interfaz Grafana detrás de un proxy inverso TLS. Los puertos **4317** (OTLP\u002FgRPC) y **4318** (OTLP\u002FHTTP) deben estar abiertos en tu firewall en el lado privado para recibir telemetría desde tus aplicaciones; no los expongas en la interfaz pública. Los puertos 3200 (Tempo) y 3000 (Grafana) permanecen internos a la red Docker.\n\nPlanifica al menos 10 GB libres para los bloques de trazas. El montaje por defecto en `\u002Ftmp\u002Ftempo` no sobrevive a los reinicios: reemplázalo con un volumen Docker o un disco dedicado antes de ir a producción.",{"type":39,"title":57,"body":58},"Arquitectura del stack: del span a la visualización","El flujo de datos sigue cuatro pasos:\n\n1. **Tu aplicación** instrumenta sus peticiones con un SDK OTel y exporta spans al OTel Collector (OTLP gRPC puerto 4317 o HTTP puerto 4318).\n2. **El OTel Collector** recibe, agrupa en lotes y exporta a Tempo vía OTLP gRPC interno. Puede enviar simultáneamente métricas a Prometheus y logs a Loki.\n3. **Grafana Tempo** almacena bloques de trazas comprimidos en disco (o S3). Expone una API TraceQL en el puerto 3200.\n4. **Grafana** consulta Tempo con TraceQL, muestra flamegraphs, grafos de servicios y span metrics.\n\n**TraceQL** es el lenguaje de consulta nativo de Tempo: `{service.name=\"api\" && status=error && duration>500ms}`.\n\n**Span Metrics** es un pipeline de Tempo que deriva automáticamente métricas RED de las trazas entrantes, sin añadir un solo contador a tu código.",{"type":60,"title":61,"steps":62},"steps","Desplegar el stack OTel + Tempo en siete pasos",[63,66,69,72,75,78,81],{"title":64,"body":65},"Crear la estructura de directorios","Organiza una carpeta `otel-stack\u002F` en tu VPS:\n\n```bash\nmkdir -p otel-stack\u002Fconfig\ncd otel-stack\n```\n\nColocarás aquí tres archivos de configuración: `tempo.yaml`, `otel-collector-config.yaml` y `docker-compose.yml`.",{"title":67,"body":68},"Escribir la configuración de Tempo (tempo.yaml)","Crea `config\u002Ftempo.yaml` con backend de almacenamiento local y soporte TraceQL:\n\n```yaml\nserver:\n  http_listen_port: 3200\n\ndistributor:\n  receivers:\n    otlp:\n      protocols:\n        grpc:\n          endpoint: 0.0.0.0:4317\n\ningester:\n  max_block_bytes: 1_000_000\n  max_block_duration: 5m\n\ncompactor:\n  compaction:\n    block_retention: 168h   # 7 días\n\nstorage:\n  trace:\n    backend: local\n    wal:\n      path: \u002Ftmp\u002Ftempo\u002Fwal\n    local:\n      path: \u002Ftmp\u002Ftempo\u002Fblocks\n```",{"title":70,"body":71},"Escribir la configuración del OTel Collector","Crea `config\u002Fotel-collector-config.yaml`:\n\n```yaml\nreceivers:\n  otlp:\n    protocols:\n      grpc:\n        endpoint: 0.0.0.0:4317\n      http:\n        endpoint: 0.0.0.0:4318\n\nprocessors:\n  batch:\n    timeout: 5s\n    send_batch_size: 1000\n\nexporters:\n  otlp:\n    endpoint: tempo:4317\n    tls:\n      insecure: true\n\nservice:\n  pipelines:\n    traces:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [otlp]\n```",{"title":73,"body":74},"Escribir el docker-compose.yml","Crea `docker-compose.yml` en la raíz de `otel-stack\u002F`:\n\n```yaml\nservices:\n  otel-collector:\n    image: otel\u002Fopentelemetry-collector-contrib:latest\n    volumes:\n      - .\u002Fconfig\u002Fotel-collector-config.yaml:\u002Fetc\u002Fotelcol-contrib\u002Fconfig.yaml\n    ports:\n      - \"4317:4317\"\n      - \"4318:4318\"\n    networks:\n      - observability\n    depends_on:\n      - tempo\n\n  tempo:\n    image: grafana\u002Ftempo:latest\n    command: [\"-config.file=\u002Fetc\u002Ftempo.yaml\"]\n    volumes:\n      - .\u002Fconfig\u002Ftempo.yaml:\u002Fetc\u002Ftempo.yaml\n      - tempo-data:\u002Ftmp\u002Ftempo\n    ports:\n      - \"3200:3200\"\n    networks:\n      - observability\n\n  grafana:\n    image: grafana\u002Fgrafana:latest\n    ports:\n      - \"3000:3000\"\n    environment:\n      - GF_AUTH_ANONYMOUS_ENABLED=true\n      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n    networks:\n      - observability\n    depends_on:\n      - tempo\n\nvolumes:\n  tempo-data:\n\nnetworks:\n  observability:\n```\n\nInicia el stack: `docker compose up -d` y verifica: `docker compose ps`.",{"title":76,"body":77},"Configurar Grafana Tempo como fuente de datos","Abre Grafana en `http:\u002F\u002Ftu-vps:3000`. Ve a **Connections → Data sources → Add data source** y selecciona **Tempo**. Establece la URL a `http:\u002F\u002Ftempo:3200`. Activa **Service graph** y **Span metrics**. Si tu stack incluye Loki, vincula ambas fuentes de datos para navegar de un span a sus logs en un clic.",{"title":79,"body":80},"Enviar tu primera traza de prueba","Prueba que el stack recibe trazas con `telemetrygen`:\n\n```bash\ndocker run --rm --network otel-stack_observability \\\n  ghcr.io\u002Fopen-telemetry\u002Fopentelemetry-collector-contrib\u002Ftelemetrygen:latest \\\n  traces \\\n  --otlp-endpoint otel-collector:4317 \\\n  --otlp-insecure \\\n  --duration 5s \\\n  --rate 10\n```\n\nEn Grafana, abre **Explore**, selecciona la fuente de datos Tempo y ejecuta la consulta `{}` para ver todas las trazas recibidas.",{"title":82,"body":83},"Consultar tus trazas con TraceQL","En el panel Explore de Grafana (fuente de datos Tempo), introduce una consulta TraceQL:\n\n- `{service.name=\"mi-api\"}` — todas las trazas del servicio\n- `{status=error}` — todas las trazas con error\n- `{duration>1s && service.name=\"mi-api\"}` — trazas lentas\n- `{span.http.route=\"\u002Fapi\u002Forders\" && status=error}` — errores en una ruta concreta\n\nHaz clic en una traza para abrir el flamegraph detallado.",{"type":39,"title":85,"body":86},"Configurar la retención y el almacenamiento de trazas","Tempo ofrece dos opciones principales de almacenamiento.\n\n**Almacenamiento local en volumen Docker**: recomendado para un VPS standalone. Ajusta `block_retention` en `tempo.yaml`: 72 h para staging, 168 a 720 h para producción. Cada hora de trazas comprimidas ocupa aproximadamente 100–300 MB.\n\n**Almacenamiento de objetos compatible con S3**: para un stack multi-nodo o almacenamiento ilimitado. Tempo es compatible con AWS S3, MinIO, Scaleway Object Storage y cualquier backend con API S3. La WAL siempre permanece en disco local para garantizar la durabilidad de las trazas en vuelo.\n\nEl **compactor** de Tempo fusiona bloques pequeños y aplica la política de retención automáticamente cada 5 minutos.",{"type":39,"title":88,"body":89},"Instrumentar una aplicación Node.js","La auto-instrumentación OTel para Node.js captura automáticamente llamadas HTTP salientes, peticiones Express\u002FFastify, consultas a bases de datos y más, sin modificar tu lógica de negocio.\n\nInstala los paquetes:\n\n```bash\nnpm install @opentelemetry\u002Fsdk-node \\\n             @opentelemetry\u002Fauto-instrumentations-node \\\n             @opentelemetry\u002Fexporter-trace-otlp-grpc\n```\n\nCrea `tracing.js`:\n\n```js\nconst { NodeSDK } = require('@opentelemetry\u002Fsdk-node');\nconst { getNodeAutoInstrumentations } = require('@opentelemetry\u002Fauto-instrumentations-node');\nconst { OTLPTraceExporter } = require('@opentelemetry\u002Fexporter-trace-otlp-grpc');\n\nconst sdk = new NodeSDK({\n  traceExporter: new OTLPTraceExporter({\n    url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'grpc:\u002F\u002Flocalhost:4317',\n  }),\n  instrumentations: [getNodeAutoInstrumentations()],\n});\n\nsdk.start();\n```\n\nInicia tu aplicación:\n\n```bash\nexport OTEL_SERVICE_NAME=mi-api\nexport OTEL_EXPORTER_OTLP_ENDPOINT=http:\u002F\u002Ftu-vps:4317\nnode --require .\u002Ftracing.js app.js\n```",{"type":39,"title":91,"body":92},"Instrumentar una aplicación Python","Instala y bootstrap:\n\n```bash\npip install opentelemetry-distro opentelemetry-exporter-otlp\nopentelemetry-bootstrap -a install\n```\n\nInicia tu aplicación:\n\n```bash\nexport OTEL_SERVICE_NAME=mi-servicio-python\nexport OTEL_EXPORTER_OTLP_ENDPOINT=http:\u002F\u002Ftu-vps:4317\nexport OTEL_EXPORTER_OTLP_PROTOCOL=grpc\nopentelemetry-instrument python app.py\n```\n\nDjango, Flask, FastAPI, SQLAlchemy y los clientes HTTP se instrumentan automáticamente. Para instrumentación manual:\n\n```python\nfrom opentelemetry import trace\ntracer = trace.get_tracer(__name__)\nwith tracer.start_as_current_span(\"procesar-pedido\") as span:\n    span.set_attribute(\"pedido.id\", pedido_id)\n```",{"type":94,"title":95,"headers":96,"rows":101},"comparison","OTel + Tempo vs Jaeger vs Zipkin vs Datadog APM",[97,98,99,100],"Criterio","OTel + Grafana Tempo","Jaeger","Datadog APM",[102,107,112,117,122,127,132,137],[103,104,105,106],"Coste mensual","Solo alojamiento (99 DH\u002Fmes VPS)","Solo alojamiento (similar)","~23 $ por host al mes",[108,109,110,111],"Backend de almacenamiento","Local, S3, GCS, Azure Blob","Cassandra, Elasticsearch, Badger","SaaS gestionado (opaco)",[113,114,115,116],"Lenguaje de consulta","TraceQL (nativo, potente)","Jaeger Query UI (básico)","Lenguaje propietario Datadog",[118,119,120,121],"Auto-instrumentación","SDK OTel universal","Librerías Jaeger o OTel","Agente propietario Datadog",[123,124,125,126],"Correlación trazas–logs","Sí (Loki + Grafana)","Limitada","Sí (integrado, de pago)",[128,129,130,131],"Span Metrics (RED)","Sí (pipeline nativo Tempo)","No nativo","Sí (calculado por Datadog)",[133,134,135,136],"Vendor lock-in","Ninguno (estándar CNCF)","Bajo (compatible OTel)","Alto (agente y formato propietarios)",[138,139,140,141],"Complejidad de instalación","Media (3 contenedores)","Baja a media","Baja (agente automático)",{"type":39,"title":143,"body":144},"Alertas y SLOs en Grafana","Grafana 10+ permite definir alertas directamente sobre métricas derivadas de trazas. Las **Span Metrics** de Tempo generan automáticamente tres métricas por servicio: tasa de peticiones, histograma de latencia y contador de errores.\n\nPara crear un SLO sobre la tasa de error de tu API, ve a **Alerting → Alert rules → New alert rule** en Grafana, elige la fuente de datos Prometheus e introduce una consulta que calcule la proporción de errores. Define el umbral (por ejemplo `> 0.05` para una tasa de error superior al 5%) y la ventana de evaluación. Configura un punto de contacto: Alertmanager, PagerDuty, Slack o webhook. Las alertas basadas en trazas son mucho más precisas que las alertas sobre métricas sintéticas.",{"type":146,"title":147,"body":148},"tip","Combinar trazas, logs y métricas en un solo Collector","El OTel Collector no se limita a las trazas. Añadiendo un **`filelog` receiver** recoges los logs de tus contenedores Docker y los envías a Loki. Un **`prometheus` receiver** hace scraping de tus endpoints `\u002Fmetrics` y los exporta a Prometheus. Un solo proceso gestiona toda la telemetría de tu VPS.\n\nEn Grafana, vincula Tempo y Loki mediante **derived fields**: cuando un log contiene un `trace_id`, un enlace clicable te lleva directamente al flamegraph correspondiente. Esta navegación cruzada reduce considerablemente el tiempo de diagnóstico.",{"type":39,"title":150,"body":151},"Resolver problemas comunes","**No llegan spans a Tempo.** Comprueba primero que el OTel Collector es accesible desde tu aplicación (`telnet tu-vps 4317`). Revisa los logs del Collector: un error `connection refused` en `tempo:4317` indica que Tempo no ha arrancado o su puerto interno no está expuesto en la red Docker.\n\n**Conexión rechazada desde la aplicación al Collector.** En UFW o firewalld, permite los puertos 4317 y 4318 solo para las IPs de tus aplicaciones. En producción, aplicaciones y Collector deben estar en la misma red privada.\n\n**Trazas truncadas o spans faltantes.** El batch processor puede tardar hasta 5 s en enviar. Para desarrollo, reduce `timeout: 1s`. Si los spans faltan sistemáticamente, verifica que el propagador de contexto `W3CTraceContextPropagator` está activo en tu SDK.\n\n**Tempo consume demasiado espacio en disco.** Reduce `block_retention` y reinicia Tempo. El compactor aplicará la nueva política en el siguiente ciclo.\n\n**Grafana no encuentra trazas desde los logs de Loki.** Verifica que tus aplicaciones inyectan `trace_id` en sus logs y que el campo **Derived fields** en la fuente de datos Loki apunta al patrón correcto.","Aloja tu stack de observabilidad en un VPS","Desde 99 DH\u002Fmes — acceso root completo, almacenamiento SSD, sin ataduras a proveedor.","Ver planes VPS","\u002Fapplications\u002Fmonitorizacion-observabilidad\u002Fgrafana",[157,181,199],{"id":158,"slug":159,"slugs":160,"title":164,"excerpt":165,"readTime":166,"views":167,"isPinned":19,"noindex":19,"publishedAt":168,"updatedAt":169,"category":170,"categories":176,"featuredImage":30,"bgImage":31,"posterImage":178,"relatedSolution":179},176,"alojar-openobserve-en-un-vps",{"fr":161,"en":162,"ar":163,"es":159},"self-host-openobserve-vps","self-host-openobserve-on-a-vps-unified-logs-metrics-and-traces","استضافة-openobserve-على-vps-سجلات-ومقاييس-وتتبعات-موحدة","Alojar OpenObserve en un VPS: logs, métricas y trazas","Sustituya Elasticsearch + Grafana por OpenObserve: un solo binario Rust para logs, métricas, trazas y paneles, con un almacenamiento 140× más barato.",6,0,"2026-07-10T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":171,"name":172,"slug":173,"color":174,"icon":175},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[177],{"id":171,"name":172,"slug":173,"color":174,"icon":175},"\u002Fblog\u002Fcovers\u002Fself-host-openobserve-vps-poster.svg",{"categorySlug":34,"appSlug":180},"openobserve",{"id":182,"slug":183,"slugs":184,"title":188,"excerpt":189,"readTime":190,"views":191,"isPinned":19,"noindex":19,"publishedAt":192,"updatedAt":21,"category":193,"categories":194,"featuredImage":30,"bgImage":31,"posterImage":196,"relatedSolution":197},209,"alojar-gatus-en-un-vps",{"fr":185,"en":186,"ar":187,"es":183},"self-host-gatus-vps","self-host-gatus-on-a-vps-config-as-code-status-page-and-checks","استضافة-gatus-على-vps-صفحة-حالة-بالكود-ومراقبة-شاملة","Alojar Gatus en un VPS: página de estado config-as-code","Despliegue Gatus en su VPS ServOrbit: página de estado pública y checks HTTP, TCP, DNS, ICMP y caducidad TLS gobernados por un solo archivo YAML, 40+ canales de alerta.",4,1,"2026-08-02T00:00:00+00:00",{"id":171,"name":172,"slug":173,"color":174,"icon":175},[195],{"id":171,"name":172,"slug":173,"color":174,"icon":175},"\u002Fblog\u002Fcovers\u002Fself-host-gatus-vps-poster.svg",{"categorySlug":34,"appSlug":198},"gatus",{"id":200,"slug":201,"slugs":202,"title":206,"excerpt":207,"readTime":208,"views":18,"isPinned":19,"noindex":19,"publishedAt":209,"updatedAt":21,"category":210,"categories":215,"featuredImage":30,"bgImage":31,"posterImage":217,"relatedSolution":218},177,"alojar-langfuse-en-un-vps",{"fr":203,"en":204,"ar":205,"es":201},"self-host-langfuse-vps","self-host-langfuse-on-a-vps-llm-observability-no-saas-bill","استضافة-langfuse-على-vps-مراقبة-llm-بلا-فاتورة-saas","Alojar Langfuse en un VPS: observabilidad LLM sin SaaS","Autoaloje Langfuse en un VPS — rastree cada llamada de IA, evalúe prompts y controle costos LLM. Guía completa: nginx, TLS, SDK Python\u002FJS, solución de problemas.",11,"2026-07-12T00:00:00+00:00",{"id":191,"name":211,"slug":212,"color":213,"icon":214},"Inteligencia Artificial","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[216],{"id":191,"name":211,"slug":212,"color":213,"icon":214},"\u002Fblog\u002Fcovers\u002Fself-host-langfuse-vps-poster.svg",{"categorySlug":219,"appSlug":220},"inteligencia-artificial","langfuse",true,1794270606167]