I spent half a year deep-diving into the world of containers and their orchestration. I have been enjoying it very much and learned a lot. On my journey, I need to tackle lots of interesting and specific concepts. But there is one commonality almost every project in this area possesses. When it comes to containers - the Go programming language is ubiquitous!
When I'm diving into a new codebase, I always start from the project structure analysis. And my favorite tool is
tree. However, not every project is perfectly balanced. Some files and folders tend to be more popular and contain much more code than others. Seems like yet another incarnation of the Pareto principle.
So, when the
tree's capabilities aren't enough, I jump to
cloc. This tool is much more powerful and can show nice textual statistics for the number of code lines and programming languages used per the whole project or per each file individually.
However, some projects are really huge and some lovely visualization would be truly helpful! And here the FlameGraph goes! What if we feed the
cloc's output for the Kubernetes codebase to FlameGraph? Thanks to the author of this article for the original cloc-to-flamegraph one-liner:
git clone https://github.com/brendangregg/FlameGraph go get -d github.com/kubernetes/kubernetes cd $(go env GOPATH)/src/github.com/kubernetes/kubernetes cloc --csv-delimiter="$(printf '\t')" --by-file --quiet --csv . | \ sed '1,2d' | \ cut -f 2,5 | \ sed 's/\//;/g' | \ ~/FlameGraph/flamegraph.pl \ --width=3600 \ --height=32 \ --fontsize=8 \ --countname=lines \ --nametype=package \ > kubernetes.html open kubernetes.html
Well, I don't see any practical applications of the approach I'm going to describe... However, I do think that messing about with things like this is the only way to gain extra knowledge of any system internals. We are going to speak Docker and Linux here. What if we want to take a base Docker image, I mean really base, just an image made with a single line Dockerfile like
FROM debian:latest, and convert it to something launchable on a real or virtual machine? In other words, can we create a disk image having exactly the same Linux userland a running container has and then boot from it? For this we would start with dumping container's root file system, luckily it's as simple as just running
docker export, however, to finally accomplish the task a bunch of additional steps is needed...