预测: 多云

诊断数据报告

Joseph Fultz

下载代码示例

Joseph Fultz
您已经可能已经听到了很多关于 Windows Azure 最近。它是一个优秀的开发平台,用于创建和部署 Web 应用程序。遗憾的是,管理可能会产生一点的一项挑战。Windows Azure 用于收集和传输有关正在运行的应用程序和角色,诊断数据提供了很好的框架,但就不那么管用上获取有用的数据存储区中的数据 — 它并不具有可视化和分析这些数据帮助。

输入 SQL Azure 报告 CTP,我们这个月的主题。它可能是常见 (由开发人员标准),但我将介绍它的管理和监视我 Windows Azure 部署上下文中。我将演示其使用性能计数器为 Web 角色作为诊断程序的一部分捕获的数据。若要到目前为止,机制大多数人员用途是传输回家庭信息或从本地机器通过报告工具 (如 SQL Server 报告服务或 Microsoft Excel 访问 SQL Azure 数据存储区。遗憾的是,以下这些路径的当前实现具有一些明显的副作用。一方面,如果在所有的数据传送到报告的本地存储区,这可以同时运行成本和存在陈旧的信息。另一方面,如果您正在访问本地报表或工具运行 SQL Azure,可能会降低聚合和汇总数据,由传输的数据量但数据传输时仍然存在 — — 与不常用的报表,您就会可能仍有一些延迟。通过在云和也从云报告其上保存数据,您可以发送数据,报表视图,提供最新数据和查看报表的最小滞后时间。

设计和安装程序

若要获取此项目正在进行,我有做第一件事是确定哪些数据,我会被收集,我打算将其放置的位置以及如何报告,我将在其上。在这种情况下,我打算收集垃圾回收中的百分比时间和百分比的 CPU 时间,这两者都是我看运行性能测试的通用计数器。我需要将数据从 Azure 表存储在其登录位置移动到 SQL Azure,为了便于报告。图 1 说明了这一过程的数据流。

The Flow of Data
图 1 的数据流

我还可以使用此关系图的数据通信流,确定我的工作区域。这些数字与关系图关联以下工作项:

  1. 配置角色的诊断程序
  2. 通过配置完成
  3. 将传送到 SQL Azure
    1. 创建移动数据以某些频率的工作角色
    2. 定义用于数据表的架构
  4. 报告
    1. 创建查询以检索所需的数据中可用的格式
    2. 创建报告定义到报表呈现数据

SQL Azure 报告

在撰写本文时,SQL Azure 的报告功能,可供注册 at CTP 作为存在 connect.microsoft.com/sqlazurectps。一旦 SQL Azure 报告我的帐户上处于活动状态,我可以管理门户中导航到该,类似于中显示的内容,请参阅图 2

SQL Azure Reporting CTP
图 2 SQL Azure 报告 CTP

请注意我需要 Web 服务 URL 和上的用户名以后在创建此示例,这一点至关重要。如果您正在之后),您将还需要您。基本上,一旦 SQL Azure 资源调配,它是准备就绪并只需等待部署您的报告。

您还需要业务智能开发 Studio (投标) 创建的报表并将其部署到该服务。

诊断程序安装程序

若要收集所需数据,必须创建两个 PerformanceCounterConfiguration 对象并将它们添加到感兴趣的角色的 OnStart 方法中 PerformanceCounters.DataSources。我有一个简单的 Web 角色,不修改模板,请从,但它提供了数据源。我自己设置这两个示例每隔五秒,然后将传输收集的数据到表存储每分钟要我计数器。图 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 简单模式,用于存储性能计数器数据

Name 类型
ID 标识 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 计数器重复此代码。 我收集的每个值需要添加到我的数据存储区。 我创建了一个.edmx 文件,以 CounterData 表中,并据此编写中显示的代码图 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();

这地方,只有左是编写实际报告 — — 大多数 coveted 的所有任务。 (是的这就是 sarcasm。

报告

我并不特别完成的报表编写者和实话相当,这就是我要确保以一致的方式展示以便永远不会得到该项目的一部分自己的特性。 因此,我将创建相对较简单报表来阐释在网格中显示的数据和绘制一条线以可视化的数据。

第一步是查询的数据以生成报表需要的格式。 我已经存储在 SQL Azure 数据库中的数据是大约一分钟的样本,这意味着每个数据点代表一分钟的平均值。 对于我的报告,但是,我将而是拥有数据单点每小时的时间,每天我可能使用的 24 磅,听我通过短天数的趋势。 为此我将取笑分开使用 DATEPART 和组按天和 1 小时的时间戳字段。 这会导致下面的查询:

    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

Designing the Chart
图 8 设计图表

有表达式中 tablix,但那些只是 CStr 函数上的字段值。 该报表是转一切就绪并需要做的就是将其推到群。 首先,我不过,需要配置此解决方案将部署到云。 要做到这一点,我打开解决方案属性,并将 TargetServerURL 设置为与"报表服务器"处对其 Windows Azure 管理门户中提供的 URL。 因此,我是: https://rsprodctp2585.ctp.reporting.database.windows。 net/报表服务器。

我必须使用 HTTPS SQL Azure 报告,此操作但的具有首选在这种情况下仍因为公司想要保持其服务器到其自身的状态和性能信息。 利用这一套我部署报表,并提示我输入我的凭据用户名我从复制管理门户,如中所示图 9

Deploying the Report
图 9 部署报告

如果执行任何操作将失败,报告应成功地部署并且我可以直接定位到该站点,以用户身份登录并从浏览器中运行报告 (图 10)。

Viewing the Report in the Browser
图 10 在浏览器中查看报告

在某些情况下您需要直接链接到该报告,但在很多其他您可能使用嵌入的应用程序或 Web 页中的报表控件。 这里的关键点在于消耗报表的人员,执行任何操作不同于他的解决方案中使用 SQL Server 报告服务的典型体验。 报告开发人员执行某些有轻微的更改操作,但多数情况下为他,相同太。

总结

我简单的例子就是,但那些不更方便地与投标和常规报告书写会找到该增效工具 SQL Azure 报告 CTP — 用于创建参数,链接报表、 表达式和其他此类报告编写功能 — 为大约为复杂的任何人会想要将形式丰富的报告提供了一个平台。 SQL Azure 报告为开发人员提供用于开发和分发报表中,没有人担心承载它的基础结构的重要区别是熟悉的范例。 象我这里性能计数器,报告各种类型的诊断数据,还负责监视任何部署的各个方面的最大好处之一使用它。 与 SQL Azure 报告,您可以为报告的中央数据库收集数据,并甚至跨部署,在单独的数据库中存储数据的报告 — 只要它们的 SQL Azure 数据库。 其他数据源上线路图,但即使是在其当前的具体化,SQL Azure 报告是一个功能强大且欢迎的新增 Windows Azure 工具箱。

约瑟夫山 Fultz 是在 HP,作为 HP.com 全局它的一部分工作的软件架构师之前,他是 Microsoft 的软件架构师,协助 Microsoft 顶层企业和 ISV 客户定义体系结构和设计解决方案。

这要归功于以下的技术专家审阅这篇文章: Jim Keane