2013年1月9日

[Azure]HTTP 404.15 when accessing WebRole with long query string

You may get HTTP 404.15 error when your query string length too is too long.

After enabling Failed Request Trace on the web role, I find the error was thrown by RequestFiltering Module

image

HTTP 404.15 was generated by the module when query string length too long, to workaround this, simply extend the length limit in your web.config by adding the following :

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxQueryString="4096"/>
        </requestFiltering>
    </security>
</system.webServer>

And

<httpRuntime maxRequestLength="4096" maxUrlLength="4096" maxQueryStringLength="4096"/>

[Azure]Auto-Scaling Application Block (3) – Troubleshooting

如果一切順利的話,我們應該要在我們指定的Storage中看到這個Table;這也是我們在前兩篇中所指定的DataPoint寫入的table。

image

但是,在我的第一次deploy中,這個Table並沒有出現,這中間一定有甚麼誤會…

為了解開這個誤會,讓我們RDP到Scaling Worker Role上,然後下載並執行DebugView

記得,在前兩節中,我們已經指定了Autoscaling AB的sampling interval是5分鐘,因此Debug view跑起來後,可能會需要五分鐘才看得到一些有用的資訊。下面是我看到的錯誤。

image

image

很明顯的,是Autoscaling AB需要憑證來存取Storage,但是找不到該憑證,因此作業失敗。

首先,確認一下我們到底是用哪張憑證。到Scaling Worker Role的Property、Certificate檢查現在使用那些憑證。

image

確認是不是跟services.xml一樣的設定。

image

以我的例子來說,我在services.xml中指定的Store是Current User,但是在Project Property中設定的是Local Machine,因此自然找不到。

另外,到Azure Portal中確認憑證是不是有上傳到Cloud Service中。

image

確認以上設定都正確了,重新deploy,一切就正常了。

[Azure]Auto-Scaling Application Block (2) - 收集Performance資料

前面設定完了Application Block,接下來,我們必須要讓我們想要Auto Scale的目標能夠收集Performance資料,這樣Auto Scaling AB才有辦法判斷要不要scale。

作法是透過Diagnostic Monitor來收集相關數據。關於Diagnostic Monitor的相關說明可以參考這一整節,另外這裡有介紹了Diagnostic Monitor Configuration File。

我們關心的是WebRole執行時的效能數據,這邊我使用比較簡單的scenario,也是MSDN Sample Code上的Scenario,就是當WebRole的五分鐘平均CPU usage高於60%時,就增加一個Instance,如果五分鐘平均小於60%時,則減少一個Instance。這些規則已經在上一篇的rule.xml裡了,晚點我們再來review她一下。

在這邊打開我們的WebRole Project,在WebRole的OnStart()中加入下面這一段code:

        public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
//Enabled by default, logged Infra. info. Remote Forwarder, Remote Access Module
config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(2);
config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;

//Custom Log files
var dirConfig = new DirectoryConfiguration();
dirConfig.Container = "azurelog";
dirConfig.DirectoryQuotaInMB = 300;
dirConfig.Path = RoleEnvironment.GetLocalResource("MyLog").RootPath;
config.Directories.DataSources.Add(dirConfig);
config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

//Basic Azure Log, write thru Listener
config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

//Windows Event Log
config.WindowsEventLog.DataSources.Add("Application!*");
config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

//preformance counter, 在我們的case裡,只需要注意下面這一段
config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
config.PerformanceCounters.BufferQuotaInMB = 300;
var cpuCounter = new PerformanceCounterConfiguration()
{
CounterSpecifier = @"\Processor(_Total)\% Processor Time",
SampleRate = TimeSpan.FromSeconds(30)
};
config.PerformanceCounters.DataSources.Add(
cpuCounter
);
if (!config.PerformanceCounters.DataSources.Contains(cpuCounter))
{
config.PerformanceCounters.DataSources.Add(cpuCounter);
}

//
config.OverallQuotaInMB = 4096;
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString",
config);


Helpers.Logger.Log("Started!Logged by Michael's Logger");
return base.OnStart();
}


上面這一大段code是我自己測試diagnostic monitor時做的測試,以Auto scaling的scenario來說,只需要performance counter這一段就可以了。


寫完Code,記得到Role->WorkerRole->Property中,把Storage的Connection String設定到上一篇中我們預定要存放Performance資料的Storage。接著就可以dpeloy到Azure上看看會發生甚麼事了。

Blog Archive

About Me