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해 메트릭스를 송신하고 있을 뿐이므로, 꽤 스펙이 낮은 서버에서도 동작하고 있습니다.
Reference
이 문제에 관하여(Datadog를 사용하여 LAN, WAN의 Smokeping 네트워크 모니터링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/YamaguchiRei/items/fe6cae83c7b6d6873784텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)