<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://laraxavier.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://laraxavier.github.io/" rel="alternate" type="text/html" /><updated>2026-04-29T02:20:20+00:00</updated><id>https://laraxavier.github.io/feed.xml</id><title type="html">Lara Xavier</title><subtitle>Artigos sobre Observabilidade, SRE, Grafana e OpenTelemetry: conectando métricas, logs e traces a decisões reais de negócio.</subtitle><entry><title type="html">Primeiros passos com Opentelemetry: Tudo (ou quase tudo) que você precisa saber</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/04/28/opentelemetry.html" rel="alternate" type="text/html" title="Primeiros passos com Opentelemetry: Tudo (ou quase tudo) que você precisa saber" /><published>2026-04-28T03:00:00+00:00</published><updated>2026-04-28T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/04/28/opentelemetry</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/04/28/opentelemetry.html"><![CDATA[<h2 id="sumário">Sumário</h2>

<ul>
  <li><a href="#1-o-que-é-o-opentelemetry">O que é o OpenTelemetry?</a></li>
  <li><a href="#12-quais-os-componentes-do-opentelemetry">Quais os componentes do OpenTelemetry?</a>
    <ul>
      <li><a href="#121-receivers">Receivers</a></li>
      <li><a href="#122-processors">Processors</a>
        <ul>
          <li><a href="#1221-batch">Batch</a></li>
          <li><a href="#1222-span">Span</a></li>
          <li><a href="#1223-memory_limiter">Memory Limiter</a></li>
          <li><a href="#1224-resource">Resource</a></li>
          <li><a href="#1225-attributes">Attributes</a></li>
          <li><a href="#1226-filters">Filters</a></li>
        </ul>
      </li>
      <li><a href="#123-exporters">Exporters</a></li>
      <li><a href="#124-connectors">Connectors</a></li>
      <li><a href="#125-extensions-e-services">Extensions e Services</a></li>
    </ul>
  </li>
  <li><a href="#13-tail-sampling-processor">Tail Sampling Processor</a>
    <ul>
      <li><a href="#14-funções">Funções e parâmetros importantes</a></li>
      <li><a href="#141-policies-as-que-mais-gosto">Policies mais utilizadas</a></li>
    </ul>
  </li>
  <li><a href="#15-segurança-e-dados-sensíveis-pii-não-é-opcional">Segurança e dados sensíveis (PII não é opcional)</a>
    <ul>
      <li><a href="#151-pii-personally-identifiable-information">PII – Personally Identifiable Information</a></li>
      <li><a href="#152-hash">Hash</a></li>
      <li><a href="#153-regex">Regex</a></li>
      <li><a href="#154-delete">Delete</a></li>
    </ul>
  </li>
  <li><a href="#16-certificados">Certificados, Keycloak e OpenID</a></li>
  <li><a href="#17-opentelemetry-collector-builder-ocb-e-load-balancing-exporter">OpenTelemetry Collector Builder (OCB) e Load Balancing Exporter</a>
    <ul>
      <li><a href="#171-opentelemetry-collector-builder-ocb">OpenTelemetry Collector Builder (OCB)</a></li>
      <li><a href="#172-load-balancing-exporter">Load Balancing Exporter</a></li>
    </ul>
  </li>
  <li><a href="#18-cardinalidade-o-erro-mais-comum-de-quem-está-começando">Cardinalidade: Os 10 mandamentos para quem começa</a></li>
  <li><a href="#19-dica-de-ouro">Dica de ouro</a></li>
</ul>

<p>Ao final da escrita me dei conta que fiz um tcc, por isso o sumário hahaha</p>

<p>O mundo da telemetria te oferece muitas possibilidades de coleta e transformação de dados. Antes de usar e listar pré-requisitos para começar a brincar nas instrumentações é importante saber a estrutura e objetivo do framework.
Já deixo aqui meu profundo agradecimento ao <strong>Juraci Paixão Kröhling, Danilo Háwila e Marilya Gutierrez</strong>. <em>São minhas referências de aprendizado contínuo com telemetria e indico totalmente para quem está começando.</em></p>

<p>Outra sugestão, caso se interessem é o livro <strong>Learning OpenTelemetry - Setting Up and Operating a Modern Observability System</strong>, foi escrito pelos co-fundadores Ted Young e Austin Parker do opentelemetry e tem uma linguagem muito bacana para explicar como os desafios foram pensados para que entenda como utilizar em aplicações modernas. Inclusive, irei apresentar insights referenciando-o nesse artigo.</p>

<h2 id="1-o-que-é-o-opentelemetry">1. O que é o Opentelemetry?</h2>

<p>Trata-se de um framework de observabilidade, explicando for dummies, um esqueleto de código personalizável que irá receber telemetria, modificar, e enviar de forma segura para uma central de recebimento <em>(backends como Grafana, Datadog, Dynatrace, Splunk, Jaeger…etc)</em>, que normalmente armazenam em um storage (s3, minIO, RustFs…) e possuem um frontend para tu criar alertas, dashboards, calcular sli, slo de forma correlacionada a fim de compreender o comportamento dos eventos gerados da sua aplicação. Utiliza o modo event-driven (envio por eventos) e seus dados são enviados em tempo real.</p>

<p>Uma analogia criada por Marilya Gutierrez para melhor fixação é o Cabo C, ele é universal para carregar diversos tipos de celulares (enviando telemetria para diversos tipos de backends) e possui o USB que seria sua aplicação enviando a telemtria. Isso revela o diferencial do OpenTelemetry, ser agnóstico. Ele é compatível com os backends de observabilidade tirando o lock-in, que é a venda de produtos com agents proprietários pagos. Caso queira mudar a solução, basta editar o apontamento e não fazer o retrabalho de tirar o agent e instrumentar novamente. Assunto sensível em aplicações críticas.</p>

<p>Para começar a diversão, segundo as definições de Ted Young e Austin Parker em 2024 na obra citad acima, temos os 3 pilares de observabilidade:métricas, logs e traces e cada um deles é composto pelas etapas abaixo, e dessa forma o opentelemetry se comporta:</p>

<p><img src="/assets/images/otel/pilar.png" alt="Obs" /></p>

<p>Fonte: Young, T., &amp; Parker, A. (2024). Learning OpenTelemetry: Setting Up and Operating a Modern Observability System. O’Reilly Media. ISBN: 978‑1‑098‑14718‑1.</p>

<h2 id="12-quais-os-componentes-do-opentelemetry">1.2 Quais os componentes do Opentelemetry?</h2>

<h3 id="121-receivers">1.2.1 Receivers</h3>

<p>Os receptores ou Receivers como é chamado no bloco de código portão de entrada para recerber a telemetria.
Quando for configurar o seu, olhe os modelos já prontos que a comunidade criou para facilitar seu processo https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver</p>

<p><em>Se o collector for local, define a porta e mantem o ip zerado</em></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">receivers</span><span class="pi">:</span>
  <span class="na">otlp</span><span class="pi">:</span>
    <span class="na">protocols</span><span class="pi">:</span>
      <span class="na">grpc</span><span class="pi">:</span>
        <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:4317</span>
      <span class="na">http</span><span class="pi">:</span>
        <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:4318</span>

</code></pre></div></div>
<h4 id="otlp-opentelemetry-protocol---nativo">OTLP (OpenTelemetry Protocol) - Nativo</h4>

<p>O OTLP é o padrão recomendado e nativo, projetado para interoperabilidade e eficiência.</p>

<p>Os formatos aceitos pelo coletor opentelemetry são:</p>

<ul>
  <li>
    <p><strong>gRPC:</strong> Geralmente usa a porta 4317. É preferencial para alto desempenho.</p>
  </li>
  <li>
    <p><strong>HTTP/Protobuf:</strong> Usa a porta 4318. Dados codificados em Protocol Buffers sobre HTTP.</p>
  </li>
  <li>
    <p><strong>HTTP/JSON:</strong> JSON sobre HTTP, facilitando a depuração, mas com maior overhead que Protobuf.</p>
  </li>
</ul>

<h3 id="122-processors">1.2.2 Processors</h3>

<p>Eles são responsáveis por modificar ou transformar os dados antes de exportar para os backends.</p>

<h4 id="1221-batch">1.2.2.1 Batch</h4>

<p>O batch processor agrupa dados de telemetria (spans, métricas ou logs) antes de enviá-los aos exporters, reduzindo overhead e melhorando desempenho.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
      <span class="na">batch</span><span class="pi">:</span>
        <span class="na">send_batch_size</span><span class="pi">:</span> <span class="m">1000</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="s">5s</span>
</code></pre></div></div>
<p>Você pode definir o tamanho e o timeout.</p>

<ul>
  <li>send_batch_size: Quantidade de itens no lote, atinge esse número ele envia imediatamente</li>
  <li>timeout: Tempo máximo de espera, mesmo que o batch não esteja cheio, ele envia</li>
</ul>

<h4 id="1222-span">1.2.2.2 Span</h4>

<p>O bloco span permite modificar, renomear, filtrar ou excluir spans antes que eles sejam exportados.</p>

<p><strong>Lembrete:</strong> A configuração funciona apenas para traces.</p>

<p>Abaixo deixo 4 exemplos de como trabalhar:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Exclusão de spans irrelevantes</span>
<span class="na">span</span><span class="pi">:</span>
        <span class="na">exclude</span><span class="pi">:</span>
          <span class="na">match_type</span><span class="pi">:</span> <span class="s">strict</span>
          <span class="na">span_names</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">Transaction.commit"</span><span class="pi">]</span>
        <span class="na">name</span><span class="pi">:</span>
          <span class="na">from_attributes</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">resource.service.name"</span><span class="pi">]</span>

<span class="c1"># Renomear spans</span>
<span class="na">span</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">attributes["container.name"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"app_container_1"'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">resource.attributes["host.name"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"localhost"'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">name</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"app_3"'</span>

<span class="c1"># Expressão de filtro OTTL = Aplique essa regra apenas se o span for gRPC E se o nome do span indicar que é gRPC.</span>
<span class="na">spanevent</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">attributes["grpc"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">true'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">IsMatch(name,</span><span class="nv"> </span><span class="s">".*grpc.*")'</span>

<span class="c1"># Extrair parte do nome do span e jogar em atributos</span>
<span class="err">  </span><span class="na">span</span><span class="pi">:</span>
    <span class="na">name</span><span class="pi">:</span>
      <span class="na">to_attributes</span><span class="pi">:</span>
        <span class="na">rules</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="s">^\/api\/v1\/document\/(?P&lt;documentId&gt;.*)\/update$</span>
      <span class="na">from_attributes</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">db.svc</span><span class="pi">,</span> <span class="nv">operation</span><span class="pi">]</span>
      <span class="na">separator</span><span class="pi">:</span> <span class="s1">'</span><span class="s">::'</span>

</code></pre></div></div>

<h4 id="1223-memory_limiter">1.2.2.3 Memory_limiter</h4>

<p>O memory_limiter controla o uso de memória do Collector, limitando quanto de telemetria pode ser processada ao mesmo tempo para evitar OOMKill e instabilidade.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># A cada 5 segundos o Collector verifica o uso real de memória do processo.</span>

 <span class="na">memory_limiter</span><span class="pi">:</span>
        <span class="na">check_interval</span><span class="pi">:</span> <span class="s">5s</span>
<span class="c1"># Limite máximo de memória permitido para o Collector: ~2 GB</span>
        <span class="na">limit_mib</span><span class="pi">:</span> <span class="s">2024</span> 
<span class="c1"># Tolerância para picos rápidos de memória: ~1.5 GB</span>
        <span class="na">spike_limit_mib</span><span class="pi">:</span> <span class="m">1500</span>

</code></pre></div></div>
<p>Acima tem alguns parâmetros que pode definir, e vale salientar que nos casos de ter um collector por aplicação você poderá aplicar a regra de negócio.</p>

<h4 id="1224-resource">1.2.2.4 Resource</h4>

<p>Um dos blocos mais subestimados, mas ele revela sobre quem aquele evento está falando. Não só revela como utiliza de actions para proteger seus dados como hashs e deleta atributos irrelevantes.</p>

<p>Quando o trace te entrega um evento ruim na aplicação, ele responde as seguintes perguntas:</p>

<ul>
  <li>
    <p>Quem gerou?</p>
  </li>
  <li>
    <p>Em qual ambiente?</p>
  </li>
  <li>
    <p>Em qual cluster?</p>
  </li>
</ul>

<p>Esse é um modelo que pode ser usado:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">resource</span><span class="pi">:</span>
        <span class="na">attributes</span><span class="pi">:</span>
        <span class="c1"># Cria o atributo hostname copiando o valor de host.name</span>
          <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">insert</span>
            <span class="na">key</span><span class="pi">:</span> <span class="s">hostname</span>
            <span class="na">from_attribute</span><span class="pi">:</span> <span class="s">host.name</span>

        <span class="c1"># Cria o atributo container_name a partir de k8s.container.name</span>
          <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">insert</span>
            <span class="na">key</span><span class="pi">:</span> <span class="s">container_name</span>
            <span class="na">from_attribute</span><span class="pi">:</span> <span class="s">k8s.container.name</span>

        <span class="c1"># Cria o atributo service_name copiando o valor de service.name</span>
          <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">insert</span>
            <span class="na">key</span><span class="pi">:</span> <span class="s">service_name</span>
            <span class="na">from_attribute</span><span class="pi">:</span> <span class="s">service.name</span>

</code></pre></div></div>

<p>Um exemplo de como ficaria:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">service.name=payment</span>
<span class="s">deployment.environment=prod</span>
<span class="s">k8s.cluster.name=eks-prod</span>
</code></pre></div></div>

<p>Se faz importante alertar que é uma boa prática evitar colocar user.id, order.id, ou usar resource diferente para o mesmo serviço. Lembre-se que em larga escala manter um padrão fará diferença, pois precisará concatenar dados e usar regex no frontend da stack que irá trabalhar.<em>(a maioria já faz insights automáticos)</em></p>

<p><em>Resource bem definido reduz cardinalidade sem perder contexto.</em></p>

<p>E falando em facilidades no frontend, eles são fundamentais para: agregação de métricas, definição de SLOs, filtros em traces e logs e custo (labels estáveis)</p>

<p>Cuidado ao colocar dado dinâmico em resource! Pode bagunçar sua visualização.</p>

<h4 id="1225-attributes">1.2.2.5 Attributes</h4>

<p>São eles que contam a história certa! E os 3 pilares podem ser trabalhados com eles, logs, métricas e traces.</p>

<h5 id="spantraces">Span/traces</h5>

<p>Dando contexto para um evento, por exemplo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">http.method = POST</span>
<span class="s">http.route = /checkout</span>
<span class="s">http.status_code = </span><span class="m">500</span>
<span class="s">db.system = postgres</span>
</code></pre></div></div>

<h5 id="logs">Logs</h5>

<p>Dando contexto ao log</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">level = error</span>
<span class="s">user.role = admin</span>
<span class="s">component = auth</span>
</code></pre></div></div>

<h5 id="métricas">Métricas</h5>

<p>Dimensões de agregação</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">method = GET</span>
<span class="s">status = </span><span class="m">200</span>
<span class="s">route = /checkout</span>
</code></pre></div></div>

<p>Com eles você pode adicionar, remover, modificar, padronizar ou proteger dados sensíveis.</p>

<p>Através das funções de ação:</p>
<ul>
  <li>insert</li>
  <li>delete</li>
  <li>update</li>
  <li>upsert</li>
  <li>hash</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">attributes</span><span class="pi">:</span>
    <span class="na">actions</span><span class="pi">:</span>
     <span class="c1"># Insere o atributo resource.labels com o valor especificado, se ele ainda não existir.</span>
        <span class="na">key</span><span class="pi">:</span> <span class="s">resource.labels</span>
        <span class="na">value</span><span class="pi">:</span> <span class="s">hostname, container_name</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">insert</span>

     <span class="c1"># Adiciona o atributo environment=production se ele ainda não existir.</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">environment</span>
        <span class="na">value</span><span class="pi">:</span> <span class="s">production</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">insert</span>

     <span class="c1"># Remove completamente o atributo db.statement do span/log/métrica.</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">db.statement</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">delete</span>
        
     <span class="c1"># Aplica um hash irreversível no valor do atributo email.(O dado continua existindo, mas não pode ser revertido para o valor original, usado para ofuscar valor irreversivelmente)</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">email</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">hash</span>
</code></pre></div></div>
<h4 id="1226-filters">1.2.2.6 Filters</h4>

<p>Outra chave poderosa do processor que decide quais dados continuam no pipeline e quais são descartados, com base em expressões OTTL. No modo for dummies ele corta dados na origem para reduzir ruído, custo e risco.</p>

<p>Destrinchando um exemplo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># Data sources: metrics, metrics, logs</span>
  <span class="na">filter</span><span class="pi">:</span>
  <span class="c1"># Se uma expressão falhar, o Collector ignora o erro e segue o fluxo</span>
    <span class="na">error_mode</span><span class="pi">:</span> <span class="s">ignore</span>
  <span class="c1"># Descartar spans que correspondam a qualquer uma dessas condições</span>
    <span class="na">traces</span><span class="pi">:</span>
      <span class="na">span</span><span class="pi">:</span>
      <span class="c1"># Remove spans gerados por esse container específico</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">attributes["container.name"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"app_container_1"'</span>
      <span class="c1"># Remove spans vindos de execução local (dev/test)</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">resource.attributes["host.name"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"localhost"'</span>
      <span class="c1"># Remove spans com nome exato "app_3"</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">name</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"app_3"'</span>
    <span class="c1"># Remove eventos de span (span events) relacionados a gRPC</span>
      <span class="na">spanevent</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">attributes["grpc"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">true'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">IsMatch(name,</span><span class="nv"> </span><span class="s">".*grpc.*")'</span>

    <span class="c1"># Essas regras filtram a métrica inteira</span>
    <span class="na">metrics</span><span class="pi">:</span>
      <span class="na">metric</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">name</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"my.metric"</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">resource.attributes["my_label"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"abc123"'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">type</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">METRIC_DATA_TYPE_HISTOGRAM'</span>
    <span class="c1"># Remove apenas pontos de dados específicos, não a métrica inteira</span>
      <span class="na">datapoint</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">metric.type</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">METRIC_DATA_TYPE_SUMMARY'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">resource.attributes["service.name"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"my_service_name"'</span>

    <span class="na">logs</span><span class="pi">:</span>
      <span class="na">log_record</span><span class="pi">:</span>
      <span class="c1"># Remove logs que contenham a palavra password.</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">IsMatch(body,</span><span class="nv"> </span><span class="s">".*password.*")'</span>
      <span class="c1"># Remove logs de nível:DEBUG e INFO</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">severity_number</span><span class="nv"> </span><span class="s">&lt;</span><span class="nv"> </span><span class="s">SEVERITY_NUMBER_WARN'</span>
</code></pre></div></div>

<h3 id="123-exporters">1.2.3 Exporters</h3>

<p>O ponto agnóstico do nosso cabo C. É aqui que você poderá definir quem irá receber sua telemetria.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">exporters</span><span class="pi">:</span>
<span class="c1"># Imprime a telemetria no log do Collector, excelente para debug de pipeline, validação de processors, testes locais</span>
<span class="na">debug</span><span class="pi">:</span>
    <span class="na">verbosity</span><span class="pi">:</span> <span class="s">detailed</span>

<span class="na">otlp</span><span class="pi">:</span>
<span class="c1"># Envia telemetria via protocolo OTLP para outro Collector ou backend compatível</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">otelcol2:4317</span>
    <span class="c1"># Habilita comunicação segura (mTLS).</span>
    <span class="na">tls</span><span class="pi">:</span>
      <span class="na">cert_file</span><span class="pi">:</span> <span class="s">cert.pem</span>
      <span class="na">key_file</span><span class="pi">:</span> <span class="s">cert-key.pem</span>

<span class="c1"># Envio de métricas</span>
<span class="na">prometheus</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:8889</span>
    <span class="na">namespace</span><span class="pi">:</span> <span class="s">default</span>

<span class="c1"># Envio de traces </span>
 <span class="na">zipkin</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">http://zipkin.example.com:9411/api/v2/spans</span>
  
<span class="c1"># Envio de logs</span>
<span class="na">otlphttp/logs</span><span class="pi">:</span>
        <span class="na">endpoint</span><span class="pi">:</span> <span class="s">LOGS_URL</span>
        <span class="na">tls</span><span class="pi">:</span>
          <span class="na">insecure</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p><em>Eu sei que você viu sobre o tls, mas falaremos disso já já.</em></p>

<h3 id="124-connectors">1.2.4 Connectors</h3>

<p>São componentes que consomem um tipo de sinal e produzem outro tipo de sinal, conectando pipelines diferentes. Pode consumir dados como exportador no final de um pipeline e emite dados como receptor no início de outro pipeline.</p>

<p>Ficou confuso? segue exemplo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">connectors</span><span class="pi">:</span>
  <span class="na">count</span><span class="pi">:</span>
  <span class="c1"># Aqui eu concateno a contagem do meu atributo</span>
    <span class="na">spanevents</span><span class="pi">:</span>
      <span class="na">my.prod.event.count</span><span class="pi">:</span>
        <span class="na">description</span><span class="pi">:</span> <span class="s">Contagem de spans que tem no meu ambiente de prod.</span>
        <span class="na">conditions</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="s1">'</span><span class="s">attributes["env"]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"prod"'</span>
          <span class="pi">-</span> <span class="s1">'</span><span class="s">name</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">"prodevent"'</span>

</code></pre></div></div>

<p>Com eles você pode dar profundidade ao seu evento, mas lembre que o básico bem feito entrega valor e aqui uma conexão de span mal tratado só irá amplificar o problema. Pois aqui os traces viram métricas.</p>

<h3 id="125-extensions-e-services">1.2.5 Extensions e Services</h3>

<p>Enquanto em services tu irá listar quais recursos seu coletor vai usar, seria como um resumo, mas se habiitar a função e não colocar nele, nada feito.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">service</span><span class="pi">:</span>
      <span class="na">extensions</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">health_check</span><span class="pi">]</span>
      <span class="na">pipelines</span><span class="pi">:</span>
        <span class="na">traces</span><span class="pi">:</span>
          <span class="na">receivers</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">otlp</span><span class="pi">]</span>
          <span class="na">processors</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">span</span><span class="pi">,</span><span class="nv">batch</span><span class="pi">]</span>
          <span class="na">exporters</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">otlp</span><span class="pi">]</span>
        <span class="na">logs</span><span class="pi">:</span>
          <span class="na">receivers</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">otlp</span><span class="pi">]</span>
          <span class="na">processors</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">resource</span><span class="pi">,</span> <span class="nv">attributes</span><span class="pi">,</span> <span class="nv">memory_limiter</span><span class="pi">]</span>
          <span class="na">exporters</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">otlphttp/logs</span><span class="pi">]</span>
        <span class="na">metrics</span><span class="pi">:</span>
          <span class="na">receivers</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">otlp</span><span class="pi">,</span><span class="nv">prometheus</span><span class="pi">]</span>
          <span class="na">processors</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">batch</span><span class="pi">]</span>
          <span class="na">exporters</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">prometheusremotewrite</span><span class="pi">]</span>

</code></pre></div></div>

<p>Nas extensions, você irá utilizar “plugins” numa linguagem mais informal para interagir com seu collector.</p>

<p>O que as extensions fazem na prática?</p>

<ul>
  <li>
    <p><strong>Observam o próprio Collector:</strong> health check, status, diagnóstico</p>
  </li>
  <li>
    <p><strong>Controlam acesso:</strong> autenticação, autorização, segurança de endpoints</p>
  </li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">basicauth</span><span class="pi">:</span>
    <span class="na">client_auth</span><span class="pi">:</span>
      <span class="na">username</span><span class="pi">:</span> <span class="s">user</span>
      <span class="na">password</span><span class="pi">:</span> <span class="s">pass</span>
</code></pre></div></div>

<ul>
  <li>
    <p><strong>Ajudam no debug:</strong> profiling, métricas internas,ZPages</p>
  </li>
  <li>
    <p><strong>Integram com o ambiente:</strong> kubernetes, cloud, certificados, configuração dinâmica</p>
  </li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">extensions</span><span class="pi">:</span>
  <span class="c1"># Exponde endpoint /health, indica se o Collector está vivo</span>
  <span class="na">health_check</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:13133</span>
  <span class="c1"># Debug de performance, diagnóstico de vazamento de memória</span>
  <span class="na">pprof</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:1777</span>
  <span class="c1"># Entender gargalos no Collector, troubleshooting em tempo real</span>
  <span class="na">zpages</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s">0.0.0.0:55679</span>
</code></pre></div></div>
<h3 id="13-tail-sampling-processor">1.3 Tail Sampling Processor</h3>

<p>O tema mais polêmico e que faz total diferença financeira e qualitativa dos seus dados de telemetria. O Tail Sampling Processor decide se um trace inteiro será mantido ou descartado somente depois que ele termina.</p>

<p>Ele observa o trace inteiro e toma decisões como: “Esse trace teve erro?”, “Esse trace foi lento?”, “Esse trace passou por uma rota crítica?”, “Esse trace veio de um serviço importante?”</p>

<p><em>Se sim, ele mantém.Se não, ele pode descartar.</em></p>

<h4 id="14-funções">1.4 Funções</h4>

<p>Você pode conferir elas aqui: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/README.md</p>

<p>Parâmetros que são ponto de atenção no arquivo de configuração:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Tempo máximo que o Collector espera para decidir.</span>
<span class="na">decision_wait</span><span class="pi">:</span> <span class="s">30s</span>
<span class="c1"># Quantidade máxima de traces mantidos em memória para decisão.</span>
<span class="na">num_traces</span><span class="pi">:</span> <span class="m">50000</span>

</code></pre></div></div>
<p>Como ele funciona por policies(Políticas utilizadas para tomar uma decisão de amostragem), vão aqui alguns exemplos:</p>

<h4 id="141-policies-as-que-mais-gosto">1.4.1 Policies: As que mais gosto</h4>

<ol>
  <li><strong>drop:</strong> Excluir (não amostrar) com base em várias políticas, cria uma política DROP</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Quando houver valores com health no url.path deverão ser excluídas</span>
<span class="pi">{</span>
            <span class="nv">name</span><span class="pi">:</span> <span class="nv">drop-policy-example-1</span><span class="pi">,</span>
            <span class="nv">type</span><span class="pi">:</span> <span class="nv">drop</span><span class="pi">,</span>
            <span class="nv">drop</span><span class="pi">:</span> <span class="pi">{</span>
              <span class="nv">drop_sub_policy</span><span class="pi">:</span>
              <span class="pi">[</span>
                <span class="pi">{</span>
                    <span class="nv">name</span><span class="pi">:</span> <span class="nv">test-drop-policy-1</span><span class="pi">,</span>
                    <span class="nv">type</span><span class="pi">:</span> <span class="nv">string_attribute</span><span class="pi">,</span>
                    <span class="nv">string_attribute</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">key</span><span class="pi">:</span> <span class="nv">url.path</span><span class="pi">,</span> <span class="nv">values</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">\/health</span><span class="pi">],</span> <span class="nv">enabled_regex_matching</span><span class="pi">:</span> <span class="nv">true</span><span class="pi">}</span>
                <span class="pi">}</span>
              <span class="pi">]</span>
            <span class="pi">}</span>
         <span class="pi">}</span>
</code></pre></div></div>
<ol>
  <li><strong>status_code:</strong> baseado no status code (OK, ERROR or UNSET)</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Mostra todos com erro</span>
<span class="pi">{</span>
                  <span class="nv">name</span><span class="pi">:</span> <span class="nv">statuscode-policy-01</span><span class="pi">,</span>
                  <span class="nv">type</span><span class="pi">:</span> <span class="nv">status_code</span><span class="pi">,</span>
                  <span class="nv">status_code</span><span class="pi">:</span> <span class="pi">{</span> <span class="nv">status_codes</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">ERROR</span><span class="pi">]</span> <span class="pi">}</span>

</code></pre></div></div>

<ol>
  <li><strong>latency:</strong> Seleciona os traces lentos com latência predefinida pelo threshold_ms.</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Guardar apenas quando os traces tiverem dentro desse intervalo de latência</span>
<span class="pi">{</span>
            <span class="nv">name</span><span class="pi">:</span> <span class="nv">latency-policy</span><span class="pi">,</span>
            <span class="nv">type</span><span class="pi">:</span> <span class="nv">latency</span><span class="pi">,</span>
            <span class="nv">latency</span><span class="pi">:</span> <span class="pi">{</span><span class="nv">threshold_ms</span><span class="pi">:</span> <span class="nv">8000</span><span class="pi">,</span> <span class="nv">upper_threshold_ms</span><span class="pi">:</span> <span class="nv">10000</span><span class="pi">}</span>
          <span class="pi">}</span>

</code></pre></div></div>
<ol>
  <li><strong>probabilistic:</strong> Entrega uma amostragem dos dados</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Mostra 5% dos traces saudáveis</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">probabilistic</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">probabilistic</span>
  <span class="na">probabilistic</span><span class="pi">:</span>
    <span class="na">sampling_percentage</span><span class="pi">:</span> <span class="m">5</span>

</code></pre></div></div>
<ol>
  <li><strong>filter by rout</strong></li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Filtragem pela rota de checkout e pagamentos, finalização de um pedido quando falamos de ecommerce.</span>

  <span class="na">name</span><span class="pi">:</span> <span class="s">critical_routes</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">string_attribute</span>
  <span class="na">string_attribute</span><span class="pi">:</span>
    <span class="na">key</span><span class="pi">:</span> <span class="s">http.route</span>
    <span class="na">values</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">/checkout"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">/payment"</span><span class="pi">]</span>

</code></pre></div></div>
<p><em>Logo, o sampling mantém traces realmente úteis e reduz o tráfego irrelevante que sobe no backend.</em></p>

<h3 id="15-segurança-e-dados-sensíveis-pii-não-é-opcional">1.5 Segurança e dados sensíveis (PII não é opcional)</h3>

<p>Se você não trata segurança na origem, você está criando um data lake de risco.</p>

<h4 id="151-pii-personally-identifiable-information">1.5.1 PII (Personally Identifiable Information)</h4>

<p>O PII são informações que identificam uma pessoa, logo todos os dados sensíveis que aparecem na telemetria precisam ser tratados a fim de LGPD para garantir a segurança das informações. Podem aparecer nas métricas, logs e traces.</p>

<p>Alguns exemplos:e-mail, CPF / documento, IP do usuário final, user_id, session_id, tokens de autenticação, dados de saúde, dados financeiros.</p>

<h4 id="152-hash">1.5.2 Hash</h4>

<p>A função <strong>hash</strong> transforma um valor sensível em um identificador irreversível.</p>

<p>Exemplo de como fazer:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="na">processors</span><span class="pi">:</span>
  <span class="na">attributes/hash_pii</span><span class="pi">:</span>
    <span class="na">actions</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">email</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">hash</span>

</code></pre></div></div>
<p>Como ficaria:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="s">email = lara@empresa.com</span>
<span class="s">↓</span>
<span class="s">email = a94a8fe5ccb19ba61c4c0873d391e987</span>

</code></pre></div></div>

<h4 id="153-regex">1.5.3 Regex</h4>

<p>Usa de expressões regulares para identificar e tratar padrões sensíveis.</p>

<p>Exemplo de como fazer:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="na">processors</span><span class="pi">:</span>
  <span class="na">filter/logs_pii</span><span class="pi">:</span>
    <span class="na">logs</span><span class="pi">:</span>
      <span class="na">log_record</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">IsMatch(body,</span><span class="nv"> </span><span class="s">".*password.*")'</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">IsMatch(body,</span><span class="nv"> </span><span class="s">".*token.*")'</span>


</code></pre></div></div>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">.*password.*</span>
<span class="s">.*token.*</span>
<span class="s">.*authorization.*</span>
</code></pre></div></div>
<h4 id="154-delete">1.5.4 Delete</h4>

<p>Remove completamente o dado sensível.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">db.statement</span>
  <span class="na">action</span><span class="pi">:</span> <span class="s">delete</span>

</code></pre></div></div>

<p>Removendo headers sensíveis:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="na">processors</span><span class="pi">:</span>
  <span class="na">attributes/delete_headers</span><span class="pi">:</span>
    <span class="na">actions</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">http.request.header.authorization</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">delete</span>
      <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s">http.request.header.cookie</span>
        <span class="na">action</span><span class="pi">:</span> <span class="s">delete</span>

</code></pre></div></div>
<h2 id="16-certificados">1.6 Certificados</h2>

<p>Aproveitando o gancho de segurança, é possível usar certificados TLS nos receivers e exporters para assegurar seus dados. 
E também Keycloak + OpenID / OAuth2 para casos de ambientes multi-tenant (segregação de quem pode ver os dados de telemetria baseados em grupos de autenticação com usuário, senha e 2FA). Trarei isso em um outro artigo com passo a passo, mas tem bastante conteúdo sobre.</p>

<h2 id="17-opentelemetry-collector-builder-ocb-e-load-balancing-exporter">1.7 OpenTelemetry Collector Builder (OCB) e Load Balancing Exporter</h2>

<h3 id="171-opentelemetry-collector-builder-ocb">1.7.1 OpenTelemetry Collector Builder (OCB)</h3>

<p>O OCB permite criar uma versão customizada do Collector, contendo apenas os componentes que você precisa, ou seja, você pode criar o seu próprio binário. Ele é excelente para padronização e essa dica eu vi com o Juraci!</p>

<p>Normalmente, o Collector oficial vem com: dezenas de receivers, dezenas de processors,dezenas de exporters. E isso acaba gerando um binário maior, superfície de ataque maior, mais dependências e consequentemente mais overhead.</p>

<p>Com ele você tem algo padronizado, enxuto com superfície de ataque menor! Se você não usa um componente, ele não deveria estar no seu binário.
E, caso tenha ficado dúvida sobre qual usar, o Core, Builder ou Contrib…tem esquema de comparação:</p>

<p><img src="/assets/images/otel/comparativo.png" alt="Obs" /></p>

<p><em>Contrib é para experimentar, Core é para aprender, OCB é para operar.</em></p>

<h3 id="172-load-balancing-exporter">1.7.2 Load Balancing Exporter</h3>

<p>O load balancing exporter distribui traces entre múltiplos destinos, garantindo que todos os spans de um mesmo trace cheguem ao mesmo backend.</p>

<p>Link do projeto: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/loadbalancingexporter</p>

<p>Se torna crítico para traces distribuídos,tail sampling, backends como Tempo / Jaeger porque traces não são dados independentes.
São conjuntos de spans que precisam se encontrar no mesmo lugar.</p>

<p>As opções para routing_key são: service, traceID, metric(nome da métrica), resource, streamID</p>

<p>Ele calcula hash do trace_id, escolhe um backend consistente e garante afinidade do trace.</p>

<p><img src="/assets/images/otel/lb.png" alt="Obs" /></p>

<p><em>Load balancing em observabilidade não é sobre distribuir carga, é sobre preservar contexto ao decidir para qual backend um trace completo deve ir.</em></p>

<h2 id="18-cardinalidade-o-erro-mais-comum-de-quem-está-começando">1.8 Cardinalidade: o erro mais comum de quem está começando</h2>

<p>Como já tivemos muita informação até aqui, criei os 10 mandamentos da cardinalidade para ajudar a memorização!</p>

<p><strong>1. Não criarás labels infinitos</strong></p>

<p>Se o valor pode crescer sem limite, ele não é um label.
<em>user_id, order_id, session_id não pertencem a métricas.</em></p>

<p><strong>2.Não confundirás detalhe com valor</strong></p>

<p>Mais informação não é mais observabilidade.
<em>Detalhe demais = ruído.Ruído demais = cegueira.</em></p>

<p><strong>3. Honrarás o resource, pois ele é estável</strong></p>

<p>Identidade vem de resource, não de atributo dinâmico.
<em>Se muda a cada requisição, não é identidade.</em></p>

<p><strong>4. Santificarás as rotas</strong></p>

<p>URL dinâmica não é rota, é armadilha.
<em>/order/983742 é um ataque silencioso à sua stack. Normalize ou pague a conta.</em></p>

<p><strong>5.Eliminarás o que não investigas</strong></p>

<p>Se você nunca usa esse campo para investigar um incidente, ele não deveria existir.
<em>Observabilidade não é arqueologia.</em></p>

<p><strong>6.Protegerás PII como se fosse produção (porque é)</strong></p>

<p>Telemetria também é dado sensível.
<em>Se vazar, o problema é seu, não da ferramenta.</em></p>

<p><strong>7.Hashearás antes de indexar</strong></p>

<p>Correlação sem exposição é maturidade.
<em>Se precisa identificar, hasheie.Se não precisa, delete.</em></p>

<p><strong>8.Não sacrificarás o backend</strong></p>

<p>Métricas ruins derrubam sistemas bons.
<em>Prometheus, Mimir, Tempo e Loki não quebram sozinhos.Eles quebram porque alguém colocou order_id como label.</em></p>

<p><strong>9.Tratarás cardinalidade antes de escalar</strong></p>

<p>Escalar uma stack sem controlar cardinalidade só aumenta o prejuízo.
<em>HA não resolve erro conceitual.</em></p>

<p><strong>10. Lembrarás: observabilidade é decisão</strong></p>

<p>Cada atributo é uma escolha.
<em>E toda escolha tem custo, impacto e responsabilidade.</em></p>

<h2 id="19-dica-de-ouro">1.9 Dica de ouro</h2>

<p>Falando em cortar custos e dados que não servem, já pensou em cortar esses logs de health e validações da sua telemetria?
Corte parte do volume de logs que chegam no seu colector para ter uma visão mais limpa e menos ingest.</p>

<p>Esse artigo aqui é ouro: https://opentelemetry.io/blog/2026/log-deduplication-processor/</p>

<p>Era pra ser os primeiros passos, mas imagino que já dá pra fazer uma boa caminhada! hahaha</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Saindo do mundo Zabbix para Opentelemetry: O que preciso saber?</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/03/29/saindo-do-zabbix.html" rel="alternate" type="text/html" title="Saindo do mundo Zabbix para Opentelemetry: O que preciso saber?" /><published>2026-03-29T03:00:00+00:00</published><updated>2026-03-29T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/03/29/saindo-do-zabbix</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/03/29/saindo-do-zabbix.html"><![CDATA[<p>Um guia prático (e sem trauma) para sair do mundo do polling e entrar na era da telemetria.</p>
<p style="text-align: justify;">

Porque todo mundo está falando de opentelemetry agora? É importante que você entenda que um não irá substituir o outro, mas a medida que as infraestruturas avançam, tecnologias nascem e morrem para facilitar as coletas e enriquecê-las. Zabbix nasceu para monitorar infraestrutura. OpenTelemetry nasceu para entender sistemas distribuídos.
</p>

<p style="text-align: justify;">

Quando falamos de Zabbix, temos uma estrutura de server, proxy, agent e banco de dados com coletas baseadas em polling criando itens (informações), triggers (regras de alerta) que fazem parte de templates prontos ou customizáveis (modelos prontos de organização dos dados coletados). Baseado em um modelo mental de perguntar constantemente se algo está bem ou mal. Logo, de forma bruta ele acaba sendo fundamental para estado, capacidade e infraestrutura.
</p>

<p><strong>Quando o usuário do Zabbix começa a sentir dor?</strong></p>

<p>Dificuldade para:</p>

<ul>
  <li>
    <p>Tracing distribuído</p>
  </li>
  <li>
    <p>Entender jornada de uma requisição</p>
  </li>
  <li>
    <p>Relacionar erro com impacto no usuário</p>
  </li>
  <li>
    <p>Muitas métricas ≠ entendimento real do problema</p>
  </li>
  <li>
    <p>Correlação manual (dashboards + experiência do operador)</p>
  </li>
</ul>
<p style="text-align: justify;">

*O alerta dispara, mas o porquê não está claro. Isso vai necessitar de uma maturidade do operador de compreender o sistema como um todo e observar possíveis pontos monitorados.*
</p>

<p style="text-align: justify;">

É  nessas dores que o opentelemetry entra, ele é um framework de código aberto que coleta as métricas, logs e traces de forma agnóstica a ferramentas. Como diz Marilya Gutierrez, o Cabo tipo C da telemetria. Com ele é possível correlacionar essas informações. Achei mais interessante fazer tabelas comparativas sobre o foco de cada um, como se complementam e um breve glossário nos próximos capítulos, espero que ajude.
</p>

<h2 id="diferencial-do-formato-de-coleta-entre-zabbix-e-otel">Diferencial do formato de coleta entre Zabbix e OTel</h2>

<p><img src="/assets/images/otel-zabbix/01-otel.png" alt="Obs" /></p>

<p><img src="/assets/images/otel-zabbix/coleta.png" alt="Obs" /></p>

<h2 id="métricas-logs-e-traces">Métricas, Logs e Traces</h2>

<p><img src="/assets/images/otel-zabbix/metric.png" alt="Obs" /></p>

<h2 id="foco-dos-domínios-em-cada-uma">Foco dos domínios em cada uma</h2>

<p><img src="/assets/images/otel-zabbix/foco.png" alt="Obs" /></p>

<h2 id="quem-responde-o-quê">Quem responde o quê?</h2>

<p><img src="/assets/images/otel-zabbix/quem.png" alt="Obs" /></p>

<h2 id="glossário-do-zabbix-e-opentelemetry">Glossário do Zabbix e Opentelemetry</h2>

<p><img src="/assets/images/otel-zabbix/glossario.png" alt="Obs" /></p>

<h2 id="quando-usar-zabbix-ou-opentelemetry-podem-ser-juntas">Quando usar Zabbix ou Opentelemetry? Podem ser juntas?</h2>

<p><img src="/assets/images/otel-zabbix/otel01.png" alt="Obs" /></p>

<p style="text-align: justify;">

Nesse caso, eles podem ser complementares. Uma não anula a outra e no mundo de observabilidade dificilmente conseguirá trabalhar apenas com uma ferramenta, porque as necessidades vão surgindo ao longo do tempo e os custos também hehehe, mas isso é papo pra outro artigo.
</p>

<p>E aí, curtiu? Se tiver algo a complementar, fala comigo que add e te menciono!</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Observabilidade com Acessibilidade</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/02/22/o11y-acessibilidade.html" rel="alternate" type="text/html" title="Observabilidade com Acessibilidade" /><published>2026-02-22T03:00:00+00:00</published><updated>2026-02-22T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/02/22/o11y-acessibilidade</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/02/22/o11y-acessibilidade.html"><![CDATA[<p>Já havia comentado em um artigo que dashboard que não responde um problema é apenas arte. Pesou?</p>
<p style="text-align: justify;">

Sua criação estratégica também precisa de um storytelling de dados, que apesar de não ser um mandamento direto e todos conseguirem criar um, nem todos conseguem interpretar da mesma forma. Quando isso se soma a uma questão de acessibilidade visual, as coisas pioram muito. É importante que você saiba contar uma história com cores, pois na correria do dia a constatação de que o ser humano é visual prevalesce. Não entendeu?
</p>

<p style="text-align: justify;">

A neurociência é um estudo científico multidisciplinar do sistema nervoso (cérebro, medula espinhal e nervos periféricos), abrangendo sua estrutura, função, desenvolvimento e patologias e constata que o cérebro humano é predominantemente visual, tem uma taxa média de retenção de até 65% em 3 dias. Nosso cérebro não pensa em textos, pensa em imagens e padrões pois elas criam atalhos cognitivos, eduzem esforço mental e aceleram a recuperação da informação.
</p>

<p style="text-align: justify;">

O FinOps da coisa é que quando trabalhamos isso em um dia cheio de telas e informações o tempo inteiro conseguimos ter uma economia de esforço cerebral. E se quiser ativar seu modo HA (Alta disponibilidade) combine imagem e palavra, assim criamos dois caminhos de memória: verbal e visual. Se um falhar, o outro recupera a informação!
</p>

<h2 id="storytelling-de-dados-componentes">Storytelling de dados: Componentes</h2>

<p>Para contar uma história aqui também não é diferente, preciso ter:</p>

<ul>
  <li>Personagem: campos de dados analisados</li>
  <li>Enredo: o insight que surge da narrativa</li>
  <li>Narrativa: estilo usado para comunicar o insight</li>
</ul>

<p>Deve-se ter um controle para transmitir o ponto de vista de forma conclusiva.</p>

<p>Dicas mais comuns:</p>

<ul>
  <li>Reduza a saturação das cores para não tirar o foco do público diante da informação ou gerar confusão.</li>
  <li>Cores muito brilhantes podem competir e causar distração, use pelo menos 75~90%</li>
  <li>Redução de brilho acaba reduzindo também a carga cognitiva que seu público precisa lidar. Você pode destacar uma informação e manter as outras em escala de cinza, por exemplo.</li>
  <li>Tenha cuidado com associação de cores</li>
</ul>

<p>Exemplos de visualizações:</p>
<ul>
  <li>Mudanças ao longo do tempo;</li>
  <li>Determinando frequência;</li>
  <li>Determinando relacionamentos;</li>
</ul>

<p>imagem do espectro de cores e emoções</p>

<h2 id="combinações">Combinações</h2>
<p style="text-align: justify;">

A combinação de vermelho e verde tão famosa e usada por nós é um exemplo a ser levado a diante, cores distintas para trazer sensações de alívio ou preocupação.
</p>

<p style="text-align: justify;">

Cinza normalmente dá sensação de uniformidade e calma podendo ser usada como complementar para outras informações e focar ainda mais no que não é cinza.
</p>

<h3 id="consistência-de-cores">Consistência de cores</h3>
<p style="text-align: justify;">

Para repetir a ideia com mais de um gráfico ajudando o público a distinguir,se ocorrer mudança significará alteração de ideia.
</p>

<p style="text-align: justify;">

A importância de escolher a de escolher a cor certa, se deve a estudos comprovarem que mais de 50% dsa pessoas que optam sair de um site nunca mais retornam devido as escolhas de cores de design.
</p>

<h3 id="conheça-seu-público">Conheça seu público</h3>
<p style="text-align: justify;">

Cores podem significar cores diferentes em culturas distintas, considere associações de cores por setor, cores da marca. Se ela for laranja e verde..faça o jogo de cores.
</p>

<p>Existem 3 razões para as cores da sua marca não funcionarem também na visualização.</p>

<ul>
  <li>contraste</li>
  <li>quantidade de cores dispersas</li>
  <li>adequações dos dados</li>
</ul>

<h3 id="paleta-de-cores">Paleta de cores</h3>
<p style="text-align: justify;">

- Faça harmonia análoga: Cores vizinhas se complementam e ninguém sobressai (Trace a linha no circulo cromático)
</p>

<p><img src="/assets/images/daltonismo/Combinacao_harmonica_das_cores.jpg" alt="Obs" /></p>

<ul>
  <li>Use complementares com conotação positiva/negativa (evite a cor da marca como negativo)</li>
  <li>Use quase complementares para destacar, por exemplo, duas séries onde uma é o foco principal. Chamam também de regra 33%</li>
  <li>Evite fundos coloridos demais;</li>
  <li>Conheça seus dispositivos para dar contexto de utilização</li>
  <li>Utilize gradientes (!!!!) para quando tiver dificuldade para comparar e contrastar dados. Evite para dados categóricos pois pode causar confusão.</li>
</ul>

<h2 id="acessibilidade-e-daltonismo">Acessibilidade e Daltonismo</h2>

<p>Daltonismo é a deficiência de visão cromática de uma forma mais bruta.</p>
<p style="text-align: justify;">

 Aproximadamente 1 em cada 12 homens e 1 em cada 200 mulheres apresentam alguma forma de deficiência de visão cromática. A maioria das pessoas ainda percebem as cores, mas são transmitidas com codificação diferente.

</p>

<p>Como identificar a real?</p>

<p>Apps que podem te auxiliar</p>

<ol>
  <li>Ferramenta Coblis Color Blindness Simulator</li>
  <li>Color Oracle</li>
</ol>

<p><strong>ATENÇÃO</strong></p>

<h3 id="combinações-a-evitar">Combinações a evitar</h3>

<ul>
  <li>vermelho, verde e marrom: podem ser indistinguíveis (tons de marrom e amarelo escuro também)</li>
  <li>Rosa, turquesa e cinza: todos parecem cinza para quem tem daltonismo com vermelho</li>
  <li>Roxo e azul: pode parecer só azul.</li>
</ul>

<h3 id="melhores-práticas">Melhores práticas</h3>

<ul>
  <li>Azul e Laranja são um ótimo ponto de partida.</li>
  <li>Preto e branco é uma combinação que não tem erro. Faça um versão em preto e branco para ver se a visualização e distinção faz sentido como prova dos 9.</li>
  <li>Luminosidade da cor ajuda.</li>
  <li>Combine elementos como linhas, formas, simbolos.</li>
</ul>

<h3 id="armadilhas-comuns-do-uso-de-cores-no-storytelling">Armadilhas comuns do uso de cores no storytelling</h3>

<ul>
  <li>
    <p>Adcionar informações irrelevantes ou em excesso
(Regra dos 3 a 5 categorias de cores)</p>
  </li>
  <li>
    <p>Usar cores não monotônicas para valores de dados
A diferença de cores deve refletir a diferença de valores nos dados</p>
  </li>
  <li>
    <p>Criar codficações de dados que não levam em consideração pessoas com deficiência cromática.</p>
  </li>
  <li>
    <p>Não criar associação com cores
Crie um padrão ou legenda para seu seu público leia o seu trabalho</p>
  </li>
  <li>
    <p>Não usar cores contrastantes para contrastar informações
cores e número tem semelhança.</p>
  </li>
  <li>
    <p>Não destacar informações importantes
Seu trabalho não é ser imparcial</p>
  </li>
  <li>
    <p>Usar muitas cores: O cérebro sofre para processar tanta informação.
Pesquisas apontam que 7 é o número máximo de itens que o cérebro pode armazenar por vez. Razão pelo qual a maioria dos números de telefone tem 7 digitos hahaha nada é por acaso.</p>
  </li>
  <li>
    <p>Não usar mapa de calor</p>
  </li>
</ul>

<p><em>Sim, como boa pesquisadora de neurociências eu vou ter boas referências. hahaha</em></p>

<p><strong>Teoria do Duplo Código (base do visual + verbal)</strong></p>

<ul>
  <li>
    <p>PAIVIO, Allan. Imagery and verbal processes. New York: Holt, Rinehart and Winston, 1971.</p>
  </li>
  <li>
    <p>PAIVIO, Allan. Mental representations: a dual coding approach. New York: Oxford University Press, 1986.</p>
  </li>
</ul>

<p><strong>Superioridade da Imagem (Picture Superiority Effect)</strong></p>

<ul>
  <li>STANDING, Lionel. Learning 10,000 pictures. Quarterly Journal of Experimental Psychology, London, v. 25, n. 2, p. 207–222, 1973. DOI: 10.1080/14640747308400340.</li>
</ul>

<p><strong>Aprendizagem multimídia e retenção visual</strong></p>

<ul>
  <li>
    <p>MAYER, Richard E. Multimedia learning. 2. ed. New York: Cambridge University Press, 2009.</p>
  </li>
  <li>
    <p>MAYER, Richard E. Applying the science of learning to medical education. Medical Education, v. 44, n. 6, p. 543–549, 2010.</p>
  </li>
</ul>

<p><strong>Neurociência, memória e processamento visual</strong></p>

<ul>
  <li>
    <p>MEDINA, John. Brain rules: 12 principles for surviving and thriving at work, home, and school. Seattle: Pear Press, 2008.</p>
  </li>
  <li>
    <p>KOSSLYN, Stephen M.; GANIS, Giorgio; THOMPSON, William L. Neural foundations of imagery. Nature Reviews Neuroscience, London, v. 2, n. 9, p. 635–642, 2001.</p>
  </li>
</ul>

<p><strong>Processamento visual e eficiência cognitiva</strong></p>

<ul>
  <li>WARE, Colin. Information visualization: perception for design. 3. ed. Waltham: Morgan Kaufmann, 2013.
LIDWELL, William; HOLDEN, Kritina; BUTLER, Jill. Universal principles of design. Beverly: Rockport Publishers, 2010.</li>
</ul>

<p><strong>A cor dos dados</strong></p>

<ul>
  <li>STRACHNYI, Kate. Color-wise: a data storyteller’s guide to the intentional use of color. Hoboken: Wiley, 2020.</li>
</ul>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Observabilidade alinhada ao negócio</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/alinhada-ao-negocio.html" rel="alternate" type="text/html" title="Observabilidade alinhada ao negócio" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/alinhada-ao-negocio</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/alinhada-ao-negocio.html"><![CDATA[<h3 id="por-onde-começar">Por onde começar?</h3>

<p style="text-align: justify;">

É comum ainda encontrar cenários em que equipes focam exclusivamente em análises técnicas, enquanto a jornada até perguntas estratégicas ainda é longa. Questões como impacto no negócio, experiência do usuário e correlação com receita muitas vezes ficam em segundo plano.

</p>

<div style="text-align: justify;">

Como correlacionar latência com perda de receita?  
Por que o tempo do produto deveria ser importado com seus dashboards?

</div>

<div style="text-align: justify;">

Neste artigo posso te ajudar a fazer e responder essas perguntas.

</div>

<h2 id="passos-iniciais">Passos iniciais</h2>

<h4 id="passo-01"><strong>Passo 01</strong></h4>
<div style="text-align: justify;">

Para iniciar a jornada, é preciso levantar os problemas conhecidos e mapear o parque de equipamentos e aplicativos, incluindo linguagens, dependências e integrações existentes.

</div>

<h4 id="passo-02"><strong>Passo 02</strong></h4>
<div style="text-align: justify;">

Fazer o uso da técnica dos 5 porquês para mapear os processos de monitoramento e seu impacto, permitindo entender e desenhar a regra de negócio que guiará alertas e dashboards.

</div>

<h2 id="exemplo-prático--aplicando-os-5-porquês">Exemplo prático — aplicando os 5 porquês</h2>

<h5 id="1-por-que-o-sistema-de-autenticação-está-lento-e-falhando"><strong>1. Por que o sistema de autenticação está lento e falhando?</strong></h5>

<div style="text-align: justify;">

“Porque o servidor responsável pela autenticação está sobrecarregado e não responde a todas as requisições dentro do tempo esperado.”

</div>

<h5 id="2-por-que-o-servidor-está-sobrecarregado"><strong>2. Por que o servidor está sobrecarregado?</strong></h5>

<div style="text-align: justify;">

“Porque há um aumento inesperado no número de requisições simultâneas, acima da capacidade do servidor atual.”

</div>

<h5 id="3-por-que-houve-esse-aumento-inesperado-nas-requisições"><strong>3. Por que houve esse aumento inesperado nas requisições?</strong></h5>

<div style="text-align: justify;">

“Porque foi lançada uma nova funcionalidade que exige autenticação mais frequente, e a equipe de infraestrutura não ajustou a capacidade para esse aumento.”

</div>

<h5 id="4-por-que-a-equipe-de-infraestrutura-não-ajustou-a-capacidade-do-servidor"><strong>4. Por que a equipe de infraestrutura não ajustou a capacidade do servidor?</strong></h5>

<div style="text-align: justify;">

“Porque não houve comunicação clara entre o time de desenvolvimento e o time de infraestrutura sobre o impacto da nova funcionalidade.”

</div>

<h5 id="5-por-que-não-houve-essa-comunicação-clara"><strong>5. Por que não houve essa comunicação clara?</strong></h5>

<div style="text-align: justify;">

“Porque não existe um processo formal para planejamento conjunto entre desenvolvimento e infraestrutura em lançamentos que impactem recursos críticos.”

</div>

<h2 id="da-análise-à-prática">Da análise à prática</h2>

<div style="text-align: justify;">

Somente após esse mapeamento é que se inicia o hands-on para a decisão de ferramentas e o levantamento das pilhas de monitoramento e observabilidade (caso ainda não existam).

</div>

<h2 id="impacto-do-problema">Impacto do problema</h2>

<div style="text-align: justify;">

A lentidão e as falhas no sistema de autenticação prejudicam a experiência do usuário, causando perda de clientes e, consequentemente, redução na receita.

</div>

<h2 id="regras-de-negócio">Regras de negócio</h2>

<div style="text-align: justify;">

Monitore a latência e as taxas de erros do serviço de autenticação para garantir que o tempo de resposta esteja dentro do limite de 200 ms e as taxas de falhas abaixo de 1%, especialmente após o lançamento de novas funcionalidades.

</div>

<h2 id="sugestão-de-alertas">Sugestão de alertas</h2>

<p><strong>Alerta 01:</strong> Latência média do serviço de autenticação acima de 200 ms por mais de 5 minutos.</p>

<p><strong>Alerta 02:</strong> Taxa de erros no serviço de autenticação acima de 1% em 5 minutos consecutivos.</p>

<p><strong>Alerta 03:</strong> Aumento súbito no volume de requisições (+30% em 10 minutos) sem ajuste na capacidade.</p>

<h2 id="sugestão-de-painel">Sugestão de painel</h2>

<ul>
  <li>Gráfico de latência média do serviço de autenticação ao longo do tempo</li>
  <li>Monitoramento da taxa de erros em percentual</li>
  <li>Volume de requisições por minuto</li>
  <li>Indicadores de capacidade do servidor (CPU, memória, conexões ativas)</li>
  <li>Eventos recentes, como lançamentos de funcionalidades e mudanças na infraestrutura</li>
</ul>

<h2 id="tudo-é-processo-foco-no-impacto-e-na-regra-de-negócio">Tudo é processo: foco no impacto e na regra de negócio</h2>

<div style="text-align: justify;">

O ponto crucial consiste em identificar requisitos que permitam compreender o impacto daquela métrica no problema e refletir sobre a próxima questão: como evitar que esse problema, que causa indisponibilidade e prejuízos, volte a ocorrer?

</div>

<p><img src="/assets/images/alinhada-ao-negocio/foto1.png" alt="Obs" /></p>

<p>Por isso, o caminho sempre é:</p>

<p><img src="/assets/images/alinhada-ao-negocio/foto2.png" alt="Obs" /></p>

<p>Métrica técnica → Regra de negócio → Impacto, dashboard e alerta!</p>

<h3 id="caso-01-recursos--finops-ama-">Caso 01: Recursos ( FinOps ama! )</h3>

<p><img src="/assets/images/alinhada-ao-negocio/foto3.png" alt="Obs" /></p>

<h3 id="caso-02-datas-comemorativas">Caso 02: Datas comemorativas</h3>

<p><img src="/assets/images/alinhada-ao-negocio/foto4.png" alt="Obs" /></p>

<div style="text-align: justify;">
Ao abordar a visualização de dados, destaco sempre a importância de estruturar a forma de ações proativas, garantindo que uma equipe responsável pela análise das métricas compreenda claramente seu significado dentro do contexto de sua atuação.
</div>

<p>Você sabia que existem documentos explicando a funcionalidade de cada parte de um dashboard para que todos aprendam o processo?</p>

<div style="text-align: justify;">

A visão operacional deve ser simples, utilizando núcleos, informações intuitivas e fontes de fácil leitura, de modo a facilitar o trabalho diário do suporte técnico. Por outro lado, a visão gerencial deve possibilitar a análise da métrica ao longo do tempo, associando seus componentes e correlacionando-os com indicadores financeiros, como o faturamento.
</div>

<p>Aqui está uma visão de equipe operacional e gerencial.</p>

<p><img src="/assets/images/alinhada-ao-negocio/foto5.png" alt="Obs" /></p>

<div style="text-align: justify;">

Nesse processo, os conceitos apresentados no livro de Engenharia de Confiabilidade do Google são amplamente utilizados e práticos para realizar uma análise proativa, evoluindo gradualmente para a visualização dos dados.
</div>

<h2 id="use-x-red-x-4-sinais-de-ouro-você-sabe-qual-usar-para-responder-sua-pergunta">USE x RED x 4 Sinais DE OURO: Você sabe qual usar para responder sua pergunta?</h2>

<div style="text-align: justify;">

Entre esses conceitos, destacam-se os modelos USE e RED, que frequentemente aparecem no escopo das interferências. Apesar das siglas semelhantes, eles possuem focos distintos em sua aplicação.
</div>

<p><img src="/assets/images/alinhada-ao-negocio/foto7.png" alt="Obs" /></p>

<p>O <strong>USE</strong> é composto por Utilização, Saturação e Erros. Esses indicadores aparecem no escopo da solicitação e têm seu foco em recursos (hardware e infraestrutura), sendo utilizados para identificar gargalos.</p>

<p><strong>Exemplo</strong>: Uso de CPU, Fila de processos, Erro de leitura no disco.</p>

<p>Já o <strong>RED</strong> composto por Taxa, Erros e Duração também aparece no escopo, mas são voltados para serviços e APIs para garantir a qualidade do serviço.</p>

<p><strong>Exemplo:</strong> Requisições HTTP, Requisições retorando HTTP 5xx, latência média p99 de 1,2 segundos.</p>

<p>Os 4 sinais de ouro são vistos na saída da solicitação.</p>

<p><img src="/assets/images/alinhada-ao-negocio/foto8.png" alt="Obs" /></p>

<h2 id="indicadores-fundamentais">Indicadores fundamentais</h2>

<ul>
  <li><strong>Latência:</strong> Tempo de resposta para atender a uma requisição.</li>
  <li><strong>Erros:</strong> Taxa de falhas ou respostas inválidas nas requisições.</li>
  <li><strong>Tráfego:</strong> Volume de requisições recebidas ou dados processados.</li>
  <li><strong>Saturação:</strong> Nível de utilização dos recursos, afetando o impacto próximo do sistema está de sua capacidade máxima.</li>
</ul>

<p style="text-align: justify;">

Ao partir de análises técnicas e de direção estruturadas, como os 5 motivos, conseguimos não apenas detectar falhas, mas entender seu impacto real e construir regras de negócios eficazes para alertas e visualizações.

</p>

<p style="text-align: justify;">

Compreender frameworks como USE, RED e os Quatro Sinais de Ouro permite que equipes técnicas e de produto falem a mesma língua: a do impacto no cliente e no faturamento. Isso transforma painéis em ferramentas de decisão, não apenas em painéis de monitoramento.

</p>

<p style="text-align: justify;">

O caminho que propus — da identificação dos problemas, passando pela demonstração com o negócio, até a criação de alertas e dashboards direcionados — é uma prática base para sair da observabilidade puramente técnica e caminhar rumo à observabilidade orientada ao valor.

</p>

<p style="text-align: justify;">

Agora que você viu exemplos, frameworks e boas práticas, fica o convite: revise seus indicadores atuais.

</p>

<p style="text-align: justify;">

Eles estão ajudando você a responder às perguntas certas?

</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Integração do AWS Lambda com OpenTelemetry: logs, métricas e rastreamentos no Grafana</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/aws.html" rel="alternate" type="text/html" title="Integração do AWS Lambda com OpenTelemetry: logs, métricas e rastreamentos no Grafana" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/aws</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/aws.html"><![CDATA[<p style="text-align: justify;">
No mundo de observabilidade moderna, não basta apenas rodar funções serverless, é essencial entender o que acontece dentro delas.
Com o AWS Lambda e o OpenTelemetry também conseguimos instrumentar aplicações e exportar logs, métricas e traces diretamente para ferramentas como Grafana Loki, Tempo e Mimir.
</p>
<p>A boa notícia: a AWS já fornece uma camada pronta, chamada ADOT Lambda Layer , que simplifica a instrumentação.</p>

<p style="text-align: justify;">

**A justificativa para atingir o objetivo dessa integração é justamente enviar dados para a stack OSS e economizar com cloudwatch. Segredo nosso.**
</p>

<p><img src="/assets/images/aws/aws01.png" alt="Lara" /></p>

<h3 id="pré-requisitos">Pré-requisitos</h3>

<p>Os pré-requisitos para fazer essa integração utilizados foram:</p>

<ul>
  <li>
    <p>Função Lambda rodando em Java 21</p>
  </li>
  <li>
    <p>Acesso ao Console da AWS.</p>
  </li>
  <li>
    <p>Grafana configurado com Loki (logs), Tempo (traces) e Mimir (métricas).</p>
  </li>
</ul>

<h3 id="passo-a-passo-de-configuração">Passo a passo de configuração</h3>

<ol>
  <li>Instrumentar sua Função com ADOT Lambda Layer</li>
  <li>No Console da AWS, abra sua função Lambda.</li>
  <li>Vá em Camadas → Adicionar uma camada → Especificar ARN .</li>
  <li>Insira o ARN do ADOT Layer correspondente à sua região (veja documentação oficial).</li>
  <li>Configure a variável de ambiente:</li>
</ol>

<p><code class="language-plaintext highlighter-rouge">AWS_LAMBDA_EXEC_WRAPPER=/opt/manipulador-otel</code></p>

<p>Isso instrui o runtime a usar o wrapper do OpenTelemetry.</p>

<h3 id="configurar-o-coletor-opentelemetry-exemplo-com-loki-para-logs">Configurar o Coletor OpenTelemetry (Exemplo com Loki para Logs)</h3>
<p>A camada ADOT traz embutido um collector. Por padrão, ele exporta para o AWS X-Ray, mas podemos personalizar para Loki/Tempo/Mimir.</p>

<p><img src="/assets/images/aws/aws02.webp" alt="Lara" /></p>

<p>Crie um arquivo chamado collector.yaml na raiz do projeto:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">receivers</span><span class="pi">:</span>
  <span class="na">otlp</span><span class="pi">:</span>
    <span class="na">protocols</span><span class="pi">:</span>
      <span class="na">grpc</span><span class="pi">:</span>
      <span class="na">http</span><span class="pi">:</span>

<span class="na">processors</span><span class="pi">:</span>
  <span class="na">batch</span><span class="pi">:</span>

<span class="na">exporters</span><span class="pi">:</span>
  <span class="na">loki</span><span class="pi">:</span>
    <span class="na">endpoint</span><span class="pi">:</span> <span class="s2">"</span><span class="s">http://&lt;LOKI_ENDPOINT&gt;:3100/loki/api/v1/push"</span>
    <span class="c1"># headers:</span>
    <span class="c1">#   Authorization: "&lt;TOKEN&gt; básico"</span>
    <span class="c1"># labels:</span>
    <span class="c1">#   service.name: "lambda-java-app"</span>

<span class="na">service</span><span class="pi">:</span>
  <span class="na">pipelines</span><span class="pi">:</span>
    <span class="na">logs</span><span class="pi">:</span>
      <span class="na">receivers</span><span class="pi">:</span> <span class="pi">[</span> <span class="nv">otlp</span> <span class="pi">]</span>
      <span class="na">processors</span><span class="pi">:</span> <span class="pi">[</span> <span class="nv">batch</span> <span class="pi">]</span>
      <span class="na">exporters</span><span class="pi">:</span> <span class="pi">[</span> <span class="nv">loki</span> <span class="pi">]</span>
</code></pre></div></div>

<h3 id="empacotar-e-apontar-o-collector">Empacotar e apontar o collector</h3>

<ul>
  <li>
    <p>Inclua o collector.yaml no pacote da função (ZIP/JAR).</p>
  </li>
  <li>
    <p>Configure mais uma variável de ambiente:</p>
  </li>
</ul>

<p><code class="language-plaintext highlighter-rouge">OPENTELEMETRY_COLLECTOR_CONFIG_FILE =/var/task/collector.yaml</code></p>

<h3 id="ative-exportação-de-logs">Ative exportação de logs</h3>

<p>Adicione:</p>

<p><code class="language-plaintext highlighter-rouge">OTEL_LOGS_EXPORTER =otlp</code></p>

<h3 id="validar-no-grafana">Validar no Grafana</h3>

<ul>
  <li>
    <p>Chame sua função Lambda.</p>
  </li>
  <li>
    <p>Os logs devem aparecer no <strong>Grafana Loki.</strong></p>
  </li>
  <li>
    <p>Configure exportadores equivalentes no collector.yaml para enviar também traces ao Tempo e métricas ao Mimir.</p>
  </li>
</ul>

<p><img src="/assets/images/aws/aws03.png" alt="Lara" /></p>

<h3 id="pontos-de-atenção">Pontos de atenção</h3>

<p><strong>Autenticação:</strong> se seu Loki exigir credenciais, configure no bloco headers.</p>

<p><strong>Labels:</strong> aproveite para enriquecer logs com service.name, job, etc.</p>

<p>Deu certo? Me conta!</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Como usar as principais funções PromQL para métricas, latência e previsões</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/promql.html" rel="alternate" type="text/html" title="Como usar as principais funções PromQL para métricas, latência e previsões" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/promql</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/promql.html"><![CDATA[<p style="text-align: justify;">
Quem já escreveu queries no Prometheus ou no Grafana sabe: dominar as funções do PromQL é a diferença entre ter um gráfico bonito e conseguir de fato extrair respostas das métricas.
</p>

<p style="text-align: justify;">
Não basta saber coletar dados , é preciso transformar séries temporais em informações úteis. Para isso, o PromQL oferece funções que permitem calcular taxas de crescimento, detectar picos, fazer agregações, prever tendências e até calcular percentis de latência a partir de histogramas.
</p>

<p style="text-align: justify;">
Neste artigo, apresento um guia prático (cheat sheet) das funções PromQL mais usadas no dia a dia de SREs, DevOps e engenheiros de observabilidade.
</p>

<p>Cada função vem acompanhada de:</p>

<ul>
  <li>O que faz.</li>
  <li>Um exemplo de query.</li>
  <li>Quando usar no contexto de monitoramento.</li>
</ul>

<p><em>Se você já se perguntou se deveria usar rate ou irate, ou como calcular o p95 de latência, este guia é para você.</em></p>

<h2 id="1-funções-de-taxa-e-crescimento">1. Funções de Taxa e Crescimento</h2>
<p>Essas são as mais usadas para métricas de contadores (counters), que só aumentam.</p>

<h3 id="ratevetorintervalo">rate(vetor[intervalo])</h3>

<p>Calcula a taxa média por segundo no período.</p>

<p>Exemplo: quantas requisições por segundo em média nos últimos 5 minutos.</p>

<p><code class="language-plaintext highlighter-rouge">rate(http_requests_total[5m])</code></p>

<h3 id="iratevetorintervalo">irate(vetor[intervalo])</h3>

<p>Taxa instantânea (derivada do último par de pontos). Detecta pico instantâneo, bom para detectar spikes.</p>

<p><code class="language-plaintext highlighter-rouge">irate(http_requests_total[1m])</code></p>

<h3 id="increasevetorintervalo">increase(vetor[intervalo])</h3>

<p>Quanto o contador aumentou no período.</p>

<p><code class="language-plaintext highlighter-rouge">increase(http_requests_total[1h])</code></p>

<p>total de requisições na última hora.</p>

<h2 id="2-funções-de-agregação">2. Funções de Agregação</h2>
<p>Usadas para somar, contar, agrupar séries.</p>

<h3 id="sum">sum</h3>
<p>Soma valores.</p>

<p><code class="language-plaintext highlighter-rouge">sum(rate(cpu_usage_seconds_total[5m])) by (instance)</code></p>

<h3 id="avg">avg</h3>
<p>Média.</p>

<p><code class="language-plaintext highlighter-rouge">avg(rate(node_network_receive_bytes_total[1m])) by (device)</code></p>

<h3 id="max--min">max / min</h3>
<p>Valor máximo/mínimo.</p>

<p><code class="language-plaintext highlighter-rouge">max(memory_usage_bytes) by (pod)</code></p>

<h3 id="count">count</h3>
<p>Número de séries retornadas.</p>

<p><code class="language-plaintext highlighter-rouge">count(up{job="node"})</code></p>

<h2 id="3-funções-de-manipulação-de-séries">3. Funções de Manipulação de Séries</h2>
<p>Mexem nas séries de tempo em si.</p>

<h3 id="rate--sum--by">rate + sum + by()</h3>

<p>Para agrupar séries por rótulos.</p>

<p><code class="language-plaintext highlighter-rouge">sum(rate(container_cpu_usage_seconds_total[5m])) by (namespace)</code></p>

<h3 id="topkn-métrica">topk(N, métrica)</h3>

<p>Retorna o top N.</p>

<p><code class="language-plaintext highlighter-rouge">topk(5, rate(http_requests_total[5m]))</code></p>

<p>os 5 endpoints mais acessados.</p>

<h3 id="bottomkn-métrica">bottomk(N, métrica)</h3>

<p>O inverso: os menores valores.</p>

<h2 id="4-funções-de-previsão-e-mudança">4. Funções de Previsão e Mudança</h2>

<h3 id="predict_linearvetorintervalo-tempo">predict_linear(vetor[intervalo], tempo)</h3>

<p>Projeta valores futuros.</p>

<p><code class="language-plaintext highlighter-rouge">predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)</code></p>

<p>prevê espaço livre em 4h, ótimo para alertas de disco.</p>

<h3 id="changesvetorintervalo">changes(vetor[intervalo])</h3>

<p>Quantas vezes o valor mudou.</p>

<p><code class="language-plaintext highlighter-rouge">changes(up[1h])</code></p>

<p>quantas vezes o serviço caiu/subiu na última hora.</p>

<h3 id="resetsvetorintervalo">resets(vetor[intervalo])</h3>

<p>Quantas vezes um contador foi resetado.</p>

<h2 id="5-funções-matemáticas">5. Funções Matemáticas</h2>

<p><strong>abs:</strong> valor absoluto.</p>

<p><strong>ceil / floor:</strong> arredondar.</p>

<p><strong>clamp_min / clamp_max:</strong> limitar valores.</p>

<p><strong>round(vetor, precisão)</strong></p>

<p><code class="language-plaintext highlighter-rouge">round(cpu_temp_celsius, 0.5)</code></p>

<h2 id="6-funções-de-histogramas">6. Funções de Histogramas</h2>

<p><strong>histogram_quantile(φ, sum(rate(…)))</strong></p>

<p>Usada para métricas de latência.</p>

<p><code class="language-plaintext highlighter-rouge">histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))</code></p>

<p>calcula o p95 do tempo de resposta HTTP.</p>

<h2 id="boas-práticas-no-uso-de-funções-promql">Boas práticas no uso de funções PromQL</h2>

<p>Escolha bem a janela de tempo ([5m], [1h]):</p>

<ul>
  <li>
    <p>Janela muito curta = dados ruidosos (spikes falsos)</p>
  </li>
  <li>
    <p>Janela muito longa = suaviza demais e esconde problemas.</p>
  </li>
</ul>

<p><strong>Regra prática:</strong> use [$__rate_interval] no Grafana para adaptar dinamicamente.</p>

<p><strong>Counters ≠ Gauges:</strong></p>

<ul>
  <li>
    <p>Use rate, irate, increase <strong>apenas para counters</strong> (métricas que só crescem, como requisições, bytes transmitidos).</p>
  </li>
  <li>
    <p>Para gauges (CPU, memória), use avg_over_time, max_over_time, etc.</p>
  </li>
</ul>

<p>Use by() conscientemente:</p>

<p><code class="language-plaintext highlighter-rouge">sum(rate(http_requests_total[5m]))</code> = soma tudo junto.</p>

<p><code class="language-plaintext highlighter-rouge">sum(rate(http_requests_total[5m])) by (job)</code> = mostra por job.</p>

<p><strong>Prefira rate a irate em alertas:</strong></p>

<p>irate é útil para visualizar spikes, mas em alertas pode gerar falsos positivos.</p>

<p><strong>Para latência, sempre histogram_quantile:</strong></p>

<p>Percentis de tempo de resposta só fazem sentido em histogramas.
Média de latência isolada pode enganar.</p>

<p><strong>Combine funções:</strong>
PromQL brilha quando você compõe funções.
Exemplo:</p>

<p><code class="language-plaintext highlighter-rouge">topk(5, rate(http_requests_total[5m])) by route)</code></p>

<p>mostra os 5 endpoints mais acessados no período.</p>

<p><strong>Dúvidas comuns</strong></p>

<p>Quando usar <strong>rate vs increase</strong>?</p>

<p><em>rate</em> → “velocidade” (quantos por segundo).</p>

<p><em>increase</em> → “quanto acumulou” (total em X tempo).</p>

<p><strong>Por que meu gráfico fica serrilhado com irate?</strong>
Porque ele usa só os dois últimos pontos. Útil para spikes, mas não para visão estável.</p>

<p><strong>Posso usar rate em métricas de memória ou CPU?</strong>
Não. Essas métricas são gauges (valores atuais). Use avg_over_time, max_over_time, etc.</p>

<p><strong>O que significa offset?</strong>
É um deslocamento no tempo. <code class="language-plaintext highlighter-rouge">rate(http_requests_total[5m]) offset 1d</code> compara hoje com ontem.</p>

<p><strong>Por que meu sum não bate com o total?</strong>
<em>Provavelmente faltou usar by() corretamente ou algum label está duplicando séries.</em></p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Dominando o tempo no Grafana: Você sabe usar as opções de período disponíveis?</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/tempo-grafana.html" rel="alternate" type="text/html" title="Dominando o tempo no Grafana: Você sabe usar as opções de período disponíveis?" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/tempo-grafana</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/tempo-grafana.html"><![CDATA[<p>Se tem uma coisa que define observabilidade, é tempo.
Saber quando aconteceu algo é tão importante quanto saber o quê.</p>

<p>E no Grafana, isso vai muito além de clicar em “Last 1h” ou “Last 24h”.</p>

<p style="text-align: justify;">
Existe todo um arsenal de formas de manipular o tempo…algumas conhecidas, outras escondidas nas configurações de painel ou dentro das queries.
</p>

<p>Esse artigo é quase um modo discovery do que dá para fazer com <strong>tempo no Grafana.</strong></p>

<h3 id="1-time-range-global">1°) Time Range Global</h3>

<p><img src="/assets/images/tempo-grafana/01.png" alt="Lara" /></p>

<p><strong>O clássico:</strong> no topo do dashboard você escolhe quanto tempo quer ver.</p>

<p><strong>Valores prontos:</strong> Last 5m, Last 7d, Last 30d.</p>

<p><strong>Absoluto:</strong> marcar data/hora específica.</p>

<p><strong>Atalho:</strong> “Zoom out” e “Zoom in” no gráfico. Isso controla o contexto geral do dashboard inteiro.</p>

<h3 id="2-relative-time-por-painel">2°) Relative Time (por painel)</h3>

<p><img src="/assets/images/tempo-grafana/02.webp" alt="Lara" /></p>

<p style="text-align: justify;">
Às vezes, você não quer que todos os gráficos sigam o mesmo range. O dashboard pode estar em 7 dias, mas um painel mostra só as últimas 2h.
</p>
<p>Exemplo:Um dashboard de disponibilidade mostra 7 dias, mas você cria um painel só para “última hora de CPU” .</p>

<h3 id="3-time-shift">3°) Time Shift</h3>

<p><img src="/assets/images/tempo-grafana/03.webp" alt="Lara" /></p>

<p>Aqui o Grafana brinca de viagem no tempo. Serve para comparar períodos diferentes.</p>

<p>Exemplo: 1d → compara essa semana com o dia anterior.</p>

<p><em>Caso prático: Tráfego da aplicação de hoje vs. tráfego de ontem, lado a lado no mesmo gráfico.</em></p>

<h3 id="4-intervalos-por-query-overrides-de-tempo">4°) Intervalos por Query (Overrides de Tempo)</h3>

<p><img src="/assets/images/tempo-grafana/04.png" alt="Lara" /></p>

<p>Max data points e Interval override permitem controlar granularidade das series via query.</p>

<p>Relative time por query → <strong>$__interval, $__rate_interval</strong></p>

<p><strong>$__timeFilter()</strong> → limita dados ao range escolhido.</p>

<p><strong>$__interval</strong> → ajusta a granularidade (5s, 1m, 1h).</p>

<p><strong>$__rate_interval</strong> → usado em métricas de Prometheus para cálculos de taxa.</p>

<p>Exemplo com Prometheus:</p>

<p><code class="language-plaintext highlighter-rouge">increase(http_requests_total[$__rate_interval])</code></p>

<p>Assim a query se adapta sozinha, sem você ter que adivinhar se vai ser 1m, 5m ou 1h.5°)</p>

<p>Como venho atuando com mais frequência com a stack OSS, estão aqui alguns que mais utilizo.</p>

<h4 id="prometheus--loki--tempo">Prometheus / Loki / Tempo</h4>

<p><strong>time():</strong> retorna o timestamp atual.</p>

<p><strong>offset:</strong> desloca séries no tempo (metric offset 5m).</p>

<p><strong>$__timeFilter(column):</strong> macro SQL-like (em datasources SQL).</p>

<p><strong>$__timeFrom() / $__timeTo():</strong> limites inferior/superior do range.</p>

<p><strong>$__interval e $__rate_interval:</strong> granularidade dinâmica.</p>

<h3 id="6-ql-datasources-postgres-mysql-etc">6°) QL Datasources (Postgres, MySQL, etc.)</h3>

<p><img src="/assets/images/tempo-grafana/05.png" alt="Lara" /></p>

<p style="text-align: justify;">
Ao plugar bancos de dados como datasource, você também pode acrescentar variáveis que funcionem em sua query. Teste com período no banco e depois substitua no frontend do Grafana.
</p>

<p><code class="language-plaintext highlighter-rouge">WHERE $__timeFilter(datetime_column)</code></p>

<p><code class="language-plaintext highlighter-rouge">GROUP BY $__interval(datetime_column)</code></p>

<p><code class="language-plaintext highlighter-rouge">date_trunc('hour', $__timeGroup(datetime_column,'1h'))</code></p>

<p><em>Esses macros viram filtros de tempo reais na query, otimizando o que vem do banco.</em></p>

<h4 id="insights-e-boas-práticas">Insights e boas práticas…</h4>

<p><strong>Auto-refresh:</strong> 5s, 30s, 1m… perfeito para dashboards de NOC.</p>

<p><strong>Variáveis de tempo:</strong> usar now-1h como variável de query.</p>

<p><strong>Templating de intervalos:</strong> deixar o usuário escolher granularidade (ex.: 5m, 15m, 1h).</p>

<p style="text-align: justify;">

- Não use ranges gigantes com granularidade de segundos: você vai matar o banco e não ganhar insight.

- Relative time é para detalhe, time shift é para comparação.

- Sempre adicione contexto com annotations — olhar métricas sem saber que rolou um deploy é perda de tempo.
</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Padronização e Automação de Ambientes Grafana em Alta Escala com HA, LDAP e API</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/grafana-ha.html" rel="alternate" type="text/html" title="Padronização e Automação de Ambientes Grafana em Alta Escala com HA, LDAP e API" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/grafana-ha</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/grafana-ha.html"><![CDATA[<p style="text-align: justify;">
A adoção do Grafana como solução de visualização centralizada é uma escolha comum em ambientes corporativos. No entanto, escalar para centenas de unidades (estabelecimento) requer uma abordagem arquitetônica e operacional padronizada. Neste post, detalhamos uma implantação de Grafana com alta disponibilidade, autenticação LDAP e provisionamento automatizado para +200 estabelecimentos, incluindo dashboards e fontes de dados via API.
</p>
<p><img src="/assets/images/grafana-ha/oks.png" alt="Obs" /></p>

<h2 id="1-grafana-em-alta-disponibilidade-ha">1. Grafana em alta disponibilidade (HA)</h2>

<p>Para garantir resiliência e continuidade de serviço, a implantação foi realizada com:</p>

<ul>
  <li>Instâncias Grafana em load balancer (modo stateless);</li>
  <li>Banco de dados MySQL externo compartilhado para estado e sessão;</li>
  <li>Diretório de plugins compartilhados via NFS;</li>
  <li>Monitoramento do próprio Grafana via dashboards internos.</li>
</ul>

<p><strong>Desenho de implantação:</strong></p>

<p>[Usuário] → Load Balancer → [Instância Grafana A/B] → MySQL + NFS Plugins</p>

<h2 id="2-autenticação-ldap-para-estabelecimentos">2. Autenticação LDAP para estabelecimentos</h2>
<p style="text-align: justify;">
O Grafana foi configurado para autenticação contra Active Directory (LDAP), com regras que direcionam o usuário automaticamente para a organização correta baseada no grupo do AD:
</p>
<p>[[servidores]]</p>

<p>host = “ad.corp.local”</p>

<p>bind_dn = “CN=ldap_reader,OU=Serviços,DC=local”</p>

<p>bind_password = “senha”</p>

<p>…</p>

<p>[[servers.group_mappings]]</p>

<p>group_dn = “CN=estabelecimento1,OU=Estabelecimentos,DC=dnslocal”</p>

<p>org_id = 1</p>

<p>org_role = “Visualizador”</p>

<p>Cada estabelecimento possui seu grupo de usuários e organização dedicada.</p>

<h3 id="3-automação-para-criação-de-estabelecimentos-fontes-de-dados-e-plugins-utilizando-scripts-python-e-comandos-sql-diretamente-no-banco-do-grafana-foi-realizado">3. Automação para criação de estabelecimentos, fontes de dados e plugins utilizando scripts python e comandos SQL diretamente no banco do Grafana, foi realizado:</h3>

<p>Criação de organizações em lote (INSERT INTO estabelecimento);</p>

<p>Associação de datasources por estabelecimento (Zabbix + TestData) com UID fixo padronizado:</p>

<ul>
  <li>
    <p>uid_zabbix_estabelecimentoXXX</p>
  </li>
  <li>
    <p>Ativação do plugin Zabbix App via plugin_setting com enabled=1.</p>
  </li>
</ul>

<h3 id="4-provisionamento-de-dashboards-via-api-com-uid-e-grupo-padronizados-para-manter-consistência-visual-e-funcional">4. Provisionamento de dashboards via API com UID e grupo padronizados para manter consistência visual e funcional:</h3>

<p>Os dashboards foram exportados e tratados com substituições em lote de:</p>

<ul>
  <li>
    <p>Grupo variável com regex padronizado /123.*/;</p>
  </li>
  <li>
    <p>Fontes de dados definidas por UID fixo, conforme organização;</p>
  </li>
  <li>
    <p>Scripts Python autenticam por login/senha, alternam organização e realizam POST no endpoint /api/dashboards/db para cada JSON.</p>
  </li>
</ul>

<p>Com esse modelo:</p>

<ul>
  <li>
    <p>A escalabilidade é garantida pela separação de organizações;</p>
  </li>
  <li>
    <p>O gerenciamento de acesso é automático e seguro via LDAP;</p>
  </li>
  <li>
    <p>Dashboards padronizados facilitam suporte e onboarding;</p>
  </li>
  <li>
    <p>A alta disponibilidade assegura robustez para ambiente crítico.</p>
  </li>
</ul>

<p><strong>Esse tipo de estrutura é ideal para grandes redes, varejo ou ambientes distribuídos. Se quiser um exemplo funcional ou clonar esse modelo, entre em contato.</strong></p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Observabilidade: Explicando os componentes do Grafana Loki distribuído</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/loki.html" rel="alternate" type="text/html" title="Observabilidade: Explicando os componentes do Grafana Loki distribuído" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/loki</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/loki.html"><![CDATA[<p style="text-align: justify;">

Olá, pessoal! Hoje vamos mergulhar no universo da observabilidade e entender como uma ferramenta sensacional chamada Loki pode simplificar (e muito!) a forma como lidamos com logs. Se você já se sentiu meio perdido na montanha de informações que seus sistemas geram, este artigo é para você. E para tornar tudo mais claro, vamos usar uma analogia que todo mundo entende: um condomínio!
</p>

<p><img src="/assets/images/loki/roadmap.png" alt="Lara" /></p>

<h2 id="o-porteiro-o-zelador-e-o-depósito-entendendo-o-fluxo-dos-logs">O Porteiro, o Zelador e o Depósito: Entendendo o Fluxo dos Logs</h2>
<p style="text-align: justify;">
Imagina só a vida de um log dentro do seu sistema. Ele não aparece do nada e se materializa num dashboard bonito, certo?
</p>
<p style="text-align: justify;">
Existe um fluxo, um caminho que ele percorre, e o Loki tem componentes que simulam perfeitamente essa jornada.
</p>
<p><img src="/assets/images/loki/image (46).png" alt="Lara" /></p>

<p>Primeiro, temos o nosso…<strong>Porteiro! — o Distributor.</strong></p>
<p style="text-align: justify;">
Pensa bem: quando uma encomenda (um log, nesse caso) chega no condomínio, o porteiro não guarda nada, ele só olha o endereço e direciona para o bloco e apartamento certos. No Loki, o Distributor faz exatamente isso: ele recebe os logs e os distribui para os “inquilinos” corretos, que chamamos de Ingesters. Ele é o primeiro ponto de contato, garantindo que cada log vá para o seu devido lugar.
</p>
<p>Em seguida, entra em cena o: <strong>Zelador, nosso querido Ingester.</strong></p>

<p><img src="/assets/images/loki/image (47).png" alt="Lara" /></p>

<p style="text-align: justify;">
O Seu Pedro Zelador, que guarda as caixas na salinha do condomínio por um tempinho? Se a Dona Maria não está em casa, ele segura a entrega até alguém buscar ou até levar para o depósito maior. O Ingester no Loki age de forma similar, segurando temporariamente os logs na memória antes de enviá-los para o armazenamento definitivo. Ele é crucial para garantir que nenhum log se perca no caminho antes de chegar ao seu destino final.
</p>
<p>E qual é esse destino final? <strong>O Depósito.</strong></p>

<p><img src="/assets/images/loki/image (51).png" alt="Lara" /></p>

<p style="text-align: justify;">
Nosso **Object Storage.** É como aquele depósito no subsolo do condomínio, onde só o zelador e a administração têm acesso, e onde ficam guardados os registros antigos, tipo caixas, papéis e documentos. No mundo do Loki, o Object Storage é o responsável pelo armazenamento durável dos logs, guardando os dados antigos de forma segura e acessível. Pense nele como a sua biblioteca histórica de eventos do sistema.
</p>

<h3 id="os-fofoqueiros-e-a-administração-acessando-e-gerenciando-informações">Os Fofoqueiros e a Administração: Acessando e Gerenciando Informações</h3>

<p style="text-align: justify;">
Agora que os logs estão guardados, como fazemos para encontrá-los e tirar proveito deles? É aí que entram os próximos personagens da nossa história.
</p>

<p>Conhece aquele…</p>

<p style="text-align: justify;">
**Vizinho Fofoqueiro?** Aquele que sempre quer saber “quem recebeu aquela pizza ontem às 23h?” ou “quem deixou a luz do hall acesa?”. Ele faz as perguntas e quer respostas rápidas.
</p>

<p><img src="/assets/images/loki/image (48).png" alt="Lara" /></p>

<p style="text-align: justify;">
Esse é o nosso **Querier.** No Loki, o Querier é o responsável por executar as queries, ou seja, as suas perguntas, para buscar os logs que você precisa. Ele é o motor por trás da sua busca por informações.
</p>
<p style="text-align: justify;">
Mas para as coisas não virarem uma bagunça de fofocas soltas, precisamos de uma boa organização. E quem faz isso?
</p>

<p><img src="/assets/images/loki/image (50).png" alt="Lara" /></p>
<p style="text-align: justify;">
**A Administradora, a Querier**:Frontend. Pensa na Lanay, que recebe todas as reclamações, dúvidas e pedidos, e organiza tudo: “isso vai para o síndico, isso o zelador responde, isso eu já sei e te respondo agora”. A Querier = Frontend gerencia as queries e trabalha para melhorar a performance do sistema. Ela garante que suas buscas sejam eficientes e que você obtenha as respostas rapidamente.
</p>

<p>### O Livro da Portaria e o Síndico: A Otimização por Trás das Cenas</p>

<p>Para que tudo funcione de forma fluida, há componentes essenciais que trabalham nos bastidores.</p>

<p>Um dos mais importantes é o <strong>Livro da Portaria, o Index Gateway.</strong></p>

<p><img src="/assets/images/loki/image (52).png" alt="Lara" /></p>

<p style="text-align: justify;">
Sabe o livro de registros que anota tudo: “Dia 01: pizza para o ap. 302. Dia 02: caixa da Net para o 704.”? Ele não guarda os objetos em si, mas diz onde eles estão. No Loki, o Index é exatamente isso: ele aponta onde os dados estão, como um índice de um livro gigante, permitindo que o sistema saiba rapidamente onde encontrar a informação que você está procurando. Ele é a chave para a agilidade nas suas buscas.
</p>
<p>E por último, mas não menos importante, <strong>temos o Síndico, o Compactor.</strong></p>

<p><img src="/assets/images/loki/image (49).png" alt="Lara" /></p>

<p style="text-align: justify;">
O Seu Walter, o síndico, de tempos em tempos manda jogar fora o que não precisa mais e junta o que vale a pena guardar numa pasta só. O Compactor do Loki faz um trabalho similar: ele junta logs antigos e os organiza para ocupar menos espaço. Ele é o cara da otimização, garantindo que o seu armazenamento de logs seja eficiente e que você não gaste mais do que o necessário com infraestrutura.
</p>

<h2 id="boas-práticas-para-um-condomínio-loki-feliz-hahaha">Boas Práticas para um Condomínio Loki Feliz! (hahaha)</h2>

<p style="text-align: justify;">
Agora que entendemos a função de cada “personagem” do nosso condomínio Loki, vamos a algumas boas práticas para garantir que seu sistema de logs seja eficiente e útil:
</p>
<p style="text-align: justify;">

1. Monitore seus “Porteiros” e “Zeladores”: Fique de olho na saúde dos seus Distributors e Ingesters. Eles são a linha de frente da ingestão de logs, e qualquer gargalo ali pode comprometer todo o seu sistema de observabilidade.
</p>
<p style="text-align: justify;">

2. Otimize suas “Fofocas”: Ao usar o Querier, seja específico nas suas queries. Quanto mais detalhada for sua pergunta, mais rápido o sistema encontrará a resposta. Evite buscar por períodos muito longos sem filtros.
</p>
<p style="text-align: justify;">

3. Cuide do seu “Depósito”: Monitore o espaço ocupado pelo seu Object Storage. Embora seja durável, o armazenamento tem custos. O 3Compactor ajuda, mas é sempre bom ter uma política de retenção de logs clara.
</p>
<p style="text-align: justify;">

4. Mantenha seu “Livro da Portaria” em ordem: Um Index bem projetado é crucial para a performance das suas consultas. Pense bem nas labels que você usa para indexar seus logs, pois elas serão suas chaves de busca.
</p>
<p style="text-align: justify;">

5. Use as “Regras do Condomínio” a seu favor: O Loki permite configurar regras de alerta e extração de métricas a partir dos logs. Utilize essas funcionalidades para transformar seus dados brutos em inteligência acionável.
</p>

<p>Se restou alguma dúvida, sinta-se à vontade de me contactar!</p>

<p>E, se tua pergunta é…Quando e porquê devo usar essa turma(?), o próximo post é sobre isso! Até mais!</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry><entry><title type="html">Entendendo Correlações, SLA, SLO e o Papel do SRE: Uma releitura da Engenharia de Confiabilidade do Google</title><link href="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/sla-slo.html" rel="alternate" type="text/html" title="Entendendo Correlações, SLA, SLO e o Papel do SRE: Uma releitura da Engenharia de Confiabilidade do Google" /><published>2026-01-15T03:00:00+00:00</published><updated>2026-01-15T03:00:00+00:00</updated><id>https://laraxavier.github.io/observabilidade/negocio/2026/01/15/sla-slo</id><content type="html" xml:base="https://laraxavier.github.io/observabilidade/negocio/2026/01/15/sla-slo.html"><![CDATA[<p style="text-align: justify;">
A confiabilidade de sistemas distribuídos é uma das maiores preocupações para empresas que escalam suas operações digitalmente. Em um mundo onde a disponibilidade e a experiência do usuário são fatores críticos, termos como SLA , SLO e SRE ganham importância estratégica. Neste artigo, faço uma releitura dos capítulos 10 e 12 do renomado livro Site Reliability Engineering , do Google, destacando os principais conceitos de demonstração, acordos de serviço e o papel do SRE nesse cenário.
</p>
<h3 id="o-que-é-sre">O que é SRE?</h3>
<p style="text-align: justify;">
SRE (Site Reliability Engineering) é uma abordagem que aplica princípios de engenharia de software para resolver problemas operacionais de infraestrutura. Criado pelo Google, o SRE busca equilibrar a velocidade de entrega de novas funcionalidades com a estabilidade dos sistemas em produção.
</p>
<h3 id="entendendo-sla-slo-e-sli">Entendendo SLA, SLO e SLI</h3>
<p>Esses três termos são comumente confundidos, mas possuem significados diferentes e complementares:</p>

<p><strong>SLA (Service Level Agreement)</strong> é o contrato firmado com os clientes, geralmente externo, e define como garantias formais de disponibilidade ou desempenho.
<strong>SLO (Objetivo de Nível de Serviço)</strong> é um objetivo interno mensurável, previsto para garantir que os serviços mantenham a confiabilidade desejada.
<strong>SLI (Service Level Indicator)</strong> são as métricas reais que medem a qualidade do serviço (como latência, taxa de erros, disponibilidade).</p>

<p>O SRE utiliza esses conceitos para construir sistemas mais resilientes, com monitoramento adequado e tolerância a falhas.</p>

<h3 id="como-criar-slas-e-slos">Como criar SLAs e SLOs?</h3>
<p>Diferença Chave:
SLA (Acordo com o Cliente) :
Exemplo: “Disponibilidade de 99,5% ao mês ou lucro financeiro.”</p>

<p>SLO (Objetivo Interno) :
Exemplo: “Disponibilidade de 99,9% para evitar riscos ao SLA.”</p>

<h3 id="5-passos-para-definir-slos-eficientes">5 Passos para Definir SLOs Eficientes</h3>

<p><img src="/assets/images/sla/sla01.png" alt="Obs" /></p>

<p>Observe o Comportamento Real do Sistema : Ex.: Se 95% das requisições têm latência &lt; 200ms, esse é um bom candidato a SLO.</p>

<ol>
  <li>
    <p>Alinhe com a Experiência do Usuário : Ex.: Um e-commerce define SLO de latência com base no abandono de carrinho .</p>
  </li>
  <li>
    <p>Considere Custos e Complexidade : Manter 99,99% de disponibilidade pode ser 10x mais caro que 99,9%.</p>
  </li>
  <li>
    <p>Garanta que o SLO Seja Mais Rigoroso que o SLA : Se o SLA for 97,5%, o SLO deve ser 99% para criar uma zona de segurança .</p>
  </li>
  <li>
    <p>Revisar regularmente : os SLOs devem evoluir com as mudanças no produto e na infraestrutura.</p>
  </li>
</ol>

<p>Exemplo Prático de Cálculo :</p>

<p><em>Para um serviço com SLA de 99,9% em um mês (43.200 minutos):</em></p>
<ul>
  <li>Tempo de Inatividade Aceitável : 43,2 minutos.</li>
  <li>SLO Interno : 99,95% (21,6 minutos de margem).</li>
</ul>

<h3 id="caso-prático-alerta-à-solução">Caso Prático: Alerta à Solução</h3>

<p style="text-align: justify;">
O processo de definição de SLIs e SLOs geralmente segue um fluxo estruturado. Tudo começa com a identificação de um problema, seguida por uma triagem e análise detalhada — muitas vezes utilizando ferramentas específicas e a técnica dos “5 porquês” para investigar a causa raiz. A partir desse diagnóstico, é possível entender os fatores e processos que desenvolvem para a falha e, com isso, propor testes e tratamentos preventivos, caso o problema volte a ocorrer. Em seguida, a solução é documentada, e são criados alertas e dashboards para monitoramento contínuo. Nesse estágio, os SLOs e SLAs se tornam fundamentais, pois orientam a priorização das investigações e ajudam a evitar decisões contratuais, especialmente em serviços considerados críticos.
</p>
<p><img src="/assets/images/sla/sla02.png" alt="Obs" /></p>

<h3 id="caso-01-para-ilustrar-a-explicação">Caso 01 para ilustrar a explicação:</h3>

<p><img src="/assets/images/sla/sla03.png" alt="Obs" /></p>

<h4 id="1-o-problema">1. O Problema</h4>
<p>O horário de monitoramento notificou que um servidor de aplicação estava reiniciando intermitentemente.</p>

<h4 id="2-a-triagem-e-análise">2. A Triagem e Análise</h4>
<p>O SRE analisou:</p>

<ul>
  <li>Logs do sistema operacional : Picos de consumo de memória antes de cada reinício.</li>
  <li>Métricas de aplicação : Aumento contínuo no uso de RAM sem liberação (possível vazamento).</li>
  <li>Logs de aplicação : Conexões HTTP não fechadas corretamente.</li>
</ul>

<h4 id="3-o-diagnóstico">3. O Diagnóstico</h4>
<p>Identificou-se que:</p>

<p style="text-align: justify;">
*“Um vazamento de memória ocorria devido a conexões HTTP persistentes não finalizadas, fazendo o sistema operacional matar o processo (OOM Killer).”*
</p>
<h4 id="4-a-solução">4. A Solução</h4>
<ul>
  <li>Ajuste no coletor de lixo da aplicação.</li>
  <li>Correção do código para fechar conexões HTTP.</li>
  <li>Implementação de alertas proativos para consumo anormal de memória.</li>
</ul>

<p style="text-align: justify;">
**Lição:** Monitorar apenas “CPU alta” não basta. É preciso correlacionar logs, análises e rastreamentos para entender a causa raiz.
</p>
<h3 id="caso-02-com-sugestões-de-slo">Caso 02 com sugestões de SLO</h3>

<p><img src="/assets/images/sla/sla04.png" alt="Obs" /></p>

<h4 id="1-o-problema-1">1. O Problema</h4>
<p style="text-align: justify;">
Imagine que você está usando um aplicativo, mas ele está lento . Algumas páginas demoram para carregar. Isso irrita, né? Pois é, outros usuários também reclamaram disso.
</p>
<h4 id="2-triagem-e-análise">2. Triagem e Análise</h4>
<p style="text-align: justify;">
Um técnico chamado SRE (Site Reliability Engineering) , que é responsável por garantir que o sistema funcione bem, iniciou uma investigação. Eles fizeram isso em etapas:
</p>
<p style="text-align: justify;">
Verifiquei alertas : Notaram que muitas requisições estavam demorando demais e até travando (timeout).
Olharam os gráficos do sistema : Perceberam que o banco de dados (onde ficam guardados as informações) estava sendo muito usado e com lentidão.
</p>
<p style="text-align: justify;">
Analisaram as consultas : Descobriram que os comandos usados ​​para buscar dados (as consultas SQL) estavam demorando muito.
Viram outros possíveis problemas : Como outras partes do sistema que estavam sobrecarregadas ou falhando.
</p>
<h4 id="3-diagnóstico-e-solução">3. Diagnóstico e Solução</h4>
<p>Depois de entender o problema, o tempo fez algumas coisas para resolver:</p>

<ul>
  <li>
    <p>Melhoraram o banco de dados : Colocaram índices para deixar as buscas mais rápidas.</p>
  </li>
  <li>
    <p>Evitaram buscas repetidas : Usaram uma técnica chamada caching que guarda os dados mais usados ​​para não ter que buscar no banco toda hora.</p>
  </li>
  <li>
    <p>Criaram alertas inteligentes : Para avisar se a lentidão acontecer de novo no futuro.</p>
  </li>
</ul>

<h4 id="4-como-criar-indicadores-a-partir-disso">4. Como criar indicadores a partir disso?</h4>

<p><strong>SLIs:</strong>
São as métricas que medem a qualidade do serviço. Na imagem, temos como SLI:</p>

<ul>
  <li>
    <p>Tempo de resposta de requisições HTTP</p>
  </li>
  <li>
    <p>Percentual de requisições atendidas em menos de 200ms</p>
  </li>
  <li>
    <p>Uso de CPU e memória do banco de dados</p>
  </li>
  <li>
    <p>Latência de consultas no banco de dados</p>
  </li>
  <li>
    <p>Taxa de erros (timeouts, falhas de cache, falhas de dependências externas, etc.)</p>
  </li>
</ul>

<p><strong>SLOs:</strong></p>
<p style="text-align: justify;">
São os alvos ou metas internacionais que queremos atingir com base nos SLIs. Os SLOs definidos na imagem incluem:
</p>
<ul>
  <li>
    <p>99% das requisições devem ser atendidas em menos de 200ms</p>
  </li>
  <li>
    <p>O tempo médio de resposta do banco de dados deve estar abaixo do limite X (implícito) — usado para verificar se o SLO está quebrado</p>
  </li>
  <li>
    <p>95% das requisições devem ser respondidas em menos de 200 ms , caso o SLA permita menos desconforto</p>
  </li>
  <li>
    <p>Erros ou lentidão que ultrapassem a margem de erro do SLO precisam ser tratados imediatamente</p>
  </li>
</ul>

<p><strong>SLA:</strong></p>

<ul>
  <li>
    <p>Tempo de atividade mínimo de 99,95%</p>
  </li>
  <li>
    <p>Se o serviço ficar fora do ar mais de 3h36min no mês, há violação contratual e possível retorno financeiro</p>
  </li>
</ul>

<p><strong>Hora da dica: Entendendo a Relação entre Métricas</strong></p>

<p style="text-align: justify;">
Um ponto interessante discutido nos capítulos do livro é um esclarecimento entre detalhes . Nem sempre dois eventos correlacionados indicam causalidade, mas entender essas relações ajudam na construção de alertas mais identificados e na identificação de anomalias reais.
</p>
<p style="text-align: justify;">
Por exemplo, um aumento na latência pode estar correlacionado a um pico de tráfego. Entretanto, uma experiência SRE sabe que não há significado significativo, e por isso investigue os dados com cuidado antes de tirar conclusões.
</p>
<p><strong>Como o SRE Usa Esses Conceitos na Prática</strong></p>

<p style="text-align: justify;">
O engenheiro de confiabilidade utiliza SLIs para medir o comportamento dos serviços e comparar esses indicadores com os SLOs definidos. Quando um SLO estiver próximo de ser violado, o tempo poderá pausar novas implementações para evitar riscos de confiabilidade.
</p>
<p style="text-align: justify;">
Além disso, o erro orçamentário é uma ferramenta poderosa do SRE. Ele define quanto de “erro” é aceitável dentro de um determinado período. Esse orçamento de erro permite inovar com segurança, sabendo quanto o sistema pode falhar sem comprometer o SLA.
</p>
<p>Seu tempo já teve um problema ‘técnico’ que virou um problema financeiro?</p>]]></content><author><name></name></author><category term="observabilidade" /><category term="negocio" /><category term="observabilidade" /><category term="monitoramento" /><category term="sre" /><category term="devops" /><summary type="html"><![CDATA[Uma visão prática sobre monitoramento e observabilidade, conectando dados técnicos a decisões estratégicas de negócio.]]></summary></entry></feed>