Я экспериментировал с выборкой данных телеметрии, чтобы не превысить лимит ежедневных журналов App Insights. В идеале я хочу применять выборку ко всему, но исключать исключения и сохранять связанные трассировки (тот же идентификатор операции) для исключений.
Я создал пример консольного приложения для тестирования и до сих пор Я могу успешно выбирать и сохранять исключения. Но связанные трассировки также выбираются.
Я рассмотрел реализацию специального ITelemetryProcessor, но он обрабатывает одну запись за раз. Поэтому я не уверен, возможно ли это вообще с помощью специального процессора. Возможно, есть что-то, что поможет добиться желаемого поведения.
Код Program.cs приведен ниже
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
const string appInsightConnString = "";
const double samplingPercentage = 50;
var services = new ServiceCollection();
// add context
var context = new Context();
services.AddSingleton(context);
// configure application insights
services.AddApplicationInsightsTelemetryWorkerService(
(options) =>
{
// disable adaptive sampling
options.EnableAdaptiveSampling = false;
options.ConnectionString = appInsightConnString;
});
// configure logging
services.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.Services.AddSingleton();
loggingBuilder.AddConsole();
});
var serviceProvider = services.BuildServiceProvider();
// setup sampling
var telemetryConfiguration = serviceProvider.GetRequiredService();
var telemetryBuilder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
telemetryBuilder.UseSampling(samplingPercentage, excludedTypes: "Exception");
telemetryBuilder.Build();
// get logger
var logger = serviceProvider.GetRequiredService();
// do something important
DoWork(context, logger);
// explicitly call Flush() followed by sleep is required in console apps.
// this is to ensure that even if application terminates, telemetry is sent to the back-end.
var telemetryClient = serviceProvider.GetRequiredService();
telemetryClient.Flush();
Task.Delay(10000).Wait();
Console.WriteLine("Flushed. Press any key to exit");
Console.ReadKey();
static void DoWork(Context context, ILogger logger)
{
const int iterations = 50;
const int errors = 15;
// session Id to filter logs
var sessionId = Guid.NewGuid().ToString();
Console.WriteLine($"Session Id: {sessionId}");
// randomize errors
var random = new Random();
var errorsHash = new HashSet();
while (errorsHash.Count < errors)
{
errorsHash.Add(random.Next(0, iterations));
}
// log
for (var i = 0; i < iterations; i++)
{
context.CorrelationId = Guid.NewGuid().ToString();
logger.LogInformation($"Begin operation: {context.CorrelationId}. Session Id: {sessionId}");
if (errorsHash.Contains(i))
logger.LogError(new Exception("test ex"), $"Error operation: {context.CorrelationId}. Session Id: {sessionId}");
logger.LogInformation($"End operation: {context.CorrelationId}. Session Id: {sessionId}");
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... lated-entr
При использовании выборки Application Insights можно сохранить связанные записи вместе с исключенными элементами. ⇐ C#
Место общения программистов C#
1713250906
Anonymous
Я экспериментировал с выборкой данных телеметрии, чтобы не превысить лимит ежедневных журналов App Insights. В идеале я хочу применять выборку ко всему, но исключать исключения и сохранять связанные трассировки (тот же идентификатор операции) для исключений.
Я создал пример консольного приложения для тестирования и до сих пор Я могу успешно выбирать и сохранять исключения. Но связанные трассировки также выбираются.
Я рассмотрел реализацию специального ITelemetryProcessor, но он обрабатывает одну запись за раз. Поэтому я не уверен, возможно ли это вообще с помощью специального процессора. Возможно, есть что-то, что поможет добиться желаемого поведения.
Код Program.cs приведен ниже
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
const string appInsightConnString = "";
const double samplingPercentage = 50;
var services = new ServiceCollection();
// add context
var context = new Context();
services.AddSingleton(context);
// configure application insights
services.AddApplicationInsightsTelemetryWorkerService(
(options) =>
{
// disable adaptive sampling
options.EnableAdaptiveSampling = false;
options.ConnectionString = appInsightConnString;
});
// configure logging
services.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.Services.AddSingleton();
loggingBuilder.AddConsole();
});
var serviceProvider = services.BuildServiceProvider();
// setup sampling
var telemetryConfiguration = serviceProvider.GetRequiredService();
var telemetryBuilder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
telemetryBuilder.UseSampling(samplingPercentage, excludedTypes: "Exception");
telemetryBuilder.Build();
// get logger
var logger = serviceProvider.GetRequiredService();
// do something important
DoWork(context, logger);
// explicitly call Flush() followed by sleep is required in console apps.
// this is to ensure that even if application terminates, telemetry is sent to the back-end.
var telemetryClient = serviceProvider.GetRequiredService();
telemetryClient.Flush();
Task.Delay(10000).Wait();
Console.WriteLine("Flushed. Press any key to exit");
Console.ReadKey();
static void DoWork(Context context, ILogger logger)
{
const int iterations = 50;
const int errors = 15;
// session Id to filter logs
var sessionId = Guid.NewGuid().ToString();
Console.WriteLine($"Session Id: {sessionId}");
// randomize errors
var random = new Random();
var errorsHash = new HashSet();
while (errorsHash.Count < errors)
{
errorsHash.Add(random.Next(0, iterations));
}
// log
for (var i = 0; i < iterations; i++)
{
context.CorrelationId = Guid.NewGuid().ToString();
logger.LogInformation($"Begin operation: {context.CorrelationId}. Session Id: {sessionId}");
if (errorsHash.Contains(i))
logger.LogError(new Exception("test ex"), $"Error operation: {context.CorrelationId}. Session Id: {sessionId}");
logger.LogInformation($"End operation: {context.CorrelationId}. Session Id: {sessionId}");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78305338/when-using-application-insights-sampling-is-it-possible-to-preserve-related-entr[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия