Следуя о том, как продлить Расширение понимания приложений в решении с оптимизацией PAAS CMSЯ хотел бы поделиться другим способом, которым вы можете использовать Insights для улучшения вашего предложения. Application Insights имеет возможность записывать и сообщать о пользовательских событиях, которые вы поднимаете в своем приложении, и повышение события легко. Я использую этот механизм для отслеживания терминов поиска без использования базы данных, и приведенные ниже примеры посвящены повышению пользовательских событий во время поиска, а затем извлечены данные обратно и агрегируют их.
Прежде чем начать работу с записи собственных мероприятий, вам нужно подготовить свое приложение:
- Установить Microsoft.ApplicationInsIsts.aspnetCore упаковка
- Получите и добавьте следующие настройки из экземпляра Praping Insights и добавьте их в свои приложения.
- ApplicationInsights__connectionString
- ApplicationInsights__apikey
- ApplicationInsights__ppid
Повышение события
Повышение события выполняется через Телеметрический клиент который является частью Microsoft.ApplicationInsIsts.aspnetCore упаковка. А Траквент Метод принимает два параметра, название вашего события и словарь
using Microsoft.ApplicationInsights;
using Microsoft.AspNetCore.Mvc;
public sealed class SearchController(ISearchService searchService, TelemetryClient telemetryClient) : Controller
{
public async Task Search(string? query)
{
LogTrackSearch(query);
// Search Logic Goes Here
var results = searchService.Search(query);
return Json(results);
}
private void LogTrackSearch(string? query)
{
if (query is { Length: >3 })
{
telemetryClient.TrackEvent("TrackSearch", new Dictionary { { "Query", query } });
}
}
}
Затем вы можете искать пользовательские события непосредственно в разделе журналов Insights Insights:
Получение событий
Теперь у вас есть ваши события, введенные в информацию о приложениях, вы можете получить эти данные обратно, чтобы представить их администратору. Я настоятельно рекомендую вам использовать эту функциональность только на экране администрирования и не использую ее для питания фронта вашего веб -сайта.
Первое, что вы захотите сделать, это разработать ваш запрос, я рекомендую вам сделать это непосредственно в инструменте журналов в приложении Inisights. Для моего запроса я хотел только данные, связанные с моим конкретным типом события с именем “TrackSearch”, и я хотел объединить эти данные по уникальным Запрос ценность и включать в себя количество случаев как УникальныйПолем В результате мой запрос выглядит так:
customEvents
| where name contains "TrackSearch"
| where timestamp > ago(7d)
| where tostring(customDimensions["Query"]) != ""
| summarize UniqueCount=count() by Query=tolower(tostring(customDimensions["Query"]))
| project Query, UniqueCount
| order by UniqueCount desc
Чтобы получить это непосредственно в вашем приложении, вам необходимо сделать запрос на получение запроса на информацию о приложениях и включить сбежавшую версию вашего запроса. Вы получите ответ, который содержит коллекцию таблиц. Поскольку мой запрос – суммирование таблицы Customevents, это единственная заселенная таблица, которую я получаю в своем ответе. Теперь данные не так просты, как вы думаете. Я должен был включить следующие DTO, чтобы я мог сериализовать контент:
public sealed class InsightsResponse
{
[JsonPropertyName("tables")]
public List? Tables { get; set; }
}
public sealed class InsightsTable
{
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("columns")]
public List? Columns { get; set; }
[JsonPropertyName("rows")]
public List>? Rows { get; set; }
}
public sealed class InsightsColumn
{
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("type")]
public string? Type { get; set; }
}
Затем в моем контроллере я использую StringBuilder Чтобы воссоздать свой запрос, я делаю запрос получить запрос на представление о приложениях и сериализовать ответ. Данные, которые я затем имею, не очень полезны в его текущей форме, поэтому у меня есть дополнительная логика, которая затем превращает данные ответа в коллекцию объектов TrackSearchterm, что является еще одним DTO, который содержат плоские данные, которые я хочу вернуть пользователю.
public sealed class InsightsController(IConfiguration configuration) : Controller
{
public async Task SearchTerms(int numberOfDays = 7)
{
var stringBuilder = new StringBuilder();
stringBuilder.AppendLine("customEvents");
stringBuilder.AppendLine("| where name contains "TrackSearch"");
stringBuilder.AppendLine($"| where timestamp > ago({numberOfDays}d)");
stringBuilder.AppendLine("| where tostring(customDimensions["Query"]) != """);
stringBuilder.AppendLine("| summarize UniqueCount=count() by Query=tolower(tostring(customDimensions["Query"]))");
stringBuilder.AppendLine("| project Query, UniqueCount");
stringBuilder.AppendLine("| order by UniqueCount desc");
var query = stringBuilder.ToString();
var settings = GetApplicationInsightSettings();
// Build the request URL
string url = $"https://api.applicationinsights.io/v1/apps/{settings.AppId}/query?query={Uri.EscapeDataString(query)}";
using var client = new HttpClient();
// Set up API key in the header
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-key", settings.ApiKey);
// Send the request
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var data = JsonSerializer.Deserialize(content);
var searchTerms = GetSearchTerms(data).ToList();
return Json(searchTerms);
}
return Json(Enumerable.Empty());
}
private static IEnumerable GetSearchTerms(InsightsResponse? insightsResponse)
{
if (insightsResponse is not { Tables.Count: >0 })
{
yield break;
}
foreach (var table in insightsResponse.Tables)
{
var queryIndex = -1;
var uniqueCountIndex = -1;
if (table is not { Columns.Count: >0, Rows.Count: >0 })
{
continue;
}
// Get the numerical index of your column
foreach (var column in table.Columns)
{
queryIndex = string.Equals(column.Name, "Query", StringComparison.OrdinalIgnoreCase) ? table.Columns.IndexOf(column) : queryIndex;
uniqueCountIndex = string.Equals(column.Name, "UniqueCount", StringComparison.OrdinalIgnoreCase) ? table.Columns.IndexOf(column) : uniqueCountIndex;
}
foreach (var row in table.Rows)
{
yield return new TrackSearchTerm
{
Query = queryIndex >= 0 ? row[queryIndex]?.ToString() : string.Empty,
UniqueCount = uniqueCountIndex >= 0 && int.TryParse(row[uniqueCountIndex]?.ToString(), out var uniqueCount) ? uniqueCount : 1
};
}
}
}
}
Затем вы можете представить этот результат непосредственно своему администратору в любой форме, которую вы хотите. Я рекомендую добавить дополнительную логику для дедупликации поисковых терминов, так как вы можете получить несколько событий, выполняемых из -за задержек при вводе пользователя. Например, вы можете получить ответы «Hello W» и «Hello World» от одного пользователя, если запрос поиска выполняется во время задержки в вводе пользователя. Я не включил этот код здесь, но мое полное решение включает его.
Теперь у вас есть вся информация, необходимая для начала использования пользовательских событий в Insights Applications для ваших собственных потребностей. Счастливое кодирование 😊
Я OMVP и автор и сопровождающий Стотт Безопасность и Стотт -роботы для оптимизации CMS 12. Вы можете найти весь мой контент, собранный на https://www.stott.pro/
25 сентября 2025 года
Читайте также

