Compartir vía


Tutorial: Supervisión y diagnóstico de una aplicación de Service Fabric mediante Application Insights

Este tutorial es la quinta parte de una serie. Describe los pasos necesarios para configurar la supervisión y el diagnóstico de una aplicación ASP.NET Core que se ejecuta en un clúster de Service Fabric de Azure con Application Insights. Recopilará datos de telemetría de la aplicación que se desarrolla en la primera parte de la serie de tutoriales.

En este tutorial, aprenderá a:

  • Configurar un recurso de Application Insights
  • Agregar Application Insights a los servicios de la aplicación
  • Ver datos de telemetría y Mapa de aplicación en Application Insights
  • Agregar instrumentación personalizada a la aplicación

En esta serie de tutoriales se muestra cómo realizar las siguientes acciones:

Requisitos previos

Antes de empezar este tutorial:

Descarga de la aplicación de ejemplo de votación

Si no compiló la aplicación de ejemplo de votación en la primera parte de esta serie de tutoriales, puede descargarla. En un terminal o ventana Comandos, ejecute el comando siguiente para clonar el repositorio de la aplicación de ejemplo en el equipo local:

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

Configurar un recurso de Application Insights

Application Insights es la plataforma de administración del rendimiento de aplicaciones de Azure. Se recomienda utilizar Application Insights para la supervisión y diagnóstico de aplicaciones de Service Fabric.

Para crear un nuevo recurso de Application Insights vaya a Azure Portal. Seleccione Crear un recurso. En el menú del portal, seleccione Supervisión y diagnóstico. En la columna Servicios populares de Azure, en Application Insights, seleccione Crear.

Captura de pantalla que muestra cómo crear un nuevo recurso de Application Insights.

Escriba o seleccione los valores de Suscripción, Grupo de recursos y Nombre. Para la Región, elija dónde quiere implementar el clúster de Service Fabric en el futuro. En este tutorial, se implementa la aplicación en un clúster local, de modo que la región de Azure es irrelevante. En Tipo de aplicación, déjelo como Aplicación web ASP.NET.

Captura de pantalla que muestra atributos de recurso de Application Insights.

Cuando haya escrito o seleccionado la información necesaria, seleccione Crear para aprovisionar el recurso. El recurso se implementa en aproximadamente un minuto.

Agregar Application Insights a los servicios de la aplicación

Abra Visual Studio 2019 con la opción Ejecutar como administrador (haga clic con el botón derecho en el icono de Visual Studio en el menú Inicio). Seleccione Archivo>Abrir>Proyecto o solución y vaya a la aplicación Voting (creada en la primera parte del tutorial o clonada de GitHub). Abra Voting.sln. Si se le pide que restaure los paquetes NuGet de la aplicación, seleccione .

Para configurar Application Insights para los servicios VotingWeb y VotingData:

  1. Haga clic con el botón derecho en el nombre del servicio y seleccione Agregar>Servicios conectados>Supervisión con Application Insights.

    Captura de pantalla que muestra cómo configurar los servicios de Application Insights.

    Nota:

    En función del tipo de proyecto, al hacer clic con el botón derecho en el nombre del servicio, es posible que tenga que seleccionar Agregar y luego seleccionar Telemetría de Application Insights.

  2. Seleccione Comenzar.

  3. Inicie sesión en la cuenta que usó para la suscripción a Azure y seleccione la suscripción en la que creó el recurso de Application Insights. Para buscar el recurso, en Recurso, vaya a Recurso existente de Application Insights. Seleccione Registrar para agregar Application Insights al servicio.

    Captura de pantalla que muestra cómo registrar Application Insights.

  4. Seleccione Finalizar.

Nota:

Asegúrese de seguir estos pasos para ambos servicios de la aplicación para finalizar la configuración de Application Insights para la aplicación. Se utiliza el mismo recurso de Application Insights para ambos servicios para ver las solicitudes entrantes y salientes, y la comunicación entre servicios.

Agregue el paquete NuGet Microsoft.ApplicationInsights.ServiceFabric.Native a los servicios

Application Insights tiene dos paquetes NuGet específicos de Service Fabric que puede usar, en función del escenario. Uno se usa con los servicios nativos de Service Fabric y el otro, con contenedores y archivos ejecutables invitados. En este caso, usamos el paquete NuGet Microsoft.ApplicationInsights.ServiceFabric.Native para obtener información sobre el contexto del servicio. Para obtener más información sobre el SDK de Application Insights y los paquetes NuGet específicos de Service Fabric, consulte Microsoft Application Insights para Service Fabric.

Para configurar el paquete de NuGet:

  1. En el Explorador de soluciones, haga clic con el botón derecho en la solución "Voting" y seleccione Administrar paquetes de NuGet para la solución.

  2. En el cuadro de diálogo NuGet: solución, seleccione Examinar. Active la casilla Incluir versión preliminar.

    Nota:

    Es posible que sea necesario instalar el paquete Microsoft.ServiceFabric.Diagnostics.Internal de forma similar si no está preinstalado antes de instalar el paquete de Application Insights.

  3. Busque Microsoft.ApplicationInsights.ServiceFabric.Native y, a continuación, seleccione el paquete NuGet.

  4. En el panel derecho, active la casilla VotingWeb y la casilla VotingData. Seleccione Instalar.

    Captura de pantalla que muestra el SDK de Application Insights en NuGet.

  5. En el cuadro de diálogo Vista previa de los cambios, seleccione Aceptar para aceptar la licencia. Los paquetes NuGet se agregan a los servicios.

  6. Después, configure el inicializador de telemetría en los dos servicios. Abra VotingWeb.cs y VotingData.cs. Complete los pasos siguientes en ambos archivos de código:

    1. Agregue estas dos instrucciones using en la parte superior de cada archivo después de las instrucciones using ya existentes:

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. En ambos archivos, en la instrucción anidada return de CreateServiceInstanceListeners() o CreateServiceReplicaListeners(), en ConfigureServices>services, con los demás servicios singleton declarados, agregue:

      .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
      

      Este código agrega Service Context a la telemetría, lo que le permitirá comprender mejor el origen de la telemetría de Application Insights. La instrucción return anidada en VotingWeb.cs ahora tiene un aspecto similar al de este ejemplo:

      return new WebHostBuilder()
          .UseKestrel()
          .ConfigureServices(
              services => services
                  .AddSingleton<HttpClient>(new HttpClient())
                  .AddSingleton<FabricClient>(new FabricClient())
                  .AddSingleton<StatelessServiceContext>(serviceContext)
                  .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseStartup<Startup>()
          .UseApplicationInsights()
          .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
          .UseUrls(url)
          .Build();
      

En VotingData.cs, el código ahora tiene un aspecto similar al de este ejemplo:

return new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<StatefulServiceContext>(serviceContext)
            .AddSingleton<IReliableStateManager>(this.StateManager)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
    .UseUrls(url)
    .Build();

Compruebe que el método UseApplicationInsights() se llama en VotingWeb.cs y VotingData.cs, como se ha mostrado en los ejemplos.

Nota:

Esta aplicación de ejemplo utiliza HTTP para que los servicios se comuniquen. Si desarrolla una aplicación mediante Service Remoting V2 de Service Fabric, agregue también las siguientes líneas en la misma ubicación en el código:

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

En este punto, ya está listo para implementar la aplicación. Seleccione Inicio (o seleccione F5). Visual Studio compila y empaqueta la aplicación, configura el clúster local e implementa la aplicación en el clúster.

Nota:

Puede que reciba un error de compilación si no tiene una versión actualizada del SDK de .NET Core instalada.

Cuando se implemente la aplicación, vaya a localhost:8080, donde se ejecuta la aplicación de página única de ejemplo de votación. Vote distintos elementos de su elección para crear datos de ejemplo y telemetría. Por ejemplo, postres.

Captura de pantalla que muestra un ejemplo de votación para tipos de postre.

También puede seleccionar Quitar para eliminar algunas opciones de voto cuando acabe de agregar algunos votos.

Ver datos de telemetría y Mapa de aplicación en Application Insights

En Azure Portal, vaya al recurso de Application Insights.

Seleccione Información general para volver al panel de información general del recurso. A continuación, seleccione Buscar en la parte superior para ver los seguimientos entrantes. Los seguimientos tardan unos minutos en aparecer en Application Insights. Si no ve ningún seguimiento, espere un minuto y seleccione el botón Actualizar.

Desplácese hacia abajo en la ventana de búsqueda para ver todos los datos de telemetría entrantes que se incluyen con Application Insights. Para cada acción que haya realizado en la aplicación Voting, debería haber una solicitud PUT saliente desde VotingWeb (PUT Votes/Put [nombre]) y una solicitud PUT entrante desde VotingData (PUT VoteData/Put [nombre]), seguidas de un par de solicitudes GET para actualizar los datos que se muestran. También habrá un seguimiento de la dependencia de HTTP en localhost, puesto que estas solicitudes son solicitudes HTTP. Este es un ejemplo de lo que verá sobre cómo se agrega un voto:

Captura de pantalla que muestra mapa de aplicación de Application Insights.

Puede seleccionar un seguimiento para ver más detalles sobre él. Application Insights incluye información útil acerca de la solicitud, como los valores de Tiempo de respuesta y la URL de solicitud. Puesto que agregó un paquete de NuGet específico de Service Fabric, también obtiene datos sobre la aplicación en el contexto de un clúster de Service Fabric en la sección Datos personalizados. Estos datos incluyen el contexto de servicio, para que pueda ver los valores de PartitionID y ReplicaId del origen de la solicitud y aislar mejor problemas cuando diagnostique errores en la aplicación.

Para ir a Mapa de aplicaciones, seleccione Mapa de aplicaciones en el menú de recursos del panel Información general o seleccione el icono Mapa de aplicaciones. El mapa muestra los dos servicios conectados.

Captura de pantalla que resalta el mapa de aplicación en el menú de recursos.

El Mapa de aplicación le puede ayudar a entender mejor la topología de la aplicación, especialmente a medida que empiece a agregar servicios que funcionen juntos. También proporciona datos básicos sobre los índices de éxito de las solicitudes, y puede ayudarle a diagnosticar solicitudes con error y a comprender en qué momento salió mal. Para obtener más información, consulte el Mapa de aplicación en Application Insights.

Agregar instrumentación personalizada a la aplicación

Aunque Application Insights proporciona telemetría lista para usar, puede agregar una instrumentación más personalizada. Tal vez tenga necesidades empresariales para instrumentación personalizada o quiera mejorar los diagnósticos cuando las cosas van mal en la aplicación. Puede ingerir eventos y métricas personalizados mediante la API de Application Insights.

A continuación, agregue algunos eventos personalizados a VoteDataController.cs (en VotingData>Controllers) para realizar el seguimiento de cuándo se agregan y eliminan votos del elemento votesDictionary subyacente:

  1. Agregue using Microsoft.ApplicationInsights; al final de otras instrucciones using.

  2. Declare un nuevo elemento TelemetryClient al principio de la clase, bajo la creación de IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.

  3. En la función Put(), agregue un evento que confirme que se ha agregado un voto. Agregue telemetry.TrackEvent($"Added a vote for {name}"); después de completar la transacción, justo antes de la instrucción return OkResult.

  4. En Delete(), hay un "if/else" basado en la condición de que votesDictionary contiene votos para una opción de votación específica.

    1. Agregue un evento que confirme la eliminación de un voto en la instrucción if, después de await tx.CommitAsync(): telemetry.TrackEvent($"Deleted votes for {name}");
    2. Agregue un evento para mostrar que la eliminación no tuvo lugar en la instrucción else, antes de la instrucción return: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Este es un ejemplo del aspecto que podrían tener las funciones Put() y Delete() después de agregar los eventos:

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

Cuando haya acabado de realizar estos cambios, seleccione Iniciar en la aplicación para compilar e implementar su versión más reciente. Cuando la aplicación haya terminado de implementarse, vaya a localhost:8080. Agregue y elimine algunas opciones de votación. A continuación, vuelva al recurso de Application Insights para ver los seguimientos de la última ejecución (los seguimientos tardan de 1 a 2 minutos en aparecer en Application Insights). Para todos los votos que agregó y eliminó, ahora debería ver una entrada para evento personalizado con telemetría de respuesta asociada.

Captura de pantalla que muestra eventos personalizados.