Повышение и извлечение пользовательских событий в Insights Applications Insights

Следуя о том, как продлить Расширение понимания приложений в решении с оптимизацией PAAS CMSЯ хотел бы поделиться другим способом, которым вы можете использовать Insights для улучшения вашего предложения. Application Insights имеет возможность записывать и сообщать о пользовательских событиях, которые вы поднимаете в своем приложении, и повышение события легко. Я использую этот механизм для отслеживания терминов поиска без использования базы данных, и приведенные ниже примеры посвящены повышению пользовательских событий во время поиска, а затем извлечены данные обратно и агрегируют их.

Прежде чем начать работу с записи собственных мероприятий, вам нужно подготовить свое приложение:

  • Установить Microsoft.ApplicationInsIsts.aspnetCore упаковка
  • Получите и добавьте следующие настройки из экземпляра Praping Insights и добавьте их в свои приложения.
    • ApplicationInsights__connectionString
    • ApplicationInsights__apikey
    • ApplicationInsights__ppid

Повышение события

Повышение события выполняется через Телеметрический клиент который является частью Microsoft.ApplicationInsIsts.aspnetCore упаковка. А Траквент Метод принимает два параметра, название вашего события и словарь пользовательских данных. А Телеметрический клиент автоматически добавит данные, такие как метод HTTP и путь запроса вместе с другой интересной информацией, чтобы вы могли сосредоточиться на деталях, которые важны для вас. Само собой разумеется, что вы не должны включать данные PII в данные вашего события.

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:

Получение событий

Теперь у вас есть ваши события, введенные в информацию о приложениях, вы можете получить эти данные обратно, чтобы представить их администратору. Я настоятельно рекомендую вам использовать эту функциональность только на экране администрирования и не использую ее для питания фронта вашего веб -сайта.

Read more:  Молчание в суде, поскольку солдат Ф., сидевший в тени, был признан невиновным - The Irish Times

Первое, что вы захотите сделать, это разработать ваш запрос, я рекомендую вам сделать это непосредственно в инструменте журналов в приложении 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» от одного пользователя, если запрос поиска выполняется во время задержки в вводе пользователя. Я не включил этот код здесь, но мое полное решение включает его.

Read more:  Дональд Трамп предупреждает ХАМАС, что он не будет «терпеть какую -либо задержку» в применении своего плана

Теперь у вас есть вся информация, необходимая для начала использования пользовательских событий в Insights Applications для ваших собственных потребностей. Счастливое кодирование 😊


Я OMVP и автор и сопровождающий Стотт Безопасность и Стотт -роботы для оптимизации CMS 12. Вы можете найти весь мой контент, собранный на https://www.stott.pro/

25 сентября 2025 года

Читайте также

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.