Tópico anterior: Dentro da lógica de negócios

Próximo tópico: Registro

Fluxo de eventos

Conforme mencionado anteriormente, as entradas para a lógica de negócios são os eventos do mecanismo e os eventos de dados brutos.

Os eventos de dados brutos recebidos pela lógica de negócios são determinados pela função de registro na qual o código solicita um conjunto específico de eventos de dados brutos definidos pelo tipo de evento e identificadores de recurso.

Na lógica de negócios, o registro também associa uma sub-rotina definida pelo usuário que é executada para lidar com o evento de dados brutos quando um evento for recebido. (Por padrão, é OnXXXEvent, que deve ser renomeado para algo mais significativo.)

Os eventos do mecanismo são acionados pelo mecanismo de acordo com o contrato e as definições de métrica associadas. Quando o evento do mecanismo é acionado e recebido, o mecanismo executa o manipulador de eventos pertinente. Cada evento do mecanismo tem um manipulador de eventos implícito. Esses manipuladores de eventos são as funções e os procedimentos definidos no VBScript. O manipulador de eventos que controla o registro e a função “Resultado” devem ser implementados no código. Todos os outros manipuladores de eventos são opcionais. No entanto, a lógica de negócios não lida com eventos do mecanismo para os quais manipuladores de eventos não estão implementados. Portanto, é uma boa prática mantê-los no local (mesmo que não estejam em uso) para permitir melhorias no futuro.

Observação: ao escrever o script de lógica de negócios, é importante implementar todos os eventos do mecanismo para que seja possível abranger todas as possibilidades finais. Por exemplo, se uma definição de período de atividade não for aplicável durante a primeira etapa da implementação, mas será aplicável no futuro, todas as fórmulas precisarão ser alteradas. Portanto, é recomendável que o Especialista em lógica de negócios defina o comportamento "no período de atividade" e "fora do período de atividade" com antecedência, mesmo que inicialmente ele não seja aplicável, para que quando o comportamento for apresentado, as alterações necessárias no sistema sejam triviais.

A seguir, há vários eventos do mecanismo e seus manipuladores de eventos:

Fluxo de eventos

A seguir, estão as etapas seguidas pelo mecanismo de cálculo (serviço PslWriter) para processar uma única fórmula de lógica de negócios:

Durante cada ciclo de cálculo, o mecanismo avalia quais são os eventos do mecanismo e os eventos de dados brutos relevantes com base no período de cálculo. Primeiro, irá classificá-los por hora e, em seguida, enviá-los às fórmulas relevantes para cálculo. A hora do evento de dados brutos é sua data e hora, e a hora do evento do mecanismo é sua hora de acionamento. Em seguida, esses dois tipos de eventos são combinados em uma sequência de tempo e enviados para cálculo.

Os períodos dos eventos estão de acordo com a métrica local associada, mas o parâmetro de hora dos manipuladores de eventos (isto é, OnPeriodStart (Time)) e a data e hora do evento de dados brutos estão de acordo com o valor em UTC. O mecanismo os compara de acordo com seus valores em UTC, de forma a usar um ponto de referência constante.

Exemplo:

Se a diferença de fuso horário de UTC de uma métrica for de duas horas (por exemplo, GMT+2), e um evento de abertura de incidente tiver data e hora de 10h00, dentro do mecanismo a data e hora que o manipulador de eventos usará na verdade será modificada de forma adequada e realmente inicia às 8h00 UTC. Supondo que o conector esteja configurado para usar esse mesmo fuso horário, os eventos de dados brutos também terão 2 horas reduzidas para UTC no banco de dados. Quando os eventos são passados para a lógica de negócios, o agente de cálculo responsável pelo cálculo dos eventos no período que inicia às 10h00 usará a hora em UTC para os eventos, que será das 8h00 em diante. No entanto, se você usar a mensagem out.log no código para imprimir as datas e horas, ela mostrará a data e hora modificada para UTC e, portanto, mostrará 8h00, apesar do período especificado (de acordo com a métrica) ser às 10 da manhã.

No seguinte requisito de cálculo, é importante converter a data e hora do evento antes de usá-lo:

Se uma métrica for para calcular o número de incidentes que foram fechados no mesmo dia em que foram abertos, será necessário comparar a hora de abertura e de fechamento de cada incidente. Se a hora de abertura e de fechamento de um incidente cair no mesmo dia (e em um período de atividade definido), o incidente será contado.

Há a possibilidade de que durante o processo de modificação do incidente para UTC a partir de sua hora local original, o dia mude (isto é, novamente usando GMT+2). Um incidente aberto à 1h será modificado para 23h no dia anterior em UTC. Desse modo, não será contado mesmo que devesse ter sido. Essa é uma situação em que a hora primeiro deve ser convertida de volta para a hora local da métrica e apenas depois ser comparada. Nesse caso, use o método GetLocaleTime(utcTime). Esse método converte uma hora determinada em um fuso horário UTC para o fuso horário da métrica local.

A seguir, há o código do manipulador de eventos:
Sub OnIncidentEvent(eventDetails)
   If dateDiff("d",Tools.GetLocaleTime(eventDetails.time),_
     Tools.GetLocaleTime(eventDetails("ClosedAt)))=0 then
          CountIncidents=CountIncidents+1
   End If
End Sub