LINE Notify를 이용한 시스템 장애 알림 시스템

관리자는 시스템에 문제가 생겼을 경우 이에 대한 빠른 조치가 필요합니다. TUNALABS.IO에서 문제에 대한 알림을 이메일 대신 문제 발생시 즉시 푸시알림을 받을 수 있는 LINE 메신저를 고려하게 되었습니다.

이번에는 LINE Notify로 LINE으로 메시지 보내는 방법과 TUNALABS.IO의 응용사례를 소개합니다.

Access Token 발급받기

https://notify-bot.line.me/my/ (LINE 계정 필요)

위 페이지로 이동하여 [Generate token]버튼을 클릭하여 token명과 알림을 보낼 유저를 선택 후 access token을 발급받습니다.

발행된 access token은 발행최초 한 번만 보여주기 때문에 잘 메모해두어야 합니다.

저의 같은 경우 알림을 여러 명이 받아야하기 때문에 알림을 단체채팅방으로 보내도록 token을 발급받았습니다.

1352.PNG

access token 발급 후 연결된 대화방을 보여주고 있습니다.

알림 보내기

curl -X POST \
https://notify-api.line.me/api/notify \
-H 'authorization: Bearer [ACCESS_TOKEN]' \
-d message=tuna-labs-messageQ

위 CURL 명령어를 사용하여 간단한 텍스트 메시지를 보내보겠습니다.

명령어를 실행하면 다음과 같이 LINE Notify 공식계정으로부터 알림을 받을 수 있습니다.

Screenshot 2017-05-20 06.53.35.png
curl -X POST \
https://notify-api.line.me/api/notify \
-H 'authorization: Bearer [ACCESS_TOKEN]' \
-d 'message=tuna-labs-image&imageThumbnail=[IMAGE_URL]&imageFullsize=[IMAGE_URL]'

텍스트 메시지와 사진을 포함하여 보내려면 imageThumbnail와 imageFullsize의 두 Key 값에 이미지 URL을 넣고 명령어를 실행하면 다음과 같이 메시지와 함께 사진도 같이 전송됩니다.

Screenshot 2017-05-20 07.19.20.png

PHP 예제

TunaLabs에서 PHP 기반으로 구현한 알림 시스템 코드 중 일부입니다.

텍스트 메시지만 보내거나 텍스트 메시지와 사진을 함께 보낼 수 있도록 하였습니다.

<?php

namespace Powershit;

/**
 * Class Powershit
 * @package Powershit
 */
class Powershit
{

	const SERVICE_LINE_NOTIFY_API_URL = "https://notify-api.line.me/api/notify";
	const SERVICE_LINE_NOTIFY_TOKEN = "ACCESS_TOKEN";

	/**
	 * Powershit constructor.
	 */
	function __construct()
	{

	}

	/**
	 * @param $msg
	 * @param null $imgUrl
	 * @return bool|null
	 */
	public function sendMessageToLineNotify($msg, $imgUrl = null)
	{
		if ($imgUrl === null) {
			$postData = [
				"message" => $msg
			];
		} else {
			$postData = [
				"message" => $msg,
				"imageThumbnail" => $imgUrl,
				"imageFullsize" => $imgUrl
			];
		}

		$fields = '';

		foreach ($postData as $key => $value) {
			$fields .= $key . '=' . $value . '&';
		}
		rtrim($fields, '&');

		$curlOptions = [
			CURLOPT_URL => $this::SERVICE_LINE_NOTIFY_API_URL,
			CURLOPT_POST => 1,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_ENCODING => "",
			CURLOPT_MAXREDIRS => 10,
			CURLOPT_TIMEOUT => 30,
			CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
			CURLOPT_POSTFIELDS => $fields,
			CURLOPT_HTTPHEADER => [
				"authorization: Bearer " . $this::SERVICE_LINE_NOTIFY_TOKEN,
				"content-type: application/x-www-form-urlencoded"
			],
		];

		$curl = curl_init();
		curl_setopt_array($curl, $curlOptions);

		$response = curl_exec($curl);
		$err = curl_error($curl);
		curl_close($curl);

		if ($err) {
			return null;
		} else {
			$lineResponse = json_decode($response, true);
			$lineResponse["status"];
			if ($lineResponse === 200) {
				return true;
			} else {
				return false;
			}
		}
	}
}

$lineNotify = new Powershit();

$lineNotify->sendMessageToLineNotify('Message');
//$lineNotify->sendMessageToLineNotify('Test Message', 'http://image-url');

PHP 7 이상에서 정상작동 확인했습니다.

응용

alerting-line-01.png

TunaLabs에서는 시스템 상황을 이렇게 간편하게 알림을 받을 수 있도록 구현했습니다.

왼쪽은 HIT 알림과 온도 이상 알림, 오른쪽은 상황 보고서입니다.

PHP와 NODE.JS 기반으로 짜여진 스크립트로 모니터링 서버에 일정시간 간격마다 접속하여 설정한 데이터 필드를 쿼리합니다.

중요한 필드는 1분주기, 덜 중요한 필드는 5분 주기로 쿼리하여 설정된 상/하한값 범위에 들지 않거나(예를 들어 장비의 온도나 습도, 전압 등), 데이터 누락, 장비 미응답 등의 문제가 발생할 경우 즉시 라인 메신저로 푸시알림을 보내줍니다.

마지막으로 매 3시간마다 주요필드를 요약하여 그래프와 메시지를 함께 보내줍니다.

지금까지

LINE Notify를 사용하여 LINE으로 메시지를 보내는 방법을 알아보았습니다.

이메일은 맨날 확인하기는 귀찮고해서 주 사용 메신저가 라인인 관계로 이쪽으로 알림을 보낼 수 있는 방법을 이래저래 삽질하다가 LINE Notify를 발견하여 원하는 기능을 제대로 구현할 수 있었습니다.


참고

2 comments

  1. 개발노트만 봤을 때는 이게 무슨 소리인가…엄청 고민했는데, 포스팅 덕분에 쉽게 이해가 됐습니다. 감사합니다!

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.