Dieser Artikel wurde maschinell übersetzt.

Prognose: bewölkt

Berichterstattung über Diagnosedaten

Joseph Fultz

Downloaden des Codebeispiels

Joseph FultzSie haben wahrscheinlich viel über Windows Azure in letzter Zeit gehört. Es ist eine hervorragende Entwicklungsplattform zum Erstellen und Bereitstellen von Webanwendungen. Management kann leider ein bisschen eine Herausforderung sein. Windows Azure bietet einen schönen Rahmen für die Erfassung und Übertragung von Diagnosedaten über die ausgeführte Anwendung und die Rolle, aber fällt kurz auf das Abrufen von Daten in eine nützliche Datenspeicher – und es hilft nicht mit der Visualisierung und Analyse von Daten.

Geben Sie die SQL Azure Reporting CTP, unser Thema für diesen Monat. Möglicherweise profanen (durch Entwickler-Standards), aber ich werde es im Kontext der Verwaltung und Überwachung von meine Windows Azure-Bereitstellungen umfassen. Ich werde es mit Daten von Leistungsindikatoren erfasst, die für eine Web-Rolle als Teil der Diagnose demonstrieren. Bis heute ist den Mechanismus werden die meisten Leute verwenden Überweisungsdaten wieder zu Hause oder einen Datenspeicher SQL Azure von einem lokalen Computer über das reporting-Tools wie SQL Server Reporting Services oder Microsoft Excel zugreifen. Leider haben die aktuelle Implementierungen dieser Pfade nach einige wesentliche Nachteile. Einerseits, wenn alle Daten auf einem lokalen Speicher für die Meldung übertragen wird, kann dies sowohl Kosten und veraltete Informationen ausführen. Andererseits, wenn Sie SQL Azure zur Ausführung einer lokalen Bericht oder das Tool zugreifen, verringern Sie die Menge der Daten durch aggregieren und Zusammenfassen der Daten übertragen, aber die Datenübertragung ist immer noch da – und mit einem nicht-triviale Bericht, Sie wahrscheinlich noch einiger Wartezeit haben. Durch die Daten in der Wolke und auch aus der Wolke Berichterstattung zu behalten, können Sie nur die Berichtsansicht der Daten, was die neuesten Daten und minimaler Latenz für den Bericht senden.

Das Design und Setup

Um dieses Projekt im Gange zu erhalten, ist das erste, was ich zu tun habe ich sammeln werde ich werde, um es und wie der Bericht darauf werde ich, welche Daten zu bestimmen. In diesem Fall werde ich zum Sammeln von Prozent GC-Zeitdauer in Prozent CPU-Zeit, beide allgemeiner Leistungsindikatoren sind, die ich bei Ausführen Leistungstests betrachten. Ich brauche die Daten aus seinen Platz Landung in Azure-Tabelle-Speicher in SQL Azure verschieben, um reporting zu erleichtern. ** Abbildung 1** stellt den Datenfluss dar.

The Flow of Data
Abbildung 1 des Datenflusses

Verwenden dieses Diagramm des Datenflusses, kann ich auch meine Bereiche Aufwand identifizieren. Die Zahlen zuordnen im Diagramm die folgenden Arbeitsaufgaben:

  1. Diagnose für Rollen konfigurieren
  2. Durch die Konfiguration fertig
  3. In SQL Azure übertragen
    1. Erstellen Sie eine Worker-Rolle, die bei einigen Frequenz Daten verschiebt
    2. Definieren Sie ein Schema für die Datentabellen
  4. Berichterstellung
    1. Erstellen Sie eine Abfrage zum Abrufen der benötigten Daten in einem nutzbaren format
    2. Erstellen Sie eine Berichtsdefinition, die Daten in den Bericht zu rendern.

SQL Azure Reporting

Zum Zeitpunkt der Erstellung dieses Dokuments der Berichtserstellungsfunktionen von SQL Azure vorhanden ist, als CTP, die zur Anmeldung at connect.microsoft.com/sqlazurectps. Sobald SQL Azure Reporting aktiv auf Mein Konto, kann ich navigieren sie im Verwaltungsportal und sehen Sie so etwas wie was, in angezeigt wird Abbildung 2.

SQL Azure Reporting CTP
Abbildung 2 SQL Azure Reporting CTP

Es ist wichtig zu beachten, dass der Webdienst-URL und den Benutzernamen auf später benötigen wie ich in diesem Beispiel erstellen. Wenn Sie nach, zusammen, müssen Ihre als auch Sie. Sobald SQL Azure bereitgestellt wird, ist es im Grunde bereit oder einfach warten auf Bereitstellung von Berichten.

Sie müssen auch Business Intelligence Development Studio (BIDS), um die Berichte zu erstellen und auf den Dienst bereitstellen.

Diagnose-Setup

Zum Sammeln von Daten, die ich habe ich ein paar PerformanceCounterConfiguration Objekte zu erstellen und die PerformanceCounters.DataSources in der OnStart-Methode der Rollen, die, denen ich mich interessiere, hinzugefügt. Ich habe eine einfache Web-Rolle, die aus der Vorlage nicht geändert wird, aber es wird eine Datenquelle bereitstellen. Ich verlegen beide Leistungsindikatoren Beispiel alle fünf Sekunden und anschließend übertragen die gesammelten Daten in Tabelle Speicher pro Minute. Abbildung 3 zeigt den Code für diese. Diese Zahlen sind völlig lächerlich in etwas anderes als ein Proof-of-Concept-Beispiel verwenden aber ist genau das, was habe ich erstellt und in kürzester Zeit etwas repräsentativen generieren genügend Daten sammeln möchte.

Abbildung 3 Beispielcode Data Collection

// Create performance counter.
var performanceConfiguration = new PerformanceCounterConfiguration();
performanceConfiguration.CounterSpecifier = @"\Processor(_Total)\% Processor Time";
performanceConfiguration.SampleRate = System.TimeSpan.FromSeconds(5.0);
 
// Add counter to the configuration.
config.PerformanceCounters.DataSources.Add(performanceConfiguration);
 
performanceConfiguration = new PerformanceCounterConfiguration();
performanceConfiguration.CounterSpecifier =
  @"\.NET CLR Memory(_Global_)\% Time in GC";
performanceConfiguration.SampleRate = System.TimeSpan.FromSeconds(5.0);
 
config.PerformanceCounters.DataSources.Add(performanceConfiguration);
 
config.PerformanceCounters.ScheduledTransferPeriod =
  System.TimeSpan.FromMinutes(1.0);
 
DiagnosticMonitor.Start(
  "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);

Die Datenerfassung und Berichterstellung

Jetzt brauche ich, um die Daten in einem Format und einen Informationsspeicher für die Berichterstellung, und dann kann ich den Bericht erstellen. Meine offensichtliche Wahl für die Speicherung der Daten wird SQL Azure sein, und nicht nur, weil es die structured Storage-Lösung für Windows Azure ist, ist auch die einzige Datenquelle, die SQL Azure Reporting zur Zeit beanspruchen kann. Wenn Sie den Bereitstellungsspeicherort für Windows Azure Speicher, SQL Azure und SQL Azure Reporting-Rollen auswählen, es empfiehlt sich, im gleichen Datencenter oder zumindest in einzusetzen derselben geographischen Region eindringen oder Ausstieg Gebühren zu vermeiden.

Datenschema und Transfer

Für das Beispiel werde ich nur das Schema einfach halten. Ich habe eine Id-Spalte, eine Identität zu verwenden als Primärschlüssel (PK), ist, obwohl eine realistischere PK so etwas wie ComputerName, CounterName + TimeStamp wäre. Jetzt werde ich nur das Identity-Feld verwenden. Abbildung 4 zeigt meine einfache Schema für die Speicherung von meinem Leistungsindikatordaten.

Abbildung 4 einfache Schema für die Speicherung von Leistungsindikatordaten

Name Typ
Id Identity, Int
TimeStamp Nvarchar (50)
CounterName Nvarchar (50)
Tageswerte Real

Ich hatte ursprünglich den Zeitstempel als aktuelle Timestampspalte, aber ich änderte es in eine Zeichenfolge zu manipulieren erleichtern. Als eine Angelegenheit von allgemeinen Praxis verwendung einer lokalen Instanz von SQL Server für die erste Entwicklung und, wenn ich bereit bin, ich ein Skript erstellen, ein neues Abfragefenster, ändern Sie die Verbindung zum SQL Azure herstellen und das Skript ausführen, um die Tabellen zu erstellen.

Jetzt, da ich Daten in Tabelle Speicher und auch ein Ort, um es in SQL Azure gesetzt wird, brauche ich die Rolle der Arbeitnehmer, die Daten zu verschieben, damit ich meine Lösung eine Worker-Rolle hinzufügen. In der OnStart-Methode, ich den Standardkonfiguration Publisher-Code hinzufügen, weil ich brauche, greifen einige Informationen von Einstellungen, wie in gezeigt Abbildung 5.

Abbildung 5 Standard Publisher Konfigurationscode

ServicePointManager.DefaultConnectionLimit = 12; 

CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
  configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
  RoleEnvironment.Changed += (sender, arg) =>
  {
    if (arg.Changes.OfType().
Any((change) => (change.ConfigurationSettingName == configName)))
    {
    if(!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
  {
  RoleEnvironment.RequestRecycle();
    }
  }
  };
});

Als Nächstes füge ich eine Methode namens TransferPerfDataToSql der Klasse. Innerhalb dieser Methode werde ich greifen die verfügbaren Daten sowie die durchschnittliche es. Ich habe die Run-Methode schlafen für etwa eine Minute so es mehrere Einträge für jeden Leistungsindikator gibt. Da ich nicht wirklich in die originalgetreue der gesammelten Leistungsindikatoren interessiert bin, werde ich ihnen an jedem Punkt des Transfers Durchschnitt. So, was auch immer das Intervall ist für die Probenahme der Leistungsindikatoren, werde ich es in einen einzelnen Eintrag für eine Minute und 15-Sekunden-Intervall umzuwandeln. Aus Gründen der Übersichtlichkeit in diesem Beispielcode werde ich dies separat für jeden Leistungsindikator tun, wenn sie eine Anweisung durchgeführt werden konnte. Abbildung 6 zeigt, wie es aussieht um für einen Leistungsindikator zu tun.

Abbildung 6 Abrufen einer einzigen Intervallwert

var account = CloudStorageAccount.FromConfigurationSetting(
  "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
var context = new PerformanceDataContext(account.TableEndpoint.ToString(),
  account.Credentials);
var data = context.PerfData;
 
 
// Get average CPU.
List selectedData =
  (from d in data
   where d.CounterName == @"\Processor(_Total)\% Processor Time"
   select d).ToList();
 
double AvgCPU = (from d in selectedData
                 where d.CounterName == @"\Processor(_Total)\% Processor Time"
                 select d.CounterValue).Average();

Nachdem ich den Wert abzurufen, müssen die Daten aus der Tabelle Speicher entfernen werden. Ich könnte die REST-API direkt aufrufen, aber in diesem Fall ich einfach Durchlaufen der ausgewählten Objekte und Durchlauf jeweils um DeleteObject Kontext:

foreach (PerformanceData perfdata in selectedData)
{
  context.DeleteObject(perfdata);
}
 
context.SaveChanges();

Ich wiederhole diesen Code für den GC-Zähler als auch. Jeder Wert Sammeln von Mein Datenspeicher hinzugefügt werden muss. Ich habe eine EDMX-Datei für die Tabelle CounterData, gegen die ich schreibe in gezeigten Code erstellt Abbildung 7 in der Tabelle Daten hinzu.

Abbildung 7 Daten der Tabelle CounterData hinzufügen

PerfDataEntities pde = new PerfDataEntities();
CounterData cd = new CounterData();
cd.CounterName = @"\Processor(_Total)\% Processor Time";
cd.CounterValue = (float)AvgCPU;
cd.TimeStamp = System.DateTime.Now.ToString();
 
pde.AddToCounterDatas(cd);
 
cd = new CounterData();
cd.CounterName = @"\.NET CLR Memory(_Global_)\% Time in GC";
cd.CounterValue = (float)AvgTimeGC;
cd.TimeStamp = System.DateTime.Now.ToString();
 
pde.AddToCounterDatas(cd);
pde.SaveChanges();
context.SaveChanges();

In diesem Ort, nur noch zu tun ist, den eigentlichen Bericht schreiben –, dass die meisten begehrte aller Vorgänge. (Ja, das ist sarkasmus.)

Der Bericht

Ich bin kein besonders erfahrener Report Writer und, um ganz ehrlich zu sein, ein Merkmal, um sicherzustellen, dass konsequent um nie Teil des Projekts mich Ende mit demonstrieren möchten. Also werde ich einen relativ einfachen Bericht darstellen, die Daten in einem Raster anzeigen und zeichnen eine Linie, die Daten zu visualisieren erstellen.

Der erste Schritt ist die Daten im Format abgefragt, ich brauche, um den Bericht zu generieren. Die in der SQL Azure-Datenbank gespeicherten Daten ist der durchschnittliche Wert für etwa eine Minute von Proben, was bedeutet, dass für jeden Datenpunkt eine Minute darstellt. Für meinen Bericht jedoch ich hätte lieber die Daten als einen einzelnen Punkt für jede Stunde Zeit, 24 Punkte pro Tag, mit denen ich könnte mir Trend über eine kurze Zahl von Tagen. Dazu werde ich das TimeStamp-Feld mit DATEPART und Gruppe von Tag und Stunde auseinander necken. Daraus ergibt sich die folgende Abfrage:

    SELECT
      DATEPART(DD, [TimeStamp]) as [Day]
      ,DATEPART(HH, [TimeStamp]) as [Hour]
      ,[CounterName]
      ,Avg([CounterValue]) [Value]
    FROM [dbo].[CounterData]
    Group by DATEPART(DD, [TimeStamp]), DATEPART(HH, [TimeStamp]), CounterName
    Order By CounterName

Moving on, ich GEBOTE zu öffnen und ein neues Berichtsprojekt erstellen. Ich zwei Datenquellen Hinzufügen eines für Cloud und eines für den lokalen. Es empfiehlt sich, einen lokalen Speicher, den Bericht zu entwickeln, wie es schneller sein wird, um eine Vorschau des Berichts, was, dass kein Ausstieg Gebühren fällig wird bedeutet, werden für die Berichtsausführung. Als eine Angelegenheit von Praxis bei der Arbeit an einem Bericht – oder für ein Projekt für die Wolke – wenn mir ein Stück davon lokal arbeiten ausführen ich einen schnellen lackmus-Test in der Wolke, um sicherzustellen, dass es dort ebenfalls funktioniert. Müssen beide Datenquellen definiert, ist dies ziemlich einfach mit SQL Azure testen, und ich werde großen Berichtsbereiche testen, indem Sie tatsächlich bereitstellen und Ausführen von SQL Azure Reporting CTP. Nach dem Hinzufügen von Datenquellen, ich den Bericht ein Dataset hinzufügen und verwenden Sie die zuvor genannten SQL Daten definieren.

Mit den unterstützenden Elementen in Place im Berichtsprojekt ich einen leeren Bericht zum Projekt hinzufügen und nennen Sie es CounterDatabyHour.rdl. Da will ich ein Raster von Daten und ein Liniendiagramm, füge ich ein Tablix-Element und einem Sparkline-Diagramm. Für Tablix verwende ich den Tageswert für den zweiten bis n Spaltenüberschriften in der ersten Zeile den Wert der Stunden für den zweiten bis n Spaltenüberschriften auf der zweiten Zeile und die Daten als Werte in den Spalten für jede Zeile von einer Gruppe von CounterName generiert. Für die Diagrammdaten ich CounterName als die Datenreihe festgelegt und als die Kategoriegruppen Stunde und Tag verwenden. Dies führt zu einer Entwurfsoberfläche, der aussieht, was, in angezeigt wird in Abbildung 8.

Designing the Chart
Abbildung 8 das Diagramm entwerfen

Es sind Ausdrücke in Tablix, aber lediglich CStr-Funktion auf die Feldwerte sind. Der Bericht ist sofort einsatzbereit und alles, was ich tun müssen, ist es in der Cloud push. Zunächst jedoch ich die Lösung für die Bereitstellung auf der Wolke zu konfigurieren. Klicken Sie hierzu ich öffnen Sie die Projektmappeneigenschaften und legen die TargetServerURL den URL "Reportserver" wendete auf, um es im Verwaltungsportal Windows Azure Lieferumfang. Folglich mine ist: https://rsprodctp2585.ctp.reporting.database.windows. NET/ReportServer.

Ich muss HTTPS verwenden, für diesen Vorgang für den Hinweis auf SQL Azure, aber das hat bevorzugt in diesem Fall trotzdem, da ein Unternehmen seine Server Status und Performance-Daten an sich selbst beibehalten möchten. Mit diesem Set ich den Bericht bereitstellen, und ich werde aufgefordert, für Meine Anmeldeinformationen – der Benutzername kopierten aus dem Portal Management, wie in gezeigt Abbildung 9.

Deploying the Report
Abbildung 9 Bereitstellen des Berichts

Wenn nichts fehlschlägt, sollten den Bericht erfolgreich bereitzustellen, und ich Sie die Site direkt rufen kann, anmelden, und führen Sie den Bericht aus dem Browser (Abbildung 10).

Viewing the Report in the Browser
Abbildung 10 den Bericht im Browser anzeigen

In einigen Fällen möchten direkt auf den Bericht zu verknüpfen, aber in vielen anderen können Sie ein Bericht-Steuerelement in einer Anwendung oder eine Webseite eingebettet. Der Kernpunkt ist, dass für die Person, die Berichte, nichts von den Erfahrungen der Verwendung SQL Server Reporting Services in seine Lösung abweicht. Der berichtsentwickler führt einige Vorgänge leicht verändert, aber es ist größtenteils das gleiche für ihn zu.

Zusammenfassung

Mein einfaches Beispiel ist genau das, aber diejenigen, die ein wenig mehr praktisch mit GEBOTE und allgemeine Bericht schreiben finden, die die Goodies im SQL Azure Reporting CTP – zum Erzeugen von Parametern, verknüpfte Berichte, Ausdrücke und andere Features Bericht schreiben – bieten eine Plattform für rich-Berichte, die etwa so komplex wie jemand sie sein möchten. SQL Azure Reporting gibt Entwicklern vertraut Paradigma für die Entwicklung und Verteilung von Berichten, mit der wesentliche Unterschied, die niemand Gedanken der Infrastruktur gehostet. Einer der größten Vorteile ist es verwenden, für die Berichterstattung über verschiedene Arten von Diagnosedaten, wie ich hier mit den Leistungsindikatoren und für die Überwachung der verschiedenen Aspekte der Bereitstellung. Mit SQL Azure Reporting, Sie sammeln Daten zu einer zentralen Datenbank für reporting und sogar Bericht über Bereitstellungen, Speichern von Daten in getrennten Datenbanken – solange sie SQL Azure Datenbanken sind. Andere Datenquellen werden in der Roadmap, aber auch in seiner aktuellen Form SQL Azure Reporting ist eine leistungsstarke und willkommene Ergänzung der Toolbox Windows Azure.

Joseph Fultz ist Softwarearchitekt bei HP, arbeiten als Teil der globalen es Packard. Zuvor war er ein Software-Architekt für Microsoft und arbeitet mit Top-Tier-Unternehmen und ISV-Kunden definieren Architektur und Entwerfen von Lösungen.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Jim Keane