Compartilhar via


Destinos de eventos estendidos do SQL Server

Destinos de eventos estendidos do SQL Server são consumidores de evento. Os destinos podem ser gravados em um arquivo, agregar dados de evento ou iniciar uma tarefa relacionada ao evento. Destinos podem processar dados de forma síncrona ou assíncrona.

O design do Extended Events garante que os destinos tenham a garantia de receber eventos somente uma vez por sessão.

Os Eventos Estendidos fornecem os seguintes destinos que você pode usar em uma sessão de eventos estendidos:

  • Event bucketing

    Use para contar o número de vezes que um evento especificado ocorre, com base em uma coluna de eventos ou uma ação específica.

  • Event pairing

    Muitos tipos de eventos ocorrem em pares, como aquisições e liberações de bloqueio. Use para determinar quando um evento emparelhado especificado não ocorre em um conjunto correspondente.

  • Event Tracing for Windows (ETW)

    Use para correlacionar eventos do SQL Server com o sistema operacional Windows ou dados de evento de aplicativo.

  • Event file

    Use para gravar a saída da sessão de evento de buffers de memória completos em disco.

  • Synchronous event counter

    Conta todos os eventos especificados que ocorrem durante uma sessão de Eventos Estendidos. Use para obter informações sobre características da carga de trabalho sem adicionar a sobrecarga de uma coleção de eventos completa.

  • Ring buffer

    Use para manter os dados do evento na memória com base em PEPS (primeiro a entrar, primeiro a sair) ou em PEPS por evento.

Os destinos podem ser divididos em destinos de arquivo e destinos na memória.

  • O destino de arquivo de evento e o destino ETW são considerados destinos de arquivo.

  • Os destinos de segmentação de eventos, emparelhamento de eventos, contador de eventos síncronos e buffer de anel são considerados destinos na memória, onde os dados são armazenados no buffer da sessão (a coluna target_data da exibição de gerenciamento dinâmico sys.dm_xe_session_targets).

Lembre-se de que, quando você parar uma sessão que use um destino na memória, todas as informações armazenadas no buffer da sessão serão perdidas. Se você desejar acessar os dados do evento depois de parar a sessão, deverá configurar a sessão para usar um destino de arquivo (recomendado) ou salvar os dados antes de parar a sessão.

Você poderá usar as diretrizes a seguir para ajudá-lo a decidir qual destino usar.

Destino

Uso recomendado

Destino de arquivo de evento ou destino ETW

Use um destino de arquivo quando uma ou mais das seguintes condições forem verdadeiras:

  • Você deseja executar coleta de dados a longo prazo.

  • Você deseja coletar dados para eventos de volume muito alto.

  • Você deseja manter dados de evento para fins históricos.

Destino de buffer de anel

Use o destino de buffer de anel quando as seguintes condições forem verdadeiras:

  • Você deseja executar rastreamento cíclico onde coleta dados continuamente, mas só se preocupa com os eventos mais recentes (aproximadamente 2 megabytes (MB) de dados de evento). Ou você deseja executar coleta de dados a curto prazo e exibir os eventos mais recentes.

  • Você deseja exibir todos os dados de evento que são capturados no buffer da sessão. Em outras palavras, você deseja exibir os dados brutos e não informações agregadas.

  • Você não precisa manter os dados de evento para fins históricos.

Destino de segmentação de eventos, emparelhamento de eventos ou contador de eventos síncronos

Use um destes destinos na memória quando as seguintes condições forem verdadeiras:

  • Você deseja solucionar um problema específico usando um destino que possa executar algum formulário de análise e agregação dos dados de evento. Por exemplo, você pode querer saber se alguma transação foi deixada aberta (destino de emparelhamento de eventos) ou quais das principais consultas por uso de CPU ultrapassam um determinado período de tempo (destino da segmentação de eventos).

  • Você deseja executar coleta de dados a longo curto.

  • Você não precisa manter os dados de evento para fins históricos.

Destino da segmentação de eventos

O destino da segmentação de eventos agrupa ocorrências de um tipo de evento específico com base nos dados do evento. Um "segmento" é um agrupamento de eventos que são contados com base em uma coluna de evento especificada ou ação. Você pode usar o destino da segmentação de eventos para solucionar problemas de desempenho. Ao identificar quais eventos ocorrem mais freqüentemente, você pode localizar "pontos de acesso" que indicam uma causa potencial de um problema de desempenho.

A tabela a seguir descreve as opções que podem ser usadas para configurar o destino da segmentação de eventos.

Opção

Valores permitidos

Descrição

slots

Qualquer valor inteiro. Esse valor é opcional.

Um valor especificado pelo usuário que indica o número máximo de blocos a serem retidos. Quando esse valor é alcançado, novos eventos que não pertencem aos blocos existentes são ignorados

filtering_event_name

Qualquer evento presente na sessão de Eventos Estendidos. Esse valor é opcional.

Um valor especificado pelo usuário usado para identificar uma classe de eventos. Somente instâncias do evento especificado são segmentadas. Todos os outros eventos são ignorados.

Se você especificar esse valor, deverá usar o formato: nome_do_pacote.nome_do_evento, por exemplo 'sqlserver.checkpoint_end'. Você pode identificar o nome do pacote usando a seguinte consulta:

SELECT p.name, se.event_name
FROM sys.dm_xe_session_events se
JOIN sys.dm_xe_packages p
ON se_event_package_guid = p.guid
ORDER BY p.name, se.event_name

Se você não especificar o valor filtering_event_name, source_type deverá ser definido como 1 (o padrão).

source_type

O tipo de objeto que serve de base para o bloco. Esse valor é opcional e se não for especificado, terá 1 como valor padrão.

Pode ter um dos seguintes valores:

  • 0 para um evento

  • 1 para uma ação

fonte

Coluna do evento ou nome da ação

A coluna do evento ou o nome da ação usados como fonte de dados.

Quando especificar uma coluna de evento para origem, você deverá especificar uma coluna a partir do evento usado para o valor filtering_event_name. Para identificar as colunas potenciais, use a seguinte consulta:

SELECT name FROM sys.dm_xe_object_columns
WHERE object_name = '<eventname>'
AND column_type != 'readonly'

Quando você especificar uma coluna de evento para origem, não será necessário incluir o nome do pacote no valor da origem.

Quando especificar um nome de ação para origem, você deverá usar uma das ações configuradas para coleta na sessão do evento para a qual esse destino está sendo usado. Para localizar valores potenciais para o nome de ação, você pode consultar a coluna action_name da exibição sys.dm_xe_sesssion_event_actions.

Se estiver usando um nome de ação como a fonte de dados, você deverá especificar o valor de origem usando o formato: nome_do_pacote.nome_da_ação.

O exemplo a seguir demonstra, em um nível alto, como o destino da segmentação de eventos coleta dados. Neste exemplo, você deseja usar o destino da segmentação de eventos para contar quantas esperas de cada tipo ocorreram. Para fazer isso, você especificaria as seguintes opções ao definir o destino da segmentação de eventos:

  • filtering_event_name = 'wait_info'

  • source = 'wait_type'

  • source_type = 0 (porque wait_type é uma coluna de evento)

No cenário de exemplo, os dados a seguir são registrados para a origem de wait_type.

Nome do evento de filtragem

Valor da coluna de origem

wait_info

file_io

wait_info

file_io

wait_info

rede

wait_info

rede

wait_info

suspensão

Os valores de tipo de espera seriam categorizados em três segmentos, com os valores e as contagens de slot a seguir:

Valor

Contagem de slot

file_io

2

rede

2

suspensão

1

Para obter mais informações sobre a sintaxe do destino da segmentação de eventos, consulte Como monitorar a atividade do sistema usando eventos estendidos.

O destino da segmentação só retém dados de evento para a fonte especificada. Em alguns casos, os dados do evento podem ser muito grandes para serem retidos completamente; nesse caso, os dados são truncados. Quando os dados do evento são truncados, o número de bytes é registrado e exibido como saída XML.

O destino da segmentação serializa os dados para um programa de chamada ou para um procedimento em formato XML.

ObservaçãoObservação

A saída do particionamento de memória não está de acordo com nenhum esquema.

O exemplo a seguir ilustra o formato de saída de destino da segmentação.

<Slots truncated = "0" buckets=[count]>
    <Slot count=[count] trunc=[truncated bytes]>
        <value>
        </value>
    </Slot>
</Slots>

Destino de emparelhamento de evento

O destino de emparelhamento de evento efetua a correspondência entre dois eventos que usam uma ou mais colunas de dados presentes em cada evento. Muitos eventos vêm em pares, por exemplo, aquisições de bloqueio e liberações de bloqueio. Após o emparelhamento de uma seqüência de eventos, ambos são descartados. O descarte de conjuntos correspondidos facilita a detecção de aquisições de bloqueios que não foram liberados.

Usando filtros do nível de evento, o destino de emparelhamento pode ser usado somente para capturar eventos que não correspondam aos critérios predefinidos.

Ao usar o destino de emparelhamento de evento, você terá permissão para escolher dois eventos que serão comparados ao longo de uma seqüência de colunas para que seja realizada a correspondência. Todas as colunas nessa seqüência deverão ser do mesmo tipo.

A tabela a seguir descreve as opções disponíveis para configurar um emparelhamento de evento.

Opção

Valores permitidos

Descrição

begin_event

Qualquer nome de evento presente na sessão atual.

O nome do evento que especifica o evento inicial em uma seqüência emparelhada.

end_event

Qualquer nome de evento presente na sessão atual.

O nome do evento que especifica o evento final em uma seqüência emparelhada.

begin_matching_columns

Uma lista delimitada por vírgula, ordenada por nomes de coluna.

As colunas em que a correspondência deve ser executada.

end_matching_columns

Uma lista delimitada por vírgula, ordenada por nomes de coluna.

As colunas em que a correspondência deve ser executada.

begin_matching_actions

Uma lista de ações ordenadas, delimitadas por vírgula.

As ações nas quais a correspondência deve ser executada.

end_matching_actions

Uma lista de ações ordenadas, delimitadas por vírgula.

As ações nas quais a correspondência deve ser executada.

respond_to_memory_pressure

Um dos valores seguintes:

  • 0 = Não responda.

  • 1 = Pare de adicionar novos órfãos à lista quando houver pressão de memória.

A resposta de destino a eventos de memória. Se definido como 1 e o servidor estiver com pouca memória, as informações não emparelhadas que estão sendo mantidas serão removidas.

Todos os dados associados a um evento são capturados e armazenados para emparelhamento futuro. Além disso, dados adicionados por ações também são coletados. Os dados de evento coletados são armazenados em memória e como tal têm um limite finito. Esse limite é baseado na capacidade e na atividade do sistema. Em vez de pegar a quantidade máxima de memória a ser usada como um parâmetro, a quantidade de memória usada terá como base os recursos disponíveis do sistema. Quando esses não estiverem disponíveis, os eventos não emparelhados que foram retidos serão cancelados. Se um evento não tiver sido emparelhado e for cancelado, o evento correspondente aparecerá como um evento não emparelhado.

O destino de emparelhamento serializa eventos não emparelhados em um formato XML. Esse formato não se adapta a nenhum esquema. O formato só contém dois tipos de elementos. O elemento < unpaired> é a raiz, seguido por um elemento <event> para cada evento não emparelhado que está sendo rastreado no momento. O elemento <event> contém um atributo que tem o nome do evento não emparelhado.

O exemplo a seguir ilustra o formato de saída de destino de emparelhamento.

<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
    <event name  = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
    <data name = "[column name]"> 
    <type name = "[column type]" package = "[type package]" /> 
    <value>[column value]</value>
    <text value>[text value]</text>>
        </data>
    </event>
</unpaired>

Destino de rastreamento de eventos do Windows

Antes de usar o Rastreamento de Eventos do Windows (ETW) como destino, é recomendável ter um conhecimento prático do ETW. O rastreamento ETW é usado com o Extended Events ou como um consumidor de evento do Extended Events. Os links externos a seguir fornecem um ponto de partida para a obtenção de informações gerais do ETW:

O Extended Events oferece suporte às versões de ETW do Windows XP e do Windows Server 2003. O destino de ETW é um destino singleton, embora o destino pode ser adicionado a muitas sessões. Se um evento for gerado em muitas sessões, esse evento somente será propagado para o destino de ETW uma vez por ocorrência de evento. O mecanismo Extended Events é limitado a uma única instância por processo.

Observação importanteImportante

Para que o destino ETW funcione, a conta de inicialização do serviço do SQL Server deve ser um membro do grupo de Usuários de Log de Desempenho.

A configuração dos eventos presente em uma sessão ETW é controlada pelo processo que hospeda o mecanismo de Eventos Estendidos. O mecanismo controla os eventos a serem disparados e as condições que devem ser atendidas para o disparo de um evento.

Depois de associar a uma sessão de Eventos Estendidos, que anexa o destino ETW pela primeira vez durante o tempo de vida de um processo, o destino ETW abre uma única sessão ETW no provedor SQL Server. Se uma sessão ETW já existir, o destino ETW obterá uma referência para a sessão existente. Essa sessão ETW é compartilhada por todas as instâncias do SQL Server em um determinado computador. Essa sessão ETW recebe todos os eventos de sessões que têm o destino ETW.

Como o ETW precisa de provedores para ser habilitado a consumir eventos e conduzi-los ao ETW, todos os pacotes de Eventos Estendidos são habilitados na sessão. Quando um evento é disparado, o destino ETW envia o evento à sessão na qual o provedor do evento está habilitado.

O destino ETW oferece suporte à publicação síncrona de eventos no thread que dispara o evento. No entanto, o destino ETW não oferece suporte à publicação assíncrona de eventos.

O destino ETW não permite controle de controladores ETW externos, como logman.exe. Para gerar rastreamentos ETW, é necessário criar uma sessão de evento com o destino ETW. Para obter mais informações, consulte CREATE EVENT SESSION (Transact-SQL).

ObservaçãoObservação

A habilitação do destino de ETW cria uma sessão de ETW denominada XE_DEFAULT_ETW_SESSION. Se uma sessão com o nome XE_DEFAULT_ETW_SESSION já existir, ele será usado sem que nenhuma propriedade da sessão existente seja modificada. O XE_DEFAULT_ETW_SESSION é compartilhado entre todas as instâncias do SQL Server. Depois de iniciar o XE_DEFAULT_ETW_SESSION, você deve pará-lo usando um controlador de ETW, como a ferramenta Logman. Por exemplo, você pode executar o comando a seguir no prompt de comando: logman stop XE_DEFAULT_ETW_SESSION -ets.

A tabela a seguir descreve as opções disponíveis para configuração do destino de ETW.

Opção

Valores permitidos

Descrição

default_xe_session_name

Qualquer cadeia de caracteres até 256 caracteres. Esse valor é opcional.

O nome da sessão de Eventos Estendidos. Por padrão, esse é XESESSION0_4B7A5EC6-37EF-4d4c-81EC-13C547B9AC46.

default_etw_session_logfile_path

Qualquer cadeia de caracteres até 256 caracteres. Esse valor é opcional.

O caminho para o arquivo de log da sessão de Eventos Estendidos. Por padrão, esse é % TEMP% \ XEEtw.etl.

default_etw_session_logfile_size_mb

Qualquer inteiro não atribuído. Esse valor é opcional.

O tamanho do arquivo de log, em megabytes (MB), para a sessão de Eventos Estendidos. O padrão é 20 MB.

default_etw_session_buffer_size_kb

Qualquer inteiro não atribuído. Esse valor é opcional.

O tamanho do buffer na memória, em quilobytes (KB), para a sessão de Eventos Estendidos. O padrão é 128 KB.

repetições

Qualquer inteiro não atribuído.

O número de vezes para tentar publicar novamente o evento no subsistema ETW antes de descartar o evento. O padrão é 0.

A configuração das definições precedentes é opcional. O destino ETW usa valores padrão para essas configurações.

O destino ETW é responsável por:

  • Criar a sessão ETW padrão.

  • Registrar todos os pacotes de Eventos Estendidos com o ETW. Isso assegura que os eventos não sejam descartados pelo ETW.

  • Gerenciar o fluxo de eventos para o ETW. O destino ETW cria um evento ETW com os dados de Eventos Estendidos e o envia para a sessão ETW apropriada. Se o evento for maior do que o tamanho do buffer, ou os dados não se encaixarem em um evento ETW, o ETW dividirá o evento em fragmentos.

  • Manter os pacotes de Eventos Estendidos habilitados o tempo todo.

Os locais de arquivo padrão seguintes são usados pelo ETW:

  • O arquivo de saída ETW está em %TEMP%\XEEtw.etl.

    Observação importanteImportante

    O caminho do arquivo não pode ser alterado depois que a sessão for iniciada.

  • Arquivos MOF (Managed Object Format) estão em <seu caminho de instalação>\Microsoft SQL Server\Shared. Para obter mais informações, consulte Managed Object Format no MSDN.

Destino de arquivo de evento

O destino de arquivo de evento é um destino assíncrono que grava buffers completos para disco. O destino de arquivo cria dois tipos de arquivos, log e metadados. O arquivo de metadados descreve os conteúdos de evento presentes no arquivo de log de saída de destino. Isso permite uma análise correta de todos os eventos no arquivo de log, assim como análise dos dados de ação associados a um evento.

Para usar esse destino, é necessário especificar o arquivo de log e o nome do local do arquivo de metadados. Outras opções de configurações, como tamanho de arquivo e características de crescimento são opcionais.

A tabela a seguir descreve as opções disponíveis para configurar o destino de arquivo de evento.

Opção

Valores permitidos

Descrição

nome do arquivo

Qualquer cadeia de caracteres até 260 caracteres. Esse valor é necessário.

O local e nome do arquivo.

É possível usar qualquer extensão de nome de arquivo.

max_file_size

Qualquer inteiro de 64 bits. Esse valor é opcional.

O tamanho máximo de arquivo em megabytes (MB). Se max_file_size não for especificado, o arquivo aumentará até que o disco fique cheio. O tamanho de arquivo padrão é 1 GB.

max_file_size deve ser maior que o tamanho atual dos buffers de sessão. Se não for, o destino de arquivo não inicializará, reportando que max_file_size é inválido. Para exibir o tamanho atual dos buffers, examine a coluna buffer_size na exibição de gerenciamento dinâmico sys.dm_xe_sessions.

Se o tamanho de arquivo padrão for menor do que o tamanho do buffer de sessão, é recomendável definir max_file_size com o valor especificado na coluna max_memory na exibição do catálogo sys.server_event_sessions.

Quando max_file_size é definido com um tamanho maior que o tamanho dos buffers de sessão, ele pode ser arredondado para baixo, para o múltiplo mais próximo do tamanho do buffer de sessão. Isso pode criar um arquivo de destino menor do que o valor especificado de max_file_size. Por exemplo, se o tamanho do buffer é 100 MB e max_file_size está definido como 150 MB, o tamanho de arquivo resultante é arredondado para baixo para 100 MB, porque um segundo buffer não caberia nos 50 MB restantes de espaço.

Se o tamanho de arquivo padrão for menor do que o tamanho do buffer de sessão, é recomendável definir max_file_size com o valor da coluna max_memory na exibição do catálogo sys.server_event_sessions.

max_rollover_files

Qualquer inteiro de 32 bits. Esse valor é opcional.

O número máximo de arquivos a serem retidos no sistema de arquivos.

incremento

Qualquer inteiro de 32 bits. Esse valor é opcional.

O crescimento incremental, em megabytes (MB), para o arquivo. Se não for especificado, o valor padrão do incremento será duas vezes o tamanho do buffer de sessão.

metadatafile

Qualquer cadeia de caracteres até 260 caracteres. Esse valor é necessário.

O local e nome dos metadados para o arquivo.

Na primeira vez que um destino de arquivo é criado, o nome de arquivo especificado é acrescentado com _0_ e um valor inteiro. O valor inteiro é calculado como o número de milissegundos entre 1o. de janeiro de 1600 e a data e a hora em que o arquivo foi criado. Os arquivos de substituição subseqüentes também usam esse formato. Examinando o valor do inteiro longo, você pode determinar o arquivo mais atual. O seguinte exemplo ilustra como arquivos são nomeados em um cenário no qual você especifica a opção de nome de arquivo como C:\OutputFiles\MyOutput.xel:

  • primeiro arquivo criado - C:\OutputFiles\MyOutput_0_128500310259380000.xel

  • primeiro arquivo de substituição - C:\OutputFiles\MyOutput_0_128505831770890000.xel

  • segundo arquivo de substituição - C:\OutputFiles\MyOutput_0_132410772966237000.xel

Destino de contador de evento síncrono

O destino de contador de evento síncrono conta todos os eventos acionados durante uma sessão de Eventos Estendidos. Usando o destino de contador de evento síncrono é possível obter informações sobre as características da carga de trabalho sem adicionar a sobrecarga completa de uma coleção de eventos. Esse destino não tem qualquer parâmetro personalizável.

O exemplo a seguir ilustra a saída de destino do contador de evento síncrono.

<CounterTarget truncated = "0">
  <Packages>
    <Package name = "[package name]">
      <Event name = "[event name]" count = "[number]" />
    </Package>
  </Packages>
</CounterTarget>

Destino de buffer de anel

O destino de buffer de anel mantém brevemente dados de eventos na memória. Esse destino pode gerenciar eventos de uma das duas maneiras possíveis.

  • O primeiro modo é basicamente o FIFO (primeiro a entrar, primeiro a sair), no qual o evento mais antigo é descartado quando toda a memória alocada ao destino é usada. Nesse modo (o padrão), a opção occurrence_number é definida como 0.

  • O segundo modo é o FIFO por evento, no qual um número especificado de eventos de cada tipo é mantido. Nesse modo, os eventos mais antigos de cada tipo são descartados quando toda a memória alocada ao destino é usada. Você pode configurar a opção occurrence_number para especificar o número de eventos de cada tipo a ser mantido.

A tabela a seguir descreve as opções disponíveis para configurar o destino de buffer de anel.

Opção

Valores permitidos

Descrição

default_memory

Qualquer inteiro de 32 bits. Esse valor é opcional.

A quantidade máxima de memória, em quilobytes (KB), para usar. Eventos existentes são descartados quando esse valor é alcançado.

occurrence_number

Um dos valores seguintes:

  • 0 (o padrão) = O evento mais antigo é descartado quando toda a memória alocada ao destino é usada.

  • Qualquer inteiro de 32 bits = O número de eventos de cada tipo a ser mantido antes de ser descartado em uma base FIFO por evento.

Esse valor é opcional.

O modo FIFO a ser usado e, se definido com um valor maior que 0, o número preferencial de eventos de cada tipo a ser mantido no buffer.

O exemplo a seguir ilustra a saída de destino do buffer de anel.

<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
 <event name="" package="" id="" version="" timestamp="">
    <data name="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </data>
    <action name="" package="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </action>
  </event>
</RingBufferTarget>

Histórico de alterações

Conteúdo atualizado

Adicionada uma observação sobre a sessão XE_DEFAULT_ETW_SESSION à seção "Rastreamento de eventos do Windows".

Na introdução, foram adicionadas descrições curtas para cada tipo de destino e diretrizes de uso recomendado.