Datadog를 사용하여 LAN, WAN의 Smokeping 네트워크 모니터링

하고 싶었던 일



Smokeping 을 사용하여 네트워크의 특정 구간의 대기 시간이나 파케로스 등의 네트워크 품질 감시를 하고 있었습니다만, 이것이 낡은 OSS이므로 아무래도 괴롭다… 그렇다고는 해도, Pingdom등의 서비스에서는, 위치는 선택해도 엄밀한 시점은 선택할 수 없고, 또, LAN의 부분은 감시할 수 없습니다. 그리고 Zabbix를 세우는 것도 정직하고 싶지 않아 ...
그래서 Datadog 을 사용하여 유사한 모니터링을 시도했습니다. 덧붙여서, 시험만 있으면 무료 버전에서도 할 수 있습니다!

구성 개요



등장인물은 2종류만

Datadog(클라우드 서비스)



htps //w w. 다만 ghq. 코m/
지표를 저장하고 그래프를 그립니다.

측정 서버(클라우드 or 물리적)



EC2 또는 GCE 또는 온프레 물리적 서버일 수 있지만 Datadog Agent를 설치하고 측정합니다. 이것이 네트워크 감시의 시작점입니다.

완성된 이미지



3개의 그래프는 왼쪽에서 RTT, 파케로스, 시도 횟수가 되어 있습니다. (시행 횟수는 계측이 잘 되고 있는지 확인용…)
그리고, $from 가 계측원, $locate 가 계측처, $isp 가 계측처 회선의 ISP 로, 이것을 선택하면 좁힐 수가 있게 되어 있습니다.



만드는 방법



사전 준비



Datadog를 사용할 수 있는 상태로 하는 곳은, 이하와 같은 기사를 참고에 부탁합니다…
Datadog 소개

맞춤 메트릭 수집



Datadog의 사용자 지정 메트릭을 사용하므로 /etc/dd-agent/checks.d/etc/dd-agent/conf.d에 다음 파일을 설치합니다. (conf.d는 사용자 정의하십시오)

checks.d/ping.py
#!/usr/bin/env python

import subprocess
import re
import time
from checks.network_checks import NetworkCheck, Status


class PingCheck(NetworkCheck):
    def __init__(self, name, init_config, agentConfig, instances):
        NetworkCheck.__init__(self, name, init_config, agentConfig, instances)
        for instance in instances:
            if not instance.get('isp', None):
                raise Exception("All instances should have a 'isp' parameter")
            # for initialize loss cnt
            self.__simple_increment(instance, 'loss_cnt', 0)

    def _check(self, instance):
        start = time.time()
        p = Ping(instance['addr'], self.init_config.get('ping_timeout', 4))
        for i in range(self.init_config.get('check_times', 1)):
            try:
                p.run()
                self.__simple_histogram(instance, 'rtt', p._rtt)
                time.sleep(self.init_config.get('interval', 0.1))
                ret = (Status.UP, "UP")
            except:
                self.__simple_increment(instance, 'loss_cnt')
                ret = (Status.DOWN, "DOWN")
            finally:
                self.__simple_increment(instance, 'total_cnt')
        elapsed_time = time.time() - start
        self.log.info("name:%s, elapsed_time:%s[sec]"
                      % (instance['name'], round(elapsed_time, 2)))
        return ret

    def __simple_increment(self, instance, category, value=1):
        self.increment(
               '%s.%s' % (self.init_config.get('basename', 'ping'),
                          category),
               value,
               tags=['isp:%s' % instance['isp'],
                     'locate:%s' % instance['name']]
        )

    def __simple_histogram(self, instance, category, value):
        self.histogram(
               '%s.%s' % (self.init_config.get('basename', 'ping'),
                          category),
               value,
               tags=['isp:%s' % instance['isp'],
                     'locate:%s' % instance['name']]
        )

    def report_as_service_check(self, sc_name, status, instance, msg=None):
        pass

    def _create_status_event(self, sc_name, status, msg, instance):
        # TODO 5.3 remove that
        pass


class Ping(object):
    def __init__(self, host, timeout):
        self._host = host
        self._timeout = timeout

    def run(self):
        ping = subprocess.Popen(
                ["ping", "-c", "1", "-W", str(self._timeout), self._host],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
                )
        out, error = ping.communicate()
        if error:
            raise Exception('[NG]: ServerName->%s, Msg->"%s"'
                            % (self._host, error.rstrip()))
        else:
            try:
                self._ttl = int(re.search("(?<=ttl=)[\d\.]+", out).group())
                self._rtt = float(re.search("(?<=time=)[\d\.]+", out).group())
            except AttributeError:
                raise Exception('[NG]: ServerName->%s, Msg->"%s"'
                                % (self._host, 'cannot connect'))

※최신판은 Gist 로 공개하고 있습니다

conf.d/ping.yaml
init_config:
    basename: ping
    check_times: 10
    threads_count: 6
    interval: 0.1

instances:
    - addr: x.x.x.x
      isp: HOGEHOGE
      name: [location name]
    - addr: x.x.x.y
      isp: HOGEHOGE2
      name: [location name]

이러한 파일을 설치한 후, 설정이 잘 되고 있는지는 다음의 커멘드로 확인할 수 있습니다
sudo -u dd-agent dd-agent check ping

문제가 없는 경우 agent를 다시 시작하여 지표 수집을 시작합니다.

대시보드 및 그래프 만들기



수집되는 메트릭스 그 자체라면, 데이터로서는 조금 보기 어렵기 때문에, 대시보드&그래프를 작성해 보기 쉽게 합니다. 각 그래프를 만드는 방법은 다음 이미지와 같습니다.

RTT





파케로스





데이터 취득 건수





$from 에는 host 태그(datadog의 디폴트), $locate 에는 name 태그, $isp 에는 isp 태그를 맞추고 있습니다

결론



계측 서버에는 30개소 정도를 계측시키고 있습니다만, Ping해 메트릭스를 송신하고 있을 뿐이므로, 꽤 스펙이 낮은 서버에서도 동작하고 있습니다.

좋은 웹페이지 즐겨찾기