2014-11-09 17 views
8

Sto cercando di capire se è possibile ottenere il "costo di richiesta" quando si eseguono richieste di query di DocumentDB tramite la libreria client .NET fornita. I dettagli tornano nell'intestazione HTTP sottostante "x-ms-request-charge" che posso monitorare tramite Fiddler ecc ma preferirei se potessi ottenerlo direttamente tramite .NET.Determinazione della richiesta di addebito DocumentDB per query tramite .NET

Qualcuno ha fatto questo? O almeno in grado di confermare se semplicemente non è possibile?

Aggiornamento:

Aggiunto chiarimento che io sono dopo la richiesta di carica durante l'esecuzione di query e non altre operazioni.

risposta

10

Dovresti essere in grado di farlo attraverso la libreria .Net. Ad esempio, dai un'occhiata alla schermata qui sotto che ti mostra la risposta di un'operazione Create New User. Il risultato è di tipo Microsoft.Azure.Client.ResourceResponse<T> che ha una proprietà denominata RequestCharge.

enter image description here

UPDATE

Così ho controllato il risultato della query e siete sulla strada giusta che questo non è esposto direttamente nella libreria Net. Tuttavia questo è disponibile in ResponseHeaders proprietà e si potrebbe trovare fuori usando qualcosa come di seguito:

FeedResponse<Microsoft.Azure.Documents.Document> queryResult = await documentClient.CreateDocumentQuery<Microsoft.Azure.Documents.Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery().ExecuteNextAsync<Microsoft.Azure.Documents.Document>(‌​); 
var requestCharge = queryResult.ResponseHeaders["x-ms-request-charge"]; 

invece di ispezionare in Fiddler.

NOTA

ExecuteNextAsync possono restituire un sottoinsieme dei risultati con un token di continuazione. Se si desidera ottenere tutti i risultati, è necessario eseguire iterazioni fino a quando il documento db non invia un token di continuazione.

var docDbQueryable = documentClient.CreateDocumentQuery<Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery(); 
var docDbResults = new List<Document>(); 
do 
{ 
    var batchResult = await docDbQueryable.ExecuteNextAsync<Document>(‌​);; 
    docDbResults.AddRange(batchResult); 
} 
while (docDbQueryable.HasMoreResults); 
return docDbResults; 
+0

Ahh forse avrebbe dovuto essere più chiaro. In particolare stavo parlando di query non "CreateXYZ" ecc. Il mio male, modificherà la mia domanda originale. –

+0

Siamo spiacenti! In realtà era il mio cattivo :). Hai menzionato la query nella tua domanda originale. Ad ogni modo, ho aggiornato la mia risposta con una soluzione alternativa. HTH. –

+0

Non lo vedo affatto. Questo avviene tramite la chiamata DocumentClient.CreateDocumentQuery(). Stavi provando qualcos'altro? –

4

Ecco cosa devi effettuare il login il costo per ogni query e anche gestire il paging:

public async Task<IEnumerable<T>> Query<T>(string databaseId, string collectionId, SqlQuerySpec sqlQuery, int take) 
where T : Resource 
{ 
    double queryCost = 0; 
    const int maxPageSize = 100; 

    var query = _client.CreateDocumentQuery<T>(
     UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), 
     sqlQuery, 
     new FeedOptions() {MaxItemCount = Math.Min(maxPageSize, take)}).AsDocumentQuery(); 

    var response = await query.ExecuteNextAsync<T>(); 
    queryCost += response.RequestCharge; 
    var entities = response.ToList(); 

    while (entities.Count < take && query.HasMoreResults) 
    { 
     var nextResponse = await query.ExecuteNextAsync<T>(); 
     queryCost += nextResponse.RequestCharge; 
     entities.AddRange(nextResponse); 
    } 

    Debug.WriteLine(
     "Query [{0}] for {1} documents in collection [{2}] cost {3} RUs.", 
     sqlQuery.QueryText, 
     take, 
     collectionId, 
     queryCost); 

    return entities.Take(take).ToList(); // We may end up with more than the requested number of items. 
} 
Problemi correlati