Blog

Reparieren von Anwendungseinblicken Live Metrics Stream auf Azure Mobile Apps

Marcel de Vries

Aktualisiert Oktober 21, 2025
3 Minuten

In Vorbereitung auf die Tech Days 2016 habe ich mit meinen Kollegen an der Techdays-App gearbeitet und dafür haben wir auch ein Backend-System. Dieses System läuft nun schon seit einiger Zeit und wir möchten bessere Einblicke in die Nutzung der Website und der mobilen App erhalten.

Eine der neuesten Ergänzungen zu Application Insights ist die Möglichkeit von Live Metrics, mit der Sie den aktuellen Datenverkehr auf Ihrer Website oder API sehen können.

Hierfür können Sie einfach ein NuGet-Paket hinzufügen, das derzeit noch in der Vorabversion ist, aber hervorragend funktioniert.

Sobald Sie das Paket installiert und die Website gestartet haben, leuchtet im Azure-Portal die Kachel Live Stream auf. Wenn Sie darauf klicken, sehen Sie einige Live-Diagramme, die den aktuellen Traffic auf der Website oder der API anzeigen.

Natürlich wollten wir unser Backend ganz einfach auf Azure Web Apps und für diesen speziellen Zweck auf Azure Mobile Services hosten, denn das ist es, was wir als mobiles Backend der Anwendung verwenden. Aber anscheinend gibt es einige subtile Unterschiede, die verhindern, dass AppInsights richtig funktioniert, wenn es um Live Metrics geht.

Wenn wir die Web-API auf einem lokalen Rechner mit aktivierten App-Insights ausführen, sehen wir eine schöne Reihe von Diagrammen, wie hier unten gezeigt:

clip_image002

Wenn ich dies jedoch bei den Azure Mobile-Diensten einsetze, führt dies zu einer Seite, die nur die Abhängigkeitsaufrufe anzeigt, aber keine eingehenden Anfragen und auch keine Anfragedauer. Sie sehen nur eine erste Anfrage, und danach sind die eingehenden Anfragen nur noch ein Flattersatz.

clip_image001

Nach einigen Nachfragen beim App Insights Team erhielt ich die Information, dass, da Azure Mobile Services OWIN verwendet, die App Insights HTTP-Module nicht geladen werden, da dies nicht erlaubt ist, und schließlich, weil die Leistungszähler der Webanwendung nicht zugänglich sind, diese Metriken nicht angezeigt werden. Nach einigem Hin und Her erhielt ich die Information, dass es möglich wäre, zumindest die Informationen für die Anfragen auf dem Bildschirm zu erhalten, indem man ein kleines Stück Middleware hinzufügt, das die Anfrage anstelle des standardmäßigen HttpModuls verfolgen kann, das normalerweise instanziiert wird, aber in einer mobilen App nicht erlaubt ist.

Das Einzige, was ich also tun musste, war, eine Middleware-Komponente wie die folgende zu erstellen:

public class ApplicationInsightsMobileAppRequestHandler : OwinMiddleware
{
  private readonly TelemetryClient telemetryClient;
  public ApplicationInsightsMobileAppRequestHandler(OwinMiddleware next) : base(next)
  {
  Versuchen Sie
  {
  // Der Aufruf initialisiert die TelemetryConfiguration, die die Module erstellt und intialisiert
  TelemetryConfiguration Konfiguration = TelemetryConfiguration.Active;
  telemetryClient = new TelemetryClient(configuration);
  }
  catch (Exception exc)
  {
  Trace.WriteLine("Fehler beim Initialisieren des Handlers");
  Trace.WriteLine(exc.Message);
  }
}
public override async Task Invoke(IOwinContext context)
{
  var operation = telemetryClient.StartOperation<RequestTelemetry>(context.Request.Path.Value);
  Versuchen Sie
  {
  var requestTelemetry = operation.Telemetry;
  await this.Next.Invoke(context);
  requestTelemetry.HttpMethod = context.Request.Method;
  requestTelemetry.Url = context.Request.Uri;
  requestTelemetry.ResponseCode = context.Response.StatusCode.ToString();
  requestTelemetry.Success = context.Response.StatusCode  >= 200 && context.Response.StatusCode  <  300;
  }
  catch (Exception exc)
  {
  var telemetry = new ExceptionTelemetry(exc);
  telemetry.HandledAt = ExceptionHandledAt.Unhandled;
  telemetryClient.TrackException(telemetry);
  }
  schließlich
  {
  telemetryClient.StopOperation(operation);
  }
  }
}

Und eine Erweiterungsmethode zur Registrierung der Middleware in der Anfrage-Pipeline beim Start in der Klasse Startup:

public static class AppBuilderExtensions
{
  public static IAppBuilder UseMobileAppRequestHandler(this IAppBuilder app)
  {
  return app.Use<ApplicationInsightsMobileAppRequestHandler>();
  }
}

Stellen Sie in der Startklasse der Anwendung sicher, dass Sie diesen Handler wie folgt als ersten registrieren:

public static void ConfigureMobileApp(IAppBuilder app)
{
  HttpConfiguration config = new HttpConfiguration();
  app.UseMobileAppRequestHandler();
  app.UseWebApi(config);
  ConfigureSwagger(config);
}

Und das war's!

Wenn Sie jetzt die mobile Azure-App bereitstellen, sehen Sie die Live-Metriken, wie wir es erwarten. Wir haben zwar immer noch keine Statistiken zum Speicherverbrauch und zur CPU-Auslastung, aber zumindest werden jetzt alle eingehenden Anfragen in Echtzeit angezeigt.

Hoffentlich hilft das!

Marcel

Verfasst von

Marcel de Vries

Marcel is a key figure in the technology sector, serving as the co-founder and Global MD & CTO of Xebia Microsoft Services. He is deeply involved in advancing organizational capabilities to deploy software swiftly and securely, emphasizing the importance of innovation and productivity while maintaining compliance. Marcel is passionate about technology and continuous learning, often sharing his insights at leading industry events and through online courses on Pluralsight. Recognized for his contributions, Marcel has been honored with the Microsoft MVP award for over 17 consecutive years and is a Microsoft Regional Director since 2008. His expertise spans across Cloud Adoption Strategies, DevOps, and various cloud computing frameworks, making him a respected voice in the tech community.

Contact

Let’s discuss how we can support your journey.