Как отслеживать запросы MongoDB из консольного приложения

У меня есть проект консольного приложения, написанный на C#, к которому я добавил Application Insights со следующими пакетами NuGet.

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

Я настроил свой InstrumentationKey в конфигурационном файле, и я запускаю TelemetryClient при запуске, используя следующий код:

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

все работает хорошо, кроме AI не захватывает никаких запросов, которые отправляются в Mongo, я вижу, что запросы отправляются на SQL server в "карте приложений", но нет знак любых других внешних запросов. Есть ли способ, которым я могу видеть телеметрию запросов, сделанных Монго?

EDIT-благодаря Питеру Бонсу я закончил в значительной степени следующее, которое работает как шарм и позволяет мне различать успех и неудачу:

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);

1 ответов


Я не знаком с MongoDB, но, насколько я могу судить, нет поддержки по умолчанию для него, когда дело доходит до Application Insights. Но это не означает, что вы не можете этого сделать, это будет просто включать еще один код.

опять же, я не знаком с MongoDB, но согласно http://www.mattburkedev.com/logging-queries-from-mongodb-c-number-driver/ существует встроенная поддержка регистрации сгенерированных запросов. Теперь нам нужно только подключить это к приложению Интуиция.

так как вы уже знаете, как использовать TelemetryClient мы можем использовать пользовательские методы отслеживания, предоставляемые этим классом. Смотри https://docs.microsoft.com/nl-nl/azure/application-insights/app-insights-api-custom-events-metrics для доступных пользовательских методов отслеживания.

все, что вам нужно сделать, это вставить такой код:

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

класс telemetryClient является потокобезопасным, поэтому вы можете использовать его.

, согласно ссылка блогпост вы должны быть в состоянии сделать что-то вроде этого:
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
        });
    }
});

опять же, я не знаком с MongoDB, но я надеюсь, что это отправная точка для вашего воображения о том, как адаптировать его к вашим потребностям, используя ваши знания MongoDB.

EDIT:

если есть также CommandCompletedEvent или аналогичное событие в отличие от CommandStartedEvent событие вы, вероятно, должны отслеживать зависимость там, потому что тогда вы должны быть в состоянии рассчитать (или simpel читать) потраченное время и, возможно, получить фактическое значение показателя успеха.