Desenhando uma máquina de estados dos logs

4

Eu tenho registros no seguinte formato:

03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35707.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-PRERUN to RUNNING-RUNNING (4-42)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-EXITING to EXITING-RETURNSTD (5-70)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:08;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)

Agora, eu gostaria de reconstruir graficamente a máquina de estado, mas estou meio que hesitando em como abordar esse problema. Cortar as transições não deve ser um problema, mas não sei como reconstruir uma representação gráfica delas.

    
por Let_Me_Be 22.03.2011 / 15:01

2 respostas

15

Eu não tenho certeza se você entende o que você quer dizer, mas você está procurando por algo assim?

Euusei Graphviz , que pega arquivos de entrada de texto descrevendo transições e descobre o gráfico automaticamente. Aqui está o comando exato:

$ sed 's/-/_/g' input | gawk '
    BEGIN {print "digraph g {"}
    END {print "}"}
    match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups) {
        print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"
    }' > output.dot
$ dot -Tpng output.dot > output.png

Explicação

  • sed 's/-/_/g' input - Dot não gosta de hifens no nome do nó, então eu os converti em sublinhados
  • gawk - O awk padrão não possui a função match que o gawk possui; você pode fazer a manipulação de string da maneira que quiser (por exemplo, perl é outra boa escolha)
    • BEGIN {print "digraph g {"} - As especificações de pontos começam com esta linha (o nome do gráfico, "g", não importa realmente)
    • END {print "}"} - Termina o digraph g iniciado no bloco BEGIN
    • match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups) - Uma expressão regular que corresponde ao seu formato de arquivo de log; armazena os resultados na variável groups
    • print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];" - Produz uma linha compatível com pontos (por exemplo, A -> B [label = "C"]; mostrará dois nós, A e B, com uma transição entre eles denominada C)
  • dot -Tpng output.dot > output.png - Diga ao graphviz para converter o arquivo de ponto para um PNG

Arquivo de pontos resultante

digraph g {
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_PRERUN -> RUNNING_RUNNING [label = "4_42"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
EXITING_EXITING -> EXITING_RETURNSTD [label = "5_70"];
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
}

O PNG que você obtém ao executar esse arquivo por meio de dot está acima

    
por 22.03.2011 / 15:31
1

Estou trabalhando em uma ferramenta para fazer exatamente o que você quer - gerar máquinas de estados finitos a partir de logs. A ferramenta é chamada Synoptic, e você pode descobrir mais sobre isso aqui: link

    
por 07.06.2011 / 18:37