Use as funções de transformação de dados do Simple Log Service (SLS) para limpar grandes volumes de logs coletados e padronizar o formato dos dados. Este tópico descreve casos de uso comuns e operações relacionadas à limpeza de dados mediante a chamada de funções.
Caso de uso 1: Filtrar logs (funções e_keep e e_drop)
Use a função e_drop ou e_keep para filtrar logs. Você também pode usar a função e_if ou e_if_else com o parâmetro DROP para filtrar logs.
As regras comuns são:
e_keep(e_search(...)): Mantém o log se a condição for atendida. Descarta o log caso contrário.e_drop(e_search(...)): Descarta o log se a condição for atendida. Mantém o log caso contrário.e_if_else(e_search("..."), KEEP, DROP): Mantém o log se a condição for atendida. Descarta o log caso contrário.e_if(e_search("not ..."), DROP): Descarta o log se a condição for atendida. Mantém o log caso contrário.e_if(e_search("..."), KEEP): Esta é uma regra de transformação sem efeito prático.
Exemplo:
-
Logs brutos
#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> -
Regra de transformação
Descarte os logs que não possuem o campo __topic__ ou o campo __tag__:__receive_time__.
e_if(e_not_has("__topic__"),e_drop()) e_if(e_not_has("__tag__:__receive_time__"),e_drop()) -
Resultado da transformação
__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: Atribuir valores a campos de log vazios (função e_set)
Use a função e_set para atribuir valores a campos de log vazios.
-
Atribua um valor a um campo caso ele não exista ou esteja vazio no original.
e_set("result", "......value......", mode="fill")Para obter mais informações sobre os valores do parâmetro mode, consulte Modos de verificação e sobrescrita de extração de campos.
Exemplo:
-
Log bruto
name: -
Regra de transformação
e_set("name", "aspara2.0", mode="fill") -
Resultado da transformação
name: aspara2.0
-
-
Use a função GROK para simplificar expressões regulares e extrair o conteúdo do campo.
Exemplo:
-
Log bruto
content: "ip address: 192.168.1.1" -
Regra de transformação
Extraia o endereço IP do campo content usando a função GROK.
e_regex("content", grok(r"(%{IP})"),"addr") -
Resultado da transformação
addr: 192.168.1.1 content: "ip address: 192.168.1.1"
-
-
Atribua valores a vários campos simultaneamente.
e_set("k1", "v1", "k2", "v2", "k3", "v3", ......)Exemplo:
-
Log bruto
__source__: 192.168.0.1 __topic__: __tag__: __receive_time__: id: 7990 test_string: <function test1 at 0x1020401e0> -
Regra de transformação
Defina valores para os campos __topic__, __tag__ e __receive_time__.
e_set("__topic__","app", "__tag__","stu","__receive_time__","1597214851") -
Resultado da transformação
__source__: 192.168.0.1 __topic__: app __tag__: stu __receive_time__: 1597214851 id: 7990 test_string: <function test1 at 0x1020401e0>
-
-
Log bruto
content: 123 age: 23 name: twiss -
Regra de transformação
Primeiro, verifique se o valor do campo content é 123. Em caso afirmativo, exclua os campos age e name. Em seguida, renomeie o campo content para ctx.
e_if(e_search("content==123"),e_compose(e_drop_fields("age|name"), e_rename("content", "ctx"))) -
Resultado da transformação
ctx: 123 -
Chame a função op_add para concatenar strings e somar números.
A função op_add aceita tanto tipos string quanto numéricos. Assim, não é necessário converter os tipos dos parâmetros.
Exemplo:
-
Log bruto
a : 1 b : 2 -
Regra de transformação
e_set("d",op_add(v("a"), v("b"))) e_set("e",op_add(ct_int(v("a")), ct_int(v("b")))) -
Resultado da transformação
a:1 b:2 d:12 e:3
-
-
Use as funções de operação de campo e a função ct_int para conversão de tipo e, em seguida, chame a função op_mul para multiplicar números.
Exemplo:
-
Log bruto
a:2 b:5 -
Regra de transformação
Os valores v("a") e v("b") são ambos strings. O segundo parâmetro da função op_mul aceita apenas tipos numéricos. Por isso, use a função ct_int para converter as strings em inteiros antes de passá-las para a função 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 da transformação
a: 2 b: 5 c: 10 d: 22222
-
-
Chame a função dt_parse e a função dt_parsetimestamp para converter uma string ou um objeto datetime em um formato de hora padrão.
A função dt_totimestamp aceita um objeto datetime, não uma string. Portanto, chame a função dt_parse para converter o valor string de time1 em um objeto datetime. Alternativamente, use diretamente a função dt_parsetimestamp, que aceita tanto objetos datetime quanto strings. Para mais informações, consulte Funções de data e hora.
Exemplo:
-
Log bruto
time1: 2020-09-17 9:00:00 -
Regra de transformação
Converta a data e hora representada por time1 em um timestamp 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 da transformação
time1: 2019-06-03 2:41:26 time2: 1559529686
-
-
Log bruto
data_len: 1024 -
Regra de transformação
e_set("data_len", op_len(v("data", default=""))) -
Resultado da transformação
data: 0 data_len: 0 -
Função e_if
e_if(condition1, operation1, condition2, operation2, condition3, operation3, ....) -
Função e_switch
A função e_switch consiste em pares de condição-operação. Ela verifica as condições sequencialmente. Se uma condição for atendida, a operação correspondente será executada e o resultado retornado imediatamente. Caso contrário, a função verifica a próxima condição. Se nenhuma condição for atendida e o parâmetro default estiver configurado, a operação definida para default será executada e seu resultado retornado.
e_switch(condition1, operation1, condition2, operation2, condition3, operation3, ...., default=None) -
Log bruto
status1: 200 status2: 404 -
Função e_if
-
Regra de transformação
e_if(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error")) -
Resultado da transformação
status1: 200 status2: 404 status1_info: normal status2_info: error
-
-
Função e_switch
-
Regra de transformação
e_switch(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error")) -
Resultado da transformação
Se qualquer condição for atendida, o resultado é retornado e nenhuma outra condição é verificada.
status1: 200 status2: 404 status1_info: normal
-
-
Log bruto
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time_nano":"1705043680630940602" } -
Regra de transformação
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 da transformação
{ "__source__": "1.2.3.4", "__time__": 1705043680, "__time_ns_part__": 630940602, "__topic__": "test", "log_time_nano":"1705043680630940602" } -
Log bruto
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time":"2024-01-11 23:10:43.992847200" } -
Regra de transformação
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 da transformação
{ "__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" }
Caso de uso 3: Exclua e renomear campos condicionalmente (funções e_search, e_rename e e_compose)
Na maioria dos cenários, use a função e_compose para executar operações condicionais repetidas.
Exemplo:
Caso de uso 4: Converter tipos de parâmetros de log (funções v, ct_int e dt_totimestamp)
Durante a transformação de dados, os campos de log e seus valores são sempre strings. Dados de tipos não string são convertidos automaticamente para o tipo string. Portanto, ao chamar uma função, preste atenção aos tipos de parâmetros aceitos. Para mais detalhes, consulte Visão geral da sintaxe.
Caso de uso 5: Preencher campos de log inexistentes com valores padrão (passar o parâmetro default)
Algumas funções de expressão SLS DSL têm requisitos específicos para parâmetros de entrada. Se esses requisitos não forem atendidos, a janela de transformação de dados relatará um erro ou retornará um valor padrão. Caso um log contenha um campo obrigatório, mas incompleto, especifique um valor padrão na função op_len.
Passar um valor padrão para uma função subsequente pode causar outro erro. Trate prontamente as exceções retornadas pela função.
Caso de uso 6: Verificar logs condicionalmente e adicionar campos (funções e_if e e_switch)
Use a função e_if ou a função e_switch para verificar logs. Para mais informações, consulte Funções de controle de fluxo.
Exemplo:
Caso de uso 7: Converter dados em um timestamp UNIX com precisão de nanossegundos
Em alguns cenários, a transformação de dados no SLS precisa oferecer suporte a precisão de timestamp no nível de nanossegundos. Se um log bruto contiver um campo no formato de timestamp UNIX, use funções de operação de campo para analisá-lo e obter um horário de log com precisão de nanossegundos.
Caso de uso 8: Converter dados em um timestamp ISO 8601 padrão com precisão de microssegundos
Em determinados cenários, a transformação de dados no SLS exige suporte a timestamps de alta precisão. Se um log bruto contiver um campo no formato de hora padrão ISO 8601, use funções de operação de campo para analisá-lo e obter um horário de log com precisão de microssegundos.