メディア アセットのライフサイクルの監査 – パート 2
このポストは、8 月 6 日に投稿した Auditing Media Assets Lifecycle – Part 2 の翻訳です。
パート 1 では、メディア アセットが作成および削除された日時が把握できるアセット監査レポートの作成方法について取り上げました。このパート 2 では、ストレージ アカウントからメディアの処理に使用する VM にコピーしたアセットを追跡する方法についてご説明します。ここではパート 1 でご紹介したサンプル コードを使用します。
アセットの追跡
ジョブを送信すると、ジョブのタスクはキューに追加され、Media Services のスケジューラがそのタスクを実行する VM を割り当てるまで待機状態になります。タスクで使用するアセットは、VM がタスクに割り当てられるまで VM にはコピーされません。このため、タスクの処理時刻を AssetAudit テーブルへのエントリの値として使用できます。
コードの変更点
アセットを Storage からコピーするタスクの ID を保存する文字列変数を AssetAuditEntity クラスに追加します。
public class AssetAuditEntity : TableEntity
{
public string OperationType { get; set; }
<strong>public string OperationData { get; set; }
</strong> }
ProcessJobs と ProcessTasks という 2 つの関数を新たに追加します。ProcessJobs 関数はすべてのジョブに対してループ処理を行い、ProcessTasks 関数はジョブのすべてのタスクに対してループ処理を行います。各タスクに関連するイベントの全履歴をチェックし、“Processing” のイベントが見つかると、イベントのタイムスタンプを RowKey として AssetAudit テーブル (OperationType=”InputToTask”、OperationData=TaskId) にエントリを追加します。
static void ProcessJobs()
{
try
{
int skipSize = 0;
int batchSize = 1000;
int currentSkipSize = 0;
while (true)
{
foreach (IJob job in _context.Jobs.Skip(skipSize).Take(batchSize))
{
currentSkipSize++;
Console.WriteLine("Processing Job " + job.Id);
ProcessTasks(job);
}
if (currentSkipSize == batchSize)
{
skipSize += batchSize;
currentSkipSize = 0;
}
else
{
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="job"></param>
static void ProcessTasks(IJob job)
{
try
{
foreach (ITask task in job.Tasks)
{
Console.WriteLine("Processing Task Id:" + task.Id);
for (int i = 0; i < task.HistoricalEvents.Count; i++)
{
if (task.HistoricalEvents[i].Code == "Processing")
{
for (int j = 0; j < task.InputAssets.Count; j++)
{
InsertAssetData(task.InputAssets[j].Id, task.HistoricalEvents[i].TimeStamp.ToString("o"), "InputToTask", task.Id);
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
InsertAssetData 関数は、OperationData 用のオプションのパラメーターを受け取れるように更新されています。
static void InsertAssetData(string _assetId, string _timeStamp, string _operationType<strong>, string _operationData = null</strong>)
{
try
{
bool _insert = true;
if (_operationType == "Create")
{
// operationType (操作の種類) が Create の場合、そのアセットの ID でエントリが既にあるかどうかチェックする
TableQuery<AssetAuditEntity> query = new TableQuery<AssetAuditEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, _assetId));
query.Take(1);
TableQuerySegment<AssetAuditEntity> tqs = _assetAuditTable.ExecuteQuerySegmented(query, null);
if ((tqs != null) && (tqs.Results != null))
{
if (tqs.Results.Count > 0)
{
if (tqs.Results[0].OperationType == "Create")
{
_insert = false;
}
}
}
}
if (_insert)
{
AssetAuditEntity _asset = new AssetAuditEntity();
_asset.PartitionKey = _assetId;
_asset.RowKey = _timeStamp;
_asset.OperationType = _operationType;
<strong>_asset.OperationData = _operationData;
</strong>
TableOperation op = TableOperation.Insert(_asset);
_assetAuditTable.Execute(op);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
最後に、Main 関数で ProcessJobs 関数を呼び出します。
static void Main(string[] args)
{
try
{
// Media Services の認証情報を静的クラス変数の形で作成しキャッシュする
_cachedCredentials = new MediaServicesCredentials(_mediaServicesAccountName, _mediaServicesAccountKey);
// キャッシュされた認証情報から CloudMediaContext を作成する
_context = new CloudMediaContext(_cachedCredentials);
_cloudStorage = CloudStorageAccount.Parse(_storageConnectionString);
_blobClient = _cloudStorage.CreateCloudBlobClient();
_tableClient = _cloudStorage.CreateCloudTableClient();
_assetAuditTable = _tableClient.GetTableReference("AssetAudit");
_assetAuditTable.CreateIfNotExists();
ProcessAssetData();
ParseStorageLogs();
<strong>ProcessJobs();</strong>
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.InnerException.StackTrace);
}
}
アセットの監査データ
上記のコードとパート 1 で使用したコードを統合して実行すると、アセットが Storage からメディアを処理する VM にコピーされた日時のエントリが AssetAudit テーブルに追加されます。下のスクリーンショットは、テスト用アカウントで更新した AssetAudit テーブルの内容です。上記コードにより追加されたエントリを赤枠で囲っています。アセットの作成日時とアセットを使用したタスク (RowKey がタイムスタンプ) が記録されているのがわかります。
また、(パート 1 で取り上げた) Excel の Power Query を使用して上記のデータを Excel に読み込み、分析に使用することもできます。
考慮事項
このサンプル コードをアプリケーションで使用する場合は次のことに注意してください。
- このコードでは、ジョブのコレクションを基に、アセットが Storage からメディアを処理する VM にコピーされたイベントの日時を記録します。上記コードを実行する前にジョブが削除されてしまっていると、ジョブに伴うイベントを記録できません。アプリケーションでジョブの実行後にジョブを削除している場合は、ジョブ通知の処理の際に ProcessTasks 関数を呼び出すことを検討してください。
- この記事のサンプル コードは、すべてのアセットが 1 つのストレージ アカウントに格納されている Media Services アカウントを想定していますが、簡単な変更で複数の Storage アカウントにも対応できます。