*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

четверг, 26 января 2012 г.

Graph visualization in DOT / Визуализация графов в языке DOT

The English version of the post is below.

Предыстория. Мы обрабатываем финансовые транзакции. Возникла задача профилирования. Решили записать путь прохода транзакции по системе и построить граф связей между модулями - кто кого вызывает. Два способа построения: на основе статического анализа исходников и через трассировку реальных вызовов во время выполнения.

Итак, связи зафиксированы. Теперь их надо их как-то представить и построить граф, визуально.

Вроде не самая тривиальная задача, но оказывается, решается весьма просто.

Есть такой язык представления графов, называется DOT. Прелесть его в предельной простоте. Например, простейший граф:

graph name {
  a -- b
  b -- c
  b -- d
}

Натравливаешь на это дело специальную программу и получаешь:
http://demin.ws/images/blog/dot-graph.png

Все! Картинка на выходе в SVG. Можно хоть на стену вешать.

К сожалению, лучший софт, что я нашел для визуализации DOT - это Graphviz. Вроде и работает неплохо, строя весьма большие графы, и есть на всех платформах, благодаря Java, но по интерфейсу - это запредельный и неописуемый кусок говна. Увы.

Если кому интересно, я выложил пример реальной трассировки (по понятным причинам, имена изменены). В целом дает представление о простоте исходника и о возможностях визуализации - PNG и SVG.

Повторюсь - процесс формализации графа крайне прост - нужно только задать пары связанных вершин. Можно делать направленные графы, можно задавать вершинам и дугам разные атрибуты.

В целом, отличная технология.

Background. We do financial transactions processing. At some point we decided that we need profiling. We could record a path of how a transaction being passed amongst modules. There are two options - either to do static analysis or to trace the runtime.

So, the connections are determined and now we have to formalize and visualize them.

At the first glance this is not an easy task, but it turned out there is a simple and elegant solution.

There is a plain text language to declare graphs -- DOT. Its beauty is in ultimate simplicity. For example, a trivial graph:

graph name {
  a -- b
  b -- c
  b -- d
}

Feed it to special software and get this:
http://demin.ws/images/blog/dot-graph.png

That's it! The output is in SVG, ready to stick on a wall.

Unfortunately, the best software I've found to visualize DOT is Graphviz. It does pretty decent job properly processing quite sophisticated graphs, but in terms of user experience it is shite.

If anyone is interested, I've uploaded a real trace (obviously, names are obfuscated). It gives an idea about simplicity of the source and visualization capabilities - PNG and SVG.

Again, the graph formalization is dead simple - you only need to specify pairs of connected vertices. Also, in DOT you can describe directed graphs and extra attributes of the vertices.

To sum up, great technology.

Комментариев нет:

Отправить комментарий