<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/pt/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 07:37:34 GMT</lastBuildDate>
  <item>
    <title><![CDATA[API do dashboard do Kibana: um contrato estável para todos os tipos de painéis, testado por mais de 50 equipes antes da disponibilidade geral (GA)]]></title>
    <description><![CDATA[Gerencie dashboards do Kibana como código: faça commit no Git, promova entre ambientes e automatize implantações com a API do Kibana e o Terraform.]]></description>
    <content:encoded><![CDATA[<p>As<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards"> APIs de dashboards e visualizações do Kibana</a> estão prontas para produção no Elastic 9.5, disponíveis em todos os níveis de assinatura, com total compatibilidade com versões anteriores. Defina seus dashboards como JSON, comprometa-os no Git e então implante em ambientes usando pipelines de integração contínua e implantação contínua (CI/CD),<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard"> Terraform</a> ou qualquer ferramenta que você já tenha. Mais de 50 equipes testaram a API durante<a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api"> a prévia técnica na versão 9.4</a>, algumas já a rodando em produção. A versão 9.5 também adiciona novos endpoints (em prévia técnica) para<a href="https://dashboardsapispec.kibana.dev/tags.html"> Tags</a>, com endpoints, <a href="https://dashboardsapispec.kibana.dev/markdowns.html"> dos painéis Markdown</a> e<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"> Links</a> disponíveis agora no Elastic Cloud Serverless e chegando na versão 9.6.</p><h2>O que a compatibilidade com versões anteriores significa para a API do dashboard do Kibana</h2><p>Durante a prévia técnica, a configuração da API pode mudar entre os lançamentos.[1] Esse não é mais o caso. Disponibilidade geral (GA) significa:</p><ul><li><p><strong>Compatibilidade retrógrada completa.</strong> Novos campos e tipos de painel serão adicionados ao longo do tempo, mas os campos e comportamentos existentes permanecem inalterados. Quaisquer mudanças futuras que quebrem a compatibilidade seriam cuidadosamente consideradas e só seriam introduzidas em uma nova versão principal da pilha.</p></li><li><p><strong>Pronto para produção com suporte completo.</strong> A API oferece todas as garantias de compatibilidade da Elastic. Você pode usá-lo com segurança em ambientes de produção para implantações automatizadas, promoção de ambiente e gerenciamento programático do dashboard.</p></li></ul><h2>Novos endpoints da API Kibana para os painéis Tags, Markdown e Links</h2><p>O Elastic 9.5 também introduz um novo  endpoint independente para <a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>Tags</strong></a>, que permite categorizar e filtrar painéis. Agora, você pode gerenciá-los programaticamente por meio de endpoints CRUD dedicados, facilitando a organização de painéis em escala entre ambientes.	</p><p>Os novos endpoints para os painéis <a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>Markdown</strong></a> e <a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>Links</strong></a> já estão disponíveis no Serverless e serão lançados na próxima versão do stack (9.6).</p><h2>Com quais tipos de painel a API do dashboard do Kibana é compatível?</h2><p>A API do dashboard é compatível com todos os painéis <em>definidos por valor</em> na versão 9.5 (aqueles definidos diretamente em um dashboard, em oposição aos painéis da biblioteca salvos para reutilização). Cada tipo de painel compatível possui um esquema tipado e validado.</p><p><strong>Tipo de painel</strong></p><p><strong>Status</strong></p><p>Gráficos XY</p><p>Compatível</p><p>Métricas</p><p>Compatível</p><p>Pizza</p><p>Compatível</p><p>Medidor</p><p>Compatível</p><p>Heatmap</p><p>Compatível</p><p>Tabelas de dados</p><p>Compatível</p><p>Mapa de árvore</p><p>Compatível</p><p>Discover sessões</p><p>Compatível</p><p>Controles</p><p>Compatível</p><p>Markdown</p><p>Compatível</p><p>Links</p><p>Compatível</p><p>Painéis de ML</p><p>Compatível</p><p>Painéis de observabilidade</p><p>Compatível</p><p>Mapas</p><p>Em breve</p><p>Vega</p><p>Em breve</p><h2>Como gerenciar dashboards do Kibana como código</h2><p>A API de dashboards permite um fluxo de trabalho completo de dashboards como código: exportar um dashboard como JSON limpo e passível de comparação, enviá-lo ao Git como fonte de verdade, revisar mudanças em pull requests e implantar a mesma definição em desenvolvimento, staging e produção. Depois que um dashboard for gerenciado como código, trate o Git como a única fonte da verdade: as alterações feitas diretamente na UI serão substituídas na próxima vez que você implantar.</p><p>O principal desafio ao mover um dashboard entre espaços, clusters ou estágios é que os dashboards referenciam objetos como data view e visualizações da biblioteca por ID. Como esses IDs são gerados automaticamente e diferem entre ambientes, um dashboard exportado de um ambiente pode apontar para objetos que não existem em outro. Existem três maneiras de lidar com isso, listadas aqui da mais automatizada à menos automatizada:</p><ul><li><p><strong>Use Terraform.</strong> O <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">provedor Terraform do Elastic Stack</a> acompanha cada recurso e mapeia os IDs automaticamente por ambiente, para que as referências permaneçam consistentes enquanto você promove um dashboard do desenvolvimento para a produção.</p></li><li><p><strong>Defina por-valor </strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>a Linguagem de Consulta Elasticsearch (ES|QL)</strong></a><strong>.</strong> A maneira mais portátil de construir um painel é definir sua visualização com o ES|QL diretamente no dashboard. Uma consulta <a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a> lê os índices que você especificar nela; portanto, o painel não contém referências externas a data views ou objetos de biblioteca. O resultado é um dashboard portátil e totalmente independente.</p></li><li><p><strong>Atribua IDs correspondentes.</strong> Se você fizer referência a objetos salvos, como visualizações de dados ou visualizações de bibliotecas, crie-os com um ID escolhido usando PUT (upsert) em vez de POST (que gera automaticamente um ID). Use IDs legíveis por humanos, como logs-prod, para que sejam fáceis de reutilizar e reconhecer em diferentes ambientes.</p></li></ul><p>Para obter uma descrição detalhada desses padrões de portabilidade e do fluxo de trabalho completo de dashboards como código, consulte a documentação <a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">Gerenciar dashboards como código</a>.</p><h3>Crie um dashboard do Kibana com a API Dashboards usando PUT</h3><p>Aqui está um exemplo rápido de criação de um dashboard com uma métrica usando PUT em vez de POST para atribuir um ID personalizado com o nome do dashboard (service-health-overview). A mesma lógica funciona para criar visualizações independentes salvas na biblioteca.</p>PUT kbn:/api/dashboards/service-health-overview
{
  "título": "Visão geral da saúde do serviço",
  "descrição": "Métricas principais do serviço — gerenciadas via API",
  "tags": [
    "produção",
    "equipe SRE"
  ],
  "painéis": [
    {
      "tipo": "vis",
      "grade": {
        "x": 0,
        "y": 0,
        "w": 12,
        "h": 8
      },
      "config": {
        "título": "Taxa de erro (5xx)",
        "tipo": "métrico",
        "data_source": {
          "type": "esql",
          "query": "FROM logs-* | WHERE http.response.status_code &gt;= 500 | STATS error_rate=count(*) BY host.name"
        },
        "métricas": [
          {
            "type": "primary",
            "column": "count"
          }
        ]
      }
    }
  ]
}<h2>Roadmap da API do dashboard do Kibana: Maps, Vega e endpoints independentes</h2><p>Estamos expandindo ativamente o escopo da API. Na sequência, compatibilidade com mapas e painéis Vega, adicionando esquemas tipados para eles. Também estamos construindo pontos finais CRUD independentes para sessões Discover (além do suporte existente como painéis de dashboard), Vega, maps e anotações, desacoplados do ciclo de vida do dashboard.</p><p>Para as definições completas de esquema, visite a <a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">documentação da API dos Dashboards</a>. Para usuários do Terraform, o <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">provedor Terraform do Elastic Stack</a> é compatível com a API GA Dashboards.</p><h2>Nota</h2><ol><li><p>Os endpoints núcleos permanecem inalterados em relação à prévia técnica. Se você construiu integrações contra a 9.4, elas funcionam na 9.5. As únicas alterações que quebram a compatibilidade são duas pequenas que afetam os formatos de listagem do dashboard e dos formatos da unidade de duração, documentadas <a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">aqui</a>.</p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[Experiência do Desenvolvedor]]></category>
    <category><![CDATA[Integrações]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ed7e33de291f255/6a730619c8b7ac02b251f9d3/image1.png" length="0" type="image/png"/>
    <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Do prompt ao dashboard em menos de um minuto, 5 vezes mais barato: dashboards de IA e gráficos personalizados com Vega-Lite no Kibana]]></title>
    <description><![CDATA[Descreva suas métricas em linguagem natural e o chat com IA do Kibana gera dashboards e gráficos Vega-Lite baseados em ES|QL, desde gráficos de dispersão até formatação condicional e dicas de ferramenta personalizadas.]]></description>
    <content:encoded><![CDATA[<p>O<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat"> chat de IA</a> do Kibana agora cria dashboards completos<a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"> baseados em ES|QL</a> a partir de um comando em linguagem natural em menos de um minuto. No Elastic 9.5, isso passa para disponibilidade geral (GA) (<a href="https://www.elastic.co/pt/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">prévia técnica na versão 9.4</a>), com recuperação de erros que tenta novamente consultas com falha, custos de geração de ES|QL 5 vezes menores por meio do roteamento em camadas do modelo e controles interativos de filtro. Esta versão também adiciona a criação de gráficos<a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega"> Vega-Lite</a> por meio de linguagem natural, incluindo gráficos de dispersão, diagramas de caixa, formatação condicional e dicas de ferramenta personalizadas que normalmente você teria que codificar manualmente em JSON.</p><h2>Novidades na criação do dashboard de IA do Kibana</h2><p><strong>Capacidade</strong></p><p><strong>Prévia técnica (9.4)</strong></p><p><strong>GA (9,5)</strong></p><p>Tratamento de erros</p><p>Sem nova tentativa em consultas ES|QL</p><p>Tenta novamente automaticamente até três vezes, com inspeção e ajuste da consulta</p><p>Custo de geração ES|QL</p><p>Todas as consultas são roteadas pelo modelo primário</p><p>Roteamento em camadas de modelos, até 5 vezes mais barato</p><p>Intervalo de tempo</p><p>Janela padrão fixa</p><p>Seleção automática baseada na distribuição temporal dos dados</p><p>Controles de filtro</p><p>Sem suporte</p><p>Adicionado automaticamente para os campos mais relevantes</p><p>Gráficos Vega-Lite</p><p>Sem suporte</p><p>Criação em linguagem natural, incluindo diagramas de dispersão, diagramas de caixa, formatação condicional e dicas de ferramenta personalizadas</p><p>Edição de gráficos</p><p>Sem suporte</p><p>Editar painéis existentes do Vega-Lite usando linguagem natural</p><h3>Recuperação automática de erros para geração de dashboards por IA</h3><p>Na prévia técnica, o agente não tentou novamente as consultas ES|QL com falha. Na versão 9.5, ele detecta erros de consulta e tenta até três vezes, inspecionando cada erro e ajustando a consulta antes de desistir. Na prática, isso elimina a maioria dos problemas de painéis vazios e produz dashboards que renderizam corretamente na primeira tentativa.</p><h3>Por que a criação de dashboards de IA é mais barata no Elastic 9.5?</h3><p>Nem toda etapa na geração de dashboards exige o mesmo nível de raciocínio. Na 9.5, ES|QL passa por um modelo mais leve por padrão e retorna ao modelo primário apenas quando necessário. Se seu <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">conector</a> usa o Claude Opus 4.8 da Anthropic, isso significa que a geração de ES|QL em todos os painéis fica 5 vezes mais barata.</p><h3>Seleção automática do intervalo de tempo com base nos seus dados</h3><p>Dashboards só são úteis quando mostram o intervalo de dados correto. Agora, o agente aplica uma lógica aprimorada para escolher um intervalo de tempo que faça sentido para os dados que está consultando, a menos que o usuário solicite um intervalo de tempo específico. Ele considera a distribuição temporal dos dados e ajusta o intervalo de acordo, seja para a última hora em um incidente em andamento ou para os últimos 90 dias em uma análise de tendências, em vez de recorrer a uma janela fixa.</p><h3>Controles automáticos de filtro em dashboards gerados por IA</h3><p>A criação de dashboards agora oferece suporte a controles; ou seja, filtros interativos que permitem aos usuários filtrar um dashboard pelos valores dos campos sem editar as consultas subjacentes. Ao gerar um dashboard, o agente adiciona automaticamente controles na parte superior para os campos mais relevantes para filtragem.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a5520e66ae76001/6a719a218a155220ed6498e7/image3.png" alt="Kibana AI chat generating an ES|QL-backed host metrics dashboard with automatic filter controls in 71 seconds" /><h2>Gráficos Vega-Lite a partir da linguagem natural: tipos de gráficos e formatação além dos padrões</h2><p><a href="https://vega.github.io/vega/">Vega</a> e <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> suportam uma ampla variedade de tipos de gráficos e personalizações no Kibana. Com a versão 9.5, você pode criá-los a partir de uma linguagem natural em vez de escrever o código você mesmo. </p><h3>Diagramas de dispersão, diagramas de caixa e mais tipos de gráficos Vega-Lite</h3><p>Diagramas de dispersão, gráficos de caixa, múltiplos pequenos facetados, gráficos de bolhas e gráficos de composição (como combinar histogramas com mapas de calor), entre muitos outros, são suportados pelo <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a>. Um prompt como <em>Mostre-me um gráfico de dispersão entre tempo de resposta e tamanho da requisição, colorido pelo nome do serviço</em>, gera um painel Vega-Lite com os mapeamentos de dados corretos. Usam as paletas de cores padrão do Kibana para se misturar com o restante do dashboard.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1651fe7ac903d47/6a719a49f124649f746fc1b4/image5.png" alt="Kibana dashboard with four Vega-Lite charts: box plot, bubble chart, faceted small multiples, and heatmap." /><h3>Formatação condicional, dicas de ferramentas personalizadas e rótulos em gráficos padrão</h3><p>Mesmo para tipos de gráficos que já são nativos de dashboards, como barra, linha ou área, às vezes você precisa de mais controle do que as capacidades padrão oferecem. O Vega-Lite via chat preenche essa lacuna. Alguns exemplos incluem:</p><ul><li><p><strong>Formatação condicional de cores:</strong> colorir pontos de dados acima de um limiar de forma diferente; por exemplo, tornar vermelhos os pontos de dados em uma linha ou barras quando algum indicador ultrapassa seu objetivo de nível de serviço (SLO). Peça ao agente algo como <em>pinte de vermelho qualquer ponto acima de 500ms no meu gráfico de linhas.</em> </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc1211784e9033557/6a719a6ab966e1736163d7d1/image1.png" alt="Vega-Lite line and bar charts in Kibana with conditional colour formatting showing data points above a threshold in red" /><p></p></li><li><p><strong>Marcas e etiquetas personalizadas:</strong> adicione emojis, símbolos ou etiquetas de texto em linha aos pontos de dados para indicadores de status de fácil visualização.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3c59c3748484bc1/6a719aa02888394fdc07bac1/image2.png" alt="Lite horizontal bar chart in Kibana with emoji flag labels and custom tooltip showing requests by country" /><p></p></li><li><p><strong>Dicas de ferramentas personalizadas:</strong> enriqueça as dicas exibidas ao passar o cursor com mais métricas, contexto ou valores calculados que não fazem parte dos eixos do gráfico. Peça algo como <em>Adicionar uma dica de ferramenta que mostre o total de registros e a % por barra.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt43f241f4382b5b90/6a719ab7ded0cf3367f49275/image4.png" alt="Vega-Lite stacked bar chart in Kibana with custom tooltip showing total records and percentage of total by extension" /><p></p></li></ul><p>Isso também funciona para editar gráficos Vega existentes. Se você tem um painel Vega-Lite que precisa de ajustes, como alterar uma escala de cores, ajustar um eixo ou mudar o tipo de marca, descreva a mudança no bate-papo em vez de se aprofundar no código JSON.</p><h2>Como construímos a geração em linguagem natural do Vega-Lite no Kibana</h2><p>Gerar um gráfico Vega-Lite a partir de uma frase não consiste em fazer um único prompt <em>para o modelo gerar o JSON</em>. Construímos um pequeno pipeline autônomo que transforma a intenção em linguagem natural em um gráfico validado e respaldado por dados.</p><p>Quando um pedido chega, o agente primeiro determina se o Vega-Lite é a opção adequada. Para requisições Vega-Lite, a visualização se baseia em uma consulta ES|QL real no Elasticsearch e então usa um modelo para gerar o código Vega-Lite. Antes da renderização, o resultado passa por uma camada de normalização que corrige o esquema e vincula a consulta canônica. Também aplica transformações para segurança na renderização. </p><p>Algumas escolhas de design tornam esse fluxo de trabalho confiável:</p><ul><li><p><strong>Chamada tipada de ferramenta</strong>: a criação de gráficos é uma invocação de ferramenta estruturada, em vez de um código Vega-Lite de formato livre colado na conversa.</p></li><li><p><strong>Geração restrita</strong>: o modelo gera código Vega-Lite dentro de um esquema definido, tornando a saída mais previsível e fácil de validar.</p></li><li><p><strong>Exemplos selecionados:</strong> padrões estruturais, como facetas, marcas em camadas e mapas de calor, fornecem orientação sem copiar os dados subjacentes.</p></li><li><p><strong>Loops de execução e verificação</strong>: as consultas são executadas antes da criação do gráfico e as falhas de validação acionam novas tentativas corretivas para a geração de ES|QL.</p></li></ul><h2>Experimente a criação de dashboards por IA e gráficos Vega-Lite em Kibana</h2><p>Para experimentar a criação de dashboards em linguagem natural e os gráficos Vega-Lite, atualize para o <strong>Elastic 9.5</strong> (ou <a href="https://cloud.elastic.co/registration">inicie um teste gratuito</a>) e abra o <strong>chat</strong> no Kibana. Depois, peça para ele criar um dashboard a partir dos seus dados. Para Vega-Lite, tente pedir um tipo de gráfico que você sempre quis, mas nunca construiu, como um gráfico de dispersão ou um gráfico de bolhas. Se o resultado não estiver totalmente certo, diga ao agente o que mudar. Ele itera com você.</p><p>Isso requer uma licença empresarial. <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Comece agora mesmo</a>.</p><p><em>O lançamento e o cronograma de quaisquer recursos ou funcionalidades descritos neste artigo permanecem a exclusivo critério da Elastic. Os recursos ou funcionalidades não disponíveis no momento poderão não ser entregues no prazo previsto ou sequer serem disponibilizados.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Marta Bondyra,Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt54406ad0378bc5fc/6a7199ffed03ccee0dac9d7c/image6.png" length="0" type="image/png"/>
    <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[137.000 pessoas, zero decisões humanas: resposta a desastres baseada em agentes com o Elasticsearch]]></title>
    <description><![CDATA[Descubra como uma regra de detecção do Kibana, um fluxo de trabalho e um agente de IA realocaram automaticamente 137.000 militares em sete instalações quando um furacão atingiu a região, sem a necessidade de um despachante.]]></description>
    <content:encoded><![CDATA[<p>A Elastic acabou de coordenar a evacuação automatizada de 137.000 militares em sete instalações, sem nenhuma intervenção humana. Um furacão de categoria 4 atinge a costa de Hampton Roads. O enriquecimento geoespacial do Elasticsearch identifica todas as instalações na zona de impacto no momento da indexação. Uma regra de detecção do Kibana dispara. Um fluxo de trabalho inicia uma conversa com o agente de IA. O agente analisa a capacidade, a distância e a compatibilidade entre os ramos e, em seguida, envia 16 notificações de evacuação e recebimento em uma única etapa. Do evento bruto do GDACS à ação coordenada, automaticamente.</p><p>Todos os anos, os desastres naturais forçam gestores de emergência, comandantes militares e autoridades de segurança pública a tomar decisões de alto risco em prazos reduzidos. Essas decisões tradicionalmente dependem de árvores de chamadas, planilhas e conhecimento institucional distribuído entre dezenas de pessoas. A sobrecarga de coordenação por si só consome um tempo precioso.</p><p>Este post demonstra como a Elastic pode viabilizar um sistema de coordenação responsivo e baseado em agentes para resposta a desastres que detecta uma ameaça, avalia a logística e toma medidas automaticamente. Para tornar isso concreto, criamos uma simulação: um furacão fictício de Categoria 4 que ameaça a costa de Hampton Roads aciona o realojamento automatizado de mais de 137.000 pessoas em sete instalações militares.</p><p><strong>Aviso:</strong> <strong>Este é um cenário totalmente fictício criado para fins de demonstração. </strong>O furacão ELARA-26 não existe. Os locais das instalações são baseados em dados geográficos reais e disponíveis publicamente (o conjunto de dados Military Installations, Ranges, and Training Areas [MIRTA] do Departamento de Defesa dos EUA [DoD]), mas todos os dados operacionais, como contagem de pessoal, capacidade de alojamento, ativos, e-mails de contato e perfis de missão, são totalmente fictícios. Nada nesta demonstração reflete prontidão militar, capacidade ou procedimentos operacionais reais.</p><h2>Por que a resposta automatizada a desastres requer coordenação geoespacial e agêntica</h2><p>Quando um desastre natural ameaça a infraestrutura crítica, o desafio de coordenação é imediato:</p><ul><li><p>Quais instalações estão na zona de impacto?</p></li><li><p>Quantas pessoas precisam se deslocar?</p></li><li><p>Para onde eles podem ir, e essas instalações têm capacidade?</p></li><li><p>Quem precisa ser notificado agora?</p></li></ul><p>Essas perguntas não esperam. Nem as respostas deveriam.</p><h2>Implantar o pipeline: pré-requisitos e configuração</h2><p>Siga as instruções <a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">aqui no repositório de exemplo</a> para implantar um cluster local da Elastic com o Elastic Inference Service (EIS) via <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/connect-self-managed-cluster-to-eis#set-up-eis-with-cloud-connect">Cloud Connect</a>.</p><h2>Como funciona o pipeline agêntico de resposta a desastres do Elasticsearch</h2><p>O pipeline tem sete camadas que trabalham juntas de ponta a ponta:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf09bfae87ab35bec/6a4693ef31bdbbe3ef8b33ae/61814cddea0409162fb057c2113e0a496c105238-1999x275.png" alt="Pipeline flowchart Alt text: Horizontal flowchart with seven labeled boxes connected by arrows: GDACS feed, ingest pipeline, enrich (geo_shape), detection rule, workflow, AI agent, and email." /><ol><li><p><strong>Ingestão de dados:</strong> eventos de desastre do Global Disaster Alert and Coordination System (GDACS) enviados para o Elasticsearch</p></li><li><p>P<strong>ipeline de ingestão</strong>: GeoJSON é ingerido e normalizado para o Elastic Common Schema (ECS).</p></li><li><p><strong>Enriquecimento geoespacial:</strong> O polígono da área afetada pelo evento é comparado aos limites indexados de instalações militares.</p></li><li><p><strong>Alerting:</strong> Uma regra de detecção do Kibana é acionada quando um desastre afeta qualquer instalação.</p></li><li><p><strong>Automação de fluxo de trabalho:</strong> O alerta aciona um fluxo de trabalho do Kibana que inicia uma conversa com um agente de IA.</p></li><li><p><strong>Raciocínio da IA:</strong> o agente analisa as instalações afetadas, seus ativos e as instalações de apoio mais próximas para determinar a realocação de todos os ativos e do pessoal.</p></li><li><p><strong>Notificações por e-mail</strong>: o agente envia e-mails para todos os destinatários referentes à entrada e saída de pessoal e/ou ativos.</p></li></ol><p>Vamos examinar cada camada.</p><h2>Etapa 1: indexação de instalações militares com limites geográficos</h2><p>A base é o conjunto de dados DoD MIRTA de <a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a>. Este conjunto de dados fornece um geo_shape do tipo Point para cada instalação; coordenadas de centroide em vez de polígonos de limites completos.</p><p>Cada documento de instalação no índice mitra-facilities é enriquecido com dados de perfil operacional (todos fictícios), além do que o MIRTA fornece:</p>{
  "entity_name": "Naval Station Norfolk",
  "branch_of_service": "Navy",
  "mission_function_type": "fleet_support",
  "personnel_count": 50000,
  "housing_capacity": 55000,
  "temporary_housing_capacity": 10000,
  "logistics_capabilities": ["fuel", "airlift", "sealift", "medical"],
  "available_assets": [
    { "type": "helicopters", "count": 24 },
    { "type": "transport_vehicles", "count": 150 }
  ],
  "contact_email": "norfolk.ops@navy.mil.gov.fake",
  "operational_status": "act",
  "is_joint_base": false,
  "entity_geo_location": { "type": "polygon", "coordinates": [...] }
}<p>Esse índice rico é o que permite ao agente de IA tomar decisões inteligentes de alocação; não apenas "aqui estão as bases próximas," mas "aqui estão bases com capacidade de alojamento disponível, tipos de missão compatíveis e a logística para receber os ativos que chegam."</p><h2>Etapa 2: ingerindo e normalizando eventos do GDACS</h2><p>O GDACS publica GeoJSON em tempo real para terremotos, ciclones tropicais, inundações, incêndios florestais, vulcões e secas. Ingerimos esse feed em um fluxo de dados (logs-gdacs.events-*) usando um pipeline de ingestão personalizado que normaliza o GeoJSON bruto para campos do ECS.</p><p>O pipeline de ingestão do GDACS faz várias coisas que valem a pena notar:</p><p><strong>Extração de geometria:</strong> O centróide é armazenado como um geo_point para exibição no mapa, e o polígono de impacto é armazenado como um geo_shape em gdacs.affected_area, que é o campo usado posteriormente para consultas de interseção.</p><p><strong>Normalização da gravidade:</strong> cada tipo de desastre tem uma escala de gravidade diferente. Um ciclone tropical é medido pela velocidade do vento em km/h; um terremoto, pela magnitude Richter. O pipeline mapeia todos eles para uma pontuação normalizada de 0–100:</p>// Trecho de Painless do pipeline de ingestão
if (type == 'TC') {
  norm = Math.min(100.0, Math.max(0.0, (val - 40.0) / 2.6));
} else if (type == 'EQ') {
  norm = Math.min(100.0, Math.max(0.0, (val - 4.0) * 20.0));
}<p>A pontuação de gravidade normalizada é então mapeada para um rótulo severity_level (low, medium, high, critical) usado para o mapeamento de gravidade do alerta na regra de detecção.</p><p><strong>Alinhamento ao ECS:</strong> event.kind: alert, event.category: threat, registros de data e hora mapeados para event.start/event.end, e um _id estável baseado em fingerprint para desduplicação.</p><h2>Passo 3: enriquecimento geoespacial: encontrar instalações afetadas no momento da indexação</h2><p>A política enrich geo_match do Elasticsearch compara o polígono do desastre com todos os limites de instalação no momento da indexação, sem a necessidade de uma junção no momento da consulta. Em vez de consultar no momento da busca, usamos um <strong>processador enrich</strong> no pipeline de ingestão para comparar o polígono de impacto do desastre com todos os limites de instalação <em>à medida que o documento é indexado</em>.</p><p>A política de enriquecimento é uma política geo_match:</p>{
  "geo_match": {
    "indices": "mitra-facilities",
    "match_field": "entity_geo_location",
    "enrich_fields": [
      "entity_name",
      "entity_type",
      "entity_station_number",
      "entity_geo_city_name",
      "entity_geo_region_name"
    ]
  }
}<p>O processador é executado no final do pipeline de ingestão:</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>O INTERSECTS captura qualquer instalação cujo limite toque ou sobreponha o polígono do desastre e até mesmo interseções parciais. O resultado é que cada documento de evento do GDACS é armazenado com um array aninhado affected_facilities que nos informa exatamente quais instalações estão na zona de impacto. Nenhuma consulta de junção é necessária.</p><h2>Etapa 4: regra de detecção: alerta sobre impacto nas instalações</h2><p>Uma regra de detecção do Kibana monitora o fluxo de dados logs-gdacs.events-* e é disparada quando um evento do GDACS tiver sido enriquecido com pelo menos uma instalação afetada:</p>Consulta: affected_facilities: { entity_name: * }<p>A regra é executada em uma programação de hora em hora (abrangendo uma janela de now-1h a now) e usa o mapeamento dinâmico de gravidade; o campo gdacs.severity_level calculado pelo pipeline de ingestão determina automaticamente a gravidade do alerta.</p><p>A gravidade do alerta também determina a pontuação de risco por meio do mapeamento de campos:</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>Quando a regra dispara, ela passa todo o contexto do alerta, incluindo o array affected_facilities enriquecido com nomes, tipos e locais de instalação, para um fluxo de trabalho subsequente do Kibana.</p><h2>Etapa 5: Automação do fluxo de trabalho: conectando o alerta ao agente</h2><p>Os fluxos de trabalho do Kibana cuidam da transição da detecção para a resposta. O fluxo de trabalho de resposta a desastres naturais é acionado pelo alerta:</p>triggers:
  - type: alert
steps:
  - name: start_convo
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      body:
        agent_id: "mitra.response"
        input: "Novo alerta de desastre natural: {{ event.alerts | json }}"<p>Toda a carga útil do alerta (tipo de desastre, gravidade, área afetada e a lista de instalações impactadas) é encaminhada ao agente de IA como contexto inicial. O agente cuida do restante.</p><h2>Etapa 6: o agente de IA: dos dados à ação coordenada</h2><p>O agente mitra.response recebe o payload completo do alerta e, em um único loop agêntico, avalia o escopo, localiza instalações receptoras, aloca pessoal e envia notificações de evacuação e recebimento, tudo sem intervenção humana.</p><p>O agente tem duas ferramentas disponíveis:</p><ul><li><p><strong>mitra.nearest_facility</strong>consulta o índice mitra-facilities usando uma consulta geo_shape, classificada por distância de uma determinada coordenada, retornando até 50 instalações ativas próximas com capacidade disponível.</p></li><li><p><strong>mitra.send_email</strong> itera sobre um array JSON de objetos de instalações e envia notificações formatadas de evacuação ou recebimento.</p></li></ul><p>O conjunto de instruções do agente define um fluxo de trabalho claro:</p><ol><li><p><strong>Avalie a situação.</strong> Analise o alerta, identifique as instalações afetadas e determine a abrangência do desastre.</p></li><li><p><strong>Faça um inventário do que precisa ser movido.</strong> Contagem de pessoal, ativos críticos, requisitos de alojamento por instalação.</p></li><li><p><strong>Encontre as instalações de destino.</strong> Chame mitra.nearest_facility para cada instalação afetada, filtrando as instalações que ainda estão na zona de perigo.</p></li><li><p><strong>Tome decisões de alocação.</strong> Analise soluções de instalação única em comparação com instalações múltiplas, compatibilidade entre ramos, capacidade de alojamento e suporte a ativos.</p></li><li><p><strong>Envie e-mails de coordenação.</strong> Envie ordens de evacuação para as instalações de origem e notificações de recebimento para as instalações receptoras.</p></li><li><p><strong>Gere um relatório de resumo. </strong>Gera um breve resumo de todas as instalações afetadas, do total de pessoas, dos ativos transferidos, das instalações de destino e de quaisquer preocupações para o chat para revisão.</p></li></ol><p>A lógica de alocação do agente segue restrições do mundo real: não exceder a capacidade de alojamento, preferir relocações do mesmo ramo quando possível, usar bases conjuntas para o excedente de diferentes ramos e priorizar a distância para minimizar o tempo de deslocamento.</p><h3>A ferramenta de instalação mais próxima</h3><p>A consulta do fluxo de trabalho subjacente usa geo_shape com um filtro circle e classificação por _geo_distance:</p>"query": {
  "bool": {
    "filter": [
      {
        "geo_shape": {
          "entity_geo_location": {
            "shape": {
              "type": "circle",
              "coordinates": [{{ inputs.lon }}, {{ inputs.lat }}],
              "radius": "5000km"
            },
            "relation": "intersects"
          }
        }
      },
      { "term": { "operational_status.keyword": "act" } }
    ]
  }
},
"sort": [
  {
    "_geo_distance": {
      "entity_geo_point": { "lat": {{ inputs.lat }}, "lon": {{ inputs.lon }} },
      "order": "asc",
      "unit": "km"
    }
  }
],
"script_fields": {
  "available_capacity": {
    "script": {
      "source": "Math.max(0, doc['housing_capacity'].value - doc['personnel_count'].value)"
    }
  }
}<p>A capacidade disponível é calculada no momento da consulta por meio de um campo com script que calcula a capacidade de alojamento menos a contagem atual de pessoal. O agente usa isso para alocar pessoal entre os destinos sem exceder os limites.</p><h2>Furacão ELARA-26: coordenação agêntica de 137.000 pessoas, de ponta a ponta</h2><p>O furacão ELARA-26 é uma tempestade de categoria 4 (ventos máximos de 213 km/h) com previsão de atingir a costa na região de Hampton Roads, na Virgínia. Quando o evento do GDACS é ingerido, o polígono da área afetada intercepta sete grandes instalações militares na região. A regra de detecção dispara. O fluxo de trabalho inicia uma conversa com o agente.</p><p>Em um único loop agêntico, o agente:</p><ul><li><p>Identificou sete instalações na zona de impacto, com um total combinado de 137.372 pessoas.</p></li><li><p>Chamou mitra.nearest_facility para encontrar instalações receptoras fora da trajetória da tempestade.</p></li><li><p>Distribuiu o pessoal entre nove instalações receptoras com base na capacidade de alojamento disponível e na distância.</p></li><li><p>Gerou e enviou ordens de evacuação para todas as sete instalações afetadas.</p></li><li><p>Gerou e enviou notificações de recebimento para todas as nove instalações receptoras.</p></li><li><p>Produziu um resumo completo de coordenação, semelhante ao mostrado abaixo:</p></li></ul><p><strong>Instalações evacuadas:</strong></p><p>Instalação</p><p>Pessoal</p><p>Estação Naval de Norfolk</p><p>50.000</p><p>Base expedicionária conjunta Little Creek-Fort Story</p><p>18.000</p><p>Naval Air Station Oceana</p><p>15.355</p><p>Naval Air Station Oceana Dam Neck Annex</p><p>17.509</p><p>Reserva Militar Estadual NG Camp Pendleton</p><p>9.707</p><p>Base Conjunta Langley-Eustis</p><p>15.000</p><p>Naval Weapons Station Yorktown</p><p>11.801</p><p><strong>Instalações receptoras:</strong></p><p>Instalação</p><p>Distância</p><p>Pessoal ingressante</p><p>Fort Gregg-Adams</p><p>97 km</p><p>~40.000</p><p>Base do Corpo de Fuzileiros Navais de Quantico</p><p>148 km</p><p>~30.000</p><p>Naval Support Facility Indian Head</p><p>151 km</p><p>~30.000</p><p>Base Conjunta Andrews</p><p>180 km</p><p>~30.000</p><p>Naval Air Station Patuxent River</p><p>141 km</p><p>~10.000</p><p>NG MTA Camp Butner</p><p>174 km</p><p>~5.000</p><p>Local de treinamento NG Bethany Beach</p><p>209 km</p><p>~4.707</p><p>Rivanna Station</p><p>140 km</p><p>~7.500</p><p>Centro de suprimentos Def Gen</p><p>22 km</p><p>~6.000</p><p>Os ativos realocados incluem veículos de transporte, helicópteros, barcos de patrulha, unidades médicas, veículos de engenharia, geradores, reboques de água, kits de abrigo e sistemas de comunicação.</p><h3>Notificações automatizadas por e-mail</h3><p>Depois que o agente finalizou seu plano de alocação, ele chamou mitra.send_email e enviou 16 e-mails de uma só vez; ou seja, ordens de evacuação para todas as sete instalações afetadas e notificações de recebimento para todas as nove instalações receptoras. Cada mensagem incluía a instalação de destino, a quantidade de pessoal que chegaria, os ativos a serem movidos e um contato de coordenação. O que teria levado horas de ligações em cadeia foi concluído automaticamente no momento em que o agente terminou de raciocinar.</p><h3>Estendendo a resposta agêntica a desastres com RAG e fundamentação em políticas</h3><p>Esta demo é puramente baseada em dados estruturados, como números de capacidade, distâncias e status operacional. Os recursos de busca semântica e retrieval augmented generation (RAG) da Elastic podem tornar o agente significativamente mais inteligente, com duas adições:</p><p><strong>Recuperação de respostas históricas:</strong> indexe relatórios pós-ação anteriores, resumos de incidentes da Agência Federal de Gestão de Emergências (FEMA) e registros de resposta a desastres como embeddings vetoriais. Quando ocorre um novo evento, o agente pode recuperar semanticamente como eventos semelhantes foram tratados, embasando decisões de alocação com conhecimento institucional, em vez de se basear apenas em cálculos de capacidade.</p><p><strong>Fundamentação em políticas e doutrinas:</strong> indexe diretrizes de gerenciamento de emergências do DoD, planos de continuidade de operações de instalações e orientações do comandante. O agente pode recuperar e citar as políticas reais que regem uma resposta, garantindo que cada decisão seja fundamentada em doutrina, em vez de inferência.</p><p>Ambos seguem a mesma abordagem nativa da Elastic:; um pipeline de inferência gera embeddings em tempo de indexação, e uma ferramenta de busca semântica é exposta ao agente. O pipeline de coordenação permanece o mesmo. O agente simplesmente fica mais inteligente.</p><h2>Por que o Elasticsearch é a plataforma certa para a resposta agêntica no setor público</h2><p>Este não é um chatbot. Não é um dashboard. É um sistema responsivo de fluxo de trabalho agêntico, que detectou uma ameaça, raciocinou sobre um problema logístico complexo e coordenou a realocação de 137.000 pessoas sem intervenção humana. Esse tipo de resultado só é possível porque todos os recursos dos quais ele depende estão em uma única plataforma unificada.</p><p>O suporte geoespacial do Elasticsearch (geo_point, geo_shape, políticas de enriquecimento e classificação baseada em distância) lida com o raciocínio espacial que torna a detecção de interseções e a consulta de instalações possíveis em escala. A busca semântica e os embeddings vetoriais ancoram os agentes na realidade, garantindo que o raciocínio da IA seja baseado no que realmente está em seus dados, em vez de suposições alucinadas. O mecanismo de detecção do Kibana, os fluxos de trabalho, o Agent Builder e as ferramentas do Agent Builder conectam tudo em um pipeline que vai do evento bruto à ação coordenada, sem a necessidade de nenhum código de integração externo.</p><p>Nenhuma outra plataforma reúne tudo isso como a Elastic. A combinação de indexação em tempo real, precisão geoespacial, recuperação semântica e orquestração por agentes, tudo em uma única pilha de tecnologia, com segurança e observabilidade de nível empresarial integradas, é o que diferencia a Elastic de ferramentas que fazem bem uma dessas coisas, mas exigem que você reúna o restante por conta própria.</p><h2>Resposta geoespacial agêntica para gerenciamento de emergências, bombeiros, aplicação da lei e saúde pública</h2><p>A mesma arquitetura se aplica onde quer que pessoas, instalações e eventos em tempo real se cruzem. Os dados específicos mudam. O pipeline não.</p><p><strong>Gerenciamento de emergências:</strong> a FEMA e os órgãos estaduais de gerenciamento de emergências podem mapear locais de abrigo, áreas de mobilização e populações vulneráveis em relação aos polígonos de clima severo do National Weather Service (NWS), acionando o pré-posicionamento automatizado de recursos antes que uma tempestade atinja a costa.</p><p><strong>Serviços de bombeiros e emergência médica:</strong> os corpos de bombeiros podem sobrepor localizações de unidades e zonas de resposta a perímetros de incêndios florestais ou clusters de incêndios estruturais, encaminhando automaticamente solicitações de ajuda mútua para as unidades disponíveis mais próximas com o equipamento adequado.</p><p><strong>Aplicação da lei:</strong> as agências podem correlacionar locais de incidentes ativos com zonas escolares, infraestrutura crítica e posições de policiais, disparando notificações de bloqueio baseadas em localização geográfica ou despacho de recursos sem esperar pela triagem manual.</p><p><strong>Segurança nas escolas públicas:</strong> os distritos escolares podem monitorar feeds de ameaças em tempo real em relação aos limites do campus. Quando uma ameaça cruza o perímetro de uma escola, um agente pode notificar imediatamente a administração, iniciar comunicações de confinamento e coordenar a resposta das forças policiais, tudo antes que um atendente pegue o telefone.</p><p><strong>Saúde pública:</strong> os departamentos de saúde podem cruzar dados de vigilância de doenças ou zonas de risco ambiental com a localização de clínicas, camadas de densidade populacional e estoques de depósitos de suprimentos para direcionar recursos para onde são mais necessários.</p><p>Setor</p><p>Caso de uso</p><p>Recurso da Elastic</p><p>Gerenciamento de emergências</p><p>Corresponda os locais de abrigo aos polígonos de clima severo do NWS</p><p>Enriquecimento de geo_shape + fluxos de trabalho do Kibana</p><p>Bombeiros e EMS</p><p>Sobreponha as localizações das unidades aos perímetros de incêndios florestais</p><p>roteamento geoespacial + consulta de instalação mais próxima</p><p>Aplicação da lei</p><p>Correlacione incidentes com zonas escolares e posições de policiais</p><p>regras de alerta com reconhecimento geográfico + despacho de agentes</p><p>Segurança nas escolas públicas</p><p>Monitore feeds de ameaças em relação aos perímetros do campus</p><p>regras de detecção + notificação automatizada</p><p>Saúde pública</p><p>Corresponda zonas de perigo a locais de clínicas e depósitos de suprimentos</p><p>busca semântica + enriquecimento geoespacial</p><p>Os dados são diferentes em cada cenário. O padrão subjacente de ingerir, enriquecer no momento da indexação, detectar interseção, acionar resposta agêntica e agir é o mesmo. A Elastic oferece às organizações do setor público a plataforma para criar uma vez e adaptar em qualquer lugar.</p><p><em>O lançamento e a disponibilização de quaisquer recursos ou funcionalidades descritos neste artigo ficam a exclusivo critério da Elastic. Os recursos ou funcionalidades não disponíveis no momento podem não ser disponibilizados no prazo previsto ou nem chegar a ser disponibilizados.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</guid>
    <category><![CDATA[IA agêntica]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Alec Carpenter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt969cad2694920de4/6a4693f37746672ad42675b5/cb292a501835472598dee30bef25c77afc54db6c-720x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[O AI Chat no Kibana agora renderiza dashboards de forma nativa]]></title>
    <description><![CDATA[O Elastic AI Chat no Kibana agora cria dashboards a partir de linguagem natural, mantendo seus elementos visuais e análises em um único fluxo e permitindo que você os salve como objetos reutilizáveis do Kibana.]]></description>
    <content:encoded><![CDATA[<p>O <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a> no Kibana agora transforma uma pergunta em linguagem simples em <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a> suportada por <strong>visualizações</strong> ou em um <strong>dashboard</strong> completo — tudo dentro da sua <strong>conversa</strong>. Descreva as métricas que você precisa, refine conforme avança e salve quando os dados estiverem consolidados. Tudo <strong>permanece na conversa</strong> até você estar pronto para <strong>salvá-los</strong>, então, vira um objeto Kibana de primeira classe que sua equipe pode abrir, editar e reutilizar. Disponível como prévia técnica no Elastic 9.4</p><p>O agente cria dashboards do zero, mas também trabalha com o que você já tem. Abra a barra lateral do AI Chat enquanto visualiza um dashboard e ele é <strong>anexado</strong> <strong>automaticamente</strong>. Pergunte por que uma métrica disparou, divida por região ou adicione um painel de comparação. Seu dashboard existente se torna o <strong>ponto de partida</strong>, não apenas o produto final.</p><h2>Bastidores: como construímos dashboards no AI Chat</h2><p>Ensinamos ao agente tarefas específicas por meio de <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">habilidades</a> — descrições estruturadas de como operar em um determinado problema. Mas construir uma habilidade de dashboard significava ensinar um LLM a gerar dashboards Kibana válidos, e a API de objetos salvos legada tornava isso doloroso: JSON profundamente aninhado, mudanças sutis de versão em versão, referências frágeis. Precisávamos de uma abordagem diferente</p><h3>Uma API construída especialmente para dashboards programáticos</h3><p>A nova <a href="https://dashboardsapispec.kibana.dev/dashboards.html">API de dashboards</a> foi criada exatamente para esse cenário. Em vez de expor o estado interno bruto, ele oferece esquemas tipados e validados para cada tipo de painel. A API lida com a tradução entre as estruturas externas limpas e as representações internas do Kibana, para que o agente possa se concentrar no que o dashboard deve conter e não em como formatá-lo.</p><h3>Uma habilidade, uma ferramenta, muitas operações</h3><p>A habilidade <code>dashboard-management</code> expõe uma única ferramenta <code>manage_dashboard</code> que aceita uma matriz ordenada de <strong>operações</strong>. Cada operação é uma ação discreta: definir metadados, adicionar um painel de markdown, criar visualizações com suporte ES|QL a partir de linguagem natural, editar painéis existentes, agrupar painéis em seções dobráveis ou reposicionar itens na grade.</p><p>O agente pode descrever um dashboard inteiro: título, descrição, seções e todos os painéis dentro deles em uma única chamada:</p>{
 "operations": [
   { "operation": "set_metadata", "title": "Checkout latency investigation" },
   {
     "operation": "add_section",
     "title": "Overview",
     "panels": [
       { "query": "p95 checkout latency over the last 24h", "chartType": "xy" },
       { "query": "checkout error rate by region", "chartType": "metric" }
     ]
   }
 ]
}<p>As operações são executadas em ordem, para que etapas posteriores possam referenciar e construir sobre as anteriores. Esse design mantém a conversa focada na intenção e não nos detalhes da implementação.</p><h3>O pipeline de visualização: linguagem natural para ES|QL para visualizações</h3><p></p><p>Quando você pede um dashboard, o agente explora seus dados — índices, mapeamentos de campos, tipos — e depois planeja as visualizações e chama manage_dashboard.</p><p>Cada painel executa seu próprio pipeline: seleção de tipo de gráfico, ES|QL, configuração de visualização e validação. Isolamos isso do thread principal do agente — a construção da visualização exige várias chamadas de modelo por painel, e misturá-las ao contexto principal incharia a janela e confundiria o raciocínio.</p><p>Dentro do manage_dashboard, todos os painéis são construídos simultaneamente e depois remontados em ordem. O resultado é um dashboard completo com painéis embutidos — sem visualizações órfãs, sem problemas de sincronização.</p><h3>Por que movemos a criação de visualizações para dentro da ferramenta de dashboard</h3><p>Nossa primeira abordagem usou uma ferramenta create_visualization separada — uma chamada por painel, depois de passar cada anexo para a ferramenta do dashboard. Funcionou, mas toda visualização precisava de sua própria chamada da ferramenta, seu próprio ciclo de vida e uma entrega explícita. Pior ainda, editar uma visualização na conversa não atualizou o painel do dashboard, o que confundiu os usuários.</p><p>Integramos a criação de visualizações diretamente em manage_dashboard. Os mesmos fluxos de trabalho paralelos são executados, mas os painéis se organizam na estrutura do dashboard sem anexos intermediários. Menos chamadas, sem problemas de sincronização, um ciclo de vida único.</p><p>As visualizações independentes ainda funcionam — você pode inserir gráficos existentes em um dashboard por meio de referências de anexos — mas, para criar do zero, a criação em linha é o caminho mais limpo</p><h2>Para equipes de segurança</h2><p>Analistas SOC e engenheiros de detecção não podem perder tempo indo e voltando do editor de dashboard no meio da investigação. No AI Chat, peça o volume de alertas por tipo de regra, host ou tática do MITRE e veja isso no seu tópico em cerca de um minuto. À medida que a investigação avança, insira painéis — anomalias na execução de processos, conexões de rede, comparações de linhas do tempo — sem perder o contexto.</p><p>Salve quando terminar. O dashboard se torna uma referência para a revisão pós-incidente, um ponto de partida para o próximo analista, ou um briefing semanal de ameaças — sem necessidade de reexplicação.</p><p>Leia mais sobre como as equipes de segurança podem usar a criação de painéis e outras capacidades recentemente lançadas do AI Chat neste <a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">post do blog</a>.</p><h2>Para engenheiros de observabilidade e confiabilidade do site (SREs)</h2><p>Quando um serviço se deteriora às 2:00, não há tempo para construir painéis do zero. Com o AI Chat, um SRE pode descrever as métricas de que precisa (latência p99 por serviço, taxa de erro em relação a eventos de implantação, reinicializações do pod na última hora) e obter um dashboard completo no tópico de investigação em cerca de um minuto. O agente pode refiná-la passo a passo à medida que a imagem fica mais nítida: adicione um painel, altere a janela de tempo, divida por região.</p><p>Ao salvar o dashboard, ele fica imediatamente disponível na sala de guerra (mesmos painéis, mesma estrutura) para todos que participam da ponte de incidentes. Após o incidente, ele se torna a base para o postmortem.</p><h2>O que vem a seguir</h2><p>Estamos trabalhando em otimização de token, interações em tela cheia mais ricas, suporte de painel mais amplo e melhorias contínuas de qualidade. A visualização técnica é o momento certo para definir prioridades — se algo estiver faltando, informe-nos através do ícone "<strong>Enviar feedback</strong>" no menu superior.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="Página de gerenciamento do dashboard mostrando uma lista com uma entrada intitulada &quot;Detalhes do host [OTel] — Visão geral&quot;, juntamente com filtros, uma barra de pesquisa, um botão &quot;Criar dashboard&quot; e uma opção para enviar comentários." /><h2>Experimente</h2><p>Atualize para o <strong>Elastic 9.4</strong> (ou inicie uma avaliação), abra o <strong>AI Chat </strong>no modo de tela cheia e experimente em uma investigação real. Peça ao agente que gere gráficos para as métricas que você está analisando e depois peça a próxima análise. Quando a história se confirma, salve e compartilhe — mesmos quadros, mesma estrutura, sem necessidade de reexplicação. Você precisa de uma licença empresarial (<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">comece agora</a>).
<em>O lançamento e o tempo de amadurecimento de todos os recursos ou funcionalidades descritos neste artigo permanecem a exclusivo critério da Elastic. Os recursos ou funcionalidades não disponíveis no momento poderão não ser entregues ou não chegarem no prazo previsto.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler,Robert Jaszczurek]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2ccc8f75d7cc972/6a17dd82577262f0831bcb21/f3c7ce5e05cabea693363616e62f5e30e0be2cd5-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibana reduz o tempo de carregamento do dashboard em até 25% — aqui está a estratégia de sondagem por trás disso]]></title>
    <description><![CDATA[Descubra como o Kibana usa sondagem contínua e detecção de HTTP/2 no navegador para reduzir o tempo de carregamento do dashboard em até 25%, com recurso automático ao HTTP/1.]]></description>
    <content:encoded><![CDATA[<p>Os dashboards do Kibana e o Discover agora carregam até 25% mais rápido graças à sondagem contínua. Em vez de ficar em espera entre verificações periódicas, o Kibana agora mantém as conexões HTTP abertas e entrega os resultados das consultas do Elasticsearch no momento em que estão prontos. Em HTTP/2+ (o padrão do Kibana desde a versão 9.0), isso ocorre automaticamente, sem necessidade de configuração. Em HTTP/1, o Kibana recorre à sondagem tradicional para evitar o esgotamento do pool de conexão.</p><h2>Como o Kibana busca dados ao carregar um dashboard</h2><p>Quando um dashboard é aberto, a maioria dos painéis (internamente, chamamos esses <em>incorporáveis</em>) inicia uma ou mais consultas no Elasticsearch. Mas, em vez da simples chamada e resposta de uma busca síncrona (sync), usamos o poder da busca assíncrona (<a href="https://www.elastic.co/docs/solutions/search/async-search-api">docs async</a>).</p><p>Com a busca assíncrona, os resultados das consultas ficam disponíveis no Elasticsearch fora de qualquer requisição HTTP específica. Isso é importante porque</p><ul><li><p>torna o carregamento de dados resiliente à turbulência da rede</p></li><li><p>potencializa nosso <a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">recurso de busca em segundo plano</a>, o que permite que os usuários trabalhem em outras coisas no Kibana enquanto esperam por um dashboard de longa duração ou por uma sessão do Discover</p></li></ul><p>Após a consulta inicial ser enviada, o Kibana monitora a busca para detectar quando ela está concluída e recuperar o conjunto de resultados.</p><h3>Como a sondagem tradicional afeta os tempos de carregamento do dashboard do Kibana</h3><p>Na sondagem tradicional, o Kibana envia uma consulta, fecha a conexão inicial e então verifica periodicamente a conclusão do Elasticsearch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Diagrama mostrando a sondagem tradicional no Kibana. A linha do tempo do Kibana mostra um curto período de conexão aberta após o envio da consulta, seguido por um longo período de espera, uma breve verificação de status e, em seguida, a entrega dos resultados. A linha do tempo do Elasticsearch executa uma consulta que se completa no meio do período de espera do Kibana, ilustrando a lacuna de coordenação que causa perda de tempo." /><p>Damos ao Elasticsearch um curto período de tempo após o envio da consulta para simplesmente completar a busca e devolver os resultados. Se a busca for concluída tão rapidamente, isso se resume a uma simples chamada e resposta. Mas para buscas mais longas, a conexão inicial é fechada e o Kibana começa a verificar periodicamente a busca para conclusão. Isso é chamado de <em>sondagem</em>.</p><h4>Desvantagens de desempenho da sondagem tradicional</h4><p>Observando a figura acima, talvez você já possa ver a desvantagem de desempenho dessa abordagem: é mais provável que a busca termine durante um dos intervalos de espera do Kibana, levando à perda de tempo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="Diagrama da linha do tempo mostrando o custo de desempenho da sondagem tradicional. A linha do tempo do Kibana mostra um período de abertura de conexão, um longo período de suspensão, uma consulta de status e em seguida os resultados entregues. A linha do tempo do Elasticsearch mostra a consulta sendo concluída no meio do período de suspensão do Kibana, seguida por um segmento vermelho de tempo perdido — a duração desperdiçada antes de o Kibana acordar e recuperar os resultados." /><p>No pior cenário (quando uma busca é concluída no início de um período de espera), toda a duração do intervalo de sondagem será desperdiçada.</p><h4>O impacto de uma estratégia de backoff</h4><p>É prática padrão durante a sondagem aplicar uma estratégia de backoff. Isso significa que, quanto maior a duração da busca, menos frequentemente a consultamos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="Gráfico de barras horizontais mostrando a programação de recuo do intervalo de sondagem do Kibana conforme a duração da consulta. Consultas com menos de 1,5 segundos usam um intervalo de aproximadamente 0,5 segundos; consultas de 1,5–5 segundos usam 1 segundo; consultas de 5–20 segundos usam aproximadamente 2,5 segundos; consultas com mais de 20 segundos utilizam um intervalo de sondagem de 5 segundos." /><p>No entanto, isso também significa que o tempo potencial perdido varia proporcionalmente com a duração da busca.</p><h4>Como intervalos de sondagem criam padrões de latência em forma de serra</h4><p>Ao combinar todos esses fatores, o tempo perdido passa a seguir um padrão em dente de serra escalonado.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="Gráfico de linhas mostrando o tempo perdido em segundos versus o tempo de conclusão da consulta em segundos, formando um padrão em dente de serra onde o tempo perdido aumenta e depois cai para zero repetidamente, com picos crescendo de menos de 1 segundo para 5 segundos à medida que a duração da consulta aumenta de 0 para 30 segundos." /><p>Aqui, os picos são os piores cenários possíveis e os vales são os melhores cenários. Isso ilustra que a sondagem tradicional nos custa entre nada e a duração total do intervalo de sondagem, dependendo da duração da busca (e das condições da rede).</p><h2>Sondagem contínuas: como o Kibana elimina o tempo de espera</h2><p>O problema com a sondagem tradicional é uma falta fundamental de coordenação entre Kibana e Elasticsearch. Idealmente, o Kibana sabe imediatamente quando os resultados estão disponíveis. Então, e se invertêssemos o padrão de sondagem para que quase todo o tempo seja gasto checando o Elasticsearch e nenhum tempo seja gasto em espera?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Diagrama da linha do tempo mostrando sondagem contínua no Kibana. A linha do tempo do Kibana é totalmente azul: a conexão permanece aberta desde o envio da consulta por meio de duas atualizações de conexão até que os resultados sejam entregues, sem períodos de descanso. A linha do tempo do Elasticsearch mostra a consulta sendo concluída e os resultados entregues imediatamente. A legenda mostra que o tempo perdido foi riscado, indicando que foi eliminado." /><p>Com esta combinação de sondagem longa e sem mais períodos de espera, os resultados são entregues assim que estiverem prontos.</p><h3>Degradação HTTP/1</h3><p>A teoria é sólida. Então, por que essa implantação do Kibana parece tão degradada quando ativamos a sondagem contínua?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Gravação animada da tela de um painel do Kibana carregando o conjunto de dados Sample Logs Data, mostrando vários painéis sendo preenchidos em sequência, incluindo uma série temporal de códigos de resposta, um mapa dos EUA com o total de solicitações, contagem de visitantes únicos, métricas de taxa de erro HTTP e um gráfico de Sankey com dados de sistema operacional e destino das máquinas." /><p>A chave é que essa implantação está sendo executada em HTTP/1. No HTTP/1, as requisições HTTP são mapeadas 1:1 para conexões TCP. Portanto, várias solicitações de sondagem de longa duração estão monopolizando o pool de conexões finito do navegador, fazendo com que outras solicitações sejam colocadas na fila.</p><p>No HTTP/2+, por outro lado, as solicitações de rede podem compartilhar conexões TCP via multiplexação, então não enfrentamos esse problema.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Diagrama comparativo entre HTTP/1 e HTTP/2 para a sondagem contínua do Kibana. O HTTP/1 requer uma conexão TCP por solicitação, esgotando o pool de conexões do navegador em seis conexões. O HTTP/2 multiplexa várias solicitações de sondagem em uma única conexão TCP, evitando o esgotamento do pool e mantendo o desempenho." /><p>Portanto, no HTTP/2+, a sondagem contínua é uma virtude, mas no HTTP/1 ela se torna um vício.</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>Conexões TCP</p><p>Uma por solicitação HTTP</p><p>Multiplexado (muitas solicitações compartilham conexões)</p><p>Comportamento de sondagem contínua</p><p>Degrada o desempenho (esgotamento do pool de conexão)</p><p>Benefício total (resultados entregues imediatamente)</p><h4>Como o Kibana detecta o protocolo HTTP para sondagem ideal</h4><p>HTTP/2 é o protocolo recomendado e é o padrão do Kibana desde a versão 9.0, então seria uma pena não enviar esse aprimoramento de desempenho. Por outro lado, a experiência HTTP/1 é tão degradada que não é aceitável arriscar isso em implantações no local que ainda não atualizaram seu protocolo. A resposta é clara: precisamos detectar qual protocolo está em uso e aplicar a estratégia de sondagem ideal.</p><p>Certamente é possível que o servidor Kibana saiba qual protocolo ele utiliza. Mas há um porém: o fator limitante é o conjunto de conexões do navegador. Isso significa que o que realmente importa é o que o <em>navegador</em> utiliza.</p><p>Por causa dos proxies, nem sempre são iguais.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="Diagrama de arquitetura mostrando três componentes em uma cadeia horizontal: Kibana Server à esquerda, um Proxy opcional no centro e Kibana Client à direita. O salto de servidor para proxy é rotulado com kibana.yml server.protocol, indicando o protocolo conhecido. O salto do proxy para o cliente é rotulado com três pontos de interrogação, indicando que o protocolo nesse salto final é desconhecido e pode ser diferente." /><p>Se basearmos nossa otimização no protocolo do servidor, podemos errar de duas maneiras.</p><ol><li><p>Aplicar sondagem contínua quando não deveria e isso prejudica a experiência.</p></li><li><p>Deixar de aplicar a sondagem contínua quando necessário e perder a otimização.</p></li></ol><p>Felizmente, navegadores modernos oferecem uma forma de detectar o protocolo do último salto de rede de qualquer requisição concluída por meio do uso de um <code>PerformanceObserver</code>. Então, observamos o protocolo da primeira submissão de consulta e otimizamos com base nisso.</p>new PerformanceObserver((list) =&gt; {
  const entries = list.getEntries();
  const entry = entries.find(({ name }) =&gt; name.includes('/internal/search/'));
  if (entry) {
    this.protocolSupportsMultiplexing = ['h2', 'h3'].includes(entry.nextHopProtocol);
  }
});<h2>Resultados de laboratório: sondagem contínua vs. sondagem tradicional em Kibana</h2><p>Para validar a sondagem contínua, criamos dashboards com atrasos de consulta variando de 1 a 23 segundos e medimos os tempos de carregamento com e sem a otimização ativada. Em seguida, carregamos os dashboards com e sem sondagem contínua para medir os ganhos (nos divertimos bastante com <a href="https://github.com/kertal/race-for-the-prize">race-for-the-prize</a>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba4af840d8324923/6a1710ceb339d52fe076a0b6/5f19fb45c5307a7491037fe1ad1a302728793203-1200x742.png" alt="Gráfico de barras mostrando os resultados dos testes de laboratório para a sondagem contínua do Kibana: tempo economizado em comparação com a sondagem tradicional em durações de consulta de 1 a 23 segundos. A economia de tempo varia entre quase zero e 4,9 segundos, dependendo de onde as consultas são concluídas em relação aos limites do intervalo de sondagem, confirmando o padrão de latência em dente de serra previsto pelo cronograma de espera." /><p>O padrão ecoa nosso diagrama dente de serra original. Para algumas durações de consulta, os ganhos são pequenos, enquanto para outras chegam a vários segundos.</p><h2>Conclusão</h2><p>Essa otimização substitui com sucesso a latência inerente à sondagem tradicional por uma estratégia de sondagem contínua mais eficiente. O principal desafio foi implementar essa otimização condicionalmente para evitar a degradação do desempenho em implantações HTTP/1. Resolvemos usando o <code>PerformanceObserver</code> do navegador para detectar de forma confiável o protocolo em uso no salto final da rede.</p><p>Testes laboratoriais validam a teoria, mostrando que a sondagem contínua entrega resultados assim que estão disponíveis. Em média, isso leva a uma melhoria significativa na experiência do usuário, tornando o carregamento de dados até 25% mais rápido.</p><p>Este trabalho é o passo mais recente em nosso compromisso de reduzir o tempo para obter insights para nossos usuários. Ao tornar o Kibana um proxy mais transparente para os dados do Elasticsearch, ultrapassamos os limites do desempenho dentro da nossa esfera de influência. Mais novidades em breve!</p><p>(Em 2025, Thomas Neirynk apresentou uma <a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">excelente visão geral</a> dos métodos e da motivação por trás do aprimoramento do desempenho do dashboard do Kibana. Esta é uma atualização sobre essa iniciativa.)</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Drew Tate,Matthias Wilhelm]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Descreva, não desenhe: dashboards nativos de IA do Kibana via MCP e ES|QL]]></title>
    <description><![CDATA[Do prompt ao dashboard. Aprenda a construir dashboards do Kibana com linguagem natural, usando example-mcp-dashbuilder: uma aplicação MCP open source que escreve consultas ES|QL, cria gráficos interativos e exporta dashboards totalmente funcionais diretamente para Kibana.]]></description>
    <content:encoded><![CDATA[<p>O example-mcp-dashbuilder é um aplicativo MCP open source que transforma um prompt em inglês simples em um dashboard do Kibana ao vivo e interativo, tudo dentro da janela de bate-papo do seu editor. Descreva o dashboard desejado e a IA descobre sua estrutura de índice, escreve agregações ES|QL corretas para cada visualização e exibe uma pré-visualização embutida enquanto trabalha. Quando terminar, um comando exporta um dashboard do Kibana totalmente funcional: visualizações reais do Lens, layout exato da sua grade, cores personalizadas preservadas. Atualmente, há seis tipos de gráficos compatíveis, com o conjunto completo do Kibana Lens previsto no roadmap.</p><h2>O que é um construtor de dashboard do Kibana?</h2><p>E se você pudesse descrever o dashboard que deseja em inglês simples e vê-lo aparecer completo, com gráficos interativos, um layout de arrastar e soltar e exportação para o Kibana com um clique?</p><p>É exatamente isso que o <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a> faz. É um aplicativo open source (Model Context Protocol (MCP)) que conecta assistentes de IA ao Elasticsearch, permitindo que você crie painéis completos do Kibana por meio de conversas. Sem precisar clicar nos menus. Sem escrever manualmente as configs de visualização. Basta descrever o que você precisa para que a IA explore seus dados, escreva as consultas Elasticsearch Query Language (ES|QL), crie os gráficos e forneça um dashboard interativo ao vivo, tudo dentro da janela de bate-papo do seu editor.</p><h2><strong>Do prompt ao dashboard em segundos</strong></h2><p>Veja como isso funciona na prática. Você digita algo como:</p><p>"Crie para mim um dashboard de tráfego da web a partir do logstash-* com total de solicitações, bytes transferidos ao longo do tempo, principais fontes geográficas e um detalhamento do código de resposta"</p><p>A IA então:</p><ol><li><p><strong>Descobre seus dados:</strong> lista índices e inspeciona mapeamentos de campos.</p></li><li><p><strong>Escreve consultas ES|QL:</strong> adaptadas ao seu esquema, usando as agregações corretas.</p></li><li><p><strong>Cria visualizações:</strong> gráficos de barras, gráficos de linhas, métricas com sparklines, mapas de calor, gráficos de pizza.</p></li><li><p><strong>Organiza tudo:</strong> seções retráteis, títulos significativos, layout adequado.</p></li><li><p><strong>Renderiza uma visualização interativa:</strong> diretamente no bate-papo, com dicas de ferramentas, um seletor de tempo e arrastar e soltar.</p></li></ol><p>Cada gráfico aparece em linha conforme é criado, então você pode ver o progresso em tempo real. Depois, <code>view_dashboard</code> mostra o dashboard completo com todos os painéis dispostos na grade de 48 colunas de Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="Dois gráficos exibidos na interface example‑mcp‑dashbuilder. O primeiro é um gráfico de barras verticais intitulado &quot;Principais fontes geográficas&quot;, mostrando a contagem de solicitações por código de país. O segundo é um gráfico circular intitulado &quot;Distribuição do código de resposta HTTP&quot;, mostrando segmentos para respostas 200, 404 e 503." /><p><em>Prévia de gráfico único em linha.</em></p><h2><strong>Desenvolvido por ES|QL</strong></h2><p>Toda recuperação de dados utiliza <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>, a linguagem de consulta em pipeline do Elasticsearch. A IA não apenas passa por consultas brutas, ela também usa conhecimento integrado do ES|QL junto com informações sobre a estrutura dos seus dados para escrever consultas corretas e eficientes para cada tipo de visualização.</p><p>O servidor inclui uma referência abrangente de ES|QL como um recurso MCP. Antes de escrever qualquer consulta, a IA lê essa referência para entender os comandos, funções e padrões disponíveis. Em conjunto com um guia de **práticas recomendadas** de visualização de dados (que também serviu como recurso), a IA sabe não apenas <em>como</em> fazer consultas, mas <em>o que</em> torna uma visualização boa:</p><ul><li><p>Use <code>BUCKET(@timestamp, 1 day)</code> para séries temporais; sempre <code>SORT</code> pelo campo de tempo.</p></li><li><p>Limite os gráficos de pizza a seis fatias com <code>| SORT value DESC | LIMIT 6</code>.</p></li><li><p>Escolha gráficos de barras para comparações de categorias, gráficos de linhas para tendências, métricas para indicadores-chave de desempenho (KPIs).</p></li></ul><h2><strong>Exploração de dados orientada por IA com análise aberta</strong></h2><p>Construir um dashboard que você já imaginou na cabeça é outra história. Perguntar "O que há de interessante nesse índice?" e obter uma resposta útil é mais difícil; isso exige que a IA saiba como <em>explorar</em>, não apenas como desenhar.</p><p>O example-mcp-dashbuilder envia um recurso <code>analysis://guidelines</code> que define um fluxo de exploração estruturado: faça o perfil dos dados, execute agregações direcionadas, identifique padrões que valem a pena investigar, crie gráficos para as descobertas mais interessantes e proponha consultas detalhadas que o usuário possa querer em seguida. Frases gatilho, como "analisar meus logs" ou "encontrar padrões neste índice", fazem a IA ler o manual antes de fazer qualquer outra coisa, então um prompt aberto produz uma investigação coerente em vez de uma pilha aleatória de gráficos.</p><p>O resultado: você pode entregar um índice não familiar à IA e receber de volta um ponto de partida: um dashboard mais uma pequena lista de prompts "Aqui estão minhas impressões, quer que eu investigue mais a fundo algum desses?"</p><h2><strong>Exportação e importação do dashboard do Kibana: a viagem completa de ida e volta</strong></h2><p>A viagem de ida e volta de exportação/importação é onde o example-mcp-dashbuilder se torna realmente útil para as equipes que já trabalham com o Kibana. O example-mcp-dashbuilder é algo próprio, uma superfície de dashboard de conversação que fica dentro do seu editor, mas não prende o seu trabalho lá. Dashboards construídos aqui podem ser movidos para o Kibana quando você quiser, e dashboards existentes do Kibana podem seguir o caminho inverso para edição assistida por IA.</p><h3><strong>Exportar para Kibana</strong></h3><p>Quando você estiver satisfeito com seu dashboard, um comando irá exportá-lo:</p><p>"Exportar este dashboard para o Kibana"</p><p>Cada painel é traduzido para uma visualização real do Kibana Lens. A tradução preserva:</p><ul><li><p><strong>Consultas ES|QL:</strong> transferidas diretamente como fontes de dados ES|QL do Lens.</p></li><li><p><strong>Posições de grade:</strong> o mesmo sistema de 48 colunas que o Kibana usa, para que você tenha um layout idêntico.</p></li><li><p><strong>Cores personalizadas:</strong> paletas de séries, fundos métricos, rampas de cores de heatmap.</p></li></ul><p>O resultado é um dashboard do Kibana totalmente funcional. Não é uma captura de tela. Não é uma incorporação. Um dashboard do Kibana que você pode compartilhar e continuar editando.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="Dois painéis são exibidos lado a lado. O dashboard esquerdo intitulado “Edição do tráfego na web — Logstash (Dashbuilder)” exibe métricas recentes de tráfego, junto com um painel de volume de tráfego, um gráfico de barras geográficas e um gráfico circular de código de resposta. O painel à direita apresenta um layout semelhante, porém com totais mais altos, e inclui um painel de volume de tráfego, um gráfico de barras geográficas e um gráfico de pizza de código de resposta." /><p><em>Dashboard do Kibana e dashboard no chat do Cursor lado a lado.</em></p><h3><strong>Importar do Kibana</strong></h3><p>A viagem de ida e volta também funciona na outra direção:</p><p>"Importar o dashboard do Kibana com o ID abc-123"</p><p>Isso busca um dashboard do Kibana existente, traduz suas visualizações do Lens para configurações de gráficos editáveis, preserva o layout e as seções da grade e carrega tudo no example-mcp-dashbuilder. A partir daí, você pode modificar com linguagem natural e reexportar.</p><p>Isso torna a IA uma colaboradora em seu fluxo de trabalho existente do Kibana, não uma substituta para ele.</p><h2><strong>Temas e cores personalizados</strong></h2><p>Quer um dashboard de marca? É só pedir:</p><p>"Crie um dashboard com tema rosa e cores personalizadas"</p><p>Todo tipo de visualização permite configuração de cor personalizada:</p><ul><li><p><strong>Gráficos:</strong> <code>palette</code> aceita uma matriz de cores hexadecimais para séries e fatias.</p></li><li><p><strong>Métricas:</strong> <code>color</code> define a cor de plano de fundo.</p></li><li><p><strong>Mapas de calor:</strong> <code>colorRamp</code> define o gradiente, dos valores baixos aos altos.</p></li></ul><p>A IA identifica os pedidos de tema naturalmente. Diga "tema do oceano", e ele vai escolher tons de azul e verde-azulado. Diga "Combine as cores da nossa marca" e forneça valores hexadecimais, e eles serão aplicados no Kibana na exportação.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="Um dashboard temático de comércio eletrônico com cores rosas personalizadas. O layout mostra os kpis de receita e pedidos na parte superior, uma seção de tendências resumida e dois gráficos baseados em categorias abaixo: um gráfico de barras para receita por categoria e um gráfico circular para pedidos por categoria." /><p><em>Um dashboard temático com cores personalizadas.</em></p><p><strong>Como funciona o example-mcp-dashbuilder: arquitetura MCP</strong></p><p>O example-mcp-dashbuilder foi desenvolvido com base no <a href="https://modelcontextprotocol.io/">MCP</a>, o padrão aberto para conectar assistentes de IA a ferramentas e dados externos. Aqui está a arquitetura em alto nível:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="Um diagrama de arquitetura mostrando o MCP Host conectado ao MCP Server, que contém ferramentas, recursos e instruções. Abaixo dele, uma caixa do app MCP inclui Elastic Charts e o layout em grade do Kibana. Elasticsearch e Kibana aparecem na parte inferior, com setas conectando-os ao App MCP." /><p>O <strong>servidor MCP</strong> expõe 25 ferramentas que a IA pode chamar diretamente, desde a execução de consultas ES|QL até a exportação de painéis, além de algumas ferramentas internas "exclusivas do app" que a pré-visualização embutida usa para buscar dados, persistir alterações de layout e detectar campos de tempo. Ele oferece três recursos: um guia de **práticas recomendadas** de dataviz, uma referência ES|QL e um manual de análise aprofundada que entra em ação para prompts abertos ("analisar meus logs", "o que há de interessante neste índice"). E executa tanto em stdio quanto em HTTP; o transporte HTTP permite respostas em fluxo contínuo e gerenciamento de sessão, permitindo que vários clientes se conectem a um mesmo servidor.</p><p>O <strong>MCP App</strong> é uma pré-visualização interativa. Ele foi desenvolvido com React, <a href="https://elastic.github.io/elastic-charts">Elastic Charts</a> e <a href="https://eui.elastic.co/">Elastic UI</a>, agrupados em um único arquivo HTML independente. Quando a IA chama <code>view_dashboard</code> ou cria um gráfico, o host renderiza este HTML em um iframe isolado. O aplicativo se comunica com o servidor inteiramente através do <a href="https://modelcontextprotocol.io/extensions/apps/overview">protocolo MCP Apps</a>, usando <code>callServerTool()</code> sobre postMessage para buscar dados, salvar layouts e detectar campos de tempo. Não há servidor localhost, nenhuma porta para configurar, nenhuma dependência de rede externa.</p><p>Isso significa que funciona com qualquer cliente compatível com MCP: Cursor, Claude Desktop, Claude.ai, VS Code com Copilot e muito mais.</p><h2><strong>Quais tipos de gráficos o example-mcp-dashbuilder permite?</strong></h2><p>No momento desta publicação, são permitidos seis tipos de gráficos que cobrem os cenários de dashboard mais comuns:</p><p>Tipo</p><p>Melhor para</p><p>Exemplo</p><p>Barra</p><p>Comparando categorias</p><p>Solicitações por fonte geográfica</p><p>Linha</p><p>Tendências ao longo do tempo</p><p>Bytes transferidos por hora</p><p>Área</p><p>Volume ao longo do tempo</p><p>Volume de solicitações ao longo do tempo</p><p>Pizza</p><p>Parte do todo (máximo seis fatias)</p><p>Distribuição de código de resposta</p><p>Métrica</p><p>KPI único com sparkline</p><p>Total de solicitações com tendência horária</p><p>Heatmap</p><p>Padrões em duas dimensões</p><p>Solicitações por dia da semana e hora</p><p>Dashboards permitem seções recolhíveis para organização, um seletor de tempo com detecção automática de campos de tempo e a capacidade de salvar e alternar entre múltiplos dashboards; sessões paralelas de chat permanecem isoladas umas das outras por meio de um <code>dashboardId</code> que passa por cada chamada de ferramenta.</p><h2><strong>Como instalar e executar o example-mcp-dashbuilder</strong></h2><p>O example-mcp-dashbuilder é open source e está pronto para uso. Você vai precisar de Node.js 22+, uma instância Elasticsearch (local ou Elastic Cloud) e um cliente compatível com MCP.</p><p><strong>Claude Desktop:</strong> baixe a versão mais recente <code>.mcpb</code> do <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a>, e clique duas vezes nela. O Claude Desktop solicitará suas credenciais do Elasticsearch.</p><p><strong>Cursor / Claude Code / VS Code Copilot:</strong> aponte sua configuração MCP para o tarball liberado; sem clone, sem <code>npm install</code>:</p>{
  "mcpServers": {
    "example-mcp-dashbuilder": {
      "type": "stdio",
      "command": "npx",
      "args": ["https://github.com/elastic/example-mcp-dashbuilder/releases/latest/download/example-mcp-dashbuilder.tgz"]
    }
  }
}<p>Configure <code>ES_NODE, ES_API_KEY</code> (ou <code>ES_USERNAME / ES_PASSWORD</code>) e <code>KIBANA_URL</code> como variáveis de ambiente. Se você preferir trabalhar a partir da fonte, clone o repositório e execute <code>npm run setup</code> para um assistente interativo que lida com o Elasticsearch local e o Elastic Cloud (Cloud ID + chave de API).</p><p>E comece a construir:</p><p>"Explore o índice de logs e construa o dashboard mais perspicaz que puder"</p><p>A partir daí, a IA assume o controle. 😉</p><h2><strong>Roadmap: o que está por vir para o example-mcp-dashbuilder</strong></h2><p>Este é um lançamento antecipado, e estamos em desenvolvimento ativo. Algumas áreas em que estamos focados:</p><ul><li><p><strong>Mais tipos de gráficos:</strong> medidor, donut, treemap, tabela de dados e nuvem de tags para combinar com todas as capacidades da Lens.</p></li><li><p><strong>Envie dashboards para o Git: </strong>escreva configurações de dashboards em um repositório para fluxo de trabalho de controle de versões e revisão de código.</p></li><li><p><strong>Melhor UX de erro: </strong>feedback mais detalhado quando o ES|QL falha, com sugestões comuns de correções.</p></li><li><p><strong>Fluxos de análise mais ricos: </strong>estenda o manual de análise profunda para cobrir mais formas de dados (logs, métricas, rastreamentos).</p></li></ul><p>Adoraríamos saber o que você cria com ele. Experimente, registre problemas e conte para a gente quais visualizações e fluxos de trabalho seriam mais úteis para sua equipe.</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub: elastic/example-mcp-dashbuilder</a></p><h3>Agradecimentos</h3><p>Agradecemos a <a href="mailto:walter.rafelsberger@elastic.co">Walter Rafelsberger</a> e <a href="mailto:tim.schnell@elastic.co">Tim Schnell</a> por suas contribuições para a implementação.</p><h3>Perguntas frequentes</h3><p><strong>O que é o example-mcp-dashbuilder?</strong> o example-mcp-dashbuilder é um aplicativo MCP (Model Context Protocol) open source que conecta assistentes de IA ao Elasticsearch. Ele permite que você descreva um dashboard do Kibana e automaticamente gera consultas ES|QL, cria visualizações e entrega um dashboard interativo ao vivo dentro da janela de chat do seu editor.</p><p><strong>Qual linguagem de consulta o example-mcp-dashbuilder usa para recuperar dados?</strong> Toda recuperação de dados utiliza ES|QL, a linguagem de consulta com barras verticais do Elasticsearch. O servidor MCP inclui uma referência ES|QL integrada que a IA lê antes de escrever qualquer consulta, garantindo a sintaxe correta e agregações eficientes para cada tipo de visualização.</p><p><strong>Posso exportar dashboards construídos com example-mcp-dashbuilder para Kibana?</strong> Sim. Executar "Exportar este dashboard para Kibana" traduz todos os painéis em uma visualização real do Kibana Lens, preservando as consultas ES|QL, o layout de grade de 48 colunas, cores personalizadas e paletas de séries. O resultado é um dashboard do Kibana totalmente funcional, não uma captura de tela ou incorporação.</p><p><strong>Posso importar um dashboard do Kibana existente para o example-mcp-dashbuilder para edição assistida por IA?</strong> Sim. Fornecer um ID de dashboard do Kibana busca o dashboard existente, traduz suas visualizações do Lens em configurações de gráfico editáveis e as carrega no example-mcp-dashbuilder. Você pode então modificar o dashboard usando linguagem natural e reexportar para o Kibana.</p><p><strong>Quais clientes MCP são compatíveis com o example-mcp-dashbuilder?</strong> O example-mcp-dashbuilder funciona com qualquer cliente compatível com MCP, incluindo Cursor, Claude Desktop, Claude.ai e VS Code com Copilot. Ele permite tanto transporte stdio quanto HTTP, sem necessidade de configuração de servidor localhost ou de porta.</p><p><strong>Quais tipos de gráficos o example-mcp-dashbuilder permite?</strong> A versão atual permite seis tipos de gráficos: barra, linha, área, pizza, métrica (com sparkline) e heatmap. As adições planejadas incluem indicador, rosca, mapa de árvore, tabela de dados e nuvem de tags para combinar com todas as capacidades do Kibana Lens.</p><p><strong>O que eu preciso para executar o example-mcp-dashbuilder?</strong> Você precisa do Node.js versão 22 ou superior, uma instância do Elasticsearch (local ou Elastic Cloud) e um cliente compatível com MCP. Defina as variáveis de ambiente ES_NODE, ES_API_KEY (ou ES_USERNAME/ES_PASSWORD) e KIBANA_URL. Para o Claude Desktop, baixe o arquivo .mcpb do GitHub Releases e clique duas vezes para instalar.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Stratoula Kalafateli]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a69a35d6d51ff47/6a17e9a5b1e11339cd79f2b3/0d38385fd64c1445b2e955ba20532570f7f38679-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Melhorando a interatividade do dashboard do Kibana com controles de variáveis]]></title>
    <description><![CDATA[Descubra como usar controles de variáveis no Kibana 8.18+ para filtrar visualizações específicas, ajustar intervalos e agrupar por diferentes campos nos dashboards do Kibana.]]></description>
    <content:encoded><![CDATA[<p>Temos o prazer de anunciar que <strong>os controles de variáveis já estão disponíveis no dashboard do Kibana</strong> a partir da versão 8.18 e em toda a série 9.x! Este recurso tem sido uma das adições mais solicitadas pelos usuários do dashboard — e finalmente chegou 🎉 Nos últimos meses, continuamos expandindo e aprimorando <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">os controles de variáveis</a>, tornando este o momento perfeito para dedicarmos um post do blog inteiro a eles.</p><h2>O que são controles de variáveis?</h2><p>Se você já usou dashboards do Kibana, provavelmente conhece nossos controles clássicos de dashboards: aqueles menus suspensos úteis que mostram os valores dos seus dados para que você possa filtrar informações com alguns cliques.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>Os controles de variáveis parecem semelhantes à primeira vista, mas têm um diferencial inteligente: em vez de filtrar automaticamente todos os painéis do seu dashboard, eles podem ser inseridos diretamente em <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">consultas ES|QL dentro de visualizações específicas</a>.</p><p>Isso significa que <em>você</em> pode decidir onde cada controle se aplica. Melhor ainda, você pode usá-los para todos os tipos de truques criativos, como ajustar intervalos, alternar campos de detalhamento ou alterar parâmetros de visualização em tempo real. Basicamente, eles proporcionam aos dashboards uma experiência verdadeiramente interativa, permitindo que você obtenha insights com mais rapidez e facilidade.</p><h2>Casos de uso para controles de variáveis</h2><p>Certo, os controles variáveis parecem úteis, mas o que você pode realmente fazer com eles? Aqui estão alguns exemplos de como eles elevam o nível de seu dashboard:</p><h3>Filtrar visualizações selecionadas</h3><p>Deseja filtrar <em>algumas</em> visualizações, mas não mexer em outras? Os controles de variáveis permitem exatamente isso. Escolha os painéis aos quais deseja responder e conecte-os nas consultas ES|QL por trás das suas visualizações.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>Selecionar diferentes intervalos</h3><p>Permita que seus usuários escolham entre "5 minutos", "1 hora", "1 dia" ou quaisquer buckets que façam sentido. Crie um controle de variáveis com intervalos predefinidos e conecte-o à sua consulta de séries temporais.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>Funções de alteração</h3><p>Em vez de criar vários gráficos para cada operação, permita que os usuários do dashboard escolham se desejam ver o máximo, a média, diferentes percentis ou qualquer outro agregador.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>Agrupe por diferentes campos</h3><p>Às vezes, é necessário dividir os dados conforme diferentes dimensões durante uma investigação. Com controles de variáveis, você pode definir múltiplos campos "agrupar por" e permitir que os usuários do dashboard escolham aquele que os ajude a descobrir seus insights.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>Como você pode criá-los?</h2><p>A maneira mais fácil (e provavelmente mais agradável) de criar um controle de variável é diretamente pelo <strong>editor de consultas ES|QL</strong> na sua visualização. Basta começar a digitar sua consulta, usar o menu de preenchimento automático, e o Kibana vai ajudar a estruturar o controle para você.</p><p>Mas, se preferir começar pela própria variável, você também pode ir para: <strong>Adicionar painel → Controles → Controle de variável</strong> e adicionar a variável às suas visualizações após criar o controle.</p><h3>Exemplo 1: Controle de filtragem com seleção de múltiplos valores</h3><p>1. Escolha uma visualização atrelada a uma consulta ES|QL e clique em "Criar controle" dentro da instrução WHERE</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. Você será redirecionado automaticamente para o submenu de criação de variáveis, onde o tipo "Valores de uma consulta" será selecionado para você e o nome da variável já estará pré-preenchido. Lembre-se de que o nome de um controle sempre precisa começar com "?...". para ser usado na consulta de visualização.</p><p>Normalmente, você precisará de uma consulta como esta para obter os valores de um campo e atualizá-los de acordo com o intervalo de tempo selecionado no dashboard:</p>FROM &lt;datasource_name&gt;
| WHERE @timestamp &lt;=?_tend and @timestamp &gt;?_tstart
| STATS BY &lt;field_name&gt;<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb34ecc3303fda700/6a17ee68a2929914e3d02d23/a2a72d4e3159923c6207908da9b4172e27cd5f81-1600x716.png" alt="" /><p>3. Ao salvar o controle, ele será exibido na parte superior do painel, e sua consulta de visualização será atualizada com o nome do controle da variável.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. Se você quiser adicionar <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">seleção multi-valor</a> ao controle, precisa usar a função <code>MV_CONTAINS</code> na consulta e selecionar "Permitir múltiplas seleções" durante a criação do controle na etapa 2 (disponível a partir da 9.3).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>Exemplo 2: Controle de intervalo de tempo</h3><p>Se estiver montando uma série temporal, você poderá facilmente adicionar um controle de variável para o intervalo do histograma de data:</p><p>1. Ao escrever uma consulta ES|QL para sua série temporal, clique em "Criar controle". Ao criar uma variável para intervalos, é melhor usar <code>TBUCKET</code> em vez de <code>BUCKET</code> para que aceite intervalos mais legíveis como "1 hora", "1 dia" etc. Também haverá uma opção automática para <code>TBUCKET</code> em breve, para que possa se adaptar automaticamente aos intervalos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. Defina os intervalos para preencher as opções no menu suspenso.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. Selecione diferentes intervalos no menu suspenso e veja como sua visualização muda.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>Exemplo 3: variáveis para funções</h3><ol><li><p>Crie uma variável usando o tipo de controle "Valores estáticos" e adicione nomes de funções aos seus valores suspensos. É importante usar um nome para sua variável que comece com “??...” para substituir funções.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. Inclua o nome da variável na sua consulta ES|QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>Exemplo 4: variáveis para campos</h3><ol><li><p>Você pode usar o tipo de controle "Valores estáticos" e anotar os nomes dos campos que quiser. É importante usar um nome de variável que comece com "??..." para aplicá-lo aos campos.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. Faça referência à variável onde quiser na consulta de visualização.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Controles de variáveis no Discover</h2><p>Controles variáveis não são apenas um recurso do dashboard — eles também estão disponíveis diretamente no editor ES|QL no Discover. Você pode construir controles para uma experiência de exploração de dados mais rápida no Discover, trazê-los para o dashboard e vice-versa.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>Detalhes técnicos</h2><p>A esta altura, você provavelmente já percebeu que os controles de variáveis vêm com algumas regras — como quais partes de uma consulta eles podem referenciar e os prefixos de nomeação que você precisa usar ("?..." para valores e "?? ...” para campos ou funções). O motivo disso é que variáveis não são apenas simples substituições de string no cliente. Elas são, na verdade, cidadãos de primeira classe na própria linguagem de consulta (conhecidos como <a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">parâmetros no ES|QL</a>).</p><p></p><p>Este design traz grandes vantagens. Por exemplo, o Kibana consegue entender o contexto de cada variável, o que nos permite gerar e preencher automaticamente sua configuração para você. Também é muito mais seguro: como a linguagem valida rigorosamente entradas variáveis, ela impede injeções nocivas e erros se algo parece errado. Além disso, melhora o desempenho e a estabilidade ao transferir validações complexas e tratamento de erros para o servidor em vez do cliente. Uma observação sobre desempenho: uma prática recomendada é criar variáveis que incluam consultas rápidas, pois elas são carregadas antes do dashboard, portanto, consultas lentas podem afetar todo o desempenho do dashboard.</p><p>É claro, essa arquitetura também vem com algumas <a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">limitações</a>—por enquanto. Variáveis ainda não permitem uma opção “Qualquer” para filtragem, e elas não podem ser usadas atualmente com certos operadores como <code>LIKE</code>ou <code>FROM</code> (para alternar fontes de dados). A boa notícia? Estamos trabalhando ativamente para adicionar essas funcionalidades.</p><h2>O que o futuro reserva para os controles</h2><p>Não vamos parar aqui! Algumas das melhorias no nosso radar incluem:</p><p>✨ A capacidade de posicionar controles em qualquer lugar do painel</p><p>✨ Encadeando seus controles — ou seja, a saída de um controle se torna a entrada do próximo</p><p>✨ Melhores opções de seleção como seleção "Qualquer" para variáveis</p><p>✨ Novos tipos de controle (controle de buscar e variáveis para suas fontes de dados)</p><p>✨ E mais melhorias de qualidade de vida que vocês pediram, como pré-filtrar controles normais.</p><p>Se você tiver ideias ou feedback, adoraríamos saber.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[analítica]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltddeea5af6d4f9884/6a17ee7ddbb4ff3aa8fb5781/59aa3adffc8c759e42b961ef7d63719ce232893a-1348x830.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Painéis de controle com inteligência artificial: da visão ao Kibana]]></title>
    <description><![CDATA[Gere um painel de controle usando um LLM para processar uma imagem e transformá-la em um painel do Kibana.
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">O Kibana Lens</a> torna o arrastar e soltar de dashboards muito simples, mas quando você precisa de dezenas de painéis, o número de cliques aumenta. E se você pudesse esboçar um painel de controle, tirar uma captura de tela e deixar um profissional de Direito concluir todo o processo para você?</p><p>Neste artigo, vamos fazer isso acontecer. Criaremos um aplicativo que captura uma imagem de um painel, analisa nossos mapeamentos e, em seguida, gera um painel sem que precisemos usar o Kibana!</p><p><strong>Passos</strong>:</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">Contexto e fluxo de trabalho do aplicativo</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">Preparar dados</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">Configuração LLM</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">Funções do aplicativo</a></p></li></ol><h2>Contexto e fluxo de trabalho do aplicativo</h2><p>A primeira ideia que me veio à mente foi deixar o LLM gerar todo o formato NDJSON <a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">dos objetos salvos</a> pelo Kibana e, em seguida, importá-los para o Kibana.</p><p>Experimentamos alguns modelos:</p><ul><li><p>Gemini 2.5 pro</p></li><li><p>GPT o3 / o4-mini-high / 4.1</p></li><li><p>Soneto 4 de Claude</p></li><li><p>Grok 3</p></li><li><p>Deepseek (Deepthink R1)</p></li></ul><p>E para as sugestões, começamos com algo tão simples quanto:</p>You are an Elasticsearch Saved-Object generator (Kibana 9.0).
INPUTS
=====
1. PNG screenshot of a 4-panel dashboard (attached).
2. Index mapping (below) – trimmed down to only the fields present in the screenshot.
3. Example NDJSON of *one* metric visualization (below) for reference.

TASK
====
Return **only** a valid NDJSON array that recreates the dashboard exactly:
* 2 metric panels (Visits, Unique Visitors)
* 1 pie chart (Most used OS)
* 1 vertical bar chart (State Geo Dest)
* Use index pattern `kibana_sample_data_logs`.
* Preserve roughly the same layout (2×2 grid).
* Use `panelIndex` values 1-4 and random `id` strings.
* Kibana version: 9.0<p>Apesar de termos analisado <a href="https://www.elastic.co/search-labs/blog/function-calling-with-elastic#:~:text=Few%2Dshot%20prompting%20involves%20providing%20examples%20of%20the%20types%20of%20queries%20you%20want%20it%20to%20return%2C%20which%20helps%20in%20increasing%20consistency.">poucos exemplos</a> e explicações detalhadas sobre como construir cada visualização, não tivemos sucesso. Se você estiver interessado nessa experiência, pode encontrar detalhes <a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">aqui</a>.</p><p>O resultado com essa abordagem foi a visualização dessas mensagens ao tentar carregar os arquivos produzidos pelo LLM no Kibana:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ea005966a783057/6a1707d266c4f90e4ef8bf88/2b599443b5613c9f0fc3235581614add5b4b3900-891x98.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e5632d6d95b998c/6a1707d3a6c2b9441de79661/d87ccfc033bc00ee8188c5cae18043fbca22784c-741x233.png" alt="" /><p>Isso significa que o JSON gerado é inválido ou está mal formatado. Os problemas mais comuns foram o LLM produzir NDJSON incompleto, apresentar parâmetros incorretos ou retornar JSON comum em vez de NDJSON, independentemente de quanto nos esforçássemos para forçar o contrário.</p><p>Inspirados por <a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">este artigo</a> – onde <a href="https://www.elastic.co/docs/solutions/search/search-templates">os modelos de pesquisa</a> funcionaram melhor do que o método freestyle do LLM – decidimos fornecer modelos ao LLM em vez de solicitar a geração do arquivo NDJSON completo e, em seguida, usar os parâmetros fornecidos pelo LLM no código para criar as visualizações adequadas. Essa abordagem não decepcionou, além de ser previsível e extensível, já que agora o código realiza o trabalho pesado, e não o LLM.</p><p>O fluxo de trabalho da aplicação será o seguinte:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>Para simplificar, omitiremos parte do código, mas você pode encontrar o código funcional da aplicação completa neste </em><a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/from-image-idea-to-kibana-dashboard-using-ai.ipynb"><em><strong>notebook</strong></em></a><em>.</em></p><h2>Pré-requisitos</h2><p>Antes de começar o desenvolvimento, você precisará do seguinte:</p><ol><li><p>Python 3.8 ou superior</p></li><li><p>Um ambiente Python <a href="https://docs.python.org/3/library/venv.html">Venv</a></p></li><li><p>Uma instância do Elasticsearch em execução, juntamente com seu endpoint e chave de API.</p></li><li><p>Uma chave de API da OpenAI armazenada na variável de ambiente com o nome OPENAI_API_KEY:</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>Preparar dados</h2><p>Para os dados, vamos manter a simplicidade e usar os logs de amostra da Elastic. Você pode aprender como importar esses dados para o seu cluster <a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">aqui</a>.</p><p>Cada documento inclui detalhes sobre o host que enviou as solicitações ao aplicativo, juntamente com informações sobre a própria solicitação e seu status de resposta. Segue abaixo um exemplo de documento:</p>{
    "agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24",
    "bytes": 8509,
    "clientip": "70.133.115.149",
    "extension": "css",
    "geo": {
        "srcdest": "US:IT",
        "src": "US",
        "dest": "IT",
        "coordinates": {
            "lat": 38.05134111,
            "lon": -103.5106908
        }
    },
    "host": "cdn.elastic-elastic-elastic.org",
    "index": "kibana_sample_data_logs",
    "ip": "70.133.115.149",
    "machine": {
        "ram": 5368709120,
        "os": "osx"
    },
    "memory": null,
    "message": "70.133.115.149 - - [2018-08-30T23:35:31.492Z] \"GET /styles/semantic-ui.css HTTP/1.1\" 200 8509 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"",
    "phpmemory": null,
    "referer": "http://twitter.com/error/john-phillips",
    "request": "/styles/semantic-ui.css",
    "response": 200,
    "tags": [
        "success",
        "info"
    ],
    "@timestamp": "2025-07-03T23:35:31.492Z",
    "url": "https://cdn.elastic-elastic-elastic.org/styles/semantic-ui.css",
    "utc_time": "2025-07-03T23:35:31.492Z",
    "event": {
        "dataset": "sample_web_logs"
    },
    "bytes_gauge": 8509,
    "bytes_counter": 51201128
}<p>Agora, vamos obter os mapeamentos do índice que acabamos de carregar, <code>kibana_sample_data_logs</code>:</p>INDEX_NAME = "kibana_sample_data_logs"

es_client = Elasticsearch(
    [os.getenv("ELASTICSEARCH_URL")],
    api_key=os.getenv("ELASTICSEARCH_API_KEY"),
)

result = es_client.indices.get_mapping(index=INDEX_NAME)
index_mappings = result[list(result.keys())[0]]["mappings"]["properties"]<p>Vamos passar os mapeamentos junto com a imagem que carregaremos posteriormente.</p><h2>Configuração LLM</h2><p>Vamos configurar o LLM para usar <a href="https://python.langchain.com/docs/concepts/structured_outputs/">saída estruturada</a> para receber uma imagem como entrada e obter um JSON com as informações necessárias para passar à nossa função e gerar os objetos JSON.</p><p>Instalamos as dependências:</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>O Elasticsearch nos ajudará a recuperar os <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">mapeamentos de índice</a>. Pydantic permite definir esquemas em Python para depois solicitar que o LLM os siga, e <a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain</a> é a estrutura que facilita a chamada de LLMs e ferramentas de IA.</p><p>Criaremos um esquema Pydantic para definir a saída desejada do LLM. O que precisamos saber da imagem é o tipo de gráfico, campo, título da visualização e título do painel:</p>class Visualization(BaseModel):
    title: str = Field(description="The dashboard title")
    type: List[Literal["pie", "bar", "metric"]]
    field: str = Field(
        description="The field that this visualization use based on the provided mappings"
    )


class Dashboard(BaseModel):
    title: str = Field(description="The dashboard title")
    visualizations: List[Visualization]<p>Para a entrada de imagem, enviaremos um painel que acabei de desenhar:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>Agora declaramos a chamada do modelo LLM e o carregamento da imagem. Essa função receberá os mapeamentos do índice do Elasticsearch e uma imagem do painel que desejamos gerar.</p><p>Com <code>with_structured_output</code> podemos usar nosso esquema Pydantic <code>Dashboard</code> como o objeto de resposta que o LLM produzirá. Com <a href="https://docs.pydantic.dev/latest/">o Pydantic</a>, podemos definir modelos de dados com validação, o que garante que a saída do modelo linear linear (LLM) corresponda à estrutura esperada.</p><p>Para converter a imagem para base64 e enviá-la como entrada, você pode usar um <a href="https://www.base64-image.de/">conversor online</a> ou fazer isso <a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">por meio de código</a>.</p>prompt = f"""
    You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.

    You will be given a dashboard image and an Elasticsearch index mapping.

    Below are the index mappings for the index that the dashboard is based on.
    Use this to help you understand the data and the fields that are available.

    Index Mappings:
    {index_mappings}

    Only include the fields that are relevant for each visualization, based on what is visible in the image.
    """

message = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": prompt},
            {
                "type": "image",
                "source_type": "base64",
                "data": image_base64,
                "mime_type": "image/png",
            },
        ],
    }
]


try:
    llm = init_chat_model("gpt-4.1-mini")
    llm = llm.with_structured_output(Dashboard)
    dashboard_values = llm.invoke(message)

    print("Dashboard values generated by the LLM successfully")
    print(dashboard_values)
except Exception as e:
    print(f"Failed to analyze image and match fields: {str(e)}")<p>O LLM já possui contexto sobre os dashboards do Kibana, então não precisamos explicar tudo no prompt, apenas alguns detalhes para garantir que ele não se esqueça de que está trabalhando com o Elasticsearch e o Kibana.</p><p>Vamos analisar a pergunta:</p><p>Seção</p><p>Razão</p><p>Você é especialista em analisar dashboards do Kibana a partir de imagens para a versão 9.0.0 do Kibana.</p><p>Ao reforçar isso no Elasticsearch e na versão do Elasticsearch, reduzimos a probabilidade de o LLM gerar parâmetros antigos/inválidos.</p><p>Você receberá uma imagem do painel de controle e um mapeamento do índice do Elasticsearch.</p><p>Explicamos que a imagem se refere a painéis de controle para evitar quaisquer interpretações errôneas por parte do LLM.</p><p>Abaixo estão os mapeamentos de índice para o índice no qual o painel se baseia. Use-os para ajudá-lo a entender os dados e os campos disponíveis. Mapeamentos de índice: {index_mappings}</p><p>É crucial fornecer os mapeamentos para que o LLM possa selecionar campos válidos dinamicamente. Caso contrário, poderíamos codificar os mapeamentos diretamente aqui, o que é muito rígido, ou confiar na imagem que contém os nomes de campo corretos, o que não é confiável.</p><p>Inclua apenas os campos relevantes para cada visualização, com base no que está visível na imagem.</p><p>Precisávamos adicionar esse reforço porque, às vezes, o programa tenta adicionar campos que não são relevantes para a imagem.</p><p>Isso retornará um objeto com uma matriz de visualizações para exibir:</p>"Dashboard values generated by the LLM successfully
title=""Client, Extension, OS, and Response Keyword Analysis""visualizations="[
   "Visualization(title=""Count of Client IP",
   "type="[
      "metric"
   ],
   "field=""clientip"")",
   "Visualization(title=""Extension Keyword Distribution",
   "type="[
      "pie"
   ],
   "field=""extension.keyword"")",
   "Visualization(title=""Most Used OS",
   "type="[
      "bar"
   ],
   "field=""machine.os.keyword"")",
   "Visualization(title=""Response Keyword Distribution",
   "type="[
      "bar"
   ],
   "field=""response.keyword"")"
]<h2>Processando a resposta do LLM</h2><p>NósCriamos um painel de exemplo 2x2 e o exportamos em JSON usando a <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">API "Obter um painel"</a>. Em seguida, armazenamos os painéis como modelos de visualização (pizza, barra, métrica), onde podemos substituir alguns parâmetros para criar novas visualizações com campos diferentes, dependendo da pergunta.</p><p>Você pode ver os arquivos JSON do modelo <a href="https://github.com/Delacrobix/elasticsearch-labs/tree/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/templates"><strong>aqui</strong></a>. Observe como alteramos os valores dos objetos que queremos substituir posteriormente por {<code>variable_name</code>}
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>Com as informações fornecidas pelo LLM, podemos decidir qual modelo usar e quais valores substituir.</p><p><code>fill_template_with_analysis</code> receberão os parâmetros para um único painel, incluindo o modelo JSON da visualização, um título, um campo e as coordenadas da visualização na grade.</p><p>Em seguida, substituirá os valores do modelo e retornará a visualização JSON final.</p>def fill_template_with_analysis(
    template: Dict[str, Any],
    visualization: Visualization,
    grid_data: Dict[str, Any],
):
    template_str = json.dumps(template)
    replacements = {
	 "{visualization_id}": str(uuid.uuid4()),
        "{title}": visualization.title,
        "{x}": grid_data["x"],
        "{y}": grid_data["y"],
    }

    if visualization.field:
        replacements["{field}"] = visualization.field

    for placeholder, value in replacements.items():
        template_str = template_str.replace(placeholder, str(value))

    return json.loads(template_str)<p>Para simplificar, teremos coordenadas estáticas que atribuiremos aos painéis que o LLM decidir criar e produziremos um painel de controle em grade 2x2, como na imagem acima.</p># Filling templates fields
panels = []    
grid_data = [
    {"x": 0, "y": 0},
    {"x": 12, "y": 0},
    {"x": 0, "y": 12},
    {"x": 12, "y": 12},
]


i = 0

for vis in dashboard_values.visualizations:
    for vis_type in vis.type:
        template = templates.get(vis_type, templates.get("bar", {}))
        filled_panel = fill_template_with_analysis(template, vis, grid_data[i])
        panels.append(filled_panel)
        i += 1<p>Dependendo do tipo de visualização decidido pelo LLM, escolheremos um modelo de arquivo JSON e substituiremos as informações relevantes usando <code>fill_template_with_analysis</code> , depois adicionaremos o novo painel a uma matriz que usaremos posteriormente para criar o painel de controle.</p><p>Quando o painel estiver pronto, usaremos a <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id">API Criar um painel</a> para enviar o novo arquivo JSON ao Kibana e gerar o painel:
</p>try:
    dashboard_id = str(uuid.uuid4())

    # post request to create the dashboard endpoint
    url = f"{os.getenv('KIBANA_URL')}/api/dashboards/dashboard/{dashboard_id}"

    dashboard_config = {
        "attributes": {
            "title": dashboard_values.title,
            "description": "Generated by AI",
            "timeRestore": True,
            "panels": panels,  # Visualizations with the values generated by the LLM
            "timeFrom": "now-7d/d",
            "timeTo": "now",
        },
    }

    headers = {
        "Content-Type": "application/json",
        "kbn-xsrf": "true",
        "Authorization": f"ApiKey {os.getenv('ELASTICSEARCH_API_KEY')}",
    }

    requests.post(
        url,
        headers=headers,
        json=dashboard_config,
    )

    # Url to the generated dashboard
    dashboard_url = f"{os.getenv('KIBANA_URL')}/app/dashboards#/view/{dashboard_id}"

    print("Dashboard URL: ", dashboard_url)
    print("Dashboard ID: ", dashboard_id)

except Exception as e:
    print(f"Failed to create dashboard: {str(e)}")<p>Para executar o script e gerar o painel de controle, execute o seguinte comando no console:</p>python &lt;file_name&gt;.py<p>O resultado final será semelhante a este:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>Conclusão</h2><p>Os profissionais com formação em Letras demonstram suas fortes habilidades visuais ao realizar tarefas de conversão de texto em código ou ao transformar imagens em código. A API de dashboards também permite transformar arquivos JSON em dashboards e, com um LLM e algum código, podemos transformar imagens em um dashboard do Kibana.</p><p>O próximo passo é melhorar a flexibilidade dos elementos visuais do painel de controle, utilizando diferentes configurações de grade, tamanhos e posições do painel. Além disso, oferecer suporte a visualizações e tipos de visualização mais complexos seria uma adição útil a este aplicativo.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-powered-dashboards</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-powered-dashboards</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo,Tomás Murúa]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt41727cbee6155a68/6a1707dbb0367dd2fd72bc86/eb60ceb2fbc3941745b21ae3357cbb6ea8fab18c-1443x811.png" length="0" type="image/png"/>
    <pubDate>Wed, 16 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Spotify Wrapped parte 2: Análise e visualização de dados]]></title>
    <description><![CDATA[Analisaremos seus dados do Spotify com mais profundidade do que nunca e exploraremos conexões que você nem imaginava que existiam.]]></description>
    <content:encoded><![CDATA[<p>Na <a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">primeira parte</a> desta série, escrita por Iulia Feroli, falamos sobre como obter seus dados do Spotify Wrapped e visualizá-los no Kibana. Na parte 2, vamos analisar os dados mais a fundo para ver o que mais podemos descobrir. Para isso, vamos usar uma abordagem um pouco diferente e utilizar <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">o Spotify to Elasticsearch</a> para indexar os dados no Elasticsearch. Essa ferramenta é um pouco mais avançada e requer um pouco mais de configuração, mas vale a pena. Os dados estão mais estruturados e podemos fazer perguntas mais complexas.</p><h2>Diferenças em relação à primeira análise do Spotify Wrapped</h2><p>No primeiro post do blog, usamos a exportação do Spotify diretamente e não realizamos nenhuma tarefa de normalização ou qualquer outro processamento de dados. Desta vez, usaremos os mesmos dados, mas realizaremos algum processamento para torná-los mais utilizáveis. Isso nos permitirá responder a perguntas muito mais complexas, como:</p><ul><li><p>Qual é a duração média de uma música no meu top 100?</p></li><li><p>Qual é a popularidade média de uma música no meu top 100?</p></li><li><p>Qual é a duração mediana de audição de uma música?</p></li><li><p>Qual é a música que eu mais pulo?</p></li><li><p>Quando gosto de pular faixas?</p></li><li><p>Será que estou prestando mais atenção a alguma hora específica do dia do que a outras?</p></li><li><p>Estou dando mais atenção a algum dia específico da semana do que a outros?</p></li><li><p>É um mês de particular interesse?</p></li><li><p>Qual é o artista com o maior tempo de audição?</p></li></ul><p>O Spotify Wrapped é uma experiência divertida que acontece todos os anos, mostrando o que você ouviu durante o ano. Não mostra as mudanças ano a ano, então você pode perder alguns artistas que já estiveram no seu top 10, mas que agora desapareceram.</p><h2>Processamento de dados do Spotify Wrapped para análise.</h2><p>Existe uma grande diferença na forma como processamos os dados na primeira e na segunda publicação. Se você quiser continuar trabalhando com os dados da primeira postagem, precisará levar em conta algumas alterações nos nomes dos campos, bem como recorrer ao ES|QL para fazer certas extrações, como <code>hour of day</code> em tempo real.</p><p>No entanto, todos vocês devem conseguir acompanhar esta publicação. O processamento de dados é feito no repositório <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch,</a> que envolve consultar a API do Spotify para obter a duração da música, a popularidade e também renomear e aprimorar alguns campos. Por exemplo, o campo <code>artist</code> na própria exportação do Spotify é apenas uma string e não representa recursos ou faixas com vários artistas.</p><h2>Visualizando dados do Spotify Wrapped com painéis de controle</h2><p>Criei um painel de controle no Kibana para visualizar os dados. O painel de controle está disponível <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">aqui</a> e você pode importá-lo para sua instância do Kibana. O painel de controle é bastante completo e responde a muitas das perguntas acima.</p><p>Vamos analisar algumas das perguntas e como respondê-las juntos!</p><h3>Qual é a duração média de uma música no meu top 100?</h3><p>Para responder a essa pergunta, podemos usar Lens ou ES|QL. Vamos explorar as três opções. Vamos reformular essa pergunta corretamente, usando a linguagem do Elasticsearch. Queremos encontrar as 100 músicas mais populares e depois calcular a duração média de todas elas juntas. Em termos do Elasticsearch, isso corresponderia a duas agregações:</p><ol><li><p>Descubra as 100 melhores músicas</p></li><li><p>Calcule a duração média dessas 100 músicas.</p></li></ol><p><strong>Lens</strong></p><p>No Lens, isso é bastante simples: crie uma nova lente, mude para uma tabela e arraste e solte o campo <code>title</code> na tabela. Em seguida, clique no campo <code>title</code> e defina o tamanho para 100, bem como defina o modo <code>accuracy</code> . Em seguida, arraste e solte o campo <code>duration</code> na tabela e use <code>last value</code>, porque na verdade só precisamos do último valor da duração de cada uma das músicas. A mesma música terá apenas uma duração. Na parte inferior desta agregação <code>last value</code> há um menu suspenso para uma linha de resumo, selecione <code>average</code> e ela será exibida para você.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="Usando o Lens para dados encapsulados do Spotify" /><p><strong>ES|QL</strong></p><p>ES|QL é uma linguagem bastante recente em comparação com DSL e agregações, mas é muito poderosa e fácil de usar. Para responder à mesma pergunta em ES|QL, você escreveria a seguinte consulta:</p><p>Vou explicar passo a passo essa consulta ES|QL:</p><ol><li><p><code>from spotify-history</code> - Este é o padrão de índice que estamos usando.</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - Esta é a primeira agregação; estamos calculando a duração máxima de cada música e a quantidade de músicas reproduzidas. Usamos <code>max</code> em vez de <code>last value</code> como usado na Lens, porque ES|QL atualmente não tem um primeiro ou último.</p></li><li><p><code>sort count desc</code> - Classificamos as músicas pela quantidade de vezes que cada música foi ouvida, então a música mais ouvida fica no topo.</p></li><li><p><code>limit 100</code> - Limitamos o resultado às 100 melhores músicas.</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - Calculamos a duração média das músicas.</p></li></ol><h3>Existe algum mês que me interesse particularmente?</h3><p>Para responder a essa pergunta, podemos usar o Lens com a ajuda de campos de tempo de execução e ES|QL. O que notamos imediatamente é que não há nenhum campo nos dados que denote o <code>month</code> diretamente, em vez disso, precisamos calculá-lo a partir do campo <code>@timestamp</code> . Existem várias maneiras de fazer isso:</p><ol><li><p>Use um campo de tempo de execução para alimentar a lente.</p></li><li><p>ES|QL</p></li></ol><p>Pessoalmente, acho que ES|QL é a solução mais elegante e rápida.</p><p>É isso, nada de especial necessário, podemos usar a função <code>DATE_EXTRACT</code> para extrair o mês do campo <code>@timestamp</code> e depois podemos agregar com base nele. Usando a visualização ES|QL, podemos adicioná-la ao painel.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Visualização do detalhamento mensal do Spotify Wrapped" /><h3>Qual é o meu tempo médio de escuta por artista por ano?</h3><p>A ideia por trás disso é verificar se um artista é apenas um caso isolado ou se há uma recorrência. Se não me engano, o Spotify só mostra os 5 artistas mais populares no ranking anual. Talvez o seu artista número 6 permaneça o mesmo o tempo todo, ou ele mude drasticamente depois da décima posição?</p><p>Uma das representações mais simples disso é um gráfico de barras percentuais. Podemos usar o Lens para isso. Siga os passos abaixo:</p><p>Arraste e solte o campo <code>listened_to_ms</code> . Este campo representa a duração da audição da música em milissegundos. Por padrão, o Lens criará uma agregação <code>median</code> , não queremos isso, altere para <code>sum</code>. Na parte superior, selecione <code>percentage</code> em vez de <code>stacked</code> para o tipo de gráfico de barras. Para a análise, selecione <code>artist</code> e diga top 10. Na lista suspensa <code>Advanced</code> não se esqueça de selecionar <code>accuracy mode</code>. Agora, cada bloco de cor representa o quanto você ouviu esse artista. Dependendo do seu seletor de tempo, as barras podem representar valores que variam de dias a semanas, meses e anos. Se você quiser um detalhamento semanal, selecione <code>@timestamp</code> e defina <code>mininum interval</code> para <code>year</code>. O que podemos dizer no meu caso é que <code>Fred Again..</code> é o artista que mais ouvi, quase 12% do meu tempo total de audição foi consumido por <code>Fred Again..</code>. Também vemos que <code>Fred Again..</code> caiu um pouco em 2024, mas <code>Jamie XX</code> cresceu bastante. Se compararmos apenas o tamanho das barras. Também podemos dizer que enquanto <code>Billie Eilish</code> está sendo constantemente tocado em 2024 a largura da barra. Isso significa que ouvi <code>Billie Eilish</code> mais em 2024 do que em 2023.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="Visualização do histórico do Spotify Wrapped usando o Kibana" /><h3>E quanto às músicas mais ouvidas por artista, por tempo de audição, em comparação com o tempo total de audição?</h3><p>Essa é uma pergunta bastante complexa. Deixe-me tentar explicar o que quero dizer com isso. O Spotify informa qual é a música mais ouvida de um artista específico ou suas 5 músicas mais ouvidas no geral. Bom, isso é definitivamente interessante, mas e quanto à análise da trajetória de um artista? Todo o meu tempo é consumido por uma única música que eu ouço repetidamente, ou isso se distribui de forma equilibrada?</p><p>Crie uma nova lente e selecione <code>Treemap</code> como tipo. Para o <code>metric</code>, igual a antes: selecione <code>sum</code> e use <code>listened_to_ms</code> como o campo. Para o <code>group by</code> precisamos de dois valores. O primeiro é <code>artist</code> e depois adicione um segundo com <code>title</code>. O resultado intermediário se parece com isto:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="Visualização do histórico do Spotify Wrapped usando o Kibana" /><p>Vamos mudar isso para os 100 melhores artistas e desmarcar o <code>other</code> no menu suspenso avançado, além de ativar o modo de precisão. Para alterar o título, escolha "Top 10" e ative o modo de precisão. O resultado final é este:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="Visualização do Spotify Wrapped usando o Kibana" /><p>O que isso nos diz exatamente? Sem analisar nenhum componente de tempo, podemos dizer que, em todo o meu histórico de audição com o Spotify, passei 5,67% ouvindo <code>Fred Again..</code>. Em particular, passei 1,21% desse tempo ouvindo <code>Delilah (pull me out of this)</code>. É interessante observar se existe uma única música que domina a carreira de um artista, ou se há outras músicas também. O próprio mapa de árvore é uma forma interessante de representar essas distribuições de dados.</p><h3>Devo escutar em um horário e dia específicos?</h3><p>Bem, podemos responder isso de forma super simples com uma visualização Lens aproveitando o <code>Heat Map</code>. Crie uma nova lente, selecione <code>Heat Map</code>. Para o campo <code>Horizontal Axis</code> selecione <code>dayOfWeek</code> e defina-o como <code>Top 7</code> em vez de Top 3. Para o <code>Vertical Axis</code> selecione o <code>hourOfDay</code> e para o <code>Cell Value</code> apenas um simples <code>Count of records</code>. Isso irá gerar este painel:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="Visualização dos hábitos de audição do Spotify Wrapped usando painéis de controle." /><p>Há algumas coisas irritantes nesta lente que me incomodam na hora da interpretação. Vamos tentar dar uma melhorada nisso. Em primeiro lugar, não me importo muito com a legenda; use o símbolo na parte superior com o triângulo, o quadrado e o círculo e desative-o.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Visualização do Spotify Wrapped " /><p>A segunda parte irritante é a ordenação dos dias. Pode ser segunda, quarta, quinta-feira ou qualquer outro dia, dependendo dos valores que você definir. O <code>hourOfDay</code> está corretamente ordenado. A maneira de ordenar os dias é um truque engraçado que consiste em usar <code>Filters</code> em vez de <code>Top Values</code>. Clique em <code>dayOfWeek</code> e selecione <code>Filters</code>, agora deverá ficar assim:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="Visualização do histórico do Spotify Wrapped com painéis do Kibana" /><p>Agora é só começar a digitar os dias. Um filtro por dia. <code>"dayOfWeek" : Monday</code> e dê a ele o rótulo <code>Monday</code> e enxágue e repita.</p><p>Uma ressalva importante, porém, é que o Spotify fornece os dados em UTC+0, sem nenhuma informação sobre fuso horário. Claro, eles também fornecem o endereço IP e o país de onde você ouviu, e poderíamos inferir as informações de fuso horário a partir disso, mas isso pode ser impreciso e, para países como os EUA, que têm vários fusos horários, pode ser muito trabalhoso. Isso é importante porque o Elasticsearch e o Kibana têm suporte para fusos horários e, ao fornecer o fuso horário correto no campo <code>@timestamp</code> , o Kibana ajustará automaticamente a hora para a hora do seu navegador.</p><p>O resultado final deverá ser este, e podemos constatar que sou um ouvinte muito ativo durante o horário de trabalho e menos aos sábados e domingos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="Visualização do Spotify Wrapped usando painéis do Kibana" /><h2>Conclusão</h2><p>Neste blog, aprofundamos um pouco mais as complexidades que os dados do Spotify oferecem. Mostramos algumas maneiras simples e rápidas de colocar algumas visualizações em funcionamento. É simplesmente incrível ter tanto controle sobre o seu próprio histórico de audição. Confira as outras partes da série:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">Parte 1: Como criar seu próprio Spotify Wrapped no Kibana</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">Parte 3: Tarefas populacionais de detecção de anomalias</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">Parte 4: Detectando relações em dados</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">Parte 5: Encontrando seu melhor amigo musical com vetores</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[analítica]]></category>
    <dc:creator><![CDATA[Philipp Kahr]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f8cddbca1a54cd5/6a17e5efe9ea87717ba9c585/e04f85e87b5b4e69b6e2df9367840a56985b96a1-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Testando o DeepSeek R1 localmente para RAG com Ollama e Kibana]]></title>
    <description><![CDATA[Saiba como executar uma instância local do DeepSeek e conectá-la a partir do Kibana.]]></description>
    <content:encoded><![CDATA[<p>Todos estão comentando sobre o DeepSeek R1, o novo grande modelo de linguagem do fundo de hedge chinês High-Flyer. As notícias estão repletas de especulações sobre o que isso significa para a indústria agora que eles introduziram um LLM capaz de raciocínio em cadeia de pensamento com pesos abertos. Para os curiosos em experimentar este novo modelo com RAG e todas as capacidades do banco de dados vetorial do Elasticsearch, aqui está um breve tutorial para começar a usar o DeepSeek R1 com inferência local. Ao longo do caminho, usaremos o recurso Playground da Elastic e até descobrir algumas boas e más propriedades do Deepseek R1 para RAG.</p><p>Aqui está um diagrama do que configuraremos neste tutorial:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="Configuração do Deepseek com Elasticsearch e Ollama" /><h2>Configurando a inferência local com Ollama</h2><p><a href="https://ollama.com/">Ollama</a> é uma excelente maneira de testar rapidamente um conjunto selecionado de modelos open source para inferência local e é uma ferramenta popular entre desenvolvedores de IA.</p><h3>Executando Ollama bare metal</h3><p>Uma <a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">instalação local</a> no Mac, Linux ou Windows é a maneira mais fácil de aproveitar qualquer capacidade de GPU local que você possa ter, principalmente para aqueles com chips Apple da série M. Depois de ter o Ollama instalado, você pode baixar e executar o DeepSeek R1 com o seguinte comando.</p><p>Talvez seja bom ajustar o tamanho do parâmetro para que ele se adeque ao seu hardware. Os tamanhos disponíveis podem ser encontrados <a href="https://ollama.com/library/deepseek-r1">aqui</a>.</p>ollama run deepseek-r1:7b<p>Você pode conversar com o modelo no terminal, mas o modelo permanece em execução quando você pressiona Ctrl+d para sair do comando ou digita "/bye". Para ver o modelo ainda em execução, digite:</p>ollama ps<h3>Executando Ollama em um container</h3><p>Como alternativa, a maneira mais rápida de executar o Ollama é utilizando um mecanismo de container como o Docker. Usar a GPU da sua máquina local nem sempre é tão simples, dependendo do seu ambiente, mas obter uma configuração de teste rápida não é difícil, desde que o container tenha a RAM e o armazenamento adequados aos modelos de vários GB.</p><p>Colocar o Ollama em execução no Docker é tão fácil quanto executar:</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>Isso cria um diretório chamado "ollama" no diretório atual e o monta dentro do container para armazenar a configuração do Ollama e também os modelos. Dependendo do número de parâmetros usados, eles podem variar de alguns GBs a dezenas de GBs. Portanto, certifique-se de escolher um volume com espaço livre suficiente.</p><p>Observação: se você tiver uma GPU Nvidia em sua máquina, certifique-se de instalar o <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">Nvidia container toolkit</a> e adicionar "--gpus=all" ao comando docker executar acima.</p><p>Assim que o container do Ollama estiver em execução na sua máquina, você pode puxar um modelo como o deepseek-r1 com:</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>Semelhante à abordagem de máquinas físicas, talvez você queira ajustar o tamanho do parâmetro para algo que se adeque ao seu hardware. Os tamanhos disponíveis podem ser encontrados em <a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a>.</p><p>Assim que o modelo terminar de ser puxado, você pode digitar “/bye” para sair das instruções. Para confirmar que o modelo ainda está em execução:</p>docker exec -it ollama ollama ps<h2>Testando nossa inferência local com um curl</h2><p>Para testar a inferência local com curl, você pode executar o seguinte comando. Estamos usando stream:false para que possamos ler facilmente a resposta narrativa JSON:</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>Testando o Ollama “compatível com OpenAI” e instruções RAG</h2><p>Convenientemente, o Ollama também oferece um endpoint REST que imita o comportamento do OpenAI para compatibilidade com uma ampla gama de ferramentas, incluindo o Kibana.</p>curl http://localhost:11434/v1/chat/completions -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "messages": [
    { 
      "role": "system", 
      "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext:  The color of the sky today is purple. "},
    { "role": "user", 
      "content": "What does the sky look like today?" 
    }
  ]
}'<p>Testar essas instruções mais complexas resulta em um conteúdo que possui uma seção &lt;think&gt;, onde o modelo foi treinado para raciocinar sobre o problema.</p>&lt;think&gt; 
Okay, so I need to figure out what the user is asking for here. They provided a context where the sky is described as purple today and then asked about how the sky looks. At first glance, it seems straightforward—maybe they just want confirmation or more details on why the sky is that color.
Wait, but maybe there's something deeper. Purple skies aren't something I encounter every day. It usually happens at certain times of the year, like during sunrise or sunset with the sun setting in pink or orange. Could this be a hint about the time of day? Or perhaps it's just an unusual natural phenomenon? 
I should consider if \"purple\" is a typo. Maybe they meant something else like blue or gray. But since they specifically said purple, I'll go with that. Purple skies can happen when there are atmospheric conditions that scatter light differently, maybe due to pollution or cloud cover affecting the sunset.

So, putting it all together, the user might be looking for an explanation of why today's sky is purple and what that implies about the weather or time of day. Alternatively, they could just want a simple statement confirming that the sky looks purple today.
&lt;/think&gt;

The color of the sky today is described as purple. This unusual shade can occur due to atmospheric conditions affecting light scattering, such as during sunrise/sunset with pollution or cloud cover influencing the sunset's hues.<h2>Conectando Ollama ao Kibana</h2><p>Uma excelente maneira de usar o Elasticsearch é o script de desenvolvimento "<a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a>".</p><p>Certifique-se de que seu Kibana e Elasticsearch consigam acessar seu Ollama na rede. Se você estiver usando uma configuração de container local do Elastic stack, isso pode significar substituir "localhost" por "host.docker.internal". ou “host.containers.internal” para obter um caminho de rede para a máquina hospedada.</p><p>No Kibana, navegue até Stack Management &gt; Alerts and Insights &gt; Connectors.</p><h3>O que fazer se você vir que este é um aviso comum de configuração</h3><p>Você precisará garantir que o xpack.encryptedSavedObjects.encryptionKey <a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">esteja configurado corretamente</a>. Esta é uma etapa comumente esquecida ao executar uma instalação local do Docker do Kibana, então listarei as etapas para corrigir na sintaxe do Docker.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>Certifique-se de persistir seu diretório kibana/config para que as alterações sejam salvas quando o container for encerrado. Meus volumes de container do Kibana se parecem com isso em docker-compose.yml:</p>services:
  kibana:
...
   volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
      - kibanaconfig:/usr/share/kibana/config
...
volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local
  kibanaconfig:
    driver: local<p>Agora você pode criar o repositório de chaves e inserir um valor para que as chaves do Connector não sejam armazenadas em texto simples.</p>## generate some new keys for me and print them to the terminal
docker exec -it kibana_1 bin/kibana-encryption-keys generate

## create a new keystrore
docker exec -it kibana_1 bin/kibana-keystore create
docker exec -it kibana_1 bin/kibana-keystore add xpack.encryptedSavedObjects.encryptionKey

## You'll be prompted to paste in a value<p>Reinicie completamente todo o cluster para que as alterações entrem em vigor.</p><h3>Criando o Conector</h3><p>Na tela de configuração do conector (no Kibana, navegue até Stack Management &gt; Alerts and Insights &gt; Connectors), crie um conector e selecione o tipo "OpenAI".</p><p>Configure o conector com as seguintes definições</p><ul><li><p>Nome do conector: Deepseek (Ollama)</p></li><li><p>Selecione um provedor OpenAI: outro (Serviço Compatível com OpenAI)</p></li><li><p>URL: <a href="http://localhost:11434/v1/chat/completions">http://localhost:11434/v1/chat/completions</a></p><ul><li><p>Ajuste o caminho correto para o seu Ollama. Lembre-se de substituir host.docker.internal ou equivalente se estiver chamando de dentro de um container.</p></li></ul></li><li><p>Modelo padrão: deepseek-r1:7b</p></li><li><p>Chave de API: invente algo, uma entrada é necessária, mas o valor não importa</p></li></ul><p>Observe que testar um conector personalizado para Ollama na configuração do conector está atualmente com problemas na versão 8.17, mas foi corrigido na próxima versão 8.18 do Kibana.</p><p>Nosso conector é assim:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>Inserindo dados de vetores incorporados no Elasticsearch</h2><p>Se você já estiver familiarizado com o Playground e tiver os dados configurados, pode pular para a etapa do Playground abaixo. Mas, se precisar de alguns dados de teste rápidos, precisaremos garantir que nossas API de inferência estejam configuradas. A partir da versão 8.17, as alocações de machine learning são dinâmicas, portanto, para baixar e ativar o vetor denso multilíngue e5, precisaremos apenas executar o seguinte nas ferramentas de desenvolvimento do Kibana.</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>Se você ainda não o fez, isso acionará o download do modelo e5 dos repositórios de modelos da Elastic.</p><p>Em seguida, vamos carregar um livro de domínio público como nosso contexto RAG. Aqui está um lugar para baixar “Alice’s Adventures in Wonderland” do Projeto Gutenberg: <a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">link</a>. Salve como arquivo .txt.</p><p>Navegue até Elasticsearch &gt; Home &gt; Carregar um arquivo</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>Selecione ou arraste e solte seu arquivo de texto e clique no botão "Importar".</p><p>Na tela “Import data” (Importar dados), selecione a guia “Advanced” (Avançado) e defina o nome do índice como “book_alice”.</p><p>Selecione a opção “Add additional campo” (Adicionar campo adicional), que fica logo abaixo de “Automatically created campos” (Campos criados automaticamente). Selecione “Adicionar campo de texto semântico” e altere o endpoint de inferência para “.multilingual-e5-small-elasticsearch”. Selecione Add e, em seguida, Import.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>Quando o carregamento e a inferência estiverem concluídos, estaremos prontos para ir para o Playground.</p><h2>Testando o RAG no Playground</h2><p>Navegue até Elasticsearch &gt; Playground no Kibana.</p><p>Na tela do playground, você verá uma marca de visto verde e “LLM Connected” para indicar que um conector existe. Este é o conector Ollama que acabamos de criar acima. Um guia mais longo para o Playground pode ser encontrado <a href="https://www.elastic.co/guide/en/kibana/current/playground.html">aqui</a>.</p><p>Clique na opção azul Add data sources (Adicionar fontes de dados) e selecione o índice book_alice que já criamos ou outro índice que você já tenha configurado e que utilize API de inferência para embeddings.</p><p>O Deepseek é um modelo de cadeia de pensamento com características fortes de alinhamento. Isso é tanto bom quanto ruim do ponto de vista do RAG. O treinamento em cadeia de pensamento pode ajudar o Deepseek a racionalizar afirmações aparentemente contraditórias nas citações, mas o forte alinhamento com o conhecimento do treinamento pode fazer com que ele prefira sua própria versão dos fatos mundiais em vez da nossa base contextual. Embora bem-intencionado, esse forte alinhamento é conhecido por dificultar a instrução dos LLMs ao discutir tópicos em que nosso conhecimento particular é limitado ou não está bem representado no conjunto de dados de treinamento.</p><p>Na nossa configuração do Playground, inserimos as seguintes instruções do sistema: "Você é um assistente para tarefas de resposta a perguntas usando passagens de texto relevantes do livro Alice no País das Maravilhas" e aceitamos os outros padrões.</p><p>À pergunta “Quem estava na festa do chá?”, obtemos a resposta: “Resposta: A Lebre de Março, o Chapeleiro e o Arganaz estavam na festa do chá. [Citação: posições 1 e 2]", o que está correto.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>Podemos ver nas tags &lt;think&gt; que o Deepseek definitivamente ponderou o conteúdo das citações para responder às perguntas.</p><h2>Testando as limitações de alinhamento</h2><p>Vamos criar um caso intelectualmente desafiador para o Deepseek como um teste. Criaremos um índice de teorias da conspiração que os dados de treinamento do Deepseek sabem que não são verdadeiras.</p><p>Nas Dev Tools do Kibana, vamos criar o seguinte índice e dados:</p>PUT /classic_conspiracies
{
   "mappings": {
       "properties": {
           "content": {
               "type": "text",
               "copy_to": "content_semantic"
           },
           "content_semantic": {
               "type": "semantic_text",
               "inference_id": ".multilingual-e5-small-elasticsearch"
           }
       }
   }
}




POST /classic_conspiracies/_doc/1
{
   "content": "birds aren't real, the government replaced them with drones a long time ago"
}
POST /classic_conspiracies/_doc/2
{
   "content": "tinfoil hats are necessary to prevent our brains from being read"
}
POST /classic_conspiracies/_doc/3
{
   "content": "ancient aliens influenced early human civilizations, this explains why things made out of stone are marginally similar on different continents"
}<p>
Essas teorias da conspiração serão nosso fundamento para o LLM. Apesar de inserir instruções agressivas no sistema, o Deepseek não aceitará nossa versão dos fatos. Se estivéssemos em uma situação em que soubéssemos que nossos dados privados eram mais confiáveis, fundamentados ou alinhados às necessidades de nossa organização, isso não seria aceitável:</p><p>Para a pergunta do teste "os pássaros são reais?" (explicação <a href="https://knowyourmeme.com/memes/birds-arent-real">conheça seu meme</a>) obtemos a resposta "No contexto fornecido, os pássaros não são considerados reais, mas na realidade, eles são animais reais." [Contexto: posição 1]. Este teste prova que o DeepSeek R1 é poderoso, mesmo no nível de parâmetro 7B... no entanto, pode não ser a melhor escolha para RAG, dependendo do nosso conjunto de dados.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>Então, o que aprendemos?</h2><p>Em resumo:</p><ul><li><p>Executar modelos localmente em ferramentas como o Ollama é uma ótima opção para dar uma olhada no comportamento do modelo.</p></li><li><p>O DeepSeek R1 é um modelo de raciocínio, o que significa que tem vantagens e desvantagens para casos de uso como RAG.</p></li><li><p>O Playground é capaz de se conectar a frameworks de hospedagem de inferência, como Ollama, por meio de uma REST API semelhante à OpenAI, que está se tornando um padrão de fato nesta era inicial da hospedagem de IA.</p></li></ul><p>De modo geral, estamos impressionados com o quanto o RAG "air gapped" local evoluiu. As ferramentas do Elasticsearch, do Kibana e os modelos de pesos abertos disponíveis avançaram significativamente desde que escrevemos pela primeira vez sobre <a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">buscas com IA que priorizam privacidade</a>, em 2023.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</guid>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Dave Erickson,Jakob Reiter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a4b2ae6bd97850b/6a17dfa4be6086558f00464c/1bd853bfdfa2710e44cc4c08dede6bd21b35c4b8-1542x860.png" length="0" type="image/png"/>
    <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Ingerir dados geoespaciais no Elasticsearch com o Kibana para uso no ES|QL]]></title>
    <description><![CDATA[Como usar o Kibana e o processador de ingestão CSV para importar dados geoespaciais para o Elasticsearch para uso com pesquisa na Linguagem de Consulta Elasticsearch (ES|QL). O Elasticsearch possui recursos poderosos de busca geoespacial, que agora estão chegando ao ES|QL para uma facilidade de uso drasticamente aprimorada e familiaridade com o OGC. Mas para utilizar essas funcionalidades, precisamos de dados geoespaciais.]]></description>
    <content:encoded><![CDATA[<p>Recentemente publicamos um artigo no blog descrevendo como usar os novos <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">recursos</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">de pesquisa geoespacial</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">no ES|QL</a>, a nova e poderosa <a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga">linguagem de consulta encadeada</a> do Elasticsearch. Para usar esses recursos, você precisa ter dados geoespaciais no Elasticsearch. Neste blog, mostraremos como importar dados geoespaciais e como usá-los em consultas ES|QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="Pesquisa Geoespacial ESQL" /><h2>Importando dados geoespaciais usando o Kibana</h2><p>Os dados que usamos nos exemplos do blog anterior foram baseados em dados que usamos internamente para testes de integração. Para sua conveniência, incluímos aqui algumas informações em formato CSV que podem ser facilmente importadas usando o Kibana. Os dados são uma mistura de aeroportos, cidades e limites urbanos. Você pode baixar os dados de:</p><ul><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">aeroportos.csv</a></p><ul><li><p>Este arquivo contém uma fusão de três conjuntos de dados:</p><ul><li><p>Aeroportos (nomes, localizações e dados relacionados) do <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a></p></li><li><p>Localização de cidades a partir <a href="https://simplemaps.com/data/world-cities">do SimpleMaps</a></p></li><li><p>Altitudes de aeroportos <a href="https://www.partow.net/miscellaneous/airportdatabase/">do banco de dados global de aeroportos</a></p></li></ul></li></ul></li><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">limites_cidade_aeroporto.csv</a></p><ul><li><p>Esta seção contém uma fusão dos nomes de aeroportos e cidades mencionados acima com uma nova fonte:</p><ul><li><p>Limites da cidade do <a href="https://www.openstreetmap.org/">OpenStreetMap</a></p></li></ul></li></ul></li></ul><p>Como você pode imaginar, dedicamos algum tempo a combinar essas fontes de dados nos dois arquivos acima, com o objetivo de poder testar os recursos geoespaciais do ES|QL. Isso pode não ser exatamente o que você precisa em termos de dados, mas espero que lhe dê uma ideia do que é possível. Em particular, queremos demonstrar algumas coisas interessantes:</p><ul><li><p>Importação de dados com campos geoespaciais juntamente com outros dados indexáveis.</p></li><li><p>Importar dados <code>geo_point</code> e <code>geo_shape</code> e usá-los em conjunto em consultas</p></li><li><p>Importar dados para dois índices que podem ser unidos usando uma relação espacial.</p></li><li><p>Criar um pipeline de ingestão para facilitar importações futuras (além do Kibana)</p></li><li><p>Alguns exemplos de processadores de ingestão, como <code>csv</code>, <code>convert</code> e <code>split</code></p></li></ul><p>Embora neste blog abordemos o trabalho com dados CSV, é importante entender que existem <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">várias maneiras</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">de</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">adicionar dados geográficos usando</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">o Kibana</a>. No aplicativo Mapa, você pode carregar dados delimitados, como CSV, GeoJSON e ESRI ShapeFiles, e também pode desenhar formas diretamente no mapa. Neste blog, vamos nos concentrar na importação de arquivos CSV da página inicial do Kibana.</p><h3>Importando os aeroportos</h3><p>O primeiro arquivo, <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">airports.csv</a>, Possui algumas peculiaridades interessantes com as quais precisamos lidar. Em primeiro lugar, as colunas possuem espaços em branco adicionais entre si, o que não é típico de arquivos CSV. Em segundo lugar, o campo <code>type</code> é um campo de múltiplos valores, que precisamos dividir em campos separados. Por fim, alguns campos não são strings e precisam ser convertidos para o tipo correto. Tudo isso pode ser feito usando o recurso de importação de CSV do Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Upload do Kibana - Pré-visualização" /><p>Comece pela página inicial do Kibana. Existe uma seção chamada "Comece adicionando integrações", que possui um link chamado "Carregar um arquivo":</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Página inicial do Kibana - Carregar um arquivo" /><p>Clique neste link e você será redirecionado para a página "Enviar arquivo". Aqui você pode arrastar e soltar o arquivo <code>airports.csv</code> , e o Kibana analisará o arquivo e apresentará uma pré-visualização dos dados. Deveria ter detectado automaticamente o delimitador como uma vírgula e a primeira linha como a linha de cabeçalho. No entanto, provavelmente não removeu o espaço em branco extra entre as colunas, nem determinou os tipos dos campos, assumindo que todos os campos são <code>text</code> ou <code>keyword</code>. Precisamos resolver isso.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Upload do Kibana - Pré-visualização" /><p>Clique em <code>Override settings</code> e marque a caixa de seleção para <code>Should trim fields</code> e <code>Apply</code> para fechar as configurações. Agora precisamos corrigir os tipos dos campos. Isso está disponível na próxima página, então clique em <code>Import</code>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Carregar no Kibana - Importar" /><p>Primeiro escolha um nome de índice e, em seguida, selecione <code>Advanced</code> para acessar os mapeamentos de campo e a página do processador de ingestão.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Carregamento no Kibana - Mapeamento de campos" /><p>Aqui precisamos fazer alterações tanto no mapeamento de campos do índice quanto no pipeline de ingestão para importar os dados. Em primeiro lugar, embora o Kibana provavelmente tenha detectado automaticamente o campo <code>scalerank</code> como <code>long</code>, ele erroneamente percebeu os campos <code>location</code> e <code>city_location</code> como <code>keyword</code>. Edite-os para <code>geo_point</code>, resultando em mapeamentos que se parecem com algo assim:</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_location": { "type": "geo_point" },
    "country":       { "type": "keyword" },
    "elevation":     { "type": "double" },
    "location":      { "type": "geo_point" },
    "name":          { "type": "text" },
    "scalerank":     { "type": "long" },
    "type":          { "type": "keyword" }
  }
}<p>Você tem alguma flexibilidade aqui, mas observe que o tipo escolhido afetará a forma como o campo é indexado e os tipos de consultas possíveis. Por exemplo, se você deixar <code>location</code> como <code>keyword</code> não poderá realizar nenhuma consulta de pesquisa geoespacial nele. Da mesma forma, se você deixar <code>elevation</code> como <code>text</code> não poderá executar consultas de intervalo numérico nele.</p><p>Agora é hora de corrigir o pipeline de ingestão. Se o Kibana detectou automaticamente <code>scalerank</code> como <code>long</code> acima, ele também terá adicionado um processador para converter o campo em <code>long</code>. Precisamos adicionar um processador semelhante para o campo <code>elevation</code> , desta vez convertendo-o em <code>double</code>. Edite o pipeline para garantir que essa conversão esteja implementada. Antes de salvar isso, queremos mais uma conversão, para dividir o campo <code>type</code> em vários campos. Adicione um processador <code>split</code> ao pipeline, com a seguinte configuração:</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>O pipeline de ingestão final deve ter a seguinte aparência:</p>{
  "description": "Ingest pipeline created by text structure finder",
  "processors": [
    {
      "csv": {
        "field": "message",
        "target_fields": [
          "abbrev",
          "name",
          "scalerank",
          "type",
          "location",
          "country",
          "city",
          "city_location",
          "elevation"
        ],
        "ignore_missing": false,
        "trim": true
      }
    },
    {
      "convert": {
        "field": "scalerank",
        "type": "long",
        "ignore_missing": true
      }
    },
    {
      "convert": {
        "field": "elevation",
        "type": "double",
        "ignore_missing": true
      }
    },
    {
      "split": {
        "field": "type",
        "separator": ":",
        "ignore_missing": true
      }
    },
    {
      "remove": {
        "field": "message"
      }
    }
  ]
}<p>Observe que não adicionamos um processador de conversão para os campos <code>location</code> e <code>city_location</code> . Isso ocorre porque o tipo <code>geo_point</code> no mapeamento de campo já entende o formato WKT dos dados nesses campos. O tipo <code>geo_point</code> pode entender uma variedade de formatos, incluindo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT, GeoJSON e outros</a>. Se tivéssemos, por exemplo, duas colunas no arquivo CSV para <code>latitude</code> e <code>longitude</code>, precisaríamos adicionar um processador <code>script</code> ou <code>set</code> para combiná-las em um único campo <code>geo_point</code> (por exemplo, <code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code>).</p><p>Agora estamos prontos para importar o arquivo. Clique em <code>Import</code> e os dados serão importados para o índice com os mapeamentos e o pipeline de ingestão que acabamos de definir. Caso ocorram erros na ingestão dos dados, o Kibana os reportará aqui, para que você possa editar os dados de origem ou o pipeline de ingestão e tentar novamente.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Carregar no Kibana - Importando" /><p>Observe que um novo pipeline de ingestão foi criado. Isso pode ser visualizado indo para a seção <code>Stack Management</code> do Kibana e selecionando <code>Ingest pipelines</code>. Aqui você pode ver o pipeline que acabamos de criar e editá-lo, se necessário. Na verdade, a seção <code>Ingest pipelines</code> pode ser usada para criar e testar pipelines de ingestão, um recurso muito útil se você planeja fazer ingestões ainda mais complexas.</p><p>Se você deseja explorar esses dados imediatamente, pule para as seções posteriores, mas se também deseja importar os limites da cidade, continue lendo.</p><h3>Importando os limites da cidade</h3><p>O arquivo de limites da cidade disponível em <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">airport_city_boundaries.csv</a> é um pouco mais simples de importar do que o exemplo anterior. Contém um campo <code>city_boundary</code> que é uma representação WKT do limite da cidade como um <code>POLYGON</code> e um campo <code>city_location</code> que é uma representação <code>geo_point</code> da localização da cidade. Podemos importar esses dados de forma semelhante aos dados dos aeroportos, mas com algumas diferenças:</p><ul><li><p>Precisávamos selecionar a configuração de substituição <code>Has header row</code> pois ela não foi detectada automaticamente.</p></li><li><p>Não foi necessário remover espaços em branco dos campos, pois os dados já estavam livres de espaços desnecessários.</p></li><li><p>Não foi necessário editar o pipeline de ingestão, pois todos os tipos eram de string ou espaciais.</p></li><li><p>No entanto, tivemos que editar os mapeamentos de campo para definir o campo <code>city_boundary</code> como <code>geo_shape</code> e o campo <code>city_location</code> como . <code>geo_point</code></p></li></ul><p>Nossos mapeamentos de campo finais ficaram assim:</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "airport":       { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_boundary": { "type": "geo_shape" },
    "city_location": { "type": "geo_point" },
    "region":        { "type": "text" }
  }
}<p>Assim como na importação <code>airports.csv</code> anterior, basta clicar em <code>Import</code> para importar os dados para o índice. Os dados serão importados com os mapeamentos que editamos e o pipeline de ingestão definido pelo Kibana.</p><h3>Explorando dados geoespaciais com ferramentas de desenvolvimento</h3><p>No Kibana, é comum explorar os dados indexados com a opção "Descobrir". No entanto, se sua intenção é escrever seu próprio aplicativo usando consultas ES|QL, pode ser mais interessante tentar acessar a API Elasticsearch diretamente. O Kibana possui um console prático para experimentar a escrita de consultas. Isso é chamado de console <code>Dev Tools</code> e pode ser encontrado na barra lateral do Kibana. Este console se comunica diretamente com o cluster Elasticsearch e pode ser usado para executar consultas, criar índices e muito mais.</p><p>Experimente o seguinte:</p>POST /_query?error_trace=true&amp;format=txt
{
  "query": """
FROM airports
| EVAL distance = ST_DISTANCE(city_location, TO_GEOPOINT("POINT(12.565 55.673)"))
| WHERE distance &lt; 1000000 AND scalerank &lt; 6 AND distance &gt; 10000
| SORT distance ASC
| KEEP distance, abbrev, name, location, country, city, elevation
| LIMIT 10
  """
}<p>Isso deverá produzir os seguintes resultados:</p><p>distância</p><p>abreviar</p><p>nome</p><p>Local</p><p>país</p><p>cidade</p><p>elevação</p><p>273418.05776847183</p><p>PRESUNTO</p><p>Hamburgo</p><p>PONTO (10,005647830925 53,6320011640866)</p><p>Alemanha</p><p>Norderstedt</p><p>17.0</p><p>337534,653466062</p><p>TXL</p><p>Aeroporto Internacional de Berlim-Tegel</p><p>PONTO (13.2903090925074 52.5544287044101)</p><p>Alemanha</p><p>Hohen Neuendorf</p><p>38,0</p><p>483713.15032266214</p><p>OSL</p><p>Oslo Gardermoen</p><p>PONTO (11.0991032762581 60.1935783171386)</p><p>Noruega</p><p>Oslo</p><p>208,0</p><p>522538.03148094116</p><p>BMA</p><p>Broma</p><p>PONTO (17,9456175406145 59,3555902065112)</p><p>Suécia</p><p>Estocolmo</p><p>15.0</p><p>522538.03148094116</p><p>ARN</p><p>Arlanda</p><p>PONTO (17,9307299016916 59,6511203397372)</p><p>Suécia</p><p>Estocolmo</p><p>38,0</p><p>624274,8274399083</p><p>DUS</p><p>Aeroporto Internacional de Düsseldorf</p><p>PONTO (6,76494446612174 51,2781820420774)</p><p>Alemanha</p><p>Düsseldorf</p><p>45,0</p><p>633388,6966435644</p><p>PRG</p><p>Ruzyn</p><p>PONTO (14,2674849854076 50,1076511703671)</p><p>República Tcheca</p><p>Praga</p><p>381,0</p><p>635911.1873311149</p><p>AMS</p><p>Schiphol</p><p>PONTO (4,76437693232812 52,3089323889822)</p><p>Países Baixos</p><p>Hoofddorp</p><p>-3,0</p><p>670864.137958866</p><p>FRA</p><p>Frankfurt Internacional</p><p>PONTO (8,57182286907608 50,0506770895207)</p><p>Alemanha</p><p>Frankfurt</p><p>111.0</p><p>683239,2529970079</p><p>UAU</p><p>Okecie Int'l</p><p>PONTO (20,9727263383587 52,171026749259)</p><p>Polônia</p><p>Piaseczno</p><p>111.0</p><h2>Visualizando dados geoespaciais com o Kibana Maps</h2><p>O Kibana Maps é uma ferramenta poderosa para visualizar dados geoespaciais. Pode ser usado para criar mapas com múltiplas camadas, cada camada representando um conjunto de dados diferente. Os dados podem ser filtrados, agregados e formatados de diversas maneiras. Nesta seção, mostraremos como criar um mapa no Kibana Maps usando os dados que importamos na seção anterior.</p><p>No menu do Kibana, navegue até <code>Analytics</code>-&gt;<code>Maps</code> para abrir uma nova visualização do mapa. Clique em <code>Add Layer</code> e selecione <code>Documents</code>, escolhendo a visualização de dados <code>airports</code> e editando o estilo da camada para colorir os marcadores usando o campo <code>elevation</code> , para que possamos ver facilmente a altitude de cada aeroporto.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibana Maps - Estilo de Camada de Aeroportos" /><p>Clique em "Manter alterações" para salvar o mapa:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Mapas do Kibana - Aeroportos" /><p>Agora adicione uma segunda camada, desta vez selecionando a visualização de dados <code>airport_city_boundaries</code> . Desta vez, usaremos o campo <code>city_boundary</code> para estilizar a camada e definiremos a cor de preenchimento para um azul claro. Isso mostrará os limites da cidade no mapa. Certifique-se de reordenar as camadas para garantir que os marcadores do aeroporto fiquem por cima.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibana Maps - Estilo de Camada de Limites da Cidade" /><h2>Junções espaciais</h2><p>ES|QL não suporta comandos <code>JOIN</code> , mas você pode realizar um caso especial de junção usando o <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">comando</a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a> . Este comando funciona de forma semelhante a uma 'junção à esquerda' em SQL, permitindo enriquecer os resultados de um índice com dados de outro índice com base em uma relação espacial entre os dois conjuntos de dados.</p><p>Por exemplo, vamos enriquecer os resultados de uma tabela de aeroportos com informações adicionais sobre a cidade que eles atendem, encontrando o limite da cidade que contém a localização do aeroporto e, em seguida, realizar algumas análises estatísticas dos resultados:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>Se você executar essa consulta sem primeiro preparar o índice de enriquecimento, receberá uma mensagem de erro como esta:</p>cannot find enrich policy [city_boundaries]<p>Isso ocorre porque, como mencionamos anteriormente, o ES|QL não suporta comandos <code>JOIN</code> verdadeiros. Um motivo importante para isso é que o Elasticsearch é um sistema distribuído, e as junções são operações custosas e difíceis de escalar. No entanto, o comando <code>ENRICH</code> pode ser bastante eficiente, porque utiliza índices enriquecidos especialmente preparados que são duplicados em todo o cluster, permitindo que junções locais sejam realizadas em cada nó.</p><p>Para melhor compreender isso, vamos nos concentrar no comando <code>ENRICH</code> na consulta acima:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>Este comando instrui o Elasticsearch a enriquecer os resultados recuperados do índice <code>airports</code> e a realizar uma junção <code>intersects</code> entre o campo <code>city_location</code> do índice original e o campo <code>city_boundary</code> do índice <code>airport_city_boundaries</code> , que usamos em alguns exemplos anteriores. Mas algumas dessas informações não estão claramente visíveis nesta consulta. O que vemos é o nome de uma política de enriquecimento <code>city_boundaries</code> e a informação em falta está encapsulada na definição dessa política.</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Aqui podemos ver que ele executará uma consulta <code>geo_match</code> (<code>intersects</code> é o padrão), o campo para comparar é <code>city_boundary</code> e os <code>enrich_fields</code> são os campos que queremos adicionar ao documento original. Um desses campos, o <code>region</code> foi na verdade usado como chave de agrupamento para o comando <code>STATS</code> , algo que não poderíamos ter feito sem essa capacidade de 'junção à esquerda'. Para obter mais informações sobre políticas de enriquecimento, consulte a <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">documentação de enriquecimento</a>.</p><p>Os índices e políticas de enriquecimento no Elasticsearch foram originalmente projetados para enriquecer dados no momento da indexação, usando dados de outro índice de enriquecimento já preparado. Em ES|QL, no entanto, o comando <code>ENRICH</code> funciona no momento da consulta e não requer o uso de pipelines de ingestão. Isso efetivamente o torna bastante semelhante a um SQL <code>LEFT JOIN</code>, exceto que você não pode unir quaisquer dois índices, apenas um índice normal à esquerda com um índice enriquecido especialmente preparado à direita.</p><p>Em ambos os casos, seja para pipelines de ingestão ou para uso no ES|QL, é necessário executar algumas etapas preparatórias para configurar o índice e a política de enriquecimento. Já importamos o índice <code>airport_city_boundaries</code> acima, mas este não é diretamente utilizável como um índice de enriquecimento no comando <code>ENRICH</code> . Primeiro, precisamos realizar duas etapas:</p><ul><li><p>Crie a política de enriquecimento descrita acima para definir o índice de origem, o campo no índice de origem a ser comparado e os campos a serem retornados após a correspondência.</p></li><li><p>Execute esta política para criar o índice de enriquecimento. Isso criará um índice interno especial, lendo o índice de origem original para uma estrutura de dados mais eficiente, que será copiada em todo o cluster.</p></li></ul><p>A política de enriquecimento pode ser criada usando o seguinte comando:</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>E a política pode ser executada usando o seguinte comando:</p>POST /_enrich/policy/city_boundaries/_execute<p>Observe que, se você alterar o conteúdo do índice <code>airport_city_boundaries</code> , precisará executar esta política novamente para ver as alterações refletidas no índice enriquecido. Agora, vamos executar a consulta ES|QL original novamente:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>Isso retorna as 5 principais regiões com o maior número de aeroportos, juntamente com o centroide de todos os aeroportos que possuem regiões correspondentes e o intervalo de comprimento da representação WKT dos limites das cidades dentro dessas regiões:</p><p>centroide</p><p>Contagem</p><p>região</p><p>PONTO (-12.139086859300733 31.024386116624648)</p><p>126</p><p>nulo</p><p>PONTO (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>PONTO (39,74537850357592 47,21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>PONTO (-156,80986787192523 20,476673701778054)</p><p>3</p><p>Havaí</p><p>PONTO (-73,94515332765877 40,70366442203522)</p><p>3</p><p>Cidade de Nova York</p><p>PONTO (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>PONTO (-76,66873019188643 24.306286952923983)</p><p>2</p><p>Nova Providência</p><p>PONTO (-3,0252167768776417 51,39245774131268)</p><p>2</p><p>Cardiff</p><p>PONTO (-115,40993484668434 32,73126147687435)</p><p>2</p><p>Município de Mexicali</p><p>PONTO (41,790108773857355 50,302146775648)</p><p>2</p><p>Área Central</p><p>PONTO (-73,88902732171118 45.57078813901171)</p><p>2</p><p>Montreal</p><p>Você também pode notar que a região mais comumente encontrada foi <code>null</code>. O que isso poderia implicar? Lembre-se de que comparei este comando a um 'left join' em SQL, o que significa que se nenhum limite de cidade correspondente for encontrado para um aeroporto, o aeroporto ainda será retornado, mas com valores <code>null</code> para os campos do índice <code>airport_city_boundaries</code> . Descobriu-se que havia 125 aeroportos que não encontraram nenhum <code>city_boundary</code> correspondente e um aeroporto com uma correspondência onde o campo <code>region</code> era <code>null</code>. Isso levou a uma contagem de 126 aeroportos sem nenhum <code>region</code> nos resultados. Se o seu caso de uso exigir que todos os aeroportos possam ser associados aos limites de uma cidade, isso exigirá a obtenção de dados adicionais para preencher as lacunas. Seria necessário determinar duas coisas:</p><ul><li><p>quais registros no índice <code>airport_city_boundaries</code> não possuem campos <code>city_boundary</code></p></li><li><p>quais registros no índice <code>airports</code> não correspondem usando o comando <code>ENRICH</code> (ou seja, não se cruzam)</p></li></ul><h2>Utilizando ES|QL para dados geoespaciais em mapas do Kibana</h2><p>O Kibana adicionou suporte para Spatial ES|QL no aplicativo Maps. Isso significa que agora você pode usar o ES|QL para pesquisar dados geoespaciais no Elasticsearch e visualizar os resultados em um mapa.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Camadas do Kibana ES|QL" /><p>Existe uma nova opção de camada no menu "Adicionar camadas", chamada "ES|QL". Assim como todos os recursos geoespaciais descritos até agora, este está em "prévia técnica". Selecionar esta opção permite adicionar uma camada ao mapa com base nos resultados de uma consulta ES|QL. Por exemplo, você poderia adicionar uma camada ao mapa que mostrasse todos os aeroportos do mundo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="Kibana ES|QL - Aeroportos" /><p>Ou você poderia adicionar uma camada que mostre os polígonos do índice <code>airport_city_boundaries</code> , ou ainda melhor, que tal aquela consulta complexa <code>ENRICH</code> acima que gera estatísticas de quantos aeroportos existem em cada região?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL - Estatísticas da região" /><h2>O que vem a seguir?</h2><p>O blog anterior <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">sobre pesquisa geoespacial</a> focou no uso de funções como <code>ST_INTERSECTS</code> para realizar pesquisas, disponíveis no Elasticsearch desde a versão 8.14. E este blog mostra como importar os dados que usamos nessas pesquisas. No entanto, o Elasticsearch 8.15 trouxe uma função particularmente interessante: <code>ST_DISTANCE</code> que pode ser usada para realizar pesquisas eficientes de distância espacial, e este será o tema do próximo blog!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Craig Taverner]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>