Why did we develop percona-agent in Go?

We recently open-sourced our percona-agent and if you check out the source code, you’ll find that it is written in the Go programming language (aka Golang). For those not up to speed, the percona-agent is a real-time client-side agent for Percona Cloud Tools.

Our requirements are quite demanding for our agents. This one is software that works on a real production server, so it must be fast, reliable, lightweight and easy to distribute. Surprisingly enough, binaries compiled by Go fit these characteristics.

There are of course alternatives that we considered. On the scripting side: Perl, Python, PHP, Ruby et al. These are not necessarily fast, and the distribution is also interesting. We have enough experience with Percona Toolkit and Perl’s “modules dependencies hell.”

On a high-end level side, there is C / C++ and I am sure we could produce an efficient agent. However we also have experience in the distribution of Percona Server / Percona XtraDB Cluster / Percona XtraBackup. Well, I have had enough with different versions of Ubuntus, Red Hats, CentOSes and the rest of the flavors of Linux.

And, yeah, there is Java, but let me just say that we are not the Java sort of developers.

So what is so charming about Go? Go feels like a scripting language, but produces executable binaries. I see it as having the ability to attack performance issues on two sides. First is the performance of software developers: They are more productive working with scripting-like languages. Second is the performance of a final product: Native self-executable binaries are more efficient than a script running through a interpreter.

It is worth noting that included batteries (a set of packages that are coming with Go) are excellent, and in many cases that will be just enough to get you going and produce software that is quite complex. And if that is not enough, there is also a list of packages and projects for Go.

Of course, there are some limitations you will find in Go (some of them are temporary I hope). These are:

1. The list of supported platforms is limited… FreeBSD (release 8 and above), Linux (ARM not supported), Mac OS X and Windows. There are no packages for Solaris yet.
2. A good MySQL driver is still a work in progress. the most advanced is Go-MySQL-Driver
3. Go comes with built-in testing capabilities, but our testing enthusiast, Daniel, says it is not enough to build a complicated testing suite.
4. There is no support of “generics” (or “templates” if you are in C++ world). Basically it means that if you developed a data structure that works with integers, you will need to copy-paste-replace to make it working with floats. Yes, there are workarounds like using a “parent-to-everything” type “interface{}”, but often it is not efficient and just looks ugly.

There is also no automatic type-conversion between int and floats, so if you need to do complex math which involves ints and floats, you may end up with a lot back-and-forth conversions, i.e. int(math.Floor(t.epsilon*float64(t.count*2)))

To finish, I would like to invite you to my webinar, “Monitoring All (Yes, All!) MySQL Metrics with Percona Cloud Tools” on Wednesday, June 25 at 10 a.m. Pacific Daylight Time, where I will talk on the new features in Percona Cloud Tools, including our new percona-agent.

Share this post

Comments (4)

  • Robert Hodges

    Hi Vadim, did you have any problems with different Go versions?

    p.s., What did you mean by “we are not the Java sort of developers?” 🙂

    June 4, 2014 at 6:37 pm
  • Nils

    A bit off-topic, assuming one can already code proficiently in other languages, are there any resources you would recommend for getting into go?

    June 5, 2014 at 5:03 am
  • Vadim Tkachenko


    Go 1.0 was somewhat rough, but newer versions 1.1 and 1.2 – we do not have problems with.

    As for Java, well, there is nothing personal. I think at this stage (Java7) it is a very complicated and capable technology,
    and we never invested enough time to get familiar with it.

    Also I tried to install some Java-required apps (i.e. Hadoop), and I can’t say that JDK installation is easy and quick, which is not suitable for our needs.

    June 5, 2014 at 1:15 pm
  • Vadim Tkachenko


    Actually http://golang.org/doc/ is a good start with materials and videos.
    Particularly http://golang.org/doc/effective_go.html is a must read for our engineers.

    The resource
    http://www.golang-book.com/ is also good.

    June 5, 2014 at 1:16 pm

Comments are closed.

Use Percona's Technical Forum to ask any follow-up questions on this blog topic.