Análisis de datos de texto en registros de Azure Monitor

Algunos datos de registro recopilados por Azure Monitor incluyen varios fragmentos de información en una sola propiedad. El análisis de estos datos en varias propiedades facilita su uso en las consultas. Un ejemplo común es un registro personalizado que recopila una entrada de registro completo con varios valores en una sola propiedad. Al crear propiedades independientes para los distintos valores, puede buscar y agregar en cada uno.

En este artículo se describen distintas opciones para analizar los datos de Azure Monitor cuando estos se ingieren y cuando se recuperan en una consulta, y se comparan las ventajas relativas para cada uno.

Permisos necesarios

  • Para analizar los datos en el momento de la recopilación, necesita los permisos Microsoft.Insights/dataCollectionRuleAssociations/*, según lo proporcionado por el rol integrado de colaborador de Log Analytics, por ejemplo.
  • Para analizar los datos en el momento de la consulta, necesita los permisos Microsoft.OperationalInsights/workspaces/query/*/read, según lo proporcionado por el rol integrado de lector de Log Analytics, por ejemplo.

Análisis de métodos

Puede analizar los datos, ya sea en el momento de la ingesta cuando se recopilan o bien al hacer la consulta cuando los datos se analizan con una consulta. Cada estrategia tiene ventajas únicas.

Análisis de los datos en el momento de la recopilación

Use transformaciones para analizar los datos en el momento de la recopilación y defina las columnas a las que se enviarán los datos analizados.

Ventajas:

  • Facilita la consulta de los datos recopilados, porque no es necesario incluir en ella comandos de análisis.
  • Mejor rendimiento de las consultas, porque no es necesario que la consulta haga el análisis.

Desventajas:

  • Deben definirse de antemano. No puede incluir datos que ya se hayan recopilado.
  • Si cambia la lógica de análisis, solo se aplicará a los nuevos datos.
  • Aumenta el tiempo de latencia para la recopilación de datos.
  • Los errores pueden resultar difíciles de controlar.

Análisis de los datos en el momento de la consulta

Cuando se analizan los datos al realizar las consultas, se incluye la lógica en la consulta para analizar los datos de varios campos. No se modifica la propia tabla.

Ventajas:

  • Se aplica a los datos, incluidos los que ya se han recopilado.
  • Los cambios en la lógica se pueden aplicar inmediatamente a todos los datos.
  • Opciones flexibles de análisis, incluida la lógica predefinida para estructuras de datos determinadas.

Desventajas:

  • Requiere las consultas más complejas. Este inconveniente se puede mitigar mediante las funciones para simular una tabla.
  • La lógica de análisis se debe replicar en varias consultas. Se puede compartir cierta lógica mediante funciones.
  • Puede crear una sobrecarga al ejecutar una lógica compleja en conjuntos de registros muy grandes (miles de millones de registros).

Los datos se analizan a medida que se recopilan.

Para más información sobre el análisis de datos a medida que se recopilan, consulte Estructura de transformación en Azure Monitor. De esta manera, se crean propiedades personalizadas en la tabla que las consultas pueden usar como cualquier otra propiedad.

Análisis de datos en una consulta mediante patrones

Cuando los datos que quiere analizar pueden identificarse mediante un patrón que se repite en los registros, puede usar distintos operadores en el lenguaje de consulta de Kusto para extraer un dato específico de una o varias propiedades nuevas.

Patrones de texto simple

Use el operador parse en la consulta para crear una o varias propiedades personalizadas que se puedan extraer de una expresión de cadena. Especifique el patrón de identificación y los nombres de las propiedades que se van a crear. Esta forma de proceder es especialmente útil para los datos con cadenas clave-valor con un formato similar a key=value.

Considere un registro personalizado con datos en el formato siguiente:

Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database

La consulta siguiente analizaría estos datos en propiedades individuales. Se agrega la línea con project para devolver solo las propiedades calculadas y no RawData, que es la única propiedad que contiene toda la entrada del registro personalizado.

MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message

En este ejemplo se divide el nombre de usuario de un nombre principal de usuario en la tabla AzureActivity.

AzureActivity
| parse  Caller with UPNUserPart "@" * 
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller

Expresiones regulares

Si los datos se pueden identificar con una expresión regular, puede usar funciones que usan expresiones regulares para extraer los valores individuales. En el ejemplo siguiente, se usa extract para separar el campo UPN de los registros AzureActivity y, a continuación, devolver usuarios distintos.

AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller) 
| distinct UPNUserPart, Caller

Para habilitar un análisis eficiente a gran escala, Azure Monitor utiliza la versión re2 de Expresiones regulares, que es similar, pero no idéntica a algunas de las otras variantes de las expresiones regulares. Para más información, consulte la sintaxis de expresión de re2.

Análisis de datos delimitados en una consulta

Los datos delimitados separan los campos con un carácter común, como una coma, en un archivo CSV. Use la función split para analizar los datos delimitados mediante el delimitador que especifique. Puede usar este método con el operador extend para devolver todos los campos de los datos o para especificar los campos individuales que se incluirán en la salida.

Nota

Dado que split devuelve un objeto dinámico, es posible que los resultados tengan que convertirse explícitamente a un tipo de datos, como es el tipo cadena para usarse en los operadores y en los filtros.

Considere un registro personalizado con datos en el formato CSV siguiente:

2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database

La consulta siguiente analizaría estos datos y los resumiría en dos según las propiedades calculadas. La primera línea divide la propiedad RawData en una matriz de cadena. Cada una de las siguientes líneas da nombre a propiedades individuales y las agrega a la salida mediante funciones para convertirlas al tipo de datos adecuado.

MyCustomCSVLog_CL
| extend CSVFields  = split(RawData, ',')
| extend EventTime  = todatetime(CSVFields[0])
| extend Code       = toint(CSVFields[1]) 
| extend Status     = tostring(CSVFields[2]) 
| extend Message    = tostring(CSVFields[3]) 
| where getyear(EventTime) == 2018
| summarize count() by Status,Code

Análisis de estructuras predefinidas en una consulta

Si se da formato a los datos en una estructura conocida, quizás se pueda usar una de las funciones en el lenguaje de consulta de Kusto para analizar las estructuras predefinidas:

En la consulta de ejemplo siguiente, se analiza el campo Properties (Propiedades) de la tabla AzureActivity (Actividad de Azure), que se estructura en JSON. Guarda los resultados en una propiedad dinámica denominada parsedProp, que incluye el valor con el nombre individual en JSON. Estos valores se usan para filtrar y resumir los resultados de la consulta.

AzureActivity
| extend parsedProp = parse_json(Properties) 
| where parsedProp.isComplianceCheck == "True" 
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)

Estas funciones de análisis pueden hacer un uso intensivo del procesador. Úselas solo cuando la consulta use varias propiedades de los datos con formato. En caso contrario, el simple procesamiento de la coincidencia de patrones es más rápido.

En el ejemplo siguiente se muestra el desglose del tipo TGT Preauth del controlador de dominio. El tipo existe solo en el campo EventData, que es una cadena XML. No se necesitan otros datos de este campo. En este caso, se usa parse para seleccionar el elemento de datos requerido.

SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' * 
| summarize count() by PreAuthType

Uso de una función para simular una tabla

Es posible que tenga varias consultas que hacen el mismo análisis de una tabla determinada. En este caso, cree una función que devuelva los datos analizados, en lugar de replicar la lógica de análisis en cada consulta. A continuación, puede utilizar el alias de función en lugar de la tabla original en otras consultas.

Considere el ejemplo anterior de registro personalizado delimitado por comas. Para usar los datos analizados en varias consultas, cree una función con la consulta siguiente y guárdela con el alias MyCustomCSVLog.

MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime  = tostring(CSVFields[0])
| extend Code      = toint(CSVFields[1]) 
| extend Status    = tostring(CSVFields[2]) 
| extend Message   = tostring(CSVFields[3]) 

Ahora puede usar el alias MyCustomCSVLog en lugar del nombre de tabla real en consultas como en el ejemplo siguiente:

MyCustomCSVLog
| summarize count() by Status,Code

Pasos siguientes

Obtenga información acerca de las consultas de registros para analizar los datos recopilados de soluciones y orígenes de datos.