預測: 多雲

診斷資料報告

約瑟夫 Fultz

下載程式碼範例

您已經可能已得知許多 Windows Azure 最近。它是建立和部署 Web 應用程式很好的開發平台。不幸的是,管理可以是一項挑戰的位元。Windows Azure 提供很好的架構,以收集與轉移角色,與執行中應用程式的診斷資訊,但落在擷取資料到有用的資料存放區的 [短,而且它不會幫助的視覺效果和分析資料。

輸入 SQL Azure 報告 CTP,我們這個月的主題。可能是例行 (藉由開發人員標準),但我要討論的管理及監視我的 Windows Azure 部署的內容。我將示範使用針對網頁角色擷取診斷的一部分的效能計數器的資料。若要到目前為止,機制大部分同仁用法是傳輸回主資訊] 或 [從本機電腦透過報告工具,例如 SQL Server 報告服務或 Microsoft Excel 存取 SQL Azure 資料存放區。不幸的是,遵循那些路徑的目前實作會有一些重大的缺點。一方面,如果所有資料都傳輸至報告的本機存放區,這可以同時執行成本與目前的狀態資訊。相反地,如果您正在存取 SQL Azure 執行本機報表或工具,您可能會降低傳輸的彙總及摘要資料,資料量,但仍有的資料轉送就 — 和重要的報告,您可能還是需要一些延遲。藉由將資料保存在定域機組以及也從定域機組報告上,您可以傳送只報告檢視的資料,因而導致流行的資料,並檢視報告的最小延遲時間。

設計及設定

進行中取得此專案,我有要第一件事是判斷哪些我將會被收集,我要將其放置的地方,以及如何在我在其上將報表的資料。在此情況下,我要收集 GC 的時間百分比和百分比 CPU 時間,兩者都是我看看當執行效能測試的通用計數器。我可能需要將資料從其平台的位置在 Azure 資料表儲存區中的資料以 SQL Azure 移動以便促進報告。圖 1 說明資料流。


圖 1] 的資料流量

您可以使用這個圖表的資料流,我也可以辨識我的工作區域。數字會將下列的工作項目關聯的圖表:

  1. 設定診斷的角色
  2. 透過組態完成
  3. 傳送至 SQL Azure
    1. 建立背景工作角色,在某些頻率會移動資料
    2. 定義資料之資料表的結構描述
  4. 報告
    1. 建立查詢來擷取所需的資料,可使用的格式
    2. 建立至報表中呈現資料的報告定義

SQL Azure 報告

在撰寫本文時,SQL Azure 的報告功能存在,它適用於註冊 at CTP connect.microsoft.com/sqlazurectps。一旦 SQL Azure 報告正在使用我的帳號上時,我可以在管理入口網站瀏覽到它,並像在顯示的內容,請參閱圖 2


圖 2 SQL Azure 報告 CTP

請務必注意我需要 Web 服務 URL 和使用者名稱稍後在 [當我建立此範例。如果您是遵循,您將也需要您。基本上,一旦 SQL Azure 提供時,就準備好且只正在等待部署您的報表。

您也必須和出價商務智慧開發 Studio (等) 來建立報表,並將它們部署到服務。

診斷的安裝程式

若要收集我需要的資料,我必須建立數個 PerformanceCounterConfiguration 物件,並將它們加入角色感興趣的 OnStart 方法中的 PerformanceCounters.DataSources。我有簡單的網頁角色,則不會修改範本,但它會提供資料來源。我要自己設定這兩個範例每隔五秒,然後將傳送收集的資料到表格儲存每分鐘我計數器。圖 3 此顯示的程式碼。這些數字是用於概念的範例,以外的其他完全沾,但這正是我建立的內容,並想要在短的時間來產生代表的項目收集足夠的資料。

圖 3 範例資料集合的程式碼

// 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);

擷取資料並報告

我現在需要報告,取得的資料格式與儲存區,然後我就可以建立報表。我明顯的選項,將資料儲存將會是 SQL Azure,並且不只因為是 Windows Azure 的結構化儲存體解決方案,它也 SQL Azure 報告目前可使用的唯一資料來源。在選擇部署位置,Windows Azure 存放區、 SQL Azure SQL Azure 報告角色時,最好是將它們放在相同的資料中心或至少在相同的地理區域,以避免任何輸入或輸出的費用。

資料結構描述和傳輸

為使本範例中,我將只是簡化的結構描述。我有一個 Id 資料行,也就是識別,用以作為主索引鍵 (PK),但更逼真的 PK 看起來應該像電腦名稱 + CounterName + 時間戳記。現在,我將只使用識別欄位。圖 4 示範我簡單的結構描述,用於儲存我的效能計數器資料。

圖 4 簡單的結構描述] 來儲存效能計數器資料

名稱 類型
識別碼 識別 Int
TimeStamp Nvarchar(50)
CounterName Nvarchar(50)
CounterValue Real

我原本擁有的時間戳記,做為實際的時間戳記資料行,但我變更到字串,以便更容易管理。一種一般的練習中,我使用本機的 SQL Server 執行個體的初始開發並時我已經準備好,我編寫它的指令碼至新增的 [查詢] 視窗、 變更的連線可以連線到 SQL Azure,並執行指令碼,以建立資料表。

現在,我必須位於表格儲存體以及位置,以將它放在 SQL Azure 的資料時,我需要 「 背景工作角色,才能移動資料,以便將背景工作角色新增至我的解決方案。在 OnStart 方法中,我新增的標準設定 「 發行者 」 程式碼中所示,我必須先擷取一些資訊從 [設定],因為圖 5

[圖 5 標準設定 「 發行者 」 程式碼

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();
    }
  }
  };
});

接下來,我會加入名為 TransferPerfDataToSql 類別的方法。 這個方法中我會擷取可用的資料和平均它。 我有執行方法睡眠的大約一分鐘,因此會有多個項目,每個計數器。 因為我不感興趣的收集計數器的完整精確度,我會在每個傳送的平均它們。 因此,不論間隔取樣的效能計數器,我要使其成為單一項目分-和-15-秒間隔。 為了清楚起見,在這個範例程式碼中,我會執行這項分別為每個計數器,但是它無法在一個陳述式完成。 圖 6 顯示它的外觀為一個計數器。

圖 6 取得單一間隔值。

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();

取得值之後,我需要移除表格儲存體中的資料。 我無法直接呼叫其他 API,但是在此情況下我只是迴圈通行證每個 DeleteObject 的內容與選取的物件:

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

我可以重複這個程式碼的 GC 計數器。 要加入至 [我的資料存放區,必須收集每個值。 我所建立的 CounterData 資料表中,針對我撰寫的程式碼所示的.edmx 檔案圖 7 將資料新增到資料表。

圖 7 將資料加入至 CounterData 資料表

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();

使用此位置中,只有事是撰寫實際的報表,最黃金時間的所有工作。 (沒錯,這是 sarcasm)。

報表

我不是特別完成的報表寫入器,是相當老實說,這是我想要確定一致地示範,以永遠不會干擾該專案的一部分自己的特性。 因此,我將建立簡單報表中,以說明顯示在框格中的資料和繪製一條線,以視覺化方式檢視資料。

第一個步驟是查詢中我產生的報表所需要的格式的資料。 我已儲存在 SQL Azure 資料庫中的資料是大約一分鐘的範例,這表示每個資料點代表一分鐘的平均值。 我的報表,不過,我想讓資料為單點的每個小時的時間,讓我每天可能使用的 24 點來透過簡短的天數的趨勢。 若要執行這項操作我將 tease 分開的日期部份與群組使用的日期和小時的時間戳記欄位。 這會導致下列查詢:

    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

我在上移動,開啟和出價等,建立新的報表專案。新增兩個資料來源,一個用於定域機組,一個本機。最好是開發對本機存放區中,報表就越快速預覽報表,這表示 「 沒有輸出費用會進行累算報表執行時。為一種作法在報表上工作時 — 或任何專案的定域機組,當我收到它在本機作業的一部分時我執行快速的辦法測試以確定它可以那里同樣的定域機組中。有兩個定義的資料來源會讓這很容易 SQL Azure,測試,我將測試主要的報表區段的實際部署它,然後從 SQL Azure 報告 CTP 執行。之後加入的資料來源,我可以在報表中加入資料集,使用先前所述的 SQL 來定義資料集。

報表專案中支援項目時,我將空白報表加入專案,並命名為 CounterDatabyHour.rdl。因為我想要的資料和線條圖方格,我新增 tablix 和 sparkline 圖表。Tablix 我用作日期值 n 個資料行標題,在第一個資料列,而第二到第二個資料列和資料的 n 個資料行行首的小時值,第二個值在每個資料列群組由 CounterName 所產生的資料行。圖表資料,我將 CounterName 設定為 [數列資料,作為類別目錄群組中的小時及天。這會導致設計介面看起來像是中所示的圖 8


圖 8 設計圖表

運算式 tablix,但這些是只根據欄位的值 CStr 函式。報表會進入就緒,我要做為它發送到定域機組。首先,不過,我必須設定方案部署至定域機組。若要這樣做,我可以開啟方案的屬性,將 TargetServerURL 設定為"reportserver",它會跟在 Windows Azure 管理入口網站中所提供的 URL。因此,我是: https://rsprodctp2585.ctp.reporting.database.windows。net/ReportServer。

我必須使用 HTTPS SQL Azure 報告,這項作業,但是,有偏好這種情況下還是因為公司可能會想要保留其伺服器本身的狀態與效能資訊。我在這個設定部署報告和我與我的認證有 — 使用者名稱從複製管理入口網站,如所示圖 9


圖 9 部署報表

如果執行任何動作就會失敗,報告應該可以順利部署,我可以直接巡覽至該網站登入,並從瀏覽器中執行報表 (圖 10)。


圖 10 在瀏覽器中檢視報表

在某些情況下您要直接連接至報表,但在許多其他人可以使用報表控制項內嵌在應用程式或網頁]。這裡的重點是使用報表的人員,執行任何動作不同於在他的方案中使用 SQL Server 報告服務的一般經驗。報表開發人員會執行某些略有改變的作業,但很相同的他,太。

完成

我簡單的範例是,但更方便和出價等具有和一般的人報告撰寫會發現除了 [電腦 SQL Azure 報告 CTP 中 — 建立參數、 連結報表、 運算式和其他這類的報告撰寫功能,提供一個平台約為複雜的任何人都可能想要它們成為豐富的報表。SQL Azure 報告可讓開發人員熟悉的開發架構,開發和散發報表,與任何人擔心裝載它的基礎結構的重要差異。報告各種資料型別的診斷,跟我這裡的效能計數器,也用來監視任何部署的各個層面,最大的好處之一使用它。與 SQL Azure 報告,您可以收集報告的中央資料庫的資料,甚至在部署中,將資料儲存在不同的資料庫的報表,只要它們是 SQL Azure 資料庫。其他資料來源位於藍圖,但即使是在其目前的形態,SQL Azure 報告是功能強大且歡迎使用加入工具箱] 視窗的 Azure。

約瑟夫 Fultz 是軟體架構設計人員在生命點數,使用一部分的 HP.com 全域人。先前,他是使用其最上層企業和定義架構和設計解決方案的 ISV 客戶的 microsoft 軟體架構設計人員。

感謝給下列技術專家來檢閱這份文件: Jim Keane