Utilice las funciones de transformación de datos de Simple Log Service (SLS) para limpiar grandes volúmenes de registros recopilados y estandarizar el formato de los datos. Este tema describe los casos de uso comunes y las operaciones relacionadas con la limpieza de datos mediante la llamada a funciones.
Caso de uso 1: filtrar registros (funciones e_keep y e_drop)
Use la función e_drop o e_keep para filtrar registros. También puede emplear la función e_if o e_if_else junto con el parámetro DROP para lograr el mismo resultado.
Las reglas más habituales son las siguientes:
e_keep(e_search(...)): conserva el registro si se cumple la condición; lo descarta en caso contrario.e_drop(e_search(...)): descarta el registro si se cumple la condición; lo conserva cuando no se cumple.e_if_else(e_search("..."), KEEP, DROP): mantiene el registro al cumplirse la condición y lo elimina si no se cumple.e_if(e_search("not ..."), DROP): elimina el registro cuando la condición es verdadera; lo retiene si es falsa.e_if(e_search("..."), KEEP): esta regla de transformación carece de utilidad práctica.
Ejemplo:
-
Registros originales
#Log 1 __source__: 192.168.0.1 __tag__:__client_ip__: 192.168.0.2 __tag__:__receive_time__: 1597214851 __topic__: app class: test_case id: 7992 test_string: <function test1 at 0x1027401e0> #Log 2 __source__: 192.168.0.1 class: produce_case id: 7990 test_string: <function test1 at 0x1020401e0> -
Regla de transformación
Descarte los registros que no contengan el campo __topic__ ni el campo __tag__:__receive_time__.
e_if(e_not_has("__topic__"),e_drop()) e_if(e_not_has("__tag__:__receive_time__"),e_drop()) -
Resultado de la transformación
__source__: 192.168.0.1 __tag__:__client_ip__: 192.168.0.2 __tag__:__receive_time__: 1597214851 __topic__: app class: test_case id: 7992 test_string: <function test1 at 0x1027401e0>
Caso de uso 2: asignar valores a campos vacíos del registro (función e_set)
Utilice la función e_set para asignar valores a los campos vacíos de un registro.
-
Asigne un valor a un campo cuando este no exista o esté vacío en el registro original.
e_set("result", "......value......", mode="fill")Para obtener más información sobre los valores del parámetro mode, consulte Field extraction check and overwrite modes.
Ejemplo:
-
Registro original
name: -
Regla de transformación
e_set("name", "aspara2.0", mode="fill") -
Resultado de la transformación
name: aspara2.0
-
-
Emplee GROK function para simplificar las expresiones regulares y extraer el contenido de los campos.
Ejemplo:
-
Registro original
content: "ip address: 192.168.1.1" -
Regla de transformación
Extraiga la dirección IP del campo content mediante la función GROK.
e_regex("content", grok(r"(%{IP})"),"addr") -
Resultado de la transformación
addr: 192.168.1.1 content: "ip address: 192.168.1.1"
-
-
Asigne valores a varios campos simultáneamente.
e_set("k1", "v1", "k2", "v2", "k3", "v3", ......)Ejemplo:
-
Registro original
__source__: 192.168.0.1 __topic__: __tag__: __receive_time__: id: 7990 test_string: <function test1 at 0x1020401e0> -
Regla de transformación
Asigne valores a los campos __topic__, __tag__ y __receive_time__.
e_set("__topic__","app", "__tag__","stu","__receive_time__","1597214851") -
Resultado de la transformación
__source__: 192.168.0.1 __topic__: app __tag__: stu __receive_time__: 1597214851 id: 7990 test_string: <function test1 at 0x1020401e0>
-
Caso de uso 3: eliminar y renombrar campos de forma condicional (funciones e_search, e_rename y e_compose)
En la mayoría de los escenarios, utilice la función e_compose para agrupar operaciones condicionales repetitivas.
Ejemplo:
-
Registro original
content: 123 age: 23 name: twiss -
Regla de transformación
Primero, compruebe si el valor del campo content es 123. Si coincide, elimine los campos age y name. Después, cambie el nombre del campo content por ctx.
e_if(e_search("content==123"),e_compose(e_drop_fields("age|name"), e_rename("content", "ctx"))) -
Resultado de la transformación
ctx: 123
Caso de uso 4: convertir los tipos de los parámetros de un registro (funciones v, ct_int y dt_totimestamp)
Durante la transformación de datos, los campos de un registro y sus valores siempre son cadenas de texto. Los datos de otros tipos se convierten automáticamente a cadenas. Por ello, al llamar a una función, preste atención a los tipos de parámetro que admite. Para obtener más información, consulte Syntax overview.
-
Llame a la función op_add para concatenar cadenas y sumar números.
La función op_add admite tanto cadenas como valores numéricos, por lo que no necesita convertir los tipos de los parámetros.
Ejemplo:
-
Registro original
a : 1 b : 2 -
Regla de transformación
e_set("d",op_add(v("a"), v("b"))) e_set("e",op_add(ct_int(v("a")), ct_int(v("b")))) -
Resultado de la transformación
a:1 b:2 d:12 e:3
-
-
Utilice field operation functions y la función ct_int para convertir los tipos de datos. Luego, llame a la función Arithmetic functions para multiplicar números.
Ejemplo:
-
Registro original
a:2 b:5 -
Regla de transformación
Los valores v("a") y v("b") son cadenas de texto, pero el segundo parámetro de la función op_mul solo acepta tipos numéricos. Por lo tanto, debe usar la función ct_int para convertir esas cadenas a enteros antes de pasarlas a op_mul.
e_set("c",op_mul(ct_int(v("a")), ct_int(v("b")))) e_set("d",op_mul(v("a"), ct_int(v("b")))) -
Resultado de la transformación
a: 2 b: 5 c: 10 d: 22222
-
-
Llame a la función dt_parse y a la función dt_parsetimestamp para convertir una cadena o un objeto datetime a un formato de hora estándar.
La función dt_totimestamp requiere un objeto datetime, no una cadena. Por consiguiente, debe invocar primero dt_parse para transformar el valor de cadena de time1 en un objeto datetime. Como alternativa, use directamente dt_parsetimestamp, ya que es compatible con objetos datetime y cadenas. Para más detalles, consulte Date and time functions.
Ejemplo:
-
Registro original
time1: 2020-09-17 9:00:00 -
Regla de transformación
Convierta la fecha y hora representada por time1 a una marca de tiempo UNIX.
e_set("time1", "2019-06-03 2:41:26") e_set("time2", dt_totimestamp(dt_parse(v("time1")))) or e_set("time2", dt_parsetimestamp(v("time1"))) -
Resultado de la transformación
time1: 2019-06-03 2:41:26 time2: 1559529686
-
Caso de uso 5: rellenar campos inexistentes con valores predeterminados (pasar el parámetro default)
Algunas funciones de expresiones DSL de SLS imponen requisitos específicos a los parámetros de entrada. Si estos no se cumplen, la ventana de transformación de datos genera un error o devuelve un valor predeterminado. Cuando un registro contiene un campo obligatorio incompleto, especifique un valor predeterminado en la función op_len.
Pasar un valor predeterminado a una función posterior podría provocar otro error. Gestione de inmediato las excepciones que devuelva la función.
-
Registro original
data_len: 1024 -
Regla de transformación
e_set("data_len", op_len(v("data", default=""))) -
Resultado de la transformación
data: 0 data_len: 0
Caso de uso 6: comprobar registros de forma condicional y agregar campos (funciones e_if y e_switch)
Utilice la función e_if o la función e_switch para evaluar registros. Para obtener más información, consulte Flow control functions.
-
Función e_if
e_if(condition1, operation1, condition2, operation2, condition3, operation3, ....) -
Función e_switch
La función e_switch está formada por pares de condición y operación. Evalúa las condiciones de manera secuencial: si una se cumple, ejecuta la operación correspondiente y devuelve el resultado de inmediato. En caso contrario, pasa a la siguiente condición. Si ninguna se cumple y se configuró el parámetro default, se ejecuta la operación definida en default y se devuelve su resultado.
e_switch(condition1, operation1, condition2, operation2, condition3, operation3, ...., default=None)
Ejemplo:
-
Registro original
status1: 200 status2: 404 -
Función e_if
-
Regla de transformación
e_if(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error")) -
Resultado de la transformación
status1: 200 status2: 404 status1_info: normal status2_info: error
-
-
Función e_switch
-
Regla de transformación
e_switch(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error")) -
Resultado de la transformación
Si alguna condición se cumple, la función devuelve el resultado y deja de evaluar las demás.
status1: 200 status2: 404 status1_info: normal
-
Caso de uso 7: convertir datos a una marca de tiempo UNIX con precisión de nanosegundos
En ciertos escenarios, la transformación de datos en SLS debe admitir marcas de tiempo con precisión de nanosegundos. Si el registro original incluye un campo con formato de marca de tiempo UNIX, utilice las funciones de operación de campos para analizarlo y obtener una hora de registro con precisión de nanosegundos.
-
Registro original
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time_nano":"1705043680630940602" } -
Regla de transformación
e_set( "__time__", op_div_floor(ct_int(v("log_time_nano")), 1000000000), ) e_set( "__time_ns_part__", op_mod(ct_int(v("log_time_nano")), 1000000000), ) -
Resultado de la transformación
{ "__source__": "1.2.3.4", "__time__": 1705043680, "__time_ns_part__": 630940602, "__topic__": "test", "log_time_nano":"1705043680630940602" }
Caso de uso 8: convertir datos a una marca de tiempo ISO 8601 estándar con precisión de microsegundos
Existen casos de uso donde la transformación de datos en SLS requiere marcas de tiempo de alta precisión. Si el registro original contiene un campo con el formato de hora estándar ISO 8601, aplique las funciones de operación de campos para analizarlo y generar una hora de registro con precisión de microsegundos.
-
Registro original
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time":"2024-01-11 23:10:43.992847200" } -
Regla de transformación
e_set( "__time__", dt_parsetimestamp(v("log_time"), tz="Asia/Shanghai"), mode="overwrite", ) e_set("tmp_ms", dt_prop(v("log_time"), "microsecond")) e_set( "__time_ns_part__", op_mul(ct_int(v("tmp_ms")), 1000), ) -
Resultado de la transformación
{ "__source__": "1.2.3.4", "__time__": 1704985843, "__time_ns_part__": 992847000, "__topic__": "test", "log_time": "2024-01-11 23:10:43.992847200", "tmp_ms": "992847" }