2017-01-23 41 views
6

Mam projekt aplikacji konsoli napisany w języku C#, do którego dodałem statystyki aplikacji z następującymi pakietami NuGet.Jak śledzić żądania MongoDB z aplikacji konsolowej?

Microsoft.ApplicationInsights 
Microsoft.ApplicationInsights.Agent.Intercept 
Microsoft.ApplicationInsights.DependencyCollector 
Microsoft.ApplicationInsights.NLogTarget 
Microsoft.ApplicationInsights.PerfCounterCollector 
Microsoft.ApplicationInsights.Web 
Microsoft.ApplicationInsights.WindowsServer 
Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel 

mam skonfigurowany mój InstrumentationKey w pliku konfiguracyjnym i mam rozpalanie TelemetryClient na starcie za pomocą za pomocą następującego kodu:

var telemetryClient = new TelemetryClient(); 
telemetryClient.Context.User.Id = Environment.UserName; 
telemetryClient.Context.Session.Id = Guid.NewGuid().ToString(); 
telemetryClient.Context.Device.OperatingSystem = Environment.OSVersion.ToString(); 

wszystko działa dobrze, z wyjątkiem AI nie jest przechwytywanie wszelkie żądania wysyłane do Mongo, widzę żądania wychodzące do serwera SQL w "Mapie aplikacji", ale żadnych innych zewnętrznych żądań. Czy jest jakiś sposób, żeby zobaczyć telemetrię zapytań złożonych do Mongo?

EDIT - Dzięki Peter Bons skończyło się prawie następujących składników, które działa jak czar i pozwala mi rozróżniać między sukcesem a porażką:

var telemetryClient = new TelemetryClient(); 
var connectionString = connectionStringSettings.ConnectionString; 
var mongoUrl = new MongoUrl(connectionString); 
var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl); 

mongoClientSettings.ClusterConfigurator = clusterConfigurator => 
{ 
    clusterConfigurator.Subscribe<CommandSucceededEvent>(e => 
    { 
     telemetryClient.TrackDependency("MongoDB", e.CommandName, DateTime.Now.Subtract(e.Duration), e.Duration, true); 
    }); 

    clusterConfigurator.Subscribe<CommandFailedEvent>(e => 
    { 
     telemetryClient.TrackDependency("MongoDB", $"{e.CommandName} - {e.ToString()}", DateTime.Now.Subtract(e.Duration), e.Duration, false); 
    }); 
}; 

var mongoClient = new MongoClient(mongoClientSettings); 

Odpowiedz

3

nie jestem zaznajomiony z MongoDB ale o ile Mogę powiedzieć, że nie ma domyślnego wsparcia dla niego, jeśli chodzi o statystyki aplikacji. Ale to nie znaczy, że nie możesz tego zrobić, to po prostu zaangażuje trochę więcej kodu.

Ponownie, nie znam MongoDB, ale zgodnie z http://www.mattburkedev.com/logging-queries-from-mongodb-c-number-driver/ jest wbudowana obsługa logowania wygenerowanych zapytań. Teraz wystarczy podpiąć to do Insightów aplikacji.

Ponieważ już wiesz, jak korzystać z TelemetryClient, możemy użyć niestandardowych metod śledzenia dostarczonych przez tę klasę. Zobacz https://docs.microsoft.com/nl-nl/azure/application-insights/app-insights-api-custom-events-metrics dla dostępnych niestandardowych metod śledzenia.

Wszystko, co musisz zrobić, to włożyć trochę kodu tak:

telemetryClient.TrackDependency(
    "MongoDB",    // The name of the dependency 
    query,     // Text of the query 
    DateTime.Now,   // Time that query is executed 
    TimeSpan.FromSeconds(0), // Time taken to execute query 
    true);     // Indicates success 

Klasa telemetryClient jest bezpieczny wątku, dzięki czemu można go ponownie wykorzystać.

Teraz, zgodnie z odnośną blogpost powinieneś być w stanie zrobić coś takiego:

var client = new MongoClient(new MongoClientSettings() 
{ 
    Server = new MongoServerAddress("localhost"), 
    ClusterConfigurator = cb => 
    { 
     cb.Subscribe<CommandStartedEvent>(e => 
     { 
      telemetryClient.TrackDependency(
       "MongoDB",    // The name of the dependency 
       e.Command.ToJson()  // Text of the query 
       DateTime.Now,   // Time that query is executed 
       TimeSpan.FromSeconds(0), // Time taken to execute query 
       true);     // Indicates success 
     }); 
    } 
}); 

Ponownie, nie jestem zaznajomiony z MongoDB, ale mam nadzieję, że jest to punkt wyjścia dla swojej wyobraźni, w jaki sposób dostosuj go do swoich potrzeb, korzystając z wiedzy o MongoDB.

EDIT:

Jeśli istnieje również CommandCompletedEvent lub podobnego zdarzenia, w przeciwieństwie do przypadku CommandStartedEvent powinieneś śledzić zależność istnieje, ponieważ należy następnie móc obliczyć (lub simpel czytać) czas spędzony i może uzyskać rzeczywistą wartość wskaźnika sukcesu.

+3

, a następnie, jeśli to zrobisz ... to może powinieneś utworzyć repozytorium github i podzielić się nim ze światem? :) –

+0

Świetna odpowiedź Peter, to nie jest naprawdę rzecz, która działa w GitHubie, ale prawdopodobnie utworzę wpis na blogu o tym, co robię i dodałem kod, który zakończyłem na moje pytanie . –

+0

Trochę za późno, wiem, ale udało mi się napisać ten post na blogu: https://sequence7.net/2017/02/09/monitoring-mongodb-with-application-insights/ –