what transaction read pricing microsoft kind from common are wcf azure azure-storage azure-table-storage

transaction - Cómo filtrar registros de Azure o filtros de servicios de datos WCF para Dummies



table storage transaction (3)

Añadiendo a la respuesta de Knightffhor, ciertamente puede escribir una consulta que filtra por Timstamp, pero este no es el enfoque recomendado ya que la consulta en el atributo "Marca de tiempo" dará lugar a la exploración completa de la tabla. En su lugar, consulte esta tabla en el atributo PartitionKey. Estoy copiando mi respuesta de otro hilo aquí ( ¿Puedo capturar contadores de rendimiento para un rol de Azure Web / Worker de forma remota ...? ):

"Una de las claves aquí es comprender cómo consultar efectivamente esta tabla (y otra tabla de diagnóstico). Una de las cosas que querríamos de la tabla de diagnósticos es obtener los datos durante un cierto período de tiempo. Nuestro instinto natural debe consultar esta tabla en el atributo Timestamp. Sin embargo, esa es una opción BAD DESIGN porque sabe en una tabla Azure que los datos están indexados en PartitionKey y RowKey. Consultar en cualquier otro atributo dará como resultado una exploración completa de la tabla que creará un problema cuando su tabla contiene una gran cantidad de datos. Lo bueno de la tabla de registros es que el valor de PartitionKey representa la fecha / hora en que se recopiló el punto de datos. Básicamente, PartitionKey se crea utilizando bits de orden superior de DateTime.Ticks (en UTC). Entonces, si buscara los datos para un determinado rango de fecha / hora, primero necesitaría calcular los Ticks para su rango (en UTC) y luego anteponer un "0" al frente y usar esos valores en su consulta. Si está consultando con RES T API, usted usaría sintaxis como: PartitionKey ge ''0 <de ticks de fecha / hora en UTC>'' y PartitionKey le ''0 <para fecha / hora en UTC>''. "

Escribí una publicación en un blog sobre cómo escribir consultas WCF contra el almacenamiento de tablas, que pueden serle útiles: http://blog.cerebrata.com/specifying-filter-criteria-when-querying-azure-table-storage-using-rest-api/

Además, si está buscando una herramienta de terceros para ver y administrar datos de diagnóstico, le sugiero que consulte nuestro producto Administrador de diagnósticos de Azure: / Productos / AzureDiagnosticsManager. Esta herramienta está diseñada específicamente para la visualización y administración de datos de Windows Azure Diagnostics.

Estoy mirando mis registros de Azure en WADLogsTable y me gustaría filtrar los resultados, pero no tengo ni idea de cómo hacerlo. Hay un cuadro de texto que dice:

"Ingrese un filtro de servicios de datos WCF para limitar las entidades devueltas"

¿Cuál es la sintaxis de un "filtro de servicios de datos de WCF"? Lo siguiente me da un error InvalidValueType que dice "El valor especificado no es válido":

Timestamp gt ''2011-04-20T00:00''

¿Estoy cerca? ¿Hay alguna referencia de sintaxis útil en alguna parte?


Esta consulta debe tener el formato:

Timestamp gt datetime''2011-04-20T00:00:00''

Recordar poner esa datetime y datetime allí es lo más importante.

Esto me dispara cada vez, así que uso el resumen de OData como referencia.


La respuesta que acepté me ayudó enormemente a consultar directamente la tabla a través de Visual Studio. Eventualmente, sin embargo, necesitaba una solución más robusta. Usé los consejos que obtuve aquí para desarrollar algunas clases en C # que me permitieron usar LINQ para consultar las tablas. En caso de que sea útil para otros que ven esta pregunta, aquí está más o menos cómo ahora consulto mis registros de Azure.

Cree una clase que herede de Microsoft.WindowsAzure.StorageClient.TableServiceEntity para representar todos los datos en la tabla "WADLogsTable":

public class AzureDiagnosticEntry : TableServiceEntity { public long EventTickCount { get; set; } public string DeploymentId { get; set; } public string Role { get; set; } public string RoleInstance { get; set; } public int EventId { get; set; } public int Level { get; set; } public int Pid { get; set; } public int Tid { get; set; } public string Message { get; set; } public DateTime EventDateTime { get { return new DateTime(EventTickCount, DateTimeKind.Utc); } } }

Cree una clase que herede de Microsoft.WindowsAzure.StorageClient.TableServiceContext y haga referencia a la clase de objeto de datos recién definida:

public class AzureDiagnosticContext : TableServiceContext { public AzureDiagnosticContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials) { this.ResolveType = s => typeof(AzureDiagnosticEntry); } public AzureDiagnosticContext(CloudStorageAccount storage) : this(storage.TableEndpoint.ToString(), storage.Credentials) { } // Helper method to get an IQueryable. Hard code "WADLogsTable" for this class public IQueryable<AzureDiagnosticEntry> Logs { get { return CreateQuery<AzureDiagnosticEntry>("WADLogsTable"); } } }

Tengo un método de ayuda que crea una CloudStorageAccount partir de la configuración:

public CloudStorageAccount GetStorageAccount() { CloudStorageAccount.SetConfigurationSettingPublisher( (name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name))); string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"; return CloudStorageAccount.FromConfigurationSetting(configKey); }

Creo un AzureDiagnosticContext de CloudStorageAccount y lo uso para consultar mis registros:

public IEnumerable<AzureDiagnosticEntry> GetAzureLog(DateTime start, DateTime end) { CloudStorageAccount storage = GetStorageAccount(); AzureDiagnosticContext context = new AzureDiagnosticContext(storage); string startTicks = "0" + start.Ticks; string endTicks = "0" + end.Ticks; IQueryable<AzureDiagnosticEntry> query = context.Logs.Where( e => e.PartitionKey.CompareTo(startTicks) > 0 && e.PartitionKey.CompareTo(endTicks) < 0); CloudTableQuery<AzureDiagnosticEntry> tableQuery = query.AsTableServiceQuery(); IEnumerable<AzureDiagnosticEntry> results = tableQuery.Execute(); return results; }

Este método aprovecha la sugerencia de rendimiento en la respuesta de Gaurav para filtrar en PartitionKey lugar de Timestamp .

Si desea filtrar los resultados más allá de la fecha, puede filtrar el IEnumerable devuelto. Pero probablemente obtendrá un mejor rendimiento filtrando el IQueryable . Puede agregar un parámetro de filtro a su método y llamarlo dentro de IQueryable.Where() . P.ej,

public IEnumerable<AzureDiagnosticEntry> GetAzureLog( DateTime start, DateTime end, Func<AzureDiagnosticEntry, bool> filter) { ... IQueryable<AzureDiagnosticEntry> query = context.Logs.Where( e => e.PartitionKey.CompareTo(startTicks) > 0 && e.PartitionKey.CompareTo(endTicks) < 0 && filter(e)); ... }

Al final, de hecho abstraí la mayoría de estas clases en clases base para reutilizar la funcionalidad para consultar otras tablas, como la que almacena el registro de eventos de Windows.