Hy Rhys,
A good timing. I just released fluent-plugin-grok-parser, which lets you extend Fluentd's parser beyond hand-coded regexp.
In particular, this is all you need to do:
1. Install fluent-plugin-grok-parser
If you are using vanilla fluentd, this is "gem install fluent-plugin-grok-parser". If you are using td-agent, it's /usr/lib/fluent/ruby/bin/fluent-gem fluent-plugin-grok-parser".
2. Configure
Use the following configuration with in_tail:
<source>
type tail
path /path/to/nagios/log
format grok
grok_pattern %{NAGIOSLOGLINE}
time_format %s
tag nagios
# other tail options
</source>
For example, it parses your example Nagios Line like this:
2014-07-01 18:38:59 +0000 foo: {"nagios_message":"PING OK - Packet loss = 16%, RTA = 72.18 ms","nagios_type":"SERVICE ALERT","nagios_hostname":"servername","nagios_service":"PING","nagios_state":"OK","nagios_statelevel":"SOFT","nagios_attempt":"2"}
Do remember though: I wrote this parser plugin last Sunday, and there's a lot of room for improvements.