トップ回答者
DiagnosticMonitorのトレースログ転送に失敗するケースがある

質問
-
はじめまして、いつもお世話になっております。このたびAzureのトレースログ出力転送について質問があり投稿させて頂きます。ご教授いただければ幸いです。
【質問】
DiagnosticMonitorTraceListenerを利用して、
「WADLogsTable」へアプリケーションからのログを転送して失敗するケースがあります。
【前提条件】
環境 :VS2010 Ultimate 日本語版 + AzureSDK1.2
実行環境:Development Fabric + 本番環境 Azureストレージ(英)
この環境下において、Diagnostic Monitorを開始した上で
System.Diagnostics.Trace.WriteLineメソッドを利用し、出力を行います。
【事象】
まず転送されるケースとされないケースが存在しています。
成功しているケースとしては、半角文字のみで出力を行った場合です。
失敗するのは、当方の認識としては全半角の文字が混在もしくは全角のみのケースです。
プログラム上は、何のエラーも発生せずコンソールにも正しくログが出力されますが
転送先の「WADLogsTable」にデータが出力されていない状況です。
具体的には、例えば下記のようなスタックトレースを出力した場合です。
//試したメッセージ
System.Data.Services.Client.DataServiceRequestException:
この要求の処理中にエラーが発生しました。 ---> System.Data.Services.Client.DataServiceClientException: <?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n<error xmln
s=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">\r\n <code>ResourceNotFound</code>\r\n <message xml:lang=\"ja-JP\">The specified resource does not exist.</
message>\r\n</error>\r\n 場所 System.Data.Services.Client.DataServiceContext.SaveResult.<HandleBatchResponse>d__1e.MoveNext()\r\n --- 内部例外スタック トレースの終わり ---\r\
n 場所 Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()\r\n 場所 Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()\r\n 場所 Microsoft.Windows
Azure.StorageClient.TaskImplHelper.ExecuteImplWithRetry[T](Func`2 impl, RetryPolicy policy)\r\n 場所 Microsoft.WindowsAzure.StorageClient.TableServiceContext.SaveChangesWithRet
ries(SaveChangesOptions options)\r\n 場所 Microsoft.WindowsAzure.StorageClient.TableServiceContext.SaveChangesWithRetries()\r\n
下記のworkerRoleソースを利用して転送を行いました。
要約すると、上記の文字を1文字ずつロギングして転送がどこまで行くのかを実験しました。
string _FAULT_MESSAGE = "";//上記のメッセージを設定
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("WorkerRole1 entry point called", "Information");
int i = 1;
while (true)
{
if (_FAULT_MESSAGE.Length > i)
{
Trace.TraceInformation(_FAULT_MESSAGE.Substring(0, i));
i++;
}
Thread.Sleep(10000);
}
}
その成果としては、下記の通りです。
それ以降は転送されていないことを確認しました。
//成功したメッセージ
この要求の処理中にエラーが発生しました。 ---> System.Data.Services.Client.DataServiceClientException: <?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n<error xmln
s=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">\r\n <code>ResourceNotFound</code>\r\n <message xml:lang=\"ja-JP\">The specified resource does not exist.</
message>\r\n</error>\r\n 場所 System.Data.Services.Client.DataServiceContext.SaveResult.<HandleBatchResponse>d__1e.MoveNext()\r\n
ちなみに、上記の文字列を
AzureStorageTableへ文字としてデータ挿入したり、「WADLogsTable」にインポートした場合は成功を確認しています。
本番のAzure環境にはデプロイできない制約がありDevelopment Fabricでの確認に留まっています。
Development Fabricだけの問題であれば良いのですが、少々気になり質問に至りました。
宜しくお願い致します。
回答
-
こんにちはhanenaoと申します。
私も上記の問題が発生しました。
日本語(マルチバイト)が出力できるケースがあったり、なかったりすると思いますが
これは、文字数が原因です。
数文字では日本語も正常に出力できるはずです。
しかし、数十文字になると出力されないと思われます。
これは、Azureのバグが根本的な原因と思われます。以前、米MSにインシデントを投げて
そう回答をもらいました。
現在は回避策としてBase64等でエンコードするしかありません。
日本語で出力するにはAzure側で対応されるまで待つしかないと思います。- 回答としてマーク yos0430 2010年7月1日 1:32
すべての返信
-
上記の現象についての回答をさせて頂きます。同問題は Azure SDK 1.0~Azure SDK 1.2(2010年6月時点の最新版)における課題に起因するものです。
□現象への回答
「WADLogsTable」に「全半角の文字が混在もしくは全角」が含まれた文字列が混在する場合にエラーとなる問題は、Development Storage(Development Fabric)特有の問題です。「WADLogsTable」はテーブル・ストレージにログを出力しますが、Development Storageのテーブル・ストレージは「マルチバイトをインサートすると例外が発生する」という問題が有ります。
手前味噌なので恐縮ですが、以下で同問題について記述しております。
http://d.hatena.ne.jp/waritohutsu/20100613/1276460707
□本番環境での挙動について
本番環境では「WADLogsTable」に「全半角の文字が混在もしくは全角」を出力することは可能です(実際に挙動を確認しました)。本番環境のテーブル・ストレージではマルチバイト文字列を入力可能であるため、マルチバイト文字列を含んだトレースログの転送が可能です。
-
すいません、本番環境ストレージを使ってらっしゃるのですね、勘違いしてました(汗。
> 環境 :VS2010 Ultimate 日本語版 + AzureSDK1.2
> 実行環境:Development Fabric + 本番環境 Azureストレージ(英)上記の環境で「WADLogsTable」に「全半角の文字が混在もしくは全角」を出力することは可能です(私の環境では確認できました)。
yoso0403さんの環境について「本番のAzure環境にはデプロイできない制約がありDevelopment Fabricでの確認に留まっています」が気になったのですが、社内プロキシ等でインターネットへの接続が制限されていませんでしょうか。Azureストレージ・サービスへ接続する場合、REST APIでリクエストを送付するため、プロキシサーバ等が間に入った場合は処理が失敗する可能性があります。
まずは一旦プロキシ等が存在しない環境で試されてはいかがでしょうか。
-
割と普通 様
はじめまして、yos0430と申します。
御回答頂きありがとうございます。
当件、情報が抜けていたので補足致します。
マルチバイトが混在していても成功するケースはあります。
ただし、例にあげている文字列で実施すると、転送が失敗してしまいます。
Base64などでエンコードすると成功するため、やはりマルチバイトが含まれている際に
何かしら失敗するケースがあるのではないかと危惧しております。
⇒ここで申し上げた点は、開発の都合上(会社的な制約)で、デプロイ自体はできる状況にありますが
本番に上げて確認ができないという状況です。誤解を与えるような表現となり申し訳ありません。
ただ、昨日許可を頂いて
本番のAzure環境に投稿であげたコードを配置してみましたが症状が変化しない状況でした。
宜しくお願い致します。
-
こんにちはhanenaoと申します。
私も上記の問題が発生しました。
日本語(マルチバイト)が出力できるケースがあったり、なかったりすると思いますが
これは、文字数が原因です。
数文字では日本語も正常に出力できるはずです。
しかし、数十文字になると出力されないと思われます。
これは、Azureのバグが根本的な原因と思われます。以前、米MSにインシデントを投げて
そう回答をもらいました。
現在は回避策としてBase64等でエンコードするしかありません。
日本語で出力するにはAzure側で対応されるまで待つしかないと思います。- 回答としてマーク yos0430 2010年7月1日 1:32
-
hanenao 様
はじめまして、yos0430と申します。
御回答頂きありがとうございます。
>日本語(マルチバイト)が出力できるケースがあったり、なかったりすると思いますが
>これは、文字数が原因です。
>数文字では日本語も正常に出力できるはずです。
⇒仰る通り、出力する内容にもよりますが成功・失敗のケースは確認していましたが
文字数が原因なのですね。
情報ありがとうございます。
根本的な問題であれば、ご提示いただいたBase64でエンコードするか
もしくは、DiagnosticMonitorTraceListenerの転送に頼らず、
自作のテーブルへ書き込むように機能を実現するのが無難でしょうか。
ひとまず既知の問題ということが分かっただけでも、とても助かりました。
一旦、解決済みとしたいと思います。