Last9

oficial

Traga perfeitamente o contexto de produção em tempo real—logs, métricas e traces—para o seu ambiente local, corrigindo código automaticamente com mais rapidez.

O que você pode fazer com Last9 MCP?

  • Investigue incidentes em produção — Peça ao seu assistente para buscar logs, traces, métricas, exceções e alertas disparados de um serviço para que ele possa diagnosticar o que falhou.
  • Correlacione mudanças com impactos — Verifique implantações e alterações de configuração e, em seguida, compare um serviço e seus chamadores antes e depois para descobrir se uma mudança causou uma regressão.
  • Consulte métricas do Prometheus — Execute consultas PromQL de intervalo ou instantâneas e liste valores de rótulos para explorar qualquer métrica na sua fonte de dados.
  • Inspecione o desempenho do banco de dados — Descubra bancos de dados, encontre execuções de consultas lentas e analise padrões de consulta e métricas do lado do servidor a partir de spans do OTel.
  • Analise traces e perfis — Busque um waterfall de trace por ID, classifique desvios de atributos entre grupos ou obtenha um flamegraph e as principais funções de um serviço.
  • Gerencie alertas e dashboards — Revise a cobertura e a qualidade dos alertas, crie ou atualize regras de alerta e liste, valide ou edite dashboards personalizados.

Documentação

Last9 MCP Server

last9 mcp demo

Seu agente de IA não sabe o que está com problemas em produção. Isto resolve isso.

Last9 MCP Server conecta Claude, Cursor, Windsurf e qualquer outro assistente de IA compatível com MCP diretamente aos seus dados de observabilidade de produção — logs, métricas, traces, exceções, consultas ao banco de dados, alertas e implantações. O agente para de adivinhar e começa a ler os sinais reais.


Comece em 30 segundos (Hospedado)

Não é necessário instalar binários. Não é preciso gerenciar tokens. Basta uma URL, autenticação OAuth no navegador e pronto.

Encontre o slug da sua organização na URL do Last9: app.last9.io/<org_slug>/...

Claude Code

claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp

Digite /mcp, selecione last9 e autentique-se. É só isso.

Cursor

Settings > MCP > Add New MCP Server:

{
  "mcpServers": {
    "last9": {
      "type": "http",
      "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Clique em Connect e conclua a autenticação OAuth.

VS Code

Requer v1.99+. Abra a Paleta de Comandos → MCP: Add Server, cole a URL e autentique-se.

Ou diretamente em settings.json:

{
  "mcp": {
    "servers": {
      "last9": {
        "type": "http",
        "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
      }
    }
  }
}

Windsurf

Settings > Cascade > Open MCP Marketplace > ícone de engrenagem (mcp_config.json):

{
  "mcpServers": {
    "last9": {
      "serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Claude Web/Desktop

Settings > Connectors > Add custom connector. Dê o nome last9, cole a URL e autentique-se.

Requer acesso de administrador à sua organização do Claude.


Auto-hospedado (STDIO)

Use esta opção quando seu cliente MCP não oferecer suporte ao transporte HTTP ou quando precisar executar o servidor localmente.

Instalação

Homebrew:

brew install last9/tap/last9-mcp

NPM:

Requer Node.js 22.23.4+, 24.22.1+ ou 26.12.1+: versões anteriores aceitam certificados TLS das autoridades intermediárias comprometidas da eMudhra quando o instalador baixa o binário.

npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest

Versões binárias (Windows / manual):

Baixe em GitHub Releases:

PlataformaArquivo
Windows (x64)last9-mcp-server_Windows_x86_64.zip
Windows (ARM64)last9-mcp-server_Windows_arm64.zip
Linux (x64)last9-mcp-server_Linux_x86_64.tar.gz
Linux (ARM64)last9-mcp-server_Linux_arm64.tar.gz
macOS (x64)last9-mcp-server_Darwin_x86_64.tar.gz
macOS (ARM64)last9-mcp-server_Darwin_arm64.tar.gz

Obter um token de atualização

Somente administradores podem criar tokens.

  1. Acesse API Access
  2. Clique em Generate Token com permissões de gravação
  3. Copie-o

Configuração do cliente

Homebrew:

{
  "mcpServers": {
    "last9": {
      "command": "/opt/homebrew/bin/last9-mcp",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

NPM:

{
  "mcpServers": {
    "last9": {
      "command": "npx",
      "args": ["-y", "@last9/mcp-server@latest"],
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

Onde colar isto:

ClienteLocal
Claude Web/DesktopSettings > Developer > Edit Config (claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > Cascade > MCP Marketplace > ícone de engrenagem (mcp_config.json)
VS CodeEnvolva em { "mcp": { "servers": { ... } } } em settings.json — detalhes
Configuração STDIO do VS Code
{
  "mcp": {
    "servers": {
      "last9": {
        "type": "stdio",
        "command": "/opt/homebrew/bin/last9-mcp",
        "env": {
          "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
        }
      }
    }
  }
}

Para NPM: use "command": "npx" e adicione "args": ["-y", "@last9/mcp-server@latest"].

Windows

Após baixar de GitHub Releases, extraia e indique o caminho completo:

{
  "mcpServers": {
    "last9": {
      "command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

A opção NPM é mais fácil no Windows — sem gerenciamento de caminhos.

Variáveis de ambiente

VariávelPadrãoDescrição
LAST9_REFRESH_TOKEN(obrigatório)Token de atualização de API Access
LAST9_DATASOURCEorganização padrãoNome da fonte de dados/cluster — útil quando você tem vários clusters Levitate
LAST9_FAKE_NOW_ISO(não definido)Somente para avaliações/reproduções; nunca defina em produção. Instante RFC3339 (por exemplo, 2026-01-02T15:04:05Z) que substitui a hora atual ao resolver janelas relativas, como lookback_minutes, para que as execuções sejam reproduzíveis. Um valor inválido causa erro na inicialização. Os tempos limite, caches e a expiração do token continuam usando a hora real
LAST9_API_HOSTapp.last9.ioSubstitui o host da API
LAST9_TOOLSETStodas as ferramentasConjuntos de ferramentas separados por vírgula a serem expostos (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias: LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalseDefina true para disponibilizar somente ferramentas de leitura; consulte Modo somente leitura. Um valor que não seja booleano causa erro na inicialização. Alias: LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—Ferramentas de gravação separadas por vírgula que continuam disponíveis no modo somente leitura. Alias: LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000Número máximo de entradas para solicitações get_logs divididas em blocos
LAST9_USE_LOG_SEARCH_APIfalseDefina true para responder a get_logs e get_service_logs com uma única chamada de pesquisa no servidor, em vez de dividir em blocos no cliente. Cada chamada tem 90 segundos e, em seguida, retorna orientações para restringir a janela; um erro 502 ou 503 é repetido uma vez dentro desse prazo
LAST9_DEBUG_CHUNKINGfalseDefina true para registrar detalhes do planejamento de blocos para get_logs, get_service_logs, get_traces
LAST9_DISABLE_TELEMETRYtrueDefina false para habilitar o rastreamento OTel interno
OTEL_SDK_DISABLED—Variável de ambiente OTel padrão. Substitui LAST9_DISABLE_TELEMETRY
OTEL_EXPORTER_OTLP_ENDPOINT—Endpoint do coletor OTLP (somente quando a telemetria está habilitada)
OTEL_EXPORTER_OTLP_HEADERS—Cabeçalhos de autenticação OTLP (somente quando a telemetria está habilitada)

Temporização das fases das ferramentas

Com a telemetria interna habilitada, os spans das ferramentas incluem last9.phase.<phase>.duration_ms (milissegundos de tempo real decorrido) e last9.phase.<phase>.failed (se essa fase retornou um erro). Os mesmos campos são emitidos como logs de depuração tool phase completed, com tool e phase, quando o logger configurado aceita registros de depuração. Essas medições de tempo não adicionam entradas, texto de consultas, credenciais nem corpos de erro.

FerramentaFases
get_log_patternssample: busca e decodificação da amostra; mine: mineração de padrões; deep_link: resolução do índice opcional e criação do link
get_logsfetch: busca, decodificação e mesclagem dos resultados, incluindo novas tentativas e verificações opcionais de consistência da contagem; count_sanity: verificação opcional aninhada; post_process: orientações, resumo e formatação JSON; deep_link: resolução do índice e criação do link
get_service_profilerequest: preparação e envio da solicitação pelo cliente de API compartilhado e leitura da resposta completa, antes da formatação resumida

Somente as fases executadas são registradas, inclusive as buscas que falham. Os auxiliares opcionais que suprimem erros mantêm esse comportamento; failed: false não garante que um link opcional ou uma verificação de contagem estivesse disponível. A duração aninhada de count_sanity já está incluída em fetch; não a some duas vezes. O tempo de busca inclui o trabalho do cliente, portanto não mede apenas a execução no backend. Compare essas fases em janelas e caminhos de pesquisa equivalentes antes de ajustar a amostragem ou o cache.

Para investigar a latência, reproduza o mesmo serviço, fonte de dados, índice, janela e limites nas versões de referência e candidata. Registre o SHA da versão, o total da ferramenta, as durações das fases, last9.logs.search_path, os atributos de novas tentativas, quando presentes, e os indicadores de cobertura. Compare também as chamadas lentas, não apenas as típicas. Uma busca lenta ou uma solicitação de perfil identifica uma fase de rede/API a investigar; a execução no backend precisa de evidências correlacionadas próprias antes que a cauda de latência seja atribuída ao backend. Esses diagnósticos, por si só, não comprovam uma melhoria de latência.

Modo somente leitura

--read-only (ou LAST9_MCP_READ_ONLY=true) disponibiliza somente ferramentas anotadas com readOnlyHint: true, portanto nenhuma ferramenta pode criar, alterar ou excluir regras de alerta, canais de notificação, painéis ou regras de descarte, confirmar ou reatribuir alertas, nem silenciar grupos. Uma ferramenta sem anotações é considerada uma ferramenta de gravação e fica oculta.

Para manter algumas ferramentas de gravação, liste-as com --allow-write-tools (ou LAST9_MCP_ALLOW_WRITE_TOOLS):

last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
  • O servidor se recusa a iniciar se um nome permitido não for uma ferramenta de gravação (por exemplo, um erro de digitação ou o nome de uma ferramenta de leitura); o erro lista as ferramentas de gravação válidas.
  • --allow-write-tools sem --read-only causa erro na inicialização, pois todas as ferramentas de gravação já estão disponíveis.
  • O modo somente leitura combina com --toolsets: uma ferramenta só fica disponível se passar por ambos. --toolsets=alerts --read-only --allow-write-tools=mute_alert_group disponibiliza as ferramentas de leitura de alertas mais mute_alert_group; uma ferramenta de gravação permitida que esteja fora dos conjuntos de ferramentas selecionados continua oculta.
  • O modo --http e dump-tools respeitam os mesmos sinalizadores e variáveis de ambiente: go run . dump-tools --read-only exibe a superfície somente leitura, com as instruções do servidor disponibilizadas em instructions.
  • As descrições, os esquemas e os resultados das ferramentas de leitura, assim como as instruções do servidor, nunca mencionam uma ferramenta de gravação oculta. Uma ferramenta de gravação permitida ainda pode mencionar suas ferramentas irmãs ocultas (create_alert cria uma regra desativada que patch_alert ativa), portanto permita esses pares em conjunto.

O que ele pode fazer

Orientação

  • get_workspace_overview — Primeira chamada recomendada quando uma solicitação não especifica serviço nem ferramenta (se especificar, vá diretamente à ferramenta correspondente): ambientes, sinais observados na última hora (logs, traces, métricas), contagens de serviços e grupos de alertas, alertas ativos e a hora atual, tudo em uma única chamada de baixo custo. Um sinal não observado nessa hora ainda pode ter dados mais antigos e, portanto, continuar disponível para consulta. Se uma subchamada falhar, seu campo fica null e uma entrada errors[] é adicionada. Disponível em todos os conjuntos de ferramentas
  • get_current_time — Hora atual, além dos limites absolutos para last 2h, yesterday ou since yesterday 9am IST, em qualquer fuso horário IANA ou abreviação comum. Disponível em todos os conjuntos de ferramentas

Integridade dos serviços

  • get_service_summary — Linhas da frota (service, env) ordenadas por classificação: request_count do intervalo, throughput_rpm, contagens de erros HTTP 4xx/5xx e contagens de erros gRPC
  • get_service_environments — Ambientes disponíveis para seus serviços. Execute isto primeiro — outras ferramentas APM precisam de env obtido aqui
  • get_service_performance_details — Detalhamento completo: throughput, taxa de erros, p50/p90/p95/média/máximo, apdex, disponibilidade (resumido por padrão; série completa com include_series)
  • get_service_operations_summary — Operações agrupadas por endpoints HTTP, chamadas ao banco de dados, mensagens e clientes HTTP
  • get_service_dependency_graph — Mapa de dependências com throughput, latência e taxas de erro para upstream/downstream/infraestrutura
  • get_apm_service_deviations — Compara uma janela atual com uma linha de base de igual duração: regressões/melhorias, reconciliação do Apdex e um resultado final (frota ou serviço individual)
  • get_exceptions — Exceções no servidor com filtros de serviço e span

Observabilidade de banco de dados

Quatro ferramentas que analisam diretamente o desempenho do seu banco de dados, com base em spans de trace do OpenTelemetry e, quando não há traces, em métricas de infraestrutura, como as do CloudWatch. Não é necessária instrumentação adicional se você já usa OTel.

  • get_databases — Descubra todos os bancos de dados em toda a sua infraestrutura: tipo de banco de dados, host, throughput (consultas/min), latência p95, taxa de erros e número de serviços dependentes. Também descobre bancos de dados a partir de métricas de infraestrutura, como CloudWatch, sem necessidade de instrumentação de traces — essas linhas apresentam um valor de atividade em vez de métricas de traces
  • get_database_slow_queries — As execuções de consultas realmente mais lentas, ordenadas por duração, com IDs de trace para investigar traces completos
  • get_database_queries — Padrões e agregações de consultas: frequência de execução, duração média/p95 e taxa de erros
  • get_database_server_metrics — Métricas do lado do servidor, coletadas diretamente no host do banco de dados (CPU, conexões, taxas de acerto do buffer — dependem do sistema de banco de dados)

Compatível com PostgreSQL, MySQL, MongoDB, Redis, Aerospike e qualquer outro sistema cujos traces OTel tenham um atributo db_system — além de bancos de dados descobertos a partir de métricas de infraestrutura, como CloudWatch, cujas linhas apresentam um valor de atividade em vez de métricas de traces.

Prometheus / PromQL

  • prometheus_range_query — Consultas de intervalo PromQL para qualquer métrica
  • prometheus_instant_query — Consultas instantâneas; use funções de agregação como avg_over_time, sum_over_time
  • prometheus_label_values — Valores de rótulos para uma determinada série
  • prometheus_labels — Todos os rótulos disponíveis para uma série

Direcione essas consultas para uma fonte de dados/cluster diferente do padrão definindo LAST9_DATASOURCE, ou por chamada com datasource. Se datasource for omitido, será usada a fonte padrão; uma correspondência aproximada única que o mecanismo considere segura (como uma variação de maiúsculas e minúsculas) usará a correspondência mais próxima. Não há garantia de resolução automática para diferenças como uma letra ausente, extra ou transposta: até mesmo um único candidato pode exigir confirmação quando a alteração puder afetar um código de região ou ambiente. Correspondências mais imprecisas ou ambíguas retornam candidatos e não executam nenhuma consulta (sem gerar erro); nomes desconhecidos retornam um erro. Um bloco de conteúdo adicional informa qual fonte de dados foi usada sempre que você não a nomear exatamente. get_metric_status, get_service_profile e get_apm_service_deviations resolvem datasource da mesma forma.

Logs

  • get_logs — Consultas de logs em pipeline JSON completo (agregações, filtros, extração de campos)
  • get_service_logs — Linhas de log de um serviço, filtráveis por gravidade e conteúdo do corpo; resumidas em 20 linhas, a menos que response_mode seja raw
  • get_log_patterns — Linhas de log de um serviço em um intervalo, agrupadas em modelos de mensagem, com contagem, primeira/última ocorrência, distribuição de gravidade e uma amostra
  • get_emerging_log_patterns — Modelos de log novos, aumentados, reduzidos ou desaparecidos em relação a um intervalo de referência, com contagens de ambos os intervalos
  • get_log_attributes — Catálogo global de atributos no esquema de logs para um intervalo de tempo
  • get_log_attributes_for_pipeline — Campos de log realmente presentes em um pipeline em andamento (descoberta com escopo definido), cada um com seu filter_field exato
  • get_drop_rules — Regras de descarte de logs do Last9 Control Plane
  • add_drop_rule — Crie uma nova regra de descarte para reduzir o volume de logs na origem
  • get_remapping_rules — Regras de remapeamento (logs_extract, logs_map, traces_map) do Last9 Control Plane
  • add_remapping_rule — Crie uma regra de remapeamento que extraia ou mapeie atributos de logs e traces durante a ingestão

Traces

  • get_traces — Consultas de traces em pipeline JSON para pesquisas e agregações abrangentes
  • get_service_traces — Traces por ID de trace exato ou nome do serviço. Use esta opção quando tiver um ID de trace — é mais rápida
  • get_trace_attributes — Catálogo global de atributos no esquema de traces
  • get_trace_attributes_for_pipeline — Atributos realmente presentes em um pipeline em andamento (descoberta com escopo definido), cada um com seu filter_field exato
  • get_trace_attribute_values — Valores distintos de um atributo de trace, opcionalmente com escopo definido para um pipeline
  • get_trace_attribute_deviations — Classifica valores de atributos que diferem entre duas coortes de spans delimitadas (lentos vs. rápidos, com erro vs. sem erro ou dois intervalos de tempo). Correlação, não causa
  • get_trace_waterfall — Um trace exato como cascata de spans pai/filho, com tempo próprio de união de intervalos, spans mais lentos e avisos sobre o grafo

Eventos de alteração e alertas

  • get_change_events — Implantações, alterações de configuração e reversões. Correlacione incidentes com o que mudou
  • analyze_change_impact — Uma alteração causou algum problema? Compara um serviço e seus chamadores diretos antes e depois de uma alteração: sinais de ouro, desvios de APM e atributos de trace, novos alertas disparados e um veredito (regression likely / no significant change / insufficient data)
  • get_alert_groups — Grupos de alertas do Compass configurados, com rótulos de metadados, equipe, nível e contagem de regras — incluindo grupos sem regras e grupos que não estão disparando
  • get_alert_operations_summary — Estado de plantão em um intervalo: alertas gerados vs. reconhecidos, pendências, entregas e, com include_rules, as regras mais ruidosas, instáveis e sem roteamento. Cada contagem inclui seu status (available / partial / unavailable)
  • get_alert_coverage — O que não está coberto por alertas: sinais de ouro sem cobertura, grupos de alertas totalmente desativados ou sem roteamento e regras silenciadas por tempo demais, cada um com uma ferramenta de correção sugerida. Somente leitura.
  • get_alert_config — Configurações de regras de alerta — pesquisáveis por nome, gravidade, tipo e tags
  • get_entity_kpis — Cada KPI (id, nome, PromQL, unidade) de um grupo de alertas, incluindo KPIs ainda não usados por nenhuma regra — os IDs de que create_alert e validate_alert_expression precisam
  • create_kpi — Crie um KPI (PromQL + unidade) em um grupo de alertas quando nenhum KPI existente for adequado. Crie uma vez e mantenha o ID retornado
  • get_alerts — Alertas atualmente disparados em um intervalo de tempo
  • get_alert_rule_state — Estado histórico de disparo (1/0) por regra de alerta em um intervalo de tempo, agrupado por rule_id. Pode ser filtrado por grupo de alertas, nome da regra, filtros de rótulo e estado.
  • get_alert_hygiene — Regras de alerta ruidosas, instáveis, obsoletas e sem roteamento nos últimos 7 ou 30 dias, classificadas, cada uma com os números que fundamentam o veredito e uma correção sugerida. Somente leitura.
  • get_notification_channels — Canais de notificação configurados (Slack, PagerDuty, e-mail etc.). scope=channels lista os próprios canais (IDs para anexação); o padrão attached lista as associações por grupo de alertas
  • recommend_alert_config — Orientações de design somente leitura (ciclo de vida, etapas de validação, contexto para quem responde) antes de criar uma regra de alerta
  • validate_alert_expression — Teste uma expressão de alerta com os KPIs de um grupo de alertas sem salvar nada
  • describe_alert_chart — Somente leitura: os sinais que podem gerar alertas (chave, unidade) em um gráfico do Discover (discover-service, discover-exceptions)
  • create_alert — Crie uma regra de alerta (estática ou adaptativa via adaptive_std_cmp) em um grupo de alertas existente; ela sempre será criada desativada como rascunho. Crie uma vez; refine com update_alert / patch_alert
  • create_alert_from_chart — Crie uma regra de alerta de limite estático a partir de um gráfico do Discover em uma única chamada. Assim como create_alert, a regra é criada desativada como rascunho
  • update_alert — Substituição completa da configuração de avaliação de uma regra (pode retornar um ID de regra substituto)
  • patch_alert — Alteração parcial de uma regra: ativar/pausar, mute_until, responsável properties, recurring_mute_schedule semanal (ou clear_recurring_mute_schedule)
  • delete_alert — Exclua permanentemente uma regra de alerta
  • mute_alert_group — Silencie (ou reative) todas as regras de um grupo de alertas até um prazo determinado
  • acknowledge_alert — Assuma a responsabilidade por um alerta disparado ou libere-a
  • reassign_alert — Transfira um alerta já reconhecido para outro usuário
  • create_notification_channel — Crie um canal do Slack, PagerDuty, Opsgenie, e-mail ou webhook genérico
  • attach_notification_channel — Direcione um canal existente para um grupo de alertas para breach, threat ou ambos
  • detach_notification_channel — Remova uma associação entre um canal e um grupo de alertas
  • delete_notification_channel — Exclua permanentemente um canal sem associações

As ferramentas de gravação de alertas (create_kpi, create_alert, update_alert, patch_alert, delete_alert, create_alert_from_chart, mute_alert_group, acknowledge_alert, reassign_alert, create_notification_channel, attach_notification_channel, detach_notification_channel, delete_notification_channel) precisam de um token com escopo de gravação; delete_alert, detach_notification_channel e delete_notification_channel precisam de escopo de exclusão. Elas são expostas somente no conjunto de ferramentas alerts.

As regras, os canais e as associações criados por essas ferramentas são marcados com created_via: last9-mcp, junto com o nome e a versão do cliente MCP (nas regras, as anotações _l9_created_via_ e _l9_created_via_client_, que patch_alert e update_alert mantêm e que os chamadores não podem definir). get_entity_alert_rules e get_notification_channels mostram o marcador, e delete_alert, detach_notification_channel e delete_notification_channel orientam os agentes a limpar somente os recursos marcados, a menos que o usuário indique um recurso específico.

Painéis personalizados

  • list_dashboards — Painéis personalizados filtrados por nome e paginados abaixo de 32 KB: IDs, nomes, horários da última atualização, autores e estado de bloqueio
  • get_dashboard — Definição completa do painel por ID, incluindo painéis e consultas
  • preview_dashboard — Pré-visualização somente leitura de um painel ou patch não salvo: consultas resolvidas, resultados limitados por painel e diferenças líquidas entre painéis; nunca salva
  • validate_dashboard — Lint + execução + classificação somente leitura para um ID de painel salvo ou um dashboard_definition em linha, em um intervalo de ≤24h. Nunca cria nem atualiza painéis
  • create_dashboard — Crie um painel personalizado totalmente novo uma única vez (painéis, consultas, metadados). Depois que o ID for retornado, edite os painéis com patch_dashboard.
  • update_dashboard — Reestruture a maior parte de um painel existente por ID (substituição completa; painéis de sistema somente leitura retornam um erro). Para editar painéis individuais, use patch_dashboard
  • patch_dashboard — Edições direcionadas a um painel existente por ID (adicionar/atualizar/remover/mover painel, definir título, definir variável); retorna uma diferença compacta, não o painel completo
  • delete_dashboard — Exclua um painel personalizado por ID
  • set_dashboard_lock — Bloqueie ou desbloqueie um painel personalizado por ID (somente o autor ou um administrador da organização); um painel bloqueado recusa atualizações, patches e exclusões
  • list_dashboard_snapshots — Capturas congeladas de um painel em um momento específico (somente metadados)
  • get_dashboard_snapshot — Captura congelada completa, incluindo dados dos painéis, para RCA / visualizações compartilháveis
  • delete_dashboard_snapshot — Exclua uma captura congelada por ID

A criação de painéis está disponível por meio de MCP prompts/list e prompts/get, sem instalar uma skill. Os três prompts não recebem argumentos:

  • create_dashboard_guide — Descoberta, layout e seleção de painéis; valide o candidato completo e execute a consulta de cada painel antes da aprovação, crie uma vez, aplique patches para edições direcionadas e, em seguida, leia novamente.
  • dashboard_examples — Um exemplo completo que abrange RED do serviço, latência de endpoints, classes de status, integridade do host, contagens de logs e painéis de traces, com variáveis dependentes.
  • query_guide — Semântica de métricas de contador/medidor/histograma e métricas de trace derivadas, instantâneas versus de intervalo, janelas de taxa, limites percentuais e regras de logjson/tracejson.

O mesmo conteúdo pode ser consultado em last9://reference/create_dashboard_guide, last9://reference/dashboard_examples e last9://reference/query_guide. Os prompts e recursos continuam disponíveis para descoberta em todos os conjuntos de ferramentas; para executar o fluxo de trabalho, são necessárias as ferramentas relevantes (para criação com sinais mistos, use --toolsets=dashboards,investigate, que também atende a list_datasources). Sessões somente leitura podem preparar e validar, mas não podem salvar. Verifique a disponibilidade das ferramentas antes de seguir uma etapa.

As verificações de painéis usam atualmente prometheus_range_query, prometheus_instant_query, get_logs e get_traces, além de validate_dashboard. Os tipos de consulta não compatíveis com o validador e os padrões simplificados não garantem paridade de renderização. A etapa separada de verificação de consultas passará a usar query_panel após a integração de #475.

Criação contínua de perfis

Requer que a criação contínua de perfis esteja habilitada para a organização. Primeiro, descubra os serviços com get_profile_services; em seguida, obtenha um flamegraph ou as funções classificadas.

  • get_profile_services — Serviços com dados de perfil na janela (índice antes da consulta)
  • get_flamegraph — Árvore de flamegraph aninhada para um serviço (cpu padrão; também alloc, wall)
  • get_top_functions — Classificação de amostras próprias das funções mais quentes de um serviço
  • get_profile_summary — Triagem breve em linguagem natural do perfil de um serviço

Painéis do Grafana

Ferramentas somente de leitura para a instância do Grafana da organização (por meio do proxy do Grafana do Last9). Os campos de credenciais nunca são retornados ao modelo. Ative com LAST9_TOOLSETS=grafana (ou deixe os conjuntos de ferramentas sem definição para usar todas as ferramentas).

  • grafana_search_dashboards — Pesquisar painéis por trecho do título (paginado; truncated: true quando o limite é atingido)
  • grafana_get_dashboard — Resumo do painel por uid (painéis, variáveis, destinos PromQL); full_json=true para o JSON bruto do Grafana
  • grafana_list_folders — Árvore de pastas
  • grafana_list_folder_dashboards — Painéis em uma pasta (paginado)
  • grafana_list_datasources — Inventário de fontes de dados sem credenciais

Resolução de nomes aproximados

  • did_you_mean — Quando o agente não tem certeza sobre o nome de uma entidade, retorna as correspondências mais próximas do seu catálogo (serviços, ambientes, hosts, bancos de dados, implantações/namespaces do K8s, jobs). Até 3 sugestões com pontuações de similaridade. O servidor chama essa ferramenta automaticamente antes da maioria das ferramentas quando uma busca por nome não retorna resultados.

Perfil do serviço

  • get_service_profile — Como é a telemetria real de um serviço, antes de consultá-la: quais sinais existem, linguagem e runtime, ambientes de implantação, formato dos logs e uma correção de ingestão recomendada, quando aplicável. Permite que o agente ignore as ferramentas de traces quando um serviço não tem traces e analise a severidade no corpo do log quando SeverityText estiver vazio, em vez de filtrá-la e não encontrar nada.

Como funciona

Links diretos em todas as respostas. Cada ferramenta retorna um campo deep_link — um URL direto para o painel do Last9 com a consulta e o intervalo de tempo exatos. O agente pode fornecer o link; você clica nele; pronto.

Conjuntos de ferramentas. Por padrão, o servidor expõe todas as ferramentas. Hosts de automação que precisam apenas de investigação (logs/traces/métricas/perfis) podem definir LAST9_TOOLSETS=investigate (ou passar --toolsets=investigate) para manter tools/list pequeno sem desativar ferramentas em massa no cliente. Pacotes nomeados: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Nomes desconhecidos geram erro imediatamente. get_current_time e get_workspace_overview são disponibilizados em todos os conjuntos de ferramentas. No modo HTTP, uma solicitação pode restringir ainda mais esse conjunto com o cabeçalho X-Last9-Toolsets (consulte Conjuntos de ferramentas por solicitação). O pacote alerts também disponibiliza os recursos somente de leitura prometheus_range_query e get_dashboard, chamados pelo prompt author-alert. O pacote metrics sozinho não inclui list_datasources nem did_you_mean — use investigate (ou combine conjuntos de ferramentas) quando precisar desses auxiliares de descoberta.

Recursos de referência das ferramentas. Manuais extensos de logjson/tracejson/service-logs/metrics são recursos MCP (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting), não texto de descrição de ferramenta sempre ativo. O manual de alertas aborda a gramática das expressões de alerta, campos estáticos e adaptativos, unidades, o que validate_alert_expression verifica e modelos de regras de latência/taxa de erros/saturação. As regras críticas de consulta permanecem na descrição da ferramenta para que agentes que nunca chamem resources/read ainda recebam orientações corretas de construção. Descubra campos específicos da organização com get_log_attributes / get_log_attributes_for_pipeline (e os equivalentes de traces) — eles não são injetados nas descrições.

Resultados grandes em blocos. get_logs e get_traces lidam com grandes conjuntos de resultados dividindo-os em blocos, em vez de truncá-los. O limite padrão é de 5000 entradas para logs; configurável por meio de LAST9_MAX_GET_LOGS_ENTRIES.


Desenvolvimento

Modo HTTP, testes com curl, compilação a partir do código-fonte

Executar no modo HTTP

export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server

O servidor é iniciado em http://localhost:8080/mcp.

Testar com curl

O manipulador HTTP Streamable é executado em modo sem estado, portanto cada solicitação é atendida de forma independente. Um handshake initialize e um cabeçalho Mcp-Session-Id são opcionais — clientes que os enviam continuam funcionando (o cabeçalho é aceito e ignorado), e os clientes também podem ir direto para tools/list / tools/call. Cada ferramenta é uma consulta independente de solicitação/resposta; o servidor não envia notificações servidor→cliente, portanto GET /mcp (o fluxo SSE) retorna 405.

# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

# Call a tool
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/call",
      "params": {
        "name": "get_service_logs",
        "arguments": {
          "service_name": "your-service-name",
          "lookback_minutes": 30,
          "limit": 10
        }
      }
    }'

Conjuntos de ferramentas por solicitação

No modo HTTP, uma solicitação pode restringir o conjunto de ferramentas com o cabeçalho X-Last9-Toolsets ou o parâmetro de consulta toolsets para clientes que não podem definir cabeçalhos (/mcp?toolsets=logs,traces). Se ambos forem enviados, um cabeçalho não vazio tem prioridade. O valor aceita os mesmos nomes separados por vírgulas que --toolsets. A solicitação recebe a interseção com o conjunto de inicialização --toolsets: pode restringi-lo, nunca ampliá-lo, e all ou um valor vazio mantém o conjunto de inicialização. Um nome desconhecido retorna 400 indicando-o. tools/list, tools/call e as instruções de initialize seguem o conjunto efetivo; get_current_time e get_workspace_overview permanecem em todos os conjuntos.

curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -H "X-Last9-Toolsets: logs,alerts" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

Cada conjunto efetivo distinto é atendido por seu próprio servidor, criado na primeira solicitação (dezenas de milissegundos) e mantido até o encerramento; uma solicitação que repete o conjunto de inicialização reutiliza o servidor de inicialização. Não há remoção de entradas: somente conjuntos de ferramentas nomeados são aceitos, portanto o cache mantém no máximo um servidor por combinação deles (135 atualmente, cerca de 75 MB de heap ativo no total; em testes, o cache completo estabilizou perto de 230 MB de memória residente).

Compilar a partir do código-fonte

git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server

LAST9_HTTP=true é para desenvolvimento local. Para uso real, o endpoint HTTP hospedado é mais simples.


Referência das ferramentas

Todos os parâmetros, padrões de entrada de tempo e detalhes

Entrada de tempo

  • Horários absolutos (start_time_iso/end_time_iso ou time_iso) têm prioridade sobre lookback_minutes.
  • Para intervalos relativos: use lookback_minutes.
  • Para intervalos absolutos: use RFC3339/ISO8601 — 2026-02-09T15:04:05Z.
  • O legado YYYY-MM-DD HH:MM:SS é aceito apenas por compatibilidade.
  • Converta expressões como since yesterday 9am IST em limites RFC3339 com get_current_time.

get_workspace_overview

Sem parâmetros. Sonda os últimos 60 minutos simultaneamente, com cada subchamada usando um tempo limite curto, e retorna current_time, lookback_minutes, environments, telemetry (booleanos logs/traces/metrics), service_count (classificações get_service_summary de serviços distintos, todos os ambientes), alert_group_count, firing_alert_count e errors ([{field, error}]). Um campo cuja subchamada falhou é null (desconhecido), nunca 0 nem false. As sondagens não são restringidas por --toolsets: os conjuntos de ferramentas filtram quais ferramentas são disponibilizadas, e o token da API define o que o servidor pode ler.

get_current_time

  • range (string, opcional): last 2h, past 30 minutes, last 7d (s, m, h, d = 24h, w = 7d; no máximo 366d); today; yesterday; since <point>; <point> to <point>. Um instante pode estar em RFC3339 ou ser today / yesterday / um dia da semana (monday, mon: ocorrência mais recente, incluindo hoje) / YYYY-MM-DD com um 9am, 9:30pm ou 14:30 opcional. Um fuso horário ao final substitui timezone para ambos os limites; um fuso em qualquer outra posição é um erro. Omita para obter apenas now.
  • timezone (string, opcional): nome ou abreviação IANA (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). O padrão é UTC. Fusos desconhecidos geram erro, assim como o ambíguo CST (passe America/Chicago ou Asia/Shanghai).

Retorna now (e start/end com range) como {iso, epoch_seconds, local}; local aparece apenas para um fuso diferente de UTC.

get_exceptions

  • limit (inteiro, opcional): Número máximo de exceções. Padrão: 20.
  • lookback_minutes (inteiro, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional): Intervalo de tempo absoluto.
  • service_name (string, opcional): Filtrar por serviço.
  • span_name (string, opcional): Filtrar por nome do span.
  • env (string, opcional): Filtrar por ambiente.

get_service_summary

  • start_time_iso / end_time_iso (string, opcional)
  • env (string, opcional): Expressão regular PromQL. O padrão é .*. Uma correspondência exata exige âncoras (por exemplo, ^prod$).
  • sort_by (string, opcional): request_count (padrão), throughput_rpm, http_4xx_count, http_5xx_count ou grpc_error_count.
  • limit (inteiro, opcional): Número máximo de linhas classificadas. Omitir ou usar 0 significa 10; valores acima de 100 são limitados a 100.

get_service_environments

  • start_time_iso / end_time_iso (string, opcional)

Todas as outras ferramentas de APM exigem um valor env. Use "" se este retornar vazio.

get_service_performance_details

Retorna por padrão um resumo por série: points, missing_points (intervalos de disponibilidade sem tráfego, excluídos das estatísticas), min, p50, p90, p99 (nearest-rank), max, mean, last, baseline_mean (média da primeira metade dos pontos válidos, não do intervalo), delta_pct (segunda metade dos pontos válidos em relação à linha de base; ausente se a linha de base for 0) e até 3 change_points (timestamp, before_mean, after_mean), para até 4 séries por métrica e cada quantil de tempo de resposta (maior média primeiro; series_omitted contabiliza as demais). Uma série com points: 0 não contém estatísticas, e baseline_mean/delta_pct exigem pelo menos 6 pontos (3 por metade). full_series indica que os pontos brutos estão disponíveis por meio de include_series.

  • service_name (string, obrigatório)
  • lookback_minutes (inteiro, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)
  • env (string, opcional): O padrão é prod.
  • top_n (inteiro, opcional): Número máximo de entradas por lista de principais operações/principais erros. Padrão: 5, ou 10 com include_series=true. Máximo: 100.
  • include_series (booleano, opcional): Retornar todos os pontos de todas as séries em vez do resumo. Padrão: false.

get_service_operations_summary

  • service_name (string, obrigatório)
  • lookback_minutes (inteiro, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)
  • env (string, opcional): O padrão é prod.

get_service_dependency_graph

  • service_name (string, opcional)
  • lookback_minutes (inteiro, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)
  • env (string, opcional): O padrão é prod.

get_apm_service_deviations

  • service_name (string, opcional): Omita para o escopo da frota; informe para um serviço e suas correlações de operação.
  • lookback_minutes (integer, opcional): Janela atual. Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional): Janela atual explícita.
  • baseline_start_time_iso / baseline_end_time_iso (string, opcional): Linha de base explícita. O padrão é a janela de mesma duração imediatamente anterior.
  • datasource (string, opcional): Omita para usar o padrão; nomes aproximados são resolvidos como nas ferramentas do Prometheus. A resposta informa o padrão ou a correspondência mais próxima usada; nomes ambíguos retornam candidatos sem fazer consultas.
  • env (string, opcional): O padrão é prod.
  • max_services / max_operations (integer, opcional): Padrão 10, máximo 10 cada.

get_databases

  • env (string, opcional): Filtrar por ambiente. Aceita uma expressão regular. Padrão: todos.
  • lookback_minutes (integer, opcional): Padrão: 60. A janela não pode exceder 7 dias.
  • start_time_iso / end_time_iso (string, opcional)

get_database_slow_queries

  • db_system (string, opcional): por exemplo, postgresql, mysql, mongodb, redis.
  • host (string, opcional): Host do banco de dados (net_peer_name).
  • service_name (string, opcional): Nome do serviço chamador.
  • env (string, opcional)
  • min_duration_ms (float, opcional): Duração mínima da consulta em ms.
  • lookback_minutes (integer, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)
  • limit (integer, opcional): Padrão: 20.

get_database_queries

  • db_system (string, opcional)
  • host (string, opcional)
  • service_name (string, opcional)
  • env (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)
  • limit (integer, opcional): Padrão: 20.

get_database_server_metrics

  • db_system (string, obrigatório): por exemplo, postgresql, mysql, mongodb, redis, aerospike.
  • host (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)

prometheus_range_query

  • query (string, obrigatório): A consulta PromQL.
  • start_time_iso / end_time_iso (string, opcional): O padrão são os últimos 60 min.
  • lookback_minutes (float, opcional): Padrão: 60.

prometheus_instant_query

  • query (string, obrigatório)
  • time_iso (string, opcional): O padrão é agora.
  • lookback_minutes (float, opcional)

prometheus_label_values

  • match_query (string, opcional): Filtro PromQL.
  • label (string, obrigatório): Nome do rótulo.
  • lookback_minutes (float, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)

Quando nenhuma janela é informada e match_query nomeia uma métrica (metric{...} ou {__name__="metric"}), um resultado vazio de 60 minutos é consultado novamente uma vez, abrangendo 4 dias; um segundo bloco de texto informa qual janela o resultado cobre.

prometheus_labels

  • match_query (string, opcional): Filtro PromQL.
  • lookback_minutes (float, opcional): Padrão: 60.
  • start_time_iso / end_time_iso (string, opcional)

Tenta novamente uma consulta vazia de métrica única abrangendo 4 dias, como prometheus_label_values.

get_logs

  • logjson_query (array, obrigatório): Consulta de pipeline JSON.
  • lookback_minutes (integer, opcional): Padrão: 5.
  • start_time_iso / end_time_iso (string, opcional)
  • limit (integer, opcional): Padrão do servidor: 5000.
  • index (string, opcional): physical_index:<name> ou rehydration_index:<block_name>.
  • response_mode (string, opcional): summary (padrão; também para null) ou raw. Um resultado de linhas brutas com mais de 20 linhas é retornado como summary: lines_summarized, severity_counts (os seis principais rótulos, os demais em other_severities), first_timestamp/last_timestamp, um histogram de 10 intervalos na janela da consulta (sobre as linhas retornadas, com truncated: true, quando o limite truncar o resultado) e os principais patterns (template, count, até dois samples), com o restante totalizado em other, no máximo 4000 caracteres; metadados de nível superior que ainda não couberem serão descartados e identificados em dropped_fields. raw retorna as linhas. Resultados agregados nunca são resumidos.

Para inventário de serviços baseado em logs, consulte primeiro physical_index_service_count:

sum by (name, service_name, env) (physical_index_service_count{destination="logs"})

Use service_name como ServiceName, env como ambiente quando presente e name como nome do índice físico. Se name="default", omita index; para um índice físico não padrão selecionado pelo usuário, informe index: "physical_index:<name>". Se o backend rejeitar a filtragem explícita por índice físico, tente novamente sem index e informe que a filtragem explícita por índice físico não está disponível para esse backend.

get_service_logs

  • service_name (string, obrigatório)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • limit (integer, opcional): Padrão: 100, ou 20 com response_mode: "raw".
  • env (string, opcional)
  • severity_filters (array, opcional): por exemplo, ["error", "warn"]. Lógica OR.
  • body_filters (array, opcional): por exemplo, ["timeout", "failed"]. Lógica OR.
  • start_time_iso / end_time_iso (string, opcional)
  • index (string, opcional)
  • response_mode (string, opcional): summary (padrão; também para null) ou raw. Com mais de 20 linhas, logs é substituído pelo mesmo summary de get_logs, mantendo os outros campos; raw retorna as entradas.

Vários tipos de filtro são combinados com AND. Cada array usa OR internamente. Use get_logs primeiro para contagens agregadas abrangentes; use get_service_logs somente depois de restringir a consulta a um serviço/ambiente/índice e a um pequeno conjunto de amostras.

get_log_patterns

  • service_name (string, obrigatório)
  • env (string, opcional)
  • start_time_iso / end_time_iso (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • severity_filters / body_filters (array, opcional): Lógica OR, como em get_service_logs. Defina severity_filters somente quando get_service_profile informar severity_set all; com none ou partial, ele descarta linhas cuja severidade esteja no corpo.
  • index (string, opcional)
  • sample_size (integer, opcional): Linhas amostradas da janela, da mais recente para a mais antiga. Padrão: 1000, máximo: 5000.
  • top_n (integer, opcional): Modelos retornados por contagem. Padrão: 20, máximo: 100. O restante é totalizado em other.

O agrupamento é executado no servidor MCP sobre as linhas amostradas; portanto, as contagens, first_seen e last_seen correspondem à amostra. window.sample_limit_reached informa quando a amostra pode não incluir linhas correspondentes (ela contém sample_size linhas e a API não informa um total_matching_lines exato igual a esse, ou a busca foi logs_truncated), caso em que contém apenas as linhas mais recentes da janela. Cada template e sample é truncado em 500 caracteres e termina em …; assim, um corpo que não seja agrupado (como JSON sem um campo message) não pode preencher a resposta. Uma busca com blocos que falharam é um erro da ferramenta; uma busca truncada ou limitada ainda retorna padrões, sinalizados por sample_limit_reached. Uma lista patterns vazia significa que nada correspondeu somente quando sample_limit_reached é falso; quando é verdadeiro, a busca foi interrompida antes do fim e pode ter deixado de encontrar linhas correspondentes.

get_emerging_log_patterns

Aceita todos os parâmetros de get_log_patterns (o intervalo de tempo é a janela atual), além de:

  • baseline_start_time_iso / baseline_end_time_iso (string, opcional): Defina ambos ou nenhum. Padrão: a janela de mesma duração imediatamente anterior à atual.
  • min_count (integer, opcional): Número de linhas que um padrão alterado precisa ter na janela em que aparece mais: atual para new/increased, linha de base para decreased/disappeared. Padrão: 3 (ou sample_size se for menor), máximo: sample_size.
  • change_factor (number, opcional): Razão de frequência, maior que 1, que um padrão presente nas duas janelas precisa atingir (increased) ou cair para o inverso de (decreased). Padrão: 2.

Os dois limites precisam ser atendidos; portanto, um modelo de alto volume cuja frequência não tenha mudado por change_factor nunca é informado. Retorna somente modelos alterados (new, increased, decreased, disappeared), com contagens de current e baseline; unchanged_patterns conta os modelos presentes nas duas janelas cuja alteração foi inferior a change_factor, e below_min_count_patterns conta as alterações descartadas por terem menos de min_count linhas. As frequências são comparadas por minuto quando ambas as amostras contêm todas as linhas correspondentes; por minuto, estimadas a partir do total_matching_lines exato de uma amostra limitada; e, nos demais casos, como proporções da amostra, em que increased/decreased descrevem a composição, não a taxa (comparison_basis). Uma lista patterns vazia significa que não houve alterações acima dos dois limites, não que os logs não mudaram: alterações menos frequentes são contabilizadas em below_min_count_patterns, e uma janela com sample_limit_reached compara amostras, não janelas inteiras.

get_log_attributes

  • lookback_minutes (integer, opcional): Padrão: 15.
  • start_time_iso / end_time_iso (string, opcional)
  • region (string, opcional)
  • index (string, opcional)

get_log_attributes_for_pipeline

  • pipeline (array, obrigatório): Etapas de filtro anteriores para delimitar a descoberta, por exemplo, [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (integer, opcional): Padrão: 15.
  • start_time_iso / end_time_iso (string, opcional)
  • region (string, opcional)
  • index (string, opcional)

get_drop_rules

Sem parâmetros. Lista as regras de descarte por meio de GET /otel_settings/drop?region=....

add_drop_rule

  • name (string, obrigatório)
  • filters (array, obrigatório): Cada filtro: key, value, operator (equals/not_equals), conjunction (and).
  • As chaves de filtro devem usar attributes["key_name"] ou resource.attributes["key_name"] (exigido pela API Last9).
  • Cria a regra por meio de POST /otel_settings/drop?region=...&cluster_id=....

get_remapping_rules

  • rule_type (string, obrigatório): logs_extract, logs_map ou traces_map.
  • region (string, opcional): Padrão: a região da fonte de dados configurada.
  • Lista as regras por meio de GET /otel_settings/remapping/{rule_type}?region=....

add_remapping_rule

Cria uma regra por chamada; regras de mapeamento exigem uma chamada por target_attribute.

  • rule_type (string, obrigatório): logs_extract, logs_map ou traces_map.
  • name (string, obrigatório)
  • remap_keys (array, obrigatório): Campos de origem. logs_extract com json: nomes dos campos do corpo; com pattern: exatamente uma regex com um grupo de captura nomeado. Regras de mapeamento: caminhos de atributos, o primeiro valor não vazio prevalece.
  • target_attribute (string, obrigatório): logs_extract: log_attributes ou resource_attributes. logs_map: service, severity ou resource_deployment.environment. traces_map: service.
  • extract_type (string, obrigatório somente em logs_extract): json ou pattern.
  • action (string, somente em logs_extract): upsert (padrão) ou insert.
  • prefix (string, somente em logs_extract)
  • preconditions (array, somente em logs_extract): No máximo um {key, value, operator}; operator é equals (padrão), not_equals ou like (regex).
  • region (string, opcional): Padrão: a região da fonte de dados configurada.
  • Cria a regra por meio de POST /otel_settings/remapping/{rule_type}?region=.... Nunca é repetido; após um tempo limite, verifique com get_remapping_rules.

get_traces

Use para pesquisas abrangentes e agregações. Para consultar um ID de trace exato, use get_service_traces.

  • tracejson_query (array, obrigatório)
  • start_time_iso / end_time_iso (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • limit (integer, opcional): Padrão: 5000.

get_service_traces

É obrigatório informar exatamente um entre trace_id e service_name.

  • trace_id (string, opcional): Período padrão de consulta retroativa: 72 horas.
  • service_name (string, opcional): Período padrão de consulta retroativa: 60 min.
  • lookback_minutes (integer, opcional)
  • start_time_iso / end_time_iso (string, opcional)
  • limit (integer, opcional): Padrão: 10.
  • env (string, opcional)

get_trace_attributes

  • lookback_minutes (integer, opcional): Padrão: 15.
  • start_time_iso / end_time_iso (string, opcional)
  • region (string, opcional)

get_trace_attributes_for_pipeline

  • pipeline (array, obrigatório): Etapas de filtro anteriores para delimitar a descoberta, por exemplo, [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (integer, opcional): Padrão: 15.
  • start_time_iso / end_time_iso (string, opcional)
  • region (string, opcional)

get_trace_attribute_values

  • tag_name (string, obrigatório): Nome do atributo de get_trace_attributes (por exemplo, resource_department ou attributes['http.method']).
  • pipeline (array, opcional): Etapas de filtro anteriores para delimitar os valores; omita para obter valores globais.
  • lookback_minutes (integer, opcional): Padrão: 15.
  • start_time_iso / end_time_iso (string, opcional): Limites históricos RFC3339; têm precedência sobre lookback_minutes.
  • region (string, opcional)

get_trace_attribute_deviations

  • comparison_mode (string, obrigatório): latency, errors ou time.
  • service_name (string, obrigatório)
  • environment (string, obrigatório): Valor exato de deployment.environment.
  • operation (string, opcional)
  • filters (array, opcional): Condições de filtro JSON de trace.
  • candidate_attributes (array, opcional): Máximo de 8; omita para descoberta limitada.
  • latency_threshold_ms (number, opcional): Obrigatório para o modo latency; rejeitado nos outros modos.
  • start_time_iso / end_time_iso (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 15. Máximo: 15.
  • baseline_start_time_iso / baseline_end_time_iso (string, opcional): Obrigatório para o modo time; os períodos não podem se sobrepor e devem ter a mesma duração da janela de destino.
  • minimum_cohort_size (integer, opcional): Padrão: 100. Mínimo: 20.
  • minimum_value_support (integer, opcional): Padrão: 20. Mínimo: 10.
  • limit (integer, opcional): Padrão: 10. Máximo: 10.

Requer que o recurso correspondente do backend esteja habilitado.

get_trace_waterfall

  • trace_id (string, obrigatório)
  • environment (string, opcional)
  • start_time_iso / end_time_iso (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 4320 (72 horas).
  • selected_span_id (string, opcional): Retorna somente os atributos, eventos e links desse span.
  • max_spans (integer, opcional): Padrão: 500. Máximo: 1000; a política de redação da organização pode impor um limite menor.

Retorna o envelope investigation-evidence/v1 do serviço de traces sem alterações; o waterfall fica em data. O serviço cria o waterfall e redige valores de acordo com uma política por organização (credenciais, literais de consulta, URLs, e-mails, IPs e identificadores de usuário) antes de os dados saírem do backend: sanitizer identifica a política aplicada e evidence.sanitization contabiliza o que foi redigido ou truncado. Se algo necessário for redigido, peça a um administrador da organização que ajuste a política, em vez de tentar contorná-la. A ferramenta rejeita uma resposta sem o bloco sanitizer, com um sanitizer.version diferente de trace-evidence-sanitizer/v1, com um corpo que repita uma chave JSON ou com um corpo maior que 512 KiB (limite inferior de max_spans). Requer que o recurso correspondente do backend esteja habilitado.

get_change_events

  • start_time_iso / end_time_iso (string, opcional)
  • lookback_minutes (integer, opcional): Padrão: 60.
  • service_name (string, opcional)
  • env (string, opcional)
  • event_name (string, opcional): Faça a chamada sem este parâmetro primeiro para obter available_event_names.

analyze_change_impact

Informe exatamente um entre change_event ou service + timestamp.

  • change_event (object, opcional): Um elemento de get_change_events change_events[], sem alterações. Usa metric.service, metric.deployment_environment e o values[].timestamp mais antigo.
  • service (string, opcional): Obrigatório com timestamp quando change_event for omitido.
  • timestamp (string, opcional): RFC3339 ou segundos Unix, arredondado para baixo até o minuto.
  • env (string, opcional): Ambiente exato. Padrão: o do evento; caso contrário, todos.
  • baseline_minutes (integer, opcional): Padrão: 60. Limitado ao intervalo de 30..120.
  • after_minutes (integer, opcional): Padrão: baseline_minutes. Limitado ao intervalo de 30..120 e ao horário atual.

regression likely quando qualquer uma destas condições for atendida: a taxa de erros aumenta pelo menos 1 ponto percentual, o p95 aumenta pelo menos 40% ou a taxa de transferência (rpm) cai pelo menos 50% para o serviço ou um dos 10 principais chamadores, classificados pela taxa de transferência combinada das duas janelas (somente com pelo menos 100 solicitações antes da alteração e, para todos os casos exceto a taxa de transferência, depois dela; o p95 considera somente as solicitações de latency_env); um alerta para eles começa a disparar após a alteração e continua disparando no fim da janela posterior (correspondência sem distinção entre maiúsculas e minúsculas pelo nome do grupo de alertas ou por um rótulo service, service_name ou service.name; caso contrário, pela anotação, nunca por texto livre como um resumo; com env, alertas rotulados com outro ambiente, sem distinção entre maiúsculas e minúsculas, são descartados e os sem rótulo são marcados como env_match: unlabelled); uma regressão de get_apm_service_deviations. insufficient data quando a janela posterior tiver menos de 5 minutos (inclusive quando a alteração estiver no futuro), o serviço tiver poucas solicitações ou os sinais dourados, a consulta de chamadores diretos, os alertas ou get_apm_service_deviations falharem, total ou parcialmente em qualquer consulta listada em deviations.apm.unavailable: a ausência de evidências nunca resulta em no significant change, e uma regressão encontrada ainda assim indica o que falhou. no significant change é uma resposta válida, não uma falha. Os desvios de atributos de trace só são executados quando env está definido, por no máximo 15 minutos de cada lado; eles explicam um veredito, mas nunca o determinam, portanto ignorá-los ou não conseguir buscá-los não altera o veredito. Cada lista mantém 10 itens e informa quantos foram descartados; uma chamada upstream com falha deixa um error somente na seção correspondente. A latência dos sinais dourados vem de um único ambiente em ambas as janelas, indicado em latency_env: se não houver env, usa-se o de maior tráfego. A taxa de erros dos sinais dourados contabiliza erros 5xx e gRPC; deviations.apm também contabiliza spans com status de erro e respostas 429. Os sinais de um chamador são os próprios spans de servidor, portanto chamadores que só têm spans de cliente mostram 0 rpm.

regressions lista uma entrada por acionador por trás de regression likely, na ordem de reason, e é [] para os outros vereditos. Cada entrada tem service, role (changed ou dependent), env, metric (exatamente um entre error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) e baseline/after na unidade da métrica (%, ms, rpm ou o valor próprio do sinal APM; nulo para alert). Uma entrada alert adiciona rule_id e state, o estado da instância no recorte mais recente do monitor de alertas na janela posterior que a lista, sempre firing: um alerta que começou após a alteração, mas foi resolvido até o fim da janela posterior, não é uma regressão e, portanto, não abre um chamado; ele permanece em alerts.started com seu state, e reason o contabiliza. env é o ambiente em que a métrica foi medida: o env solicitado; caso contrário, a taxa de erros e a taxa de transferência somam todos os ambientes (env: ""), enquanto o p95 usa o ambiente de maior tráfego, latency_env; um alerta usa seu próprio rótulo de ambiente e um desvio APM usa seu próprio ambiente. Toda regressão é válida para o serviço como um todo, portanto nenhuma identifica um endpoint.

get_alert_groups

Inventário dos grupos de alertas configurados no Compass para auditorias de changeboard / cobertura de rótulos. Inclui grupos sem regras e grupos que não estão disparando. Não retorna PromQL.

  • alert_group_name / alert_group_type / data_source_name (string, opcional): Correspondência de substring sem distinção entre maiúsculas e minúsculas.
  • team / tier (string, opcional): Correspondência exata, sem distinção entre maiúsculas e minúsculas, nos metadados configurados.
  • label_key + label_value (string, opcional): Devem ser definidos juntos. Correspondência exata, sem distinção entre maiúsculas e minúsculas, em um par metadata.labels — chave e valor.

Retorna {"count":N,"groups":[...]} JSON compacto com id, name, type, entity_class, team, tier, metadata.labels e contagens de regras. team / labels vazios significam que não estão definidos.

get_alert_operations_summary

  • start_time_iso / end_time_iso (string, obrigatório): Janela RFC3339, de no máximo 31 dias.
  • timezone (string, opcional): Nome IANA para os limites dos dias. Padrão: UTC.
  • severities / services (array, opcional): Restringe o resumo.
  • include_rules (boolean, opcional): Também retorna a higiene por regra (as 20 principais por fire_count, regras com disparos repetidos e sem roteamento, com truncated quando a API limitou a lista de regras). Padrão: false.

Retorna JSON com alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention e coverage. Cada métrica é {status, count?, reason?}; uma contagem partial cobre apenas parte da janela e não é um limite inferior.

get_alert_coverage

Responde à pergunta "para o que não estou gerando alertas?" para um serviço, um ambiente, um grupo de alertas ou toda a organização quando nenhum escopo é informado. Somente leitura: nunca cria, altera nem reativa nada. Também disponível no conjunto de ferramentas investigate.

  • service (string, opcional): Nome do serviço.
  • environment (string, opcional): Ambiente de implantação (por exemplo, prod).
  • entity_id (string, opcional): UUID do grupo de alertas (entidade), conforme retornado por get_alert_groups.
  • muted_days (integer, opcional): Dias inteiros, de 1 a 3650. Padrão: 7; 0 significa o padrão. Uma regra silenciada por mais tempo que isso é uma lacuna muted_too_long. Os valores são aparados; strings em branco são ignoradas. Tipos de lacuna: uncovered_signal (nenhuma regra habilitada para latency, error_rate, throughput ou saturation; indica uma regra desabilitada que a cobriria), all_rules_disabled (um grupo de alertas cujas regras estão todas desabilitadas), no_notification_channel (uma regra cuja severidade não é encaminhada por nenhum canal do grupo de alertas), muted_too_long (silenciada indefinidamente ou por mais de muted_days; muted_since é a última atualização da regra e mute_until é omitido para um silenciamento indefinido).

Retorna JSON compacto {scope, generated_at, complete, summary, counts, groups}. groups contém uma entrada {kind, count, gaps, omitted} para cada tipo presente, listando no máximo 10 lacunas por tipo (omitted contabiliza as restantes; restrinja o escopo para vê-las); cada lacuna contém suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel ou patch_alert) e suggested_args, contendo apenas entradas aceitas pela ferramenta (patch_alert: entity_id, id e is_disabled=false ou mute_until=0; attach_notification_channel: alert_group_id e um breach/threat severity; create_alert: entity_id; create_alert_from_chart: service_name); os próprios entity_id, rule_id e signal da lacuna são listados ao lado. Chame a ferramenta sugerida somente se ela estiver disponível na sessão e o usuário confirmar. complete é true somente quando a API não lista lacunas, todas as contagens são 0 e pelo menos um grupo de alertas corresponde ao escopo (rótulos exatos service_name / env, verificados em relação à lista de get_alert_groups); um escopo que não corresponde a nenhum grupo, uma consulta malsucedida ou contagens sem lacunas listadas não são considerados completos, e summary explica o motivo.

get_alert_config

  • search_term (string, opcional): Pesquisa em texto livre por nome, grupo, fonte de dados e tags.
  • rule_name (string, opcional)
  • severity (string, opcional)
  • rule_type (string, opcional): static ou anomaly.
  • alert_group_name / alert_group_type / data_source_name (string, opcional)
  • tags (array, opcional): Todos devem corresponder (lógica AND).

Cada regra lista Recent Evaluations: 5 amostras de um minuto, da mais recente para a mais antiga, cada uma identificada pelo minuto UTC em que termina; a mais recente termina 1–2 minutos antes da chamada, pois o monitor preenche o minuto mais recente com atraso. firing; ok = o monitor informou que a regra não está disparando (estado normal, resolvido, pendente ou vazio, conforme is_firing=0 em get_alert_rule_state); unknown = não há linha do monitor para a regra (ainda não avaliada ou a consulta daquele minuto falhou, conforme indicado no início da resposta), ou há uma linha cujo estado não é nenhum destes: firing, normal, resolved, pending ou empty (por exemplo, no_data, silenced). Regras desabilitadas mostram none. Quando mais de 25 regras habilitadas correspondem, o histórico é omitido para todas elas e a resposta informa isso.

get_entity_kpis

Somente leitura; nos conjuntos de ferramentas alerts e investigate. Lista todos os KPIs de um grupo de alertas, incluindo KPIs ainda não usados por nenhuma regra de alerta. Use os IDs retornados em expression_args / indicators_used; nunca invente um.

  • entity_id (string, obrigatório): UUID do grupo de alertas/entidade, obtido de get_alert_groups ou get_alert_config.

Retorna JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]}, ordenado por nome. unit é um rótulo de exibição: os limites são comparados com o valor bruto da consulta. Quando nenhum KPI for adequado, crie um com create_kpi. O resultado de um grupo vazio menciona create_kpi somente quando a sessão o disponibiliza; com --read-only (a menos que --allow-write-tools=create_kpi) ou o conjunto de ferramentas investigate, informa que a criação de KPI requer uma sessão alerts com permissão de gravação.

create_kpi

Cria um KPI em um grupo de alertas existente; somente no conjunto de ferramentas alerts. Use apenas quando get_entity_kpis não tiver nenhum KPI com a consulta necessária. Primeiro, verifique se a consulta retorna dados com prometheus_range_query: a API rejeita apenas consultas que não podem ser analisadas e salva consultas válidas mesmo quando a métrica não existe.

  • entity_id (string, obrigatório): UUID do grupo de alertas/entidade.
  • name (string, obrigatório): Único dentro do grupo de alertas; uma segunda criação com o mesmo nome é rejeitada como conflito.
  • query (string, obrigatório): PromQL. Para criar um alerta com base em um painel do dashboard, obtenha o PromQL do painel em get_dashboard.
  • unit (string, obrigatório): Unidade do valor bruto da consulta, por exemplo, seconds, ms, percent, ratio, count, req/s. É apenas um rótulo e não converte nada; portanto, os limites são comparados com o valor bruto.
  • description (string, opcional)
  • data_source_id (string, opcional): Usa como padrão a fonte de dados do grupo de alertas.

Nenhuma ferramenta MCP exclui ou edita um KPI (use a interface do Last9); portanto, confirme o nome, a consulta e a unidade antes de criar. Crie uma única vez e guarde o ID retornado para expression_args / indicators_used; em caso de conflito de nome, reutilize o ID do KPI existente obtido em get_entity_kpis. Em caso de timeout ou erro de conexão, a criação pode ou não ter sido aplicada: verifique pelo nome com get_entity_kpis antes de tentar novamente. Retorna {"id","name","query","unit"}.

get_alerts

  • time_iso (string, opcional): Horário da avaliação em RFC3339.
  • window (integer, opcional): Período retroativo em segundos. Padrão: 900. Intervalo: 60–86400.
  • lookback_minutes (integer, opcional): Intervalo: 1–1440.

get_alert_rule_state

  • start_time (integer ou string, obrigatório): Início do intervalo (inclusivo): segundos da época Unix (1718000000) ou RFC3339 (2024-06-10T06:13:20Z). Milissegundos, microssegundos e nanossegundos da época são convertidos para segundos; valores anteriores a 2000-01-01 são rejeitados.
  • end_time (integer ou string, obrigatório): Fim do intervalo (inclusivo), nos mesmos formatos.
  • step (integer, obrigatório): Resolução em segundos entre amostras. O número de amostras ((end_time - start_time) / step + 1) é limitado a 100. Cada amostra é uma chamada upstream que cobre os min(step, 3600) segundos anteriores ao seu horário; as amostras são obtidas em lotes de 5, e a ferramenta retorna um erro com instruções para tentar novamente se demorarem mais de 60s.
  • alert_group_id (string, opcional): Filtrar por ID do grupo de alertas.
  • rule_name (string, opcional): Filtro regex no nome da regra.
  • alert_group_name (string, opcional): Filtro regex no nome do grupo de alertas.
  • label_filters (string, opcional): Filtros de rótulo key=value separados por vírgula.
  • state (string, opcional): Filtrar por estado (por exemplo, firing).

Retorna um mapa JSON de rule_id -> [{timestamp, is_firing}]. Um horário em que uma regra está ausente da resposta upstream é informado como is_firing=0 — isso significa “não observada como disparando”, não um estado normal confirmado.

get_alert_hygiene

Auditoria somente leitura das regras de alerta habilitadas. Nunca altera nada: cada correção sugerida é uma proposta, aplicada somente após confirmação explícita do usuário, por meio de update_alert (ajuste), patch_alert (is_disabled), delete_alert ou attach_notification_channel quando estiverem disponíveis.

  • window (string, opcional): 7d ou 30d. Padrão: 7d.
  • limit (integer, opcional): Número máximo de regras sinalizadas a retornar, começando pelas piores. Padrão: 20. Intervalo: 1–100.

A janela termina agora. Categorias (uma regra pode pertencer a várias): noisy (≥ 5 disparos/dia com < 20% acked; with an unavailable ack_rate it is judged on fire rate alone and the reason says so; mute time is not reported), flapping (> 4 oscilações/dia), stale (último disparo anterior à janela, sem disparos durante ela, ou uma regra configurada e habilitada sem episódios na janela, enquanto o ciclo de vida coverage está completo e a lista da API não está truncada), unrouted (nenhum disparo na janela chegou a um canal e o grupo de alertas não tem nenhum canal associado no momento; quando não é possível ler as associações, a regra é contabilizada em unavailable.routed). Cada estatística é {status, count|value, reason} ou null: um valor indisponível nunca é interpretado como zero e ignora apenas a verificação que depende dele, e unavailable contabiliza as regras habilitadas por valor ausente (fire_count, flap_count, ack_rate, routed, rule_config para regras ausentes da lista de regras de alerta, cujas correções não incluem um valor atual, e activity para regras configuradas sem episódios cujo silêncio não pode ser comprovado pelo histórico e que não são avaliadas). coverage informa quanto da janela foi coberto pelo histórico de alertas; as taxas usam o período coberto, de pelo menos um dia. upstream_truncated é true quando a API retornou apenas as 200 regras mais ruidosas, portanto as regras menos ruidosas não foram avaliadas. Correções, elaboradas com base na configuração de cada regra na lista de regras de alerta: aumentar bad_minutes (o N em count_true(result) >= N) ou prolongar eval_window (no máximo 60 minutos); para limites estáticos ruidosos, ajustar o limite em condition (expr > 100) ou mudar a expressão para adaptive_std_cmp(metric, sensitivity, window); associar um canal de notificação; desabilitar ou excluir regras obsoletas.

Retorna JSON compacto {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules}, dimensionado para uma meta de 32 KB: truncated é true quando o número de regras sinalizadas excede limit ou essa meta, e omitted_for_size contabiliza as regras dentro de limit removidas para respeitar o tamanho (a pior regra é sempre mantida; portanto, uma única regra maior que 32 KB é retornada sozinha e excede a meta); cada regra contém findings (category, reason, suggested_fix, alternative_fix opcional) e o stats bruto.

get_notification_channels

  • scope (string, opcional): attached (padrão) retorna uma linha por associação ao grupo de alertas; o id é um ID de associação, conforme usado por detach_notification_channel. channels retorna os canais da organização (id, name, type, send_resolved, created_via); o id é um ID de canal, conforme usado por attach_notification_channel. Destinos, cabeçalhos e certificados nunca são retornados.

Retorna os canais de notificação configurados (Slack, PagerDuty, e-mail, webhooks etc.) como uma tabela TSV. As linhas de associação (service_fqid definido) mostram global false e services -; services lista apenas associações de serviço legadas. Nas linhas de associação, send_resolved é o padrão armazenado na linha, não o que é usado na entrega; as notificações de resolução seguem o próprio send_resolved do canal (scope=channels). Ambos os escopos incluem created_via (last9-mcp para linhas criadas por um agente MCP; caso contrário, -).

recommend_alert_config

Somente leitura. Retorna orientações sobre o ciclo de vida, critérios de validação e requisitos de contexto para quem responde; não constitui evidência por si só, portanto fundamente os limites com ferramentas de telemetria.

  • signal (string, obrigatório): Métrica ou sinal de impacto para o usuário, incluindo unidade e dimensões.
  • objective (string, obrigatório): Sintoma ou impacto para o usuário a detectar.
  • rule_type (string, opcional): static (padrão) ou anomaly.
  • severity (string, opcional): breach (padrão) ou threat.
  • environment (string, opcional): Ambiente e perfil de tráfego.

validate_alert_expression

Executa uma expressão em modo de teste sem salvá-la. Use antes de create_alert / update_alert.

  • entity_id (string, obrigatório): UUID do grupo de alertas/entidade.
  • expression (string, obrigatório): Operações aritméticas sobre indicadores identificados pelo nome exato do KPI, por exemplo, errors / requests. No máximo 3 indicadores. Escreva nomes com espaços, pontos ou hífens exatamente como estão (Test Alert / errors), da mesma forma que create_alert os salva.
  • indicators_used (object, obrigatório, não vazio): Mapeamento do nome do indicador para o UUID do KPI pertencente a entity_id; liste os IDs e nomes dos KPIs do grupo com get_entity_kpis. Use o nome exato de cada KPI: esta execução de teste aceita qualquer nome, mas create_alert e update_alert rejeitam chaves expression_args que não correspondam ao nome do KPI associado. Somente a expressão aritmética é verificada (passe a expressão interna da métrica, não um wrapper adaptive_std_cmp(...)); condition / alert_condition não são. A verificação de pelo menos uma série temporal é executada somente quando mais de um indicador é usado.

Retorna {"valid":true} ou {"valid":false,"reason":"..."}; uma expressão inválida é um resultado normal, não um erro da ferramenta.

describe_alert_chart

Somente leitura. Lista os sinais que podem gerar alertas (key, unit, eval_query, query_kind) em um gráfico do Discover compatível. Tokens com função de visualizador são rejeitados.

  • surface (string, obrigatório): discover-service ou discover-exceptions; qualquer outra superfície, incluindo painéis personalizados, é rejeitada antes da chamada à API (use create_alert com um KPI).
  • chart_key (string, obrigatório): por exemplo, apdex, error_rate, response_time, exception_count.
  • service_name (string, obrigatório)
  • env (string, opcional)
  • attributes (object, opcional): Dimensões de identidade adicionais, usando os nomes de chave informados por esta ferramenta.

create_alert

Cria uma regra em um grupo de alertas existente, sempre desativada (um rascunho, mesmo que is_disabled=false seja passado). Chame recommend_alert_config primeiro e, em seguida, promova com patch_alert is_disabled=false somente após a confirmação do usuário. Crie uma única vez e mantenha o ID da regra retornado. Um rule_name que o grupo de alertas já usa (sem diferenciar maiúsculas de minúsculas) é recusado sem criar nada, informando o id da regra existente.

  • entity_id (string, obrigatório): UUID do grupo de alertas/entidade.
  • alert_rule (object, obrigatório): Corpo completo da regra tipada, incluindo primary_indicator e expression_args vinculados a KPIs reais da entidade. Cada chave expression_args deve ser o nome exato do KPI ao qual está vinculada (não um placeholder como x), e primary_indicator e expression usam esses nomes. Regras estáticas exigem condition, alert_condition e eval_window (0–60 minutos). Regras adaptativas usam expression = adaptive_std_cmp(<primary_indicator>, sensitivity, window); os três campos são então opcionais (padrões expr > 0, count_true(result) >= 1, 1). algorithm não pode ser definido. O contexto do responsável fica em properties (descrição, runbook, anotações, query_mode).

O roteamento de notificações é configurado no grupo de alertas, não na regra.

create_alert_from_chart

Cria uma regra de limite estático a partir de um gráfico descrito por describe_alert_chart. Assim como create_alert, a regra é criada desativada como rascunho e não dispara; promova-a com patch_alert is_disabled=false somente após a confirmação do usuário. A API do gráfico cria regras ativadas, então a ferramenta desativa a regra logo após criá-la; se isso falhar, o resultado será um erro que informa o id da regra, que pode estar ativa.

  • surface / chart_key / service_name / signal_key / name (string, obrigatório)
  • env (string, opcional)
  • attributes (object, opcional)
  • threshold (number, opcional): Na unidade do sinal; deve ser 0 ou maior. Sinais em unidades de pontuação, como apdex, precisam de um valor explícito.
  • threshold_operator (string, opcional): > (padrão), <, >=, <=, ==, !=.
  • eval_window (integer, opcional): Minutos, 1–60. Padrão: 5.
  • bad_minutes (integer, opcional): 1–eval_window. Padrão: 3.
  • severity (string, opcional): breach ou threat.
  • description (string, opcional)
  • group_id (string, opcional): Normalmente, omita.

update_alert

Substituição completa da configuração de avaliação de uma regra. Recupere a regra primeiro com get_alert_config ou get_entity_alert_rules. Recusa sem alterar nada quando a regra não existe ou pertence a outro grupo de alertas. Pode excluir logicamente e recriar a regra; portanto, use depois o ID de substituição retornado.

  • entity_id (string, obrigatório)
  • id (string, obrigatório): UUID da regra de alerta.
  • alert_rule (object, obrigatório): Configuração completa; mesma estrutura de create_alert.

patch_alert

Alteração parcial que preserva o ID da regra. É necessária pelo menos uma alteração. Recusa sem alterar nada quando a regra não existe ou pertence a outro grupo de alertas.

  • entity_id (string, obrigatório)
  • id (string, obrigatório): UUID da regra de alerta.
  • is_disabled (boolean, opcional): false promove/ativa, true pausa.
  • mute_until (integer, opcional): Prazo em época Unix; 0 remove o silenciamento.
  • properties (object, opcional): description, runbook, annotations, query_mode. Cada campo enviado substitui o valor armazenado; campos omitidos ou em branco mantêm o valor armazenado. annotations substitui o mapa inteiro, então envie todas as chaves para mantê-las; {} o limpa.
  • recurring_mute_schedule (object, opcional): Substitui a programação semanal: enabled (padrão false), timezone (nome IANA, obrigatório) e windows (1–20 de weekdays como sun..sat, start_time / end_time como HH:MM de 24 horas). Um horário de término igual ou anterior ao início termina no dia seguinte. Envie todas as janelas para mantê-las.
  • clear_recurring_mute_schedule (boolean, opcional): Remove a programação por completo; não pode ser combinado com recurring_mute_schedule. Difere de enabled=false, que mantém as janelas armazenadas.

Usuários com função de visualizador só podem alterar mute_until. Alterações de silenciamento no nível da regra são rejeitadas enquanto o grupo ou a entidade estiver silenciado. Leia as alterações de volta com get_entity_alert_rules, que mostra mute_until, recurring_mute_schedule e properties.

delete_alert

Exclui uma regra permanentemente. Verifique com get_alert_config e obtenha primeiro a confirmação explícita do usuário. Recusa sem excluir nada quando a regra não existe ou pertence a outro grupo de alertas.

  • entity_id (string, obrigatório)
  • id (string, obrigatório): UUID da regra de alerta.

mute_alert_group

Silencia todas as regras atuais e futuras de um grupo; para silenciar uma única regra, use patch_alert com mute_until. Requer acesso de editor.

  • entity_id (string, obrigatório): UUID do grupo de alertas/entidade.
  • until (integer, obrigatório): Segundos de época Unix em que o silenciamento termina. 0 remove o silenciamento; um valor negativo, como -1, silencia indefinidamente.

acknowledge_alert

Assume a responsabilidade por um alerta em disparo ou a libera. Não resolve nem silencia o alerta. Reconhecer um alerta que você já possui é uma operação segura sem efeito. ack recusa sem registrar nada, a menos que get_alerts liste esse alerta exato (os três ids) na última hora.

  • alert_group_id / rule_id / rule_type (string, obrigatório): Copie do alerta em get_alerts.
  • action (string, opcional): ack (padrão) ou unack. Somente o responsável ou um administrador da organização pode remover o reconhecimento.
  • mute_until (integer, opcional): Somente ack. Registra um silenciamento que você já aplicou com mute_alert_group ou patch_alert; não silencia nada.

reassign_alert

Transfere um alerta que já tem um responsável para outro usuário; se não tiver responsável, reconheça-o primeiro. Quando nada é reatribuído porque o alerta não tem responsável, informa se get_alerts lista esse alerta na última hora. Last9 não notifica o novo responsável.

  • alert_group_id / rule_id / rule_type (string, obrigatório): Copie do alerta em get_alerts.
  • owner_email (string, opcional): Preferencial; corresponde sem diferenciar maiúsculas de minúsculas a usuários ativos da organização.
  • owner_user_id (string, opcional): Forneça exatamente um entre owner_email ou owner_user_id.

create_notification_channel

Cria um canal; ele não roteia nada até ser associado com attach_notification_channel. Crie uma única vez e mantenha o id; não há ferramenta de atualização. Retorna somente id, name, type e send_resolved.

  • name (string, obrigatório): Único por tipo; sem dois-pontos.
  • type (string, obrigatório): slack, pagerduty, opsgenie, email ou generic_webhook.
  • destination (string, obrigatório): URL de webhook de entrada do Slack (ou ID do canal com slack_app_mode), chave de roteamento do PagerDuty, chave de API do Opsgenie, endereços de e-mail corporativos separados por vírgulas em qualquer domínio, não apenas no da organização (a API rejeita endereços de provedores pessoais, como Gmail, e uma organização com login pessoal aceita somente o endereço do administrador), ou uma URL de webhook HTTPS.
  • slack_app_mode (boolean, opcional): Somente Slack. Padrão: false.
  • mention_handles (string, opcional): Separados por vírgulas, por exemplo, user|U123ABC|name, special|here, special|channel.
  • webhook_headers (object, opcional): Somente generic_webhook.
  • webhook_ca_certificate (string, opcional): Somente generic_webhook; um certificado CA PEM de até 64 KiB.
  • send_resolved (boolean, opcional): Padrão: true.

attach_notification_channel

Roteia um canal existente para um grupo de alertas. Idempotente. Os anexos copiam as configurações de entrega do canal (cabeçalhos, certificado, menções) no momento da associação; se as configurações do canal mudarem depois, associe-o novamente.

  • channel_id (integer, obrigatório): Um id de canal (get_notification_channels com scope=channels), não um id de anexo.
  • alert_group_id (string, obrigatório): De get_alert_groups.
  • severity (string, obrigatório): breach, threat ou both. both cria dois anexos; se o segundo falhar, o primeiro permanece associado e o erro informa a severidade a tentar novamente.

detach_notification_channel

Remove um anexo. Requer um token com escopo de exclusão; um token com escopo de gravação não pode desassociar.

  • attachment_id (integer, obrigatório): O id de get_notification_channels com scope=attached. IDs de canal são recusados.
  • alert_group_id (string, opcional): Recusa se o anexo pertencer a outro grupo.

delete_notification_channel

Exclui permanentemente um canal sem anexos; desassocie os anexos primeiro. Requer um token com escopo de exclusão. Confirma a exclusão listando os canais novamente.

  • channel_id (integer, obrigatório): O id de get_notification_channels com scope=channels. IDs de anexo são recusados.

did_you_mean

  • query (string, obrigatório): O nome a pesquisar — parcial, com erro de digitação ou abreviado.
  • type (string, opcional): Restringe ao tipo de entidade: service, environment, host, database, k8s_deployment, k8s_namespace, job.

Retorna até 3 correspondências mais próximas com pontuações de similaridade. Use antes de qualquer chamada de ferramenta quando houver incerteza sobre o nome da entidade. Se uma chamada anterior retornou resultados vazios, tente esta antes de repetir.

get_service_profile

  • service_name (string, obrigatório): Serviço para o qual derivar um perfil de telemetria.
  • datasource (string, opcional): Nome da fonte de dados. Omita para usar o padrão; um nome aproximado é resolvido como nas ferramentas do Prometheus. Retorna um breve resumo da investigação seguido do perfil completo como JSON bruto: presença de sinais (logs/traces/metrics como present, absent ou unknown), linguagem e runtime, ambientes de implantação, log signal_shape (log_format, severity_set, level_field, trace_context_in_logs) e uma correção de ingestão recomendada quando aplicável. Quando o backend informa freshness, o resumo adiciona uma linha last seen com freshness.logs.last_seen e freshness.traces.last_seen (RFC3339 ou none quando nulo) e um aviso traces stale quando freshness.traces_stale é true: os spans pararam enquanto os logs continuaram, então investigue uma regressão em torno de freshness.traces.last_seen, não uma configuração ausente. Derivado upstream e armazenado em cache com TTL de ~15 minutos.

Chame-o antes de qualquer investigação com escopo de serviço para que a seleção de ferramentas corresponda à telemetria real do serviço — ignore as ferramentas de trace quando traces for absent e, quando severity_set for none ou partial, analise a severidade de level_field no corpo do log em vez de usar severity_filters. metrics é sempre unknown e dependencies não é preenchido na v1. Quando logs e traces forem ambos absent, confirme o nome com did_you_mean antes de concluir que o serviço não é monitorado.

list_dashboards

  • name (string, opcional): Substring do nome do dashboard, sem distinção entre maiúsculas e minúsculas. Restringe a lista e total.
  • limit (integer, opcional): Dashboards por página, 1–200. Padrão: 100.
  • cursor (string, opcional): next_cursor da página anterior; passe o mesmo name junto com ele.

Retorna {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"}, começando pelos atualizados mais recentemente. created_by é omitido quando vazio; locked é omitido quando a API não informa readonly. updated_at é o tempo Unix epoch em segundos como string. Uma página termina antes do esperado para permanecer abaixo de 32 KB; next_cursor não aparece na última página.

get_dashboard

  • id (string, obrigatório): UUID do dashboard.
  • region (string, opcional): Região para preencher as consultas dos painéis. O padrão é a região da fonte de dados configurada.

O resultado adiciona locked no nível superior (false quando a API o omite) e created_by (o ID de usuário do autor).

Para criar um alerta em um painel, consulte last9://reference/alerting.

validate_dashboard

Somente leitura. Nunca cria nem atualiza dashboards. Aceita exatamente um entre dashboard_id e dashboard_definition.

  • dashboard_id (string, opcional): UUID do dashboard salvo a validar.
  • dashboard_definition (object, opcional): Corpo de dashboard inline não salvo (simulação real). Um envelope de criação {dashboard, metadata} é desembrulhado para seu objeto dashboard.
  • start_time_iso / end_time_iso (string, opcional): Janela de validação (RFC3339). Deve ser ≤ 24h.
  • region (string, opcional): Região para execução das consultas dos painéis.

Retorna dashboard_validation/v1: classificação de lint e execução por painel (data / no_data / invalid / error). Resultados vazios no primeiro dia são classificados como valid_no_data, sem sondagens de diagnóstico. Um dashboard sem painéis retorna success: false com error: "no_panels". Campos de painel de outros formatos (Grafana gridPos, title, type e targets em painéis que precisam de consultas), bem como campos com tipos incorretos, são listados por painel em shape_problems, contabilizados em summary.panels_invalid_shape e fazem com que overall seja fail.

preview_dashboard

Pré-visualização somente leitura no cliente. Passe dashboard (o objeto de dashboard não salvo de uma solicitação de criação) ou id mais ops (as mesmas operações ordenadas de patch_dashboard). Os campos obrigatórios start_time_iso e end_time_iso são timestamps RFC3339 com intervalo máximo de 24 horas. variables opcional contém substituições escalares; caso contrário, aplicam-se os valores do dashboard e os padrões integrados.

{
  "id": "dashboard-id",
  "ops": [{"op": "update_panel", "panel_id": "panel-id", "fields": {"name": "Request latency"}}],
  "start_time_iso": "2026-10-01T08:00:00Z",
  "end_time_iso": "2026-10-01T09:00:00Z"
}

Retorna saved: false, um resumo de definição/consulta validation (incluindo definition_error para uma incompatibilidade com o esquema de criação) e panels com status ok / empty / error, consultas resolvidas e diagnósticos de destino. PromQL e LogJSON são executados; tipos de consulta não compatíveis e variáveis não resolvidas fazem o painel apresentar erro. Painéis válidos que não são de consulta são ok; definições de painel inválidas são error. O patch diff inclui panels_added líquido, panels_changed (incluindo movimentações) e panels_removed, além das alterações ordenadas das operações. IDs e índices baseados em zero identificam os painéis; os índices removidos referem-se ao dashboard original. Os painéis salvos devem ter IDs distintos e não vazios.

Limites: 50 painéis, 100 consultas, 100 operações, 65536 bytes JSON para cada um dos dashboards de entrada e candidato e prazo de execução de 60 segundos. Consultas resolvidas com mais de 65536 bytes JSON são rejeitadas antes da execução. As evidências mantêm no máximo três amostras e 1024 bytes JSON por destino, com truncated: true quando as amostras são omitidas. Um relatório JSON com mais de 262144 bytes falha com instruções para reduzir a entrada.

Nenhum dashboard é criado ou atualizado. Isso verifica o candidato em relação ao esquema de criação e executa consultas usando o validador existente; não garante a aceitação nem a renderização pelo backend. IDs atribuídos pelo backend, padrões, campos descartados ou edições simultâneas podem alterar o resultado salvo. A pré-visualização usa as mesmas operações de patch locais e os mesmos padrões de versão de painel de uma gravação.

create_dashboard

Somente para novos dashboards. Depois que esta chamada retornar dashboard.id, edite os painéis com patch_dashboard (ou reestruture com update_dashboard) — não crie novamente para adicionar, remover ou corrigir painéis.

  • dashboard (object, obrigatório): Definição do dashboard com name e panels[]. Cada painel exige name, version, layout (x, y, w, h), visualization.type e queries[].
  • metadata (object, opcional): Metadados do dashboard — campos _category e _type (por exemplo, {"_category":"custom","_type":"metrics"}).

update_dashboard

Use somente para reestruturar a maior parte de um dashboard; para adicionar, editar, remover ou mover painéis individuais, use patch_dashboard. Substituição completa por ID (mesmo corpo de create): todos os painéis devem ser enviados novamente, sem alterações.

  • id (string, obrigatório): UUID do dashboard a atualizar.
  • dashboard (object, obrigatório): Corpo completo de substituição do dashboard (mesma estrutura de create).
  • metadata (object, opcional): Metadados de substituição. Dashboards de sistema somente leitura retornam um erro recuperável da ferramenta.

patch_dashboard

Prefira esta opção a update_dashboard para pequenos ajustes: painéis inalterados nunca são enviados novamente. Lê o dashboard, aplica ops em ordem e o grava de volta; portanto, uma edição feita em outro lugar entre a leitura e a gravação é sobrescrita. Retorna {dashboard_id, changes[]}; operações que o dashboard já satisfaz são omitidas e, se nenhuma alterar algo, nada é gravado. A diferença é verificada em relação a uma nova leitura após a gravação: fields dos painéis mostram os valores armazenados, not_stored lista as chaves descartadas pela API e not_removed lista as chaves mantidas apesar de um null. Valores da diferença com mais de 200 caracteres são encurtados no próprio lugar, mantendo o tipo JSON.

  • id (string, obrigatório): UUID do dashboard a aplicar o patch.
  • ops (array, obrigatório): Operações aplicadas em ordem; se alguma for inválida, nada é gravado e o erro a identifica como ops[i].
    • add_panel: panel (objeto completo do painel; version tem padrão 1), index opcional (posição de inserção baseada em zero, padrão: adicionar ao final).
    • update_panel: panel_id, fields (chaves de nível superior do painel a substituir; null remove uma chave; id não pode ser alterado).
    • remove_panel: panel_id.
    • move_panel: panel_id, index (posição baseada em zero após a movimentação).
    • set_title: title (o nome do dashboard).
    • set_variable: variable; substitui a variável com o mesmo target; caso contrário, adiciona-a.

delete_dashboard

  • id (string, obrigatório): UUID do dashboard a excluir. Dashboards de sistema somente leitura não podem ser excluídos.

set_dashboard_lock

  • id (string, obrigatório): UUID do dashboard.
  • locked (boolean, obrigatório): true bloqueia o dashboard; false o desbloqueia.

Ferramenta de gravação; chame-a somente quando o usuário solicitar explicitamente. Somente o autor do dashboard ou um administrador da organização pode bloqueá-lo ou desbloqueá-lo, e dashboards integrados são sempre somente leitura. Retorna {"id", "locked"} com o estado resultante. Enquanto estiver bloqueado, update_dashboard, patch_dashboard e delete_dashboard não enviam gravações e retornam um erro recuperável da ferramenta iniciado por dashboard is locked, que identifica o autor e sugere desbloquear ou copiar o dashboard com create_dashboard.

list_dashboard_snapshots

  • dashboard_id (string, obrigatório): UUID do dashboard cujos snapshots serão listados.

Retorna somente metadados (id, name, expires_at etc.). Use get_dashboard_snapshot para obter dados congelados dos painéis.

get_dashboard_snapshot

  • id (string, obrigatório): UUID do snapshot.

Retorna o snapshot congelado completo, incluindo dashboard_definition, panel_data, time_range e variables.

delete_dashboard_snapshot

  • id (string, obrigatório): UUID do snapshot a excluir.

get_profile_services

  • lookback_minutes / start_time_iso / end_time_iso (opcional): Janela; prefira lookback ou limites ISO explícitos (padrão: 60m).
  • region (string, opcional): Substituição da região.

Retorna os serviços que têm dados de profiling na janela. Chame antes de get_flamegraph / get_top_functions / get_profile_summary.

get_flamegraph

  • service (string, obrigatório): Nome do serviço de get_profile_services.
  • profile_type (string, opcional): cpu (padrão), alloc ou wall. Fixe um tipo ao comparar janelas.
  • env / cluster / namespace / runtime (string, opcional): Filtros de escopo.
  • limit (number, opcional): Máximo de linhas de pilha agregadas (padrão: 1000, máximo: 10000).
  • lookback_minutes / start_time_iso / end_time_iso / region (opcional).

Retorna uma árvore de flamegraph aninhada (name / value / self / children). truncated: true significa que o limite de linhas da API foi atingido.

get_top_functions

Mesmos filtros de get_flamegraph. Retorna a classificação das funções mais quentes por amostras próprias. Pode ser truncado; verifique truncated.

get_profile_summary

Mesmos filtros de get_flamegraph. Retorna uma triagem breve em linguagem natural do perfil do serviço.

grafana_search_dashboards

  • query (string, opcional): Substring do título. Vazio lista de forma abrangente (sujeito ao limite de 5.000 linhas).

Retorna {"dashboards":[…], "truncated":bool} com uid, title, uri, url, type, tags. Use uid com grafana_get_dashboard.

grafana_get_dashboard

  • uid (string, obrigatório): uid do dashboard do Grafana.
  • full_json (boolean, opcional): Quando true, retorna o JSON bruto do Grafana em vez do resumo filtrado.

Resumo padrão: versão, tags, variáveis de templating e o tipo/fonte de dados/gridPos/alvos promQL de cada painel. Tipos de painel de plugins desconhecidos aparecem em unsupportedPanelTypes.

grafana_list_folders

Sem parâmetros. Retorna a árvore de pastas.

grafana_list_folder_dashboards

  • folder_uid (string, obrigatório): UID da pasta do Grafana.

Retorna {"dashboards":[…], "truncated":bool} para os dashboards nessa pasta (paginados até 5.000).

grafana_list_datasources

Sem parâmetros. Retorna uma projeção segura das fontes de dados (sem campos de credenciais).


Testes

Execute o analisador de goroutines de teste sem executar os testes da aplicação:

make lint-test

Isso executa o analisador testinggoroutine do Go em todos os pacotes, incluindo seus arquivos *_test.go, e verifica o resultado com fixtures seguras e inseguras. Ambos os fluxos de teste da CI executam go vet -testinggoroutine ./... como uma etapa separada, para que os resultados de testes de pacotes em cache não possam ignorar a aplicação do lint.

O pacote raiz também executa o analisador como um teste. Use go test -count=1 ./... para executar a suíte completa sem cache nessa verificação: o cache de testes do Go não rastreia os arquivos-fonte internos do pacote lidos pelo subprocesso do analisador. Um go test ./... simples pode reutilizar o resultado aprovado do teste raiz depois que esses arquivos forem alterados.

Fatal, Fatalf e FailNow em testing.T ou testing.B devem ser executados na goroutine de teste pai. Os workers devem enviar os erros de volta para que o pai possa fazer asserções:

errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
    t.Fatal(err)
}

O analisador detecta chamadas diretas em closures go func; ele não é uma verificação interprocedural geral para asserções ocultas atrás de chamadas arbitrárias de helpers. Os testes de integração são ignorados, a menos que TEST_REFRESH_TOKEN esteja definido.


MseeP.ai Security Assessment Badge