Сбор, запрос и визуализация состояний работоспособности

Завершено

Чтобы точно представить модель работоспособности, необходимо собрать различные наборы данных из системы. Наборы данных включают журналы и метрики производительности из компонентов приложений и базовых ресурсов Azure. Важно сопоставить данные между наборами данных для создания многоуровневого представления работоспособности системы.

Инструментирование кода и инфраструктуры

Единый приемник данных необходим, чтобы все операционные данные хранились и доступны в одном расположении, где собираются все данные телеметрии. Например, когда сотрудник создает комментарий в веб-браузере, вы можете отслеживать эту операцию и видеть, что запрос прошел через API каталога для Центры событий Azure. Оттуда фоновый процессор взял комментарий и сохраняет его в Azure Cosmos DB.

Azure Monitor Log Analytics служит основным единым приемником данных Azure для хранения и анализа операционных данных:

  • Application Insights — это рекомендуемое средство Монитор производительности приложений (APM) для сбора журналов приложений, метрик и трассировок. Application Insights развертывается в конфигурации на основе рабочей области в каждом регионе.

    В примере приложения Функции Azure используется в Microsoft .NET 6 для внутренних служб для собственной интеграции. Так как внутренние приложения уже существуют, Contoso Shoes создает только новый ресурс Application Insights в Azure и настраивает APPLICATIONINSIGHTS_CONNECTION_STRING параметр для обоих приложений-функций. Среда выполнения Функции Azure автоматически регистрирует поставщика ведения журнала Application Insights, поэтому данные телеметрии отображаются в Azure без дополнительных усилий. Для более настраиваемого ILogger ведения журнала можно использовать интерфейс.

  • Централизованный набор данных — это антипаттерн для критически важных рабочих нагрузок. Каждый регион должен иметь свою выделенную рабочую область Log Analytics и экземпляр Application Insights. Для глобальных ресурсов рекомендуется использовать отдельные экземпляры. Сведения о базовом шаблоне архитектуры см. в статье "Архитектура" для критически важных рабочих нагрузок в Azure.

  • Каждый слой должен отправлять данные в одну рабочую область Log Analytics, чтобы упростить анализ и вычисления работоспособности.

Схема, демонстрирующая пример сбора данных о работоспособности приложений.

Запросы мониторинга работоспособности

Log Analytics, Application Insights и Azure Data Explorer используют язык запросов Kusto (KQL) для своих запросов. С помощью KQL можно создавать запросы и использовать функции для получения метрик и вычисления показателей работоспособности.

Сведения о отдельных службах, которые вычисляют состояние работоспособности, см. в следующих примерах запросов.

API каталога

В следующем примере демонстрируется запрос API каталога:


let _maxAge = 2d; // Include data only from the last two days
let _timespanStart = ago(_maxAge); // Start time for the time span
let _timespanEnd = now(-2m); // Account for ingestion lag by stripping the last 2m
// For time frame, compare the averages to the following threshold values
let Thresholds=datatable(MetricName: string, YellowThreshold: double, RedThreshold: double) [ 
    "failureCount", 10, 50, // Failed requests, anything non-200, allow a few more than 0 for user-caused errors like 404s
    "avgProcessingTime", 150, 500 // Average duration of the request, in ms
    ];
// Calculate average processing time for each request
let avgProcessingTime = AppRequests
| where AppRoleName startswith "CatalogService"
| where OperationName != "GET /health/liveness" // Liveness requests don't do any processing, including them would skew the results
| make-series Value = avg(DurationMs) default=0 on TimeGenerated from _timespanStart to _timespanEnd step 1m
| mv-expand TimeGenerated, Value
| extend TimeGenerated = todatetime(TimeGenerated), Value=toreal(Value), MetricName= 'avgProcessingTime';
// Calculate failed requests
let failureCount = AppRequests
| where AppRoleName startswith "CatalogService" // Liveness requests don't do any processing, including them would skew the results
| where OperationName != "GET /health/liveness"
| make-series Value=countif(Success != true) default=0 on TimeGenerated from _timespanStart to _timespanEnd step 1m
| mv-expand TimeGenerated, Value
| extend TimeGenerated = todatetime(TimeGenerated), Value=toreal(Value), MetricName= 'failureCount';
// Union all together and join with the thresholds
avgProcessingTime
| union failureCount
| lookup kind = inner Thresholds on MetricName
| extend IsYellow = iff(todouble(Value) > YellowThreshold and todouble(Value) < RedThreshold, 1, 0)
| extend IsRed = iff(todouble(Value) > RedThreshold, 1, 0)
| project-reorder TimeGenerated, MetricName, Value, IsYellow, IsRed, YellowThreshold, RedThreshold
| extend ComponentName="CatalogService"

Azure Key Vault

В следующем примере демонстрируется запрос Azure Key Vault:

let _maxAge = 2d; // Include data only from the last two days
let _timespanStart = ago(_maxAge); // Start time for the time span
let _timespanEnd = now(-2m); // Account for ingestion lag by stripping the last 2m
// For time frame, compare the averages to the following threshold values
let Thresholds = datatable(MetricName: string, YellowThreshold: double, RedThreshold: double) [
    "failureCount", 3, 10 // Failure count on key vault requests
    ];
let failureStats = AzureDiagnostics
| where TimeGenerated > _timespanStart
| where ResourceProvider == "MICROSOFT.KEYVAULT"
// Ignore authentication operations that have a 401. This is normal when using Key Vault SDK. First an unauthenticated request is made, then the response is used for authentication
| where Category=="AuditEvent" and not (OperationName == "Authentication" and httpStatusCode_d == 401)
| where OperationName in ('SecretGet','SecretList','VaultGet') or '*' in ('SecretGet','SecretList','VaultGet')
// Exclude Not Found responses because these happen regularly during 'Terraform plan' operations, when Terraform checks for the existence of secrets
| where ResultSignature != "Not Found"
// Create ResultStatus with all the 'success' results bucketed as 'Success'
// Certain operations like StorageAccountAutoSyncKey have no ResultSignature; for now, also set to 'Success'
| extend ResultStatus = case ( ResultSignature == "", "Success",
                               ResultSignature == "OK", "Success",
                               ResultSignature == "Accepted", "Success",
                               ResultSignature);
failureStats
| make-series Value=countif(ResultStatus != "Success") default=0 on TimeGenerated from _timespanStart to _timespanEnd step 1m
| mv-expand TimeGenerated, Value
| extend TimeGenerated = todatetime(TimeGenerated), Value=toreal(Value), MetricName="failureCount", ComponentName="Keyvault"
| lookup kind = inner Thresholds on MetricName
| extend IsYellow = iff(todouble(Value) > YellowThreshold and todouble(Value) < RedThreshold, 1, 0)
| extend IsRed = iff(todouble(Value) > RedThreshold, 1, 0)

Оценка Работоспособность служб каталога

В конечном итоге можно связать различные запросы состояния работоспособности, чтобы вычислить оценку работоспособности компонента. В следующем примере запроса показано, как вычислить оценку Работоспособность служб каталога:

CatalogServiceHealthStatus()
| union AksClusterHealthStatus()
| union KeyvaultHealthStatus()
| union EventHubHealthStatus()
| where TimeGenerated < ago(2m)
| summarize YellowScore = max(IsYellow), RedScore = max(IsRed) by bin(TimeGenerated, 2m)
| extend HealthScore = 1 - (YellowScore * 0.25) - (RedScore * 0.5)
| extend ComponentName = "CatalogService", Dependencies="AKSCluster,Keyvault,EventHub" // These values are added to build the dependency visualization
| order by TimeGenerated desc

Настройка оповещений на основе запросов

Оповещения вызывают немедленное внимание на проблемы, которые отражают или влияют на состояние работоспособности. Всякий раз, когда в состоянии работоспособности изменяется состояние работоспособности( желтый) или в неработоспособное (красное) состояние, уведомления должны отправляться в подотчетную команду. Задайте оповещения на корневом узле модели работоспособности, чтобы сразу же узнать о любых изменениях уровня бизнеса в состоянии работоспособности решения. Затем можно просмотреть визуализации модели работоспособности, чтобы получить дополнительные сведения и устранить неполадки.

В примере используются оповещения Azure Monitor для выполнения автоматических действий в ответ на изменения состояния работоспособности приложения.

Использование панелей мониторинга для визуализации

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

Типичным способом визуализации сведений о работоспособности системы является объединение многоуровневого представления модели работоспособности с возможностями детализации телеметрии на панели мониторинга.

Снимок экрана: пример панели мониторинга модели работоспособности для многоуровневой модели выше детализации таблиц данных.

Технология панели мониторинга должна представлять модель работоспособности. Популярные варианты: панели мониторинга Azure, Power BI и Azure Managed Grafana.

Проверка знаний

1.

Где системные компоненты отправляют данные телеметрии?

2.

Какой язык используется для запроса журналов Log Analytics и вычисления показателей работоспособности?

3.

Что такое лучшие технологии мониторинга для моделирования работоспособности?