Периодическая проблема: App Insights не регистрирует специальные измеренияC#

Место общения программистов C#
Ответить
Anonymous
 Периодическая проблема: App Insights не регистрирует специальные измерения

Сообщение Anonymous »

У нас есть несколько оболочек, написанных вокруг ILogger, которые преобразуют пары имя-значение в пользовательские измерения. Мы используем этот код уже много лет и сталкиваемся с периодическими проблемами: иногда мы получаем customDimensions, а иногда нет. Как вы понимаете, это очень неприятно при попытке сортировки ошибок. Возможно, в моей реализации есть ошибка, которую я просто не вижу.
Этот конкретный случай: приложение представляет собой веб-API .net Core 9. Он выполняет HTTP-вызов к другой службе (надежная функция) и должен регистрировать ответ в формате JSON со всеми URL-адресами состояния — тот же ответ, который вы получаете, если используете бегун на портале Azure.
Проблема в том, что в этом случае App Insights просто перестает регистрировать любые пользовательские измерения в этом одном классе, в то время как другие места в том же коде API работают нормально и пишут customDimensions.
Для конфигурации у нас есть что-то вроде этого:
где рассматриваемый код находится в пространстве имен MyApi.Api.Application.Common.Services

Код: Выделить всё

    {
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft": "Error",
"Microsoft.AspNetCore": "Error",
"Microsoft.Hosting.Lifetime": "Error",
"Microsoft.EntityFrameworkCore": "Error",
"MyApi.Api.Application.Common.Services": "Debug"
},
"ApplicationInsights": {
"samplingSettings": {
"isEnabled": false
},
"EnableLiveMetricsFilters": false,
"LogLevel": {
"Default": "Debug",
"Microsoft": "Error",
"Microsoft.AspNetCore": "Error",
"Microsoft.Hosting.Lifetime": "Error",
"Microsoft.EntityFrameworkCore": "Error",
"MyApi.Api.Application.Common.Services": "Debug"
}
}
},
"AllowedHosts": "*"
}
Да, фильтрация и выборка включены, поскольку это конкретное приложение является основой нашей системы, поэтому в журналах оно очень и очень болтливо.
Регистрация службы App Insights выглядит следующим образом:

Код: Выделить всё

    public static void RegisterLogging(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment)
{
services.AddSingleton(environment);

if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
{
services.AddLogging(builder =>
{
builder.AddApplicationInsights();
});

services.TryAddScoped();

services.AddApplicationInsightsTelemetry(options =>
{
options.ConnectionString = configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"];
});
}
}
Мы проверяем наличие строки подключения, поскольку она автоматически настраивается в наших службах приложений в Azure, но не всегда включена на компьютере разработчика. App Insights выдаст ошибку, если вы вызовете конфигурацию с несуществующим значением конфигурации строки подключения.
У нас есть несколько методов расширения, которые мы используем, чтобы абстрагировать некоторые тонкости ведения журнала, поэтому я собираюсь показать пример пути, используемого одной из наших наиболее распространенных реализаций.

Код: Выделить всё

public static ILogger WriteDebug(this ILogger logger, string message,
params (string, object)[] properties)
{
logger.WriteDebug(message, properties.ToLoggingScope(), null);

return logger;
}

public static void WriteDebug(this ILogger logger, string message, IDictionary properties = null, params object[] arguments)
{
properties = properties ?? CreateDefaultScope();

using (logger.BeginScope(properties))
{
logger.LogDebug(message, arguments);
}
}

public static IDictionary ToLoggingScope(this (string, object)[] properties)
{
return properties
.GroupBy(prop => prop.Item1, StringComparer.OrdinalIgnoreCase)
.Select(grp => new KeyValuePair(grp.Key, grp.LastOrDefault().Item2))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

private static IDictionary CreateDefaultScope()
{
return new Dictionary()
{
["ScopeId"] = Guid.NewGuid().ToString("N")
};
}

И чаще всего использование выглядит так:

Код: Выделить всё

public class MyService(ILoggerFactory loggerFactory)
{
private readonly ILogger = loggerFactory.CreateLogger();

public void DoSomething(int myId)
{
_logger.WriteDebug("Begin DoSomething",
(nameof(myId), myId));
}
}
Это то, что расстраивает. Иногда зарегистрированные записи будут иметь customDimensions, а иногда нет.


Подробнее здесь: https://stackoverflow.com/questions/797 ... dimensions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»