Análisis del uso en un área de trabajo de Log Analytics

Los costos de la plataforma Azure Monitor pueden variar significativamente en función del volumen de datos que se recopilan en el área de trabajo de Log Analytics. Este volumen lo determinan el conjunto de soluciones que usan el área de trabajo y la cantidad de datos que recopila cada solución. En este artículo se proporcionan instrucciones sobre cómo analizar los datos recopilados para ayudarle a controlar los costos de la ingesta de datos. Le ayuda a determinar la causa del uso más alto que el esperado. Además, le ayudará a predecir los costos mediante la supervisión de recursos adicionales y la configuración de diferentes características de Azure Monitor.

Sugerencia

Para descubrir estrategias que le ayudarán a reducir los costes de Azure Monitor, consulte Optimización de costes y Azure Monitor.

Causas de un uso superior al esperado

Cada área de trabajo de Log Analytics se cobra como un servicio independiente y contribuye a la factura de la suscripción a Azure. La cantidad de datos ingeridos puede ser considerable dependiendo de los factores siguientes:

  • El conjunto de conclusiones y servicios habilitados y su configuración
  • El número y tipo de recursos supervisados
  • El volumen de datos recopilados de cada recurso supervisado

Un aumento inesperado en cualquiera de estos factores puede dar lugar a un aumento de los cargos por la retención de datos. En el resto de este artículo se proporcionan métodos para detectar este tipo de situación y, a continuación, analizar los datos recopilados para identificar y mitigar el origen del aumento del uso.

Enviar una alerta cuando la recopilación de datos es alta

Para evitar facturas inesperadas, debería recibir una notificación proactiva cada vez que experimente un uso excesivo. La notificación le permite abordar cualquier posible anomalía antes de que finalice el periodo de facturación.

El ejemplo siguiente es una regla de alerta de búsqueda de registros que envía una alerta si el volumen de datos facturable ingerido en las últimas 24 horas era mayor que 50 GB. Modifique la configuración de la lógica de alertas para usar un umbral diferente basado en el uso esperado en su entorno También puede aumentar la frecuencia para comprobar el uso varias veces al día, pero esta opción supondrá un cargo mayor para la regla de alerta.

Configuración Valor
Ámbito
Ámbito de destino Seleccione el área de trabajo de Log Analytics.
Condition
Consultar Usage | where IsBillable | summarize DataGB = sum(Quantity / 1000)
Medición Medida: DataGB
Tipo de agregación: Total
Granularidad de agregación: 1 día
Lógica de alerta Operador: Mayor que
Valor del umbral: 50
Frecuencia de evaluación: 1 día
Acciones Seleccione o agregue un grupo de acciones para que le notifique cuando se supere el umbral.
Detalles
severity Advertencia
Nombre de la regla de alertas Volumen de datos facturables superior a 50 GB en 24 horas.

Análisis de uso en Azure Monitor

Use las herramientas existentes en Azure Monitor para iniciar el análisis. Esta herramientas no requieren ninguna configuración y, a menudo, pueden proporcionar la información que necesita con un esfuerzo mínimo. Si necesita un análisis más profundo de los datos recopilados que el que ofrecen las características existentes de Azure Monitor, use cualquiera de las siguientes consultas de registro de Log Analytics.

Conclusiones del área de trabajo de Log Analytics

La herramienta Conclusiones del área de trabajo de Log Analytics le proporciona una descripción rápida de los datos del área de trabajo. Por ejemplo, puede determinar lo siguiente:

  • Las tablas de datos que ingieren el mayor volumen de datos de la tabla principal.
  • Los principales recursos que ofrecen datos.
  • La tendencia de la ingesta de datos.

Consulte la pestaña Uso para obtener un desglose de la ingesta por solución y tabla. Esta información puede ayudarle a identificar rápidamente qué tablas contribuyen a la mayor parte del volumen de datos. En la pestaña también se muestran las tendencias de la recopilación de datos a lo largo del tiempo. Puede determinar si la recopilación de datos aumentó constantemente a lo largo del tiempo o, por el contrario, aumentó repentinamente en respuesta a un cambio concreto de configuración.

Seleccione Consultas adicionales para obtener consultas pregeneradas que le ayudarán a comprender los patrones de datos aún mejor.

Uso y costos estimados

El gráfico de ingesta de datos por solución de la página Uso y costos estimados de cada área de trabajo muestra el volumen total de datos enviados y la cantidad enviada por cada solución durante los últimos 31 días. Esta información le ayudará a determinar tendencias como, por ejemplo, si algún aumento procede del uso general de datos o del uso de una solución concreta.

Consulta de volúmenes de datos desde la tabla de uso

Analice la cantidad de datos facturables que recopiló una solución o servicio concreto. Este tipo de consultas utiliza la tabla Uso. Esta recopila los datos de uso de cada tabla del área de trabajo.

Nota:

La cláusula con TimeGenerated solo se utiliza para garantizar que la experiencia de consulta en Azure Portal examina más allá del período predeterminado de 24 horas. Al utilizar el tipo de datos Uso, StartTime y EndTime representan los períodos de tiempo de los que se presentan resultados.

La siguiente consulta recopila el volumen de datos facturable por tipo durante el último mes

Usage 
| where TimeGenerated > ago(32d)
| where StartTime >= startofday(ago(31d)) and EndTime < startofday(now())
| where IsBillable == true
| summarize BillableDataGB = sum(Quantity) / 1000. by bin(StartTime, 1d), DataType 
| render columnchart

La siguiente consulta recopila el volumen de datos facturable por solución y tipo durante el último mes

Usage 
| where TimeGenerated > ago(32d)
| where StartTime >= startofday(ago(31d)) and EndTime < startofday(now())
| where IsBillable == true
| summarize BillableDataGB = sum(Quantity) / 1000 by Solution, DataType
| sort by Solution asc, DataType asc

Consulta de volúmenes de datos directamente desde los eventos

Si necesita un análisis más profundo en los datos recopilados, puede usar las consultas de registro de Log Analytics. Cada una de las tablas de un área de trabajo de Log Analytics contiene las siguientes columnas estándar. Estas pueden ayudarle a analizar los datos facturables:

  • _IsBillable identifica a los registros que tienen un cargo por ingesta. Use esta columna para filtrar los datos no facturables.
  • _BilledSize proporciona el tamaño del registro en bytes.

Volumen de datos para eventos específicos

Si cree que un tipo determinado de datos está recopilando una cantidad excesiva de datos, puede que desee analizar los datos de esa tabla para determinar qué registros están aumentando concretamente. En el siguiente ejemplo, se filtran los id. de eventos concretos de la tabla Event y, después, se proporciona un recuento para cada id. Puede modificar estas consultas mediante el uso de las columnas de otras tablas.

Event
| where TimeGenerated > startofday(ago(31d)) and TimeGenerated < startofday(now()) 
| where EventID == 5145 or EventID == 5156
| where _IsBillable == true
| summarize count(), Bytes=sum(_BilledSize) by EventID, bin(TimeGenerated, 1d)

Volumen de datos por recurso de Azure, grupo de recursos o suscripción

Puede analizar la cantidad de datos facturables recopilados de un determinado recurso o conjunto de recursos. Estas consultas usan las columnas _ResourceId y _SubscriptionId para recuperar los datos de los recursos hospedados en Azure.

Advertencia

Use las consultas find con moderación, ya que la ejecución de exámenes que abarcan distintos tipos de datos consume muchos recursos. Si no necesita resultados recuperados por suscripción, grupo de recursos o nombre de recurso, use la tabla Uso tal y como se hace en las consultas anteriores.

Volumen de datos facturable por identificador de recurso para el último día completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _ResourceId, _BilledSize, _IsBillable
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _ResourceId 
| sort by BillableDataBytes nulls last

Volumen de datos facturable por grupo de recursos para el último día completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _ResourceId, _BilledSize, _IsBillable
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _ResourceId
| extend resourceGroup = tostring(split(_ResourceId, "/")[4] )
| summarize BillableDataBytes = sum(BillableDataBytes) by resourceGroup 
| sort by BillableDataBytes nulls last

Puede resultar útil analizar la columna _ResourceId:

| parse tolower(_ResourceId) with "/subscriptions/" subscriptionId "/resourcegroups/" 
    resourceGroup "/providers/" provider "/" resourceType "/" resourceName   

Volumen de datos facturable por suscripción durante el último día completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _BilledSize, _IsBillable, _SubscriptionId
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _SubscriptionId 
| sort by BillableDataBytes nulls last

Sugerencia

En el caso de las áreas de trabajo con grandes volúmenes de datos, al realizar consultas como se muestra en esta sección --, que consultan grandes volúmenes de datos sin procesar, es posible que deba restringirse a un solo día. Para realizar un seguimiento de las tendencias a lo largo del tiempo, considere la posibilidad de configurar un informe de Power BI y usar la actualización incremental para recopilar volúmenes de datos por recurso una vez al día.

Volumen de datos por equipo

Puede analizar la cantidad de datos facturables que se recopilan de una máquina virtual o de un conjunto de ellas. La tabla Uso no tiene la granularidad para mostrar volúmenes de datos de máquinas virtuales específicas, por lo que estas consultas usan el operador find para buscar en todas las tablas que incluyen un nombre de equipo. El tipo Uso se omite, ya que es solo para el análisis de tendencias de datos.

Advertencia

Use las consultas find con moderación, ya que la ejecución de exámenes que abarcan distintos tipos de datos consume muchos recursos. Si no necesita resultados recuperados por suscripción, grupo de recursos o nombre de recurso, use la tabla Uso tal y como se hace en las consultas anteriores.

Volumen de datos facturable por equipo durante el último día completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _BilledSize, _IsBillable, Computer, Type
| where _IsBillable == true and Type != "Usage"
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| summarize BillableDataBytes = sum(_BilledSize) by  computerName 
| sort by BillableDataBytes desc nulls last

Recuento de eventos facturables por equipo para el último día completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _IsBillable, Computer, Type
| where _IsBillable == true and Type != "Usage"
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| summarize eventCount = count() by computerName  
| sort by eventCount desc nulls last

Consulta de volúmenes de datos, excepto los tipos de datos gratuitos conocidos

La consulta siguiente devolverá el volumen de datos mensual en GB, excepto todos los tipos de datos que se supone que están libres de cargos de ingesta de datos:

let freeTables = dynamic([
"AppAvailabilityResults","AppSystemEvents","ApplicationInsights","AzureActivity","AzureNetworkAnalyticsIPDetails_CL",
"AzureNetworkAnalytics_CL","AzureTrafficAnalyticsInsights_CL","ComputerGroup","DefenderIoTRawEvent","Heartbeat",
"MAApplication","MAApplicationHealth","MAApplicationHealthIssues","MAApplicationInstance","MAApplicationInstanceReadiness",
"MAApplicationReadiness","MADeploymentPlan","MADevice","MADeviceNotEnrolled","MADeviceReadiness","MADriverInstanceReadiness",
"MADriverReadiness","MAProposedPilotDevices","MAWindowsBuildInfo","MAWindowsCurrencyAssessment",
"MAWindowsCurrencyAssessmentDailyCounts","MAWindowsDeploymentStatus","NTAIPDetails_CL","NTANetAnalytics_CL",
"OfficeActivity","Operation","SecurityAlert","SecurityIncident","UCClient","UCClientReadinessStatus",
"UCClientUpdateStatus","UCDOAggregatedStatus","UCDOStatus","UCDeviceAlert","UCServiceUpdateStatus","UCUpdateAlert",
"Usage","WUDOAggregatedStatus","WUDOStatus","WaaSDeploymentStatus","WaaSInsiderStatus","WaaSUpdateStatus"]);
Usage 
| where DataType !in (freeTables) 
| where TimeGenerated > ago(30d) 
| summarize MonthlyGB=sum(Quantity)/1000

Para buscar datos que podrían no tener IsBillable establecido correctamente (y que podrían dar lugar a una facturación incorrecta, o más concretamente a infrafacturación), use esta consulta en el área de trabajo:

let freeTables = dynamic([
"AppAvailabilityResults","AppSystemEvents","ApplicationInsights","AzureActivity","AzureNetworkAnalyticsIPDetails_CL",
"AzureNetworkAnalytics_CL","AzureTrafficAnalyticsInsights_CL","ComputerGroup","DefenderIoTRawEvent","Heartbeat",
"MAApplication","MAApplicationHealth","MAApplicationHealthIssues","MAApplicationInstance","MAApplicationInstanceReadiness",
"MAApplicationReadiness","MADeploymentPlan","MADevice","MADeviceNotEnrolled","MADeviceReadiness","MADriverInstanceReadiness",
"MADriverReadiness","MAProposedPilotDevices","MAWindowsBuildInfo","MAWindowsCurrencyAssessment",
"MAWindowsCurrencyAssessmentDailyCounts","MAWindowsDeploymentStatus","NTAIPDetails_CL","NTANetAnalytics_CL",
"OfficeActivity","Operation","SecurityAlert","SecurityIncident","UCClient","UCClientReadinessStatus",
"UCClientUpdateStatus","UCDOAggregatedStatus","UCDOStatus","UCDeviceAlert","UCServiceUpdateStatus","UCUpdateAlert",
"Usage","WUDOAggregatedStatus","WUDOStatus","WaaSDeploymentStatus","WaaSInsiderStatus","WaaSUpdateStatus"]);
Usage 
| where DataType !in (freeTables) 
| where TimeGenerated > ago(30d) 
| where IsBillable == false 
| summarize MonthlyPotentialUnderbilledGB=sum(Quantity)/1000 by DataType

Consulta de los tipos de datos comunes

Si observa que un tipo de datos determinado tiene una cantidad excesiva de datos facturables, puede que deba realizar una consulta para analizar los datos de esa tabla. Las consultas siguientes proporcionan ejemplos para algunos tipos de datos comunes:

Solución Security

SecurityEvent 
| summarize AggregatedValue = count() by EventID
| order by AggregatedValue desc nulls last

Solución Log Management

Usage 
| where Solution == "LogManagement" and iff(isnotnull(toint(IsBillable)), IsBillable == true, IsBillable == "true") == true 
| summarize AggregatedValue = count() by DataType
| order by AggregatedValue desc nulls last

Tipo de datos Perf

Perf 
| summarize AggregatedValue = count() by CounterPath
Perf 
| summarize AggregatedValue = count() by CounterName

Tipo de datos Event

Event 
| summarize AggregatedValue = count() by EventID
Event 
| summarize AggregatedValue = count() by EventLog, EventLevelName

Tipo de datos Syslog

Syslog 
| summarize AggregatedValue = count() by Facility, SeverityLevel
Syslog 
| summarize AggregatedValue = count() by ProcessName

Tipo de datos de AzureDiagnostics

AzureDiagnostics 
| summarize AggregatedValue = count() by ResourceProvider, ResourceId

Datos de Application Insights

Hay dos enfoques a la hora de investigar la cantidad de datos que recopila Application Insights. Su disponibilidad depende de si tiene una aplicación clásica o basada en áreas de trabajo. Tanto para los recursos clásicos como para los basados en áreas de trabajo, use la propiedad _BilledSize disponible en cada evento ingerido. Para los recursos clásicos, también puede usar información agregada en la tabla systemEvents.

Nota

Las consultas en tablas de Application Insights, excepto SystemEvents, funcionarán para un recurso de Application Insights clásico y basado en áreas de trabajo. La compatibilidad con versiones anteriores le permite seguir usando nombres de tabla heredados. Si usa un recurso basado en el área de trabajo, abra la página Registros en el menú del área de trabajo de Log Analytics. Si usa un recurso clásico, abra la página Registros desde el menú de Application Insights.

Operaciones de dependencia que generan el mayor volumen de datos en los últimos 30 días (basadas en el espacio de trabajo o clásicas)

dependencies
| where timestamp >= startofday(ago(30d))
| summarize sum(_BilledSize) by operation_Name
| render barchart  

Volumen de datos diario por tipo para este recurso de Application Insights los últimos 7 días (solo clásico)

systemEvents
| where timestamp >= startofday(ago(7d)) and timestamp < startofday(now())
| where type == "Billing"
| extend BillingTelemetryType = tostring(dimensions["BillingTelemetryType"])
| extend BillingTelemetrySizeInBytes = todouble(measurements["BillingTelemetrySize"])
| summarize sum(BillingTelemetrySizeInBytes) by BillingTelemetryType, bin(timestamp, 1d)  

Para examinar las tendencias de los volúmenes de datos en los recursos de Application Insights basados en áreas de trabajo, use una consulta que incluya todas las tablas de Application Insights. Las siguientes consultas usan los nombres de tablas específicos de los recursos basados en áreas de trabajo.

Volumen de datos diario por tipo para todos los recursos de Application Insights de un área de trabajo durante los 7 días

union AppAvailabilityResults,
      AppBrowserTimings,
      AppDependencies,
      AppExceptions,
      AppEvents,
      AppMetrics,
      AppPageViews,
      AppPerformanceCounters,
      AppRequests,
      AppSystemEvents,
      AppTraces
| where TimeGenerated >= startofday(ago(7d)) and TimeGenerated < startofday(now())
| summarize sum(_BilledSize) by _ResourceId, bin(TimeGenerated, 1d)

Para ver las tendencias del volumen de datos de un solo recurso de Application Insights, agregue la siguiente línea antes del summarize en la consulta anterior:

| where _ResourceId contains "<myAppInsightsResourceName>"

Sugerencia

En el caso de las áreas de trabajo con grandes volúmenes de datos, al realizar consultas como esta, es posible que sea necesario restringir grandes volúmenes de datos sin procesar a un solo día. Para realizar un seguimiento de las tendencias a lo largo del tiempo, considere la posibilidad de configurar un informe de Power BI y usar la actualización incremental para recopilar volúmenes de datos por recurso una vez al día.

Descripción de nodos que envían datos

Si los datos excesivos no proceden de un origen concreto, es posible que haya un número excesivo de agentes que envían datos.

Recuento de los nodos de agente que enviaron un latido diario durante el último mes

Heartbeat 
| where TimeGenerated > startofday(ago(31d))
| summarize nodes = dcount(Computer) by bin(TimeGenerated, 1d)    
| render timechart

Advertencia

Use las consultas find con moderación, ya que la ejecución de exámenes que abarcan distintos tipos de datos consume muchos recursos. Si no necesita resultados recuperados por suscripción, grupo de recursos o nombre de recurso, use la tabla Uso tal y como se hace en las consultas anteriores.

Recuento de los nodos que enviaron cualquier dato durante las últimas 24 horas

find where TimeGenerated > ago(24h) project Computer
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| summarize nodes = dcount(computerName)

La siguiente consulta recopila el volumen de datos que envió cada nodo durante las últimas 24 horas

find where TimeGenerated > ago(24h) project _BilledSize, Computer
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| summarize TotalVolumeBytes=sum(_BilledSize) by computerName

Nodos facturados según el plan de tarifa heredado por nodo

El plan de tarifa heredado por nodo factura los nodos con granularidad por hora y tampoco cuenta los nodos que solo envían un conjunto de tipos de datos de seguridad. Para obtener una lista de los equipos que se facturarán como nodos si el área de trabajo se encuentra en el plan de tarifa heredado Por nodo, busque los nodos que envían tipos de datos facturados, ya que algunos tipos de datos son gratuitos. En este caso, use el campo ubicado más a la izquierda del nombre de dominio completo.

Las siguientes consultas devuelven el recuento de equipos cuyos datos se facturan por horas. El número de unidades de la factura está en unidades de meses de nodo, que se representa mediante billableNodeMonthsPerDay en la consulta. Si el área de trabajo tiene instalada la solución Update Management, agregue los tipos de datos Actualizar y UpdateSummary a la lista de la cláusula where.

find where TimeGenerated >= startofday(ago(7d)) and TimeGenerated < startofday(now()) project Computer, _IsBillable, Type, TimeGenerated
| where Type !in ("SecurityAlert", "SecurityBaseline", "SecurityBaselineSummary", "SecurityDetection", "SecurityEvent", "WindowsFirewall", "MaliciousIPCommunication", "LinuxAuditLog", "SysmonEvent", "ProtectionStatus", "WindowsEvent")
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| where _IsBillable == true
| summarize billableNodesPerHour=dcount(computerName) by bin(TimeGenerated, 1h)
| summarize billableNodesPerDay = sum(billableNodesPerHour)/24., billableNodeMonthsPerDay = sum(billableNodesPerHour)/24./31.  by day=bin(TimeGenerated, 1d)
| sort by day asc

Nota:

Si se usa un destino de solución no representado en la consulta anterior, se añadirá una cierta complejidad adicional al algoritmo de facturación real.

Recuentos de nodos de seguridad y automatización

El siguiente código de ejemplo le permite obtener un recuento de los distintos nodos de seguridad

union
(
    Heartbeat
    | where (Solutions has 'security' or Solutions has 'antimalware' or Solutions has 'securitycenter')
    | project Computer
),
(
    ProtectionStatus
    | where Computer !in (Heartbeat | project Computer)
    | project Computer
)
| distinct Computer
| project lowComputer = tolower(Computer)
| distinct lowComputer
| count

El siguiente código de ejemplo le permite obtener el número de nodos de Automatización distintos

 ConfigurationData 
 | where (ConfigDataType == "WindowsServices" or ConfigDataType == "Software" or ConfigDataType =="Daemons") 
 | extend lowComputer = tolower(Computer) | summarize by lowComputer 
 | join (
     Heartbeat 
       | where SCAgentChannel == "Direct"
       | extend lowComputer = tolower(Computer) | summarize by lowComputer, ComputerEnvironment
 ) on lowComputer
 | summarize count() by ComputerEnvironment | sort by ComputerEnvironment asc

Datos de llegada tardía

Si observa informes de una ingesta de datos elevada mediante los registros Usage, pero no observa los mismos resultados sumando _BilledSize directamente al tipo de datos, es posible que algunos datos estén llegando tarde. Esta situación ocurre cuando los datos se ingieren con marcas de tiempo antiguas.

Por ejemplo, un agente podría experimentar un problema de conectividad y enviar los datos acumulados una vez que se vuelva a conectar. O bien, un host podría tener una hora incorrecta. Esto puede resultar en una discrepancia aparente entre los datos ingeridos que notifique el tipo de datos Uso y una consulta que sume la propiedad _BilledSize a los datos sin procesar, de un día determinado que especifica TimeGenerated; la marca de tiempo en la que se generó el evento.

Para diagnosticar las incidencias de datos que llegan tarde, use la columna _TimeReceived, además de la columna TimeGenerated. La propiedad _TimeReceived es la hora en que el punto de ingesta de Azure Monitor recibió el registro en la nube de Azure.

El siguiente ejemplo es en respuesta a un escenario con grandes volúmenes de datos W3CIISLog, ingeridos el 2 de mayo de 2021, y tiene la finalidad de identificar las marcas de tiempo de estos datos ingeridos. La instrucción where TimeGenerated > datetime(1970-01-01) solo se incluye para proporcionar una pista a la interfaz de usuario de Log Analytics, para que busque a través de todos los datos.

W3CIISLog
| where TimeGenerated > datetime(1970-01-01)
| where _TimeReceived >= datetime(2021-05-02) and _TimeReceived < datetime(2021-05-03) 
| where _IsBillable == true
| summarize BillableDataMB = sum(_BilledSize)/1.E6 by bin(TimeGenerated, 1d)
| sort by TimeGenerated asc 

Pasos siguientes