Udocs.me

Telemetria no Azure

image

Olá pessoal, hoje eu vou falar um pouco sobre o application insights do Microsoft Azure para telemetria de informações. Muitos analistas e arquitetos não pensam ou até pensam na parte de logar erro no sistemas, mas por algum motivo não desenvolve essa parte e o sistema vai crescendo até se tornar um monstro.

Após o sistema pronto, alguém pensa: poxa, tenho que ter o log das pessoas que estão utilizando o sistema. O grande problema é desenvolver com banco de dados o log de tudo, em toda classe e todos os métodos.

Para sanar o problema e ter tudo registrado, achei melhor fazer uma telemetria dos dados que eu desejo para guardar no Microsoft Azure. O primeiro ponto é importar a classe ApplicationInsights.

Código 1.1 - Importe

using Microsoft.ApplicationInsights;

Depois de importar em seu sistema, basta utilizar a classe TelemetryClient para registar o evento chamado TrackEvent. O legal com ele é que pode ser registrado qualquer propriedade como um dicionário, usando chave e valor. No meu caso, criei uma classe com Get e Set utilizando todas as propriedades que eu preciso.

O que eu preciso registrar é o nome da api, o usuário, o nome do método, a excessão e todos os dados da excessão. Isso porque eu quero registrar todos os erros ocorridos no sistema para dentro do Microsoft Azure.

Código 1.2 - Classe com Get e Set

/// <summary>
/// Objects da classe
/// </summary>
public class ElementTelemetryObjects
{
    /// <summary>
    /// 
    /// </summary>
    public string apiName { get; set; }

    /// <summary>
    /// User Id
    /// </summary>
    public string userId { get; set; }

    /// <summary>
    /// Método
    /// </summary>
    public string method { get; set; }

    /// <summary>
    /// InnerHTML
    /// </summary>
    public string innerHTML { get; set; }

    /// <summary>
    /// Message
    /// </summary>
    public string exceptionMessage { get; set; }

    /// <summary>
    /// A excecao ocorrida
    /// </summary>
    public string dataException { get; set; }
}

Depois de ter gerado as propriedades que eu preciso, criei uma classe que receber a classe de propriedade e registra todos os dados. O método chamado Register(ElementTelemetryObjects) prepara as propriedades e registra no Azure através do EventTrack.

O código 1.3 mostra toda a classe preparada com chave e valor com o objeto.

Código 1.3 - Método principal que registra o EventTrack.

 /// <summary>
/// Classe que registra os eventos no telemetry azure
/// </summary>
public class EventTelemetryRegister
{
    /// <summary>
    /// Telemetry Azure
    /// </summary>
    protected TelemetryClient Telemetry = new TelemetryClient();

    /// <summary>
    /// Método que registra os Eventos no Telemetry
    /// Envie os objetos ElementTelemetryObjects
    /// </summary>
    /// <param name="objects">ElementTelemetryObjects</param>
    public void Register(ElementTelemetryObjects objects)
    {
        EventTelemetry eventTelemetry = new EventTelemetry(objects.apiName);

        eventTelemetry.Properties.Add("UserId", objects.userId);
        eventTelemetry.Properties.Add("Method", objects.method);

        if (!String.IsNullOrEmpty(objects.innerHTML))
            eventTelemetry.Properties.Add("InnerHTML", objects.innerHTML);

        if (!String.IsNullOrEmpty(objects.exceptionMessage))
            eventTelemetry.Properties.Add("Message", objects.exceptionMessage);

        if (!String.IsNullOrEmpty(objects.dataException))
            eventTelemetry.Properties.Add("Exception", objects.dataException);

        Telemetry.TrackEvent(eventTelemetry);
    }
}

Como meu objetivo era registrar todo erro jundo ao Azure, criei os objetos, criei a classe principal e agora eu preciso colocar dentro dos métodos já desenvolvidos. Dentro da Controller do Web API eu coloquei na exception a chamada do método RegistrarTelemetry.

Agora, todo o método da minha controller terá essa chamada para registrar o erro e assim eu vou saber qual usuário chamou, qual a API, qual o erro causado, qual método e tudo mais. Assim eu posso verificar qualquer problema ocorrido dentro do sistema de serviços.

///Pega os documentos locais vinculados no banco de dados
public GetDocumentsResponse GetDocumentsLocais([FromUri] GetDocumentsRequest request)
{
    try
    {
        return DocumentBo.GetDocumentsLocais(request);
    }
	 catch (Exception ex)
    {
        RegistrarTelemetry(ex, "GetDocumentsLocais");

        throw ex;
    }
}

Dentro do Azure existe o Application Insights dentro da aplicação. Basta clicar lá e ver quase em tempo real os erros ocorridos dentro do aplicativo ou software que chama a Controller, no meu caso o serviço.

Espero que tenha gostado e qualquer dúvida pode entrar em contato pelo site https://www.mauriciojunior.org.


Autor: Mauricio Junior
Revista ecode10 Magazine