How to Monitor SSIS Package Execution Time

17 de dezembro de 2019 0 Por Luciano Gambato

Monitorar o tempo de execução de projetos do SSIS é uma tarefa essencial para garantir que os dados estão sendo carregados corretamente e no tempo previsto, principalmente quando uma aplicação está aguardando o retorno destas execuções.

O SSIS oferece alguns reports padrões que mostram o tempo utilizado nas últimas execuções, porém estes reports não são nem um pouco úteis quando precisamos monitorar processos que rodam dezenas de vezes a cada hora. Na figura abaixo, podemos observar um dos reports padrões que o SSIS oferece. Ele mostra o tempo decorrido nas últimas dez execuções que finalizaram com sucesso.

Esse report pode ser utilizado para uma simples conferência, mas precisamos automatizar o monitoramento, e para resolver esse problema vamos utilizar o banco SSISDB. O mesmo é criado quando configuramos o integration services na instância e é responsável por armazenar todas as informações relacionadas aos projetos do SSIS, como, por exemplo, versões, propriedades, execuções, dados de conexão, etc.

Vamos utilizar a tabela catalog.executions. Ela armazena todas as instâncias dos packages que foram criadas e informações da execução, como, por exemplo, o status da execução, data de criação, a versão do package, etc.

Para calcular qual é o tempo de execução, vamos consultar a coluna start_time, que armazena a data e hora em que a instância do packge foi executada, e utilizando a função datediff vamos obter a diferença em segundos do início da execução com a data atual, conforme:

declare @foldername as varchar(50) = '' 
declare @packagename as varchar(50) = '' 
declare @executiontime int = 0 
 
select @executiontime = datediff(s, cast(start_time as datetime), getdate()) 
from ssisdb.catalog.executions 
where status = 2  
and folder_name = @foldername 
and package_name = @packagename 

Nos filtros, utilizamos o nome da pasta, a qual o projeto foi salvo, o nome do package e o status. A coluna status grava o estado atual de cada execução e pode apresentar diversos valores. Utilizamos o valor 2 que representa running, ou seja, vai retornar somente o tempo de execução para o package que ainda está executando. Ressaltando que esses filtros podem ser alterados conforme as peculiaridades de cada projeto.

Você deve estar se perguntando, como podemos notificar ao operador que o ETL está executando a mais tempo que o planejado? Simples, podemos utilizar a stored procedure sp_send_dbmail passando como parâmetro um profile do Database Mail, os destinatários, assunto e o corpo do e-mail contendo todas as informações necessárias.

if @executiontime > 180
begin 

exec msdb.dbo.sp_send_dbmail
    @profile_name = 'OperadorTeste', 
    @recipients = 'teste@teste.com.br', 
    @body = 'O package pckTeste está executando a mais de 3 minutos. (Tempo médio de execução 10 segundos).', 
    @subject = 'Tempo de execução pckTeste' 

end

Por fim, adicionamos esses scripts em um job do SQL Agent e configuramos uma schedule. Assim toda vez que o job executar e o tempo de execução do package for maior do que o planejado, o operador será notificado.

Gostou do artigo técnico? Ficou com dúvida? Entre em contato com a gente!