internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: DataDog/dd-agent

Issue:
Allow strings to be elements in dogstatsd sets
Right now it only counts numbers.



Discussion:
Not sure where this is being restricted. The only thing I can find where there are any type restrictions is in https://github.com/DataDog/dd-agent/blob/master/checks/db/mongo.py#L188

Any other info you can give me on this?

When I send this string to my local dogstatsd "testmetric.site.unique_visitors:3c63f69|s|@1", I get the error:

```
2012-12-07 16:18:55,103 | dogstatsd | ERROR | Error receiving datagram
Traceback (most recent call last):
File "/usr/bin/dogstatsd", line 153, in start
 aggregator_submit(socket_recv(buffer_size))
File "/usr/share/datadog/agent/aggregator.py", line 277, in submit_packets
raise Exception('Metric value must be a number: %s, %s' % name, metadata[0])
TypeError: not enough arguments for format string
```


Resolving patch:
diff --git a/aggregator.py b/aggregator.py
--- a/aggregator.py
+++ b/aggregator.py
@@ -236,6 +236,9 @@ class MetricsAggregator(object):
     A metric aggregator class.
     """
 
+    # Types of metrics that allow strings
+    ALLOW_STRINGS = ['s', ]
+
     def __init__(self, hostname, interval=1.0, expiry_seconds=300, formatter=None):
         self.metrics = {}
         self.total_count = 0
@@ -283,7 +286,13 @@ def submit_packets(self, packets):
                 try:
                     value = float(metadata[0])
                 except ValueError:
-                    raise Exception('Metric value must be a number: %s, %s' % name, metadata[0])
+
+                    # If the data type is Set, we will allow strings
+                    if metadata[1] in self.ALLOW_STRINGS:
+                        value = metadata[0]
+                    else:
+                        # Otherwise, raise an error saying it must be a number
+                        raise Exception('Metric value must be a number: %s, %s' % (name, metadata[0]))
 
             # Parse the optional values - sample rate & tags.
             sample_rate = 1


Test patch:
diff --git a/tests/test_dogstatsd.py b/tests/test_dogstatsd.py
--- a/tests/test_dogstatsd.py
+++ b/tests/test_dogstatsd.py
@@ -171,6 +171,24 @@ def test_sets(self):
         # Assert there are no more sets
         assert not stats.flush()
 
+    def test_string_sets(self):
+        stats = MetricsAggregator('myhost')
+        stats.submit_packets('my.set:string|s')
+        stats.submit_packets('my.set:sets|s')
+        stats.submit_packets('my.set:sets|s')
+        stats.submit_packets('my.set:test|s')
+        stats.submit_packets('my.set:test|s')
+        stats.submit_packets('my.set:test|s')
+
+        # Assert that it's treated normally.
+        metrics = stats.flush()
+        nt.assert_equal(len(metrics), 1)
+        m = metrics[0]
+        nt.assert_equal(m['metric'], 'my.set')
+        nt.assert_equal(m['points'][0][1], 3)
+
+        # Assert there are no more sets
+        assert not stats.flush()
 
     def test_rate(self):
         stats = MetricsAggregator('myhost')
Repository: DataDog/dd-agent

Issue:
apache check doesn't support basic auth
If I want basic auth, I'd assume that all I have to do is make my config look like:

```
apache_status_url: http://user:pass@127.0.0.1:80/server-status?auto
```

But actually that just doesn't work. We need to do some special incantations to make `urllib2` do basic auth.



Discussion:
Link to original support case: https://datadog.desk.com/agent/case/3200


Resolving patch:
diff --git a/checks.d/apache.py b/checks.d/apache.py
--- a/checks.d/apache.py
+++ b/checks.d/apache.py
@@ -1,4 +1,5 @@
 import urllib2
+import base64
 
 from util import headers
 from checks import AgentCheck
@@ -35,6 +36,10 @@ def check(self, instance):
         tags = instance.get('tags', [])
         req = urllib2.Request(url, None,
             headers(self.agentConfig))
+        if 'apache_user' in instance and 'apache_password' in instance:
+            auth_str = '%s:%s' % (instance['apache_user'], instance['apache_password'])
+            encoded_auth_str = base64.encodestring(auth_str)
+            req.add_header("Authorization", "Basic %s" % encoded_auth_str)
         request = urllib2.urlopen(req)
         response = request.read()
 


Test patch:
Repository: DataDog/dd-agent

Issue:
If already running statsd on the default port, agent fails with no error
https://datadog.desk.com/agent/case/3875



Discussion:
It'd be good to raise a better message here, e.g. "A program is already listening on port XYZ"

Haven't been able to reproduce this one. While already running statsd:

```
➜  dd-agent git:(master) ✗ python dogstatsd.py
Log file is unwritable: '/var/log/datadog/dogstatsd.log'
2013-05-14 13:00:18,488 | INFO | dd.dogstatsd | dogstatsd(dogstatsd.py:218) | Adding sig handler
2013-05-14 13:00:18,488 | INFO | dd.dogstatsd | dogstatsd(dogstatsd.py:78) | Reporting to localhost:9000 every 10s
2013-05-14 13:00:18,489 | INFO | dd.dogstatsd | dogstatsd(dogstatsd.py:73) | Stopping reporter
2013-05-14 13:00:18,490 | INFO | dd.dogstatsd | dogstatsd(dogstatsd.py:229) | Stopped
Traceback (most recent call last):
  File "dogstatsd.py", line 322, in <module>
    sys.exit(main())
  File "dogstatsd.py", line 301, in main
    daemon.run()
  File "dogstatsd.py", line 223, in run
    self.server.start()
  File "dogstatsd.py", line 174, in start
    self.socket.bind(self.address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 48] Address already in use
```

You should probably use the same environment:
centos 6, then install the agent via the repo and look at the logs.


Resolving patch:
diff --git a/dogstatsd.py b/dogstatsd.py
--- a/dogstatsd.py
+++ b/dogstatsd.py
@@ -220,7 +220,11 @@ def run(self):
         signal.signal(signal.SIGINT, self._handle_sigterm)
         self.reporter.start()
         try:
-            self.server.start()
+            try:
+                self.server.start()
+            except Exception, e:
+                log.exception('Error starting server')
+                raise e
         finally:
             # The server will block until it's done. Once we're here, shutdown
             # the reporting thread.


Test patch:
Repository: DataDog/dd-agent

Issue:
Support custom tags in the SQL Server check
Follow the same pattern we use in other checks, allowing an optional `tags` attribute for each instance in the configuration.



Discussion:

Resolving patch:
diff --git a/checks.d/sqlserver.py b/checks.d/sqlserver.py
--- a/checks.d/sqlserver.py
+++ b/checks.d/sqlserver.py
@@ -62,6 +62,7 @@ def check(self, instance):
         username = instance.get('username')
         password = instance.get('password')
         database = instance.get('database', 'master')
+        tags = instance.get('tags', [])
         conn_key = self._conn_key(host, username, password, database)
 
         if conn_key not in self.connections:
@@ -75,9 +76,9 @@ def check(self, instance):
 
         conn = self.connections[conn_key]
         cursor = conn.cursor()
-        self._fetch_metrics(cursor)
+        self._fetch_metrics(cursor, tags)
 
-    def _fetch_metrics(self, cursor):
+    def _fetch_metrics(self, cursor, custom_tags):
         ''' Fetch the metrics from the sys.dm_os_performance_counters table
         '''
         for metric in self.METRICS:
@@ -93,7 +94,7 @@ def _fetch_metrics(self, cursor):
             # to loop over multiple results and tag the metrics
             if instance_n == ALL_INSTANCES:
                 try:
-                    self._fetch_all_instances(metric, cursor)
+                    self._fetch_all_instances(metric, cursor, custom_tags)
                 except Exception, e:
                     self.log.exception('Unable to fetch metric: %s' % mname)
                     self.warning('Unable to fetch metric: %s' % mname)
@@ -113,9 +114,9 @@ def _fetch_metrics(self, cursor):
 
                 # Save the metric
                 metric_func = getattr(self, mtype)
-                metric_func(mname, value)
+                metric_func(mname, value, tags=custom_tags)
 
-    def _fetch_all_instances(self, metric, cursor):
+    def _fetch_all_instances(self, metric, cursor, custom_tags):
         mname, mtype, counter, instance_n, tag_by = metric
         cursor.execute("""
             select instance_name, cntr_value
@@ -127,7 +128,7 @@ def _fetch_all_instances(self, metric, cursor):
 
         for instance_name, cntr_value in rows:
             value = cntr_value
-            tags = ['%s:%s' % (tag_by, instance_name.strip())]
+            tags = ['%s:%s' % (tag_by, instance_name.strip())] + custom_tags
             metric_func = getattr(self, mtype)
             metric_func(mname, value, tags=tags)
 


Test patch:
Repository: DataDog/dd-agent

Issue:
System checks break on OS X Mavericks.
@janm399 wrote up a gist with a fix that worked for him: https://gist.github.com/janm399/7169817



Discussion:
This is why I only use trusty ol' Snow Leopard. :older_man: 

:snowflake: :leopard: 


Resolving patch:
diff --git a/checks/system/unix.py b/checks/system/unix.py
--- a/checks/system/unix.py
+++ b/checks/system/unix.py
@@ -543,6 +543,9 @@ def check(self, agentConfig):
             return memData  
             
         elif sys.platform == 'darwin':
+            macV = platform.mac_ver()
+            macV_minor_version = int(re.match(r'10\.(\d+)\.?.*', macV[0]).group(1))
+
             try:
                 top = sp.Popen(['top', '-l 1'], stdout=sp.PIPE, close_fds=True).communicate()[0]
                 sysctl = sp.Popen(['sysctl', 'vm.swapusage'], stdout=sp.PIPE, close_fds=True).communicate()[0]
@@ -556,8 +559,15 @@ def check(self, agentConfig):
             
             # Deal with sysctl
             swapParts = re.findall(r'([0-9]+\.\d+)', sysctl)
-            
-            return {'physUsed' : physParts[3], 'physFree' : physParts[4], 'swapUsed' : swapParts[1], 'swapFree' : swapParts[2]}
+
+            # Mavericks changes the layout of physical memory format in `top`
+            physUsedPartIndex = 3
+            physFreePartIndex = 4
+            if macV and (macV_minor_version >= 9):
+                physUsedPartIndex = 0
+                physFreePartIndex = 2
+
+            return {'physUsed' : physParts[physUsedPartIndex], 'physFree' : physParts[physFreePartIndex], 'swapUsed' : swapParts[1], 'swapFree' : swapParts[2]}
             
         elif sys.platform.startswith("freebsd"):
             try:


Test patch:
Repository: DataDog/dd-agent

Issue:
ElasticSearch recovery events are categorized wrong.
They're being categorized as info messages, instead of recoveries, so a message that says "[hostname] recovered as green" has a white side bar.



Discussion:

Resolving patch:
diff --git a/checks.d/elastic.py b/checks.d/elastic.py
--- a/checks.d/elastic.py
+++ b/checks.d/elastic.py
@@ -159,7 +159,7 @@ def check_status(self, data, url):
             event = self._create_event(data['status'])
             self.event(event)
 
-        
+
     def load_url(self, config_url, instance, tags=None, url_suffix=STATS_URL):
 
         # Try to fetch data from the stats URL
@@ -322,7 +322,7 @@ def _create_event(self, status):
 
         else:
             # then it should be green
-            alert_type = "info"
+            alert_type = "success"
             msg_title = "%s recovered as %s" % (hostname, status)
 
         msg = "ElasticSearch: %s just reported as %s" % (hostname, status)


Test patch:
Repository: DataDog/dd-agent

Issue:
Support for varnish instances by name
We have several varnish instances on one server. Each has a name and can be referenced with `-n name` via the command line tools.

```
-n  Specifies the name of the varnishd instance to get logs from. If -n is not specified, the host name is used.
```

(from https://www.varnish-cache.org/docs/3.0/reference/varnishstat.html)

It would be nice if the name could be specified in the yaml and the check would use it automatically. I've tried adding `-n name` to the bin location but that fails.

I'll probably try to add this later when I have a chance, unless someone else can do it quickly.

<!---
@huboard:{"order":770.0}
-->



Discussion:

Resolving patch:
diff --git a/checks.d/varnish.py b/checks.d/varnish.py
--- a/checks.d/varnish.py
+++ b/checks.d/varnish.py
@@ -82,6 +82,7 @@ def check(self, instance):
         if instance.get("varnishstat", None) is None:
             raise Exception("varnishstat is not configured")
         tags = instance.get('tags', [])
+        name = instance.get('name')
 
         # Get the varnish version from varnishstat
         output, error = subprocess.Popen([instance.get("varnishstat"), "-V"],
@@ -113,9 +114,19 @@ def check(self, instance):
             use_xml = False
             arg = "-1"
 
-        output, error = subprocess.Popen([instance.get("varnishstat"), arg],
-                                         stdout=subprocess.PIPE,
-                                         stderr=subprocess.PIPE).communicate()
+        cmd = [instance.get("varnishstat"), arg]
+        if name is not None:
+            cmd.extend(['-n', name])
+            tags += [u'varnish_name:%s' % name]
+        else:
+            tags += [u'varnish_name:default']
+        try:
+            proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                                         stderr=subprocess.PIPE)
+            output, error = proc.communicate()
+        except Exception:
+            self.log.error(u"Failed to run %s" % repr(cmd))
+            raise
         if error and len(error) > 0:
             self.log.error(error)
         self._parse_varnishstat(output, use_xml, tags)
@@ -142,11 +153,11 @@ def _parse_varnishstat(self, output, use_xml, tags=None):
                 if rate_val.lower() in ("nan", "."):
                     # col 2 matters
                     self.log.debug("Varnish (gauge) %s %d" % (metric_name, int(gauge_val)))
-                    self.gauge(metric_name, int(gauge_val))
+                    self.gauge(metric_name, int(gauge_val), tags=tags)
                 else:
                     # col 3 has a rate (since restart)
                     self.log.debug("Varnish (rate) %s %d" % (metric_name, int(gauge_val)))
-                    self.rate(metric_name, float(gauge_val))
+                    self.rate(metric_name, float(gauge_val), tags=tags)
 
     @staticmethod
     def parse_agent_config(agentConfig):


Test patch:
Repository: DataDog/dd-agent

Issue:
collector is broken on windows 2008 sp 2
The issue resolves around resolving `localhost` vs `127.0.0.1`.

From the logs:

```
2014-05-06 15:02:02 Pacific Daylight Time | INFO | dogstatsd(dogstatsd.pyc:98) | Reporting to localhost:17123 every 2s
...
2014-05-06 15:02:02 Pacific Daylight Time | WARNING | forwarder(ddagent.pyc:401) | localhost seems undefined in your host file, using 127.0.0.1 instead
...
2014-05-06 15:02:10 Pacific Daylight Time | ERROR | checks.collector(collector.pyc:335) | Error running emitter: http_emitter
Traceback (most recent call last):
  File "checks\collector.pyc", line 333, in _emit
  File "emitter.pyc", line 60, in http_emitter
  File "urllib2.pyc", line 126, in urlopen
  File "urllib2.pyc", line 400, in open
  File "urllib2.pyc", line 418, in _open
  File "urllib2.pyc", line 378, in _call_chain
  File "urllib2.pyc", line 1207, in http_open
  File "urllib2.pyc", line 1177, in do_open
URLError: <urlopen error [Errno 11001] getaddrinfo failed>
```

It looks like the collector is trying to send to `localhost` but should be sending to `127.0.0.1`.

This was confirmed by the customer:

```
import socket
print socket.getaddrinfo(‘localhost’, 17123)   # this fails
print socket.getaddrinfo(‘127.0.0.1’, 17123)  # this passes
```



Discussion:
I don't think it's related to Windows 2008 though.
Will make a quick fix for next release.

awesome thanks


Resolving patch:
diff --git a/config.py b/config.py
--- a/config.py
+++ b/config.py
@@ -13,6 +13,8 @@
 import traceback
 import re
 import imp
+import socket
+from socket import gaierror
 from optparse import OptionParser, Values
 from cStringIO import StringIO
 
@@ -184,6 +186,13 @@ def get_config_path(cfg_path=None, os_name=None):
     sys.stderr.write("Please supply a configuration file at %s or in the directory where the Agent is currently deployed.\n" % bad_path)
     sys.exit(3)
 
+def get_default_bind_host():
+    try:
+        socket.gethostbyname('localhost')
+    except gaierror:
+        log.warning("localhost seems undefined in your hosts file, using 127.0.0.1 instead")
+        return '127.0.0.1'
+    return 'localhost'
 
 def get_config(parse_args=True, cfg_path=None, options=None):
     if parse_args:
@@ -205,7 +214,7 @@ def get_config(parse_args=True, cfg_path=None, options=None):
         'version': get_version(),
         'watchdog': True,
         'additional_checksd': '/etc/dd-agent/checks.d/',
-        'bind_host': 'localhost'
+        'bind_host': get_default_bind_host(),
     }
 
     dogstatsd_interval = DEFAULT_STATSD_FREQUENCY


Test patch:
Repository: DataDog/dd-agent

Issue:
small bug in invisible characters in udp packets
Currently, invisible characters (like `\r` in windows) may be added to the end of udp packets. for instance, a packet like this

`metric_name:##|ms`

produces a key value error for the metric type on windows:
https://github.com/DataDog/dd-agent/blob/master/aggregator.py#L514

``` console
2014-07-08 17:14:23 Eastern Daylight Time | ERROR | dogstatsd(dogstatsd.pyc:300) | Error receiving datagram
Traceback (most recent call last):
  File "dogstatsd.pyc", line 288, in start
  File "aggregator.pyc", line 410, in submit_packets
  File "aggregator.pyc", line 514, in submit_metric
KeyError: 'ms\r'
```

fix would be to strip the invisible characters before parsing the packet:
https://github.com/DataDog/dd-agent/blob/master/aggregator.py#L314-L320



Discussion:

Resolving patch:
diff --git a/aggregator.py b/aggregator.py
--- a/aggregator.py
+++ b/aggregator.py
@@ -395,7 +395,7 @@ def parse_event_packet(self, packet):
             raise Exception(u'Unparseable event packet: %s' % packet)
 
     def submit_packets(self, packets):
-        for packet in packets.split("\n"):
+        for packet in packets.splitlines():
 
             if not packet.strip():
                 continue


Test patch:
diff --git a/tests/test_dogstatsd.py b/tests/test_dogstatsd.py
--- a/tests/test_dogstatsd.py
+++ b/tests/test_dogstatsd.py
@@ -569,5 +569,26 @@ def test_recent_point_threshold(self):
         nt.assert_equal(h1['points'][0][0], h4['points'][0][0])
         nt.assert_equal(h1['points'][0][0], h5['points'][0][0])
 
+    def test_packet_string_endings(self):
+        stats = MetricsAggregator('myhost')
+
+        stats.submit_packets('line_ending.generic:500|c')
+        stats.submit_packets('line_ending.unix:400|c\n')
+        stats.submit_packets('line_ending.windows:300|c\r\n')
+
+        metrics = self.sort_metrics(stats.flush())
+
+        assert len(metrics) == 3
+
+        first, second, third = metrics
+        nt.assert_equals(first['metric'], 'line_ending.generic')
+        nt.assert_equals(first['points'][0][1], 500)
+
+        nt.assert_equals(second['metric'], 'line_ending.unix')
+        nt.assert_equals(second['points'][0][1], 400)
+
+        nt.assert_equals(third['metric'], 'line_ending.windows')
+        nt.assert_equals(third['points'][0][1], 300)
+
 if __name__ == "__main__":
     unittest.main()
Repository: DataDog/dd-agent

Issue:
Windows agent connection error
agent version: 4.4
OS: Windows 2008 Standard, SP2.
case: https://datadog.desk.com/agent/case/11902
- log snippet:

> 2014-06-24 13:45:04 Eastern Daylight Time | ERROR | forwarder(ddagent.pyc:240) | Response: HTTPResponse(_body=None,buffer=None,code=599,effective_url='https://app.datadoghq.com/intake?api_key=#################',error=gaierror(11001, 'getaddrinfo failed'),headers={},reason='Unknown',request=<tornado.httpclient.HTTPRequest object at 0x01212170>,request_time=0.018000125885009766,time_info={})
> 
> 2014-06-24 13:45:04 Eastern Daylight Time | WARNING | transaction(transaction.pyc:213) | Transaction 4 in error (5 errors), it will be replayed after 2014-06-24 13:46:34
> 
> 2014-06-24 13:45:05 Eastern Daylight Time | INFO | win32.agent(agent.pyc:91) | pup has died. Restarting...
> 
> 2014-06-24 13:45:05 Eastern Daylight Time | ERROR | forwarder(ddagent.pyc:240) | Response: HTTPResponse(_body=None,buffer=None,code=599,effective_url='https://app.datadoghq.com/api/v1/series/?api_key=################',error=gaierror(11001, 'getaddrinfo failed`
- able to TCP connection (80 and 443) to app.datadoghq.com
  EDIT:
  
  > telnet app.datadoghq.com 80
  > telnet app.datadoghq.com 443
- from agent python shell:
  
  > print socket.getaddrinfo('app.datadoghq.com',443)
  > Traceback (most recent call last):
  > File "shell.py", line 13, in shell
  > File "<string>", line 1, in <module>
  > gaierror: [Errno 11001] getaddrinfo failed



Discussion:
Could you ask them how they tested the tcp connection to app.datadoghq.com please ?

yep, will do

EDIT:

telnet app.datadoghq.com 80
telnet app.datadoghq.com 443


Resolving patch:
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -94,6 +94,7 @@ def __init__(self, **kw):
                 'optimize': 0,
                 'compressed': True,
                 'bundle_files': 3,
+                'dll_excludes': [ "IPHLPAPI.DLL", "NSI.dll",  "WINNSI.DLL",  "WTSAPI32.dll"],
             },
         },
         'console': ['win32\shell.py'],


Test patch:
Repository: DataDog/dd-agent

Issue:
Nagios plugin can't process externally-submitted check result logs
Externally-submitted check result events (for example, those that result from running nsca or ncsa-ng on the server to receive passive check results) aren't parsed properly by the Nagios plugin.  

Instead, the user could end up filling syslog with warnings like:

```
dd.collector[1550]: WARNING (nagios.py:100): Ignoring unknown nagios event for line: [1408565962] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;host;syslog-ng;0;OK
```



Discussion:

Resolving patch:
diff --git a/checks.d/nagios.py b/checks.d/nagios.py
--- a/checks.d/nagios.py
+++ b/checks.d/nagios.py
@@ -32,6 +32,12 @@
     # ACKNOWLEDGE_HOST_PROBLEM;<host_name>;<sticky>;<notify>;<persistent>;<author>;<comment>
     'ACKNOWLEDGE_HOST_PROBLEM': namedtuple('E_HostAck', 'host, sticky_ack, notify_ack, persistent_ack, ack_author, payload'),
 
+    # Comment Format:
+    # PROCESS_SERVICE_CHECK_RESULT;<host_name>;<service_description>;<result_code>;<comment>
+    # We ignore it because Nagios will log a "PASSIVE SERVICE CHECK" after
+    # receiving this, and we don't want duplicate events to be counted.
+    'PROCESS_SERVICE_CHECK_RESULT': False,
+
     # Host Downtime
     # [1297894825] HOST DOWNTIME ALERT: ip-10-114-89-59;STARTED; Host has entered a period of scheduled downtime
     # [1297894825] SERVICE DOWNTIME ALERT: ip-10-114-237-165;intake;STARTED; Service has entered a period of scheduled downtime
@@ -240,6 +246,10 @@ def _parse_line(self, line):
             if fields is None:
                 self.log.warning("Ignoring unknown nagios event for line: %s" % (line[:-1]))
                 return False
+            elif fields is False:
+                # Ignore and skip
+                self.log.debug("Ignoring Nagios event for line: %s" % (line[:-1]))
+                return False
 
             # and parse the rest of the line
             parts = map(lambda p: p.strip(), remainder.split(';'))


Test patch:
diff --git a/tests/nagios.log b/tests/nagios.log
--- a/tests/nagios.log
+++ b/tests/nagios.log
@@ -629,3 +629,4 @@
 [1297900154] EXTERNAL COMMAND: DEL_SVC_COMMENT;29
 [1297900165] EXTERNAL COMMAND: SCHEDULE_FORCED_SVC_CHECK;ip-10-202-61-193;apt;1297900163
 [1297900170] SERVICE ALERT: ip-10-202-61-193;apt;OK;HARD;4;APT OK: 0 packages available for upgrade (0 critical updates).
+[1408566942] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;ip-10-114-237-165;syslog-ng;0;PROCS OK: 2 processes with command name 'syslog-ng', args 'syslog-ng', UID = 0 (root)\\n