17. Chat Integration

17. Chat Integration

Gitlab-Chat 에서 소개 드린바와 같이 Chat의 Webhook 기능을 이용하여 여러가지 통지를 받을 수 있습니다.

Bookmarklet

웹을 탐색하다가 괜찮은 기사를 발견했을때 클릭질 한번으로 Chat의 채널에 링크를 공유할 수 있습니다. Chat에서 들어오는 Webhook를 하나 만들고 token을 복사 합니다. func.php를 만들었던 디렉토리에 다음 파일을 chat.php 라고 추가 합시다.

<?php
include_once 'func.php';

$text = $_GET['text'];
$token = $_GET['token'];
$file_url = $_GET['file_url'];

if( $text != '' && $token != '') {
	$result = send_request($token, $text, $file_url);
	echo $result;
}else{
	echo '<pre>missing param</pre>';
}
?>

브라우저의 bookmark 메뉴바에서 북마크를 하나 추가 합니다. 적당한 이름을 주고 주소 창에 아래 내용을 넣습니다. 이때 코드중 token=’ + encodedURI(‘”xxxxxxxx”‘) 부분을 Chat에서 생성한 webhook의 token으로 교체합니다.

javascript: (function() {
  xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://dev.example.io/chat.php?token=' + encodeURI('"여기에 Chat의 Token을 복사해 넣습니다"') + '&text=' + encodeURI(document.location.href));
  xhr.send(null);
}());

이제 브라우저에서 서핑하다가 맘에 드는 페이지를 보시면 해당 북마크를 한번 눌러줍니다. Chat에 자동으로 게시 됩니다.

Synology 알림

DSM에는 주요 이벤트에 대해 SMS로 알려주는 ‘알림’기능이 있습니다. 이는 SMS유료 서비스에 가입해야 합니다. 따라서, 무료인 Chat을 이용하여 SMS대신 Chat으로 통지 받을 수 있도록 설정 합니다. gitlab-chat 에서 설명드린 func.php와 위에서 설명드린 chat.php 가 필요합니다.

제어판-알림을 선택 합니다.

상단 SMS 메뉴를 선택 하고 SMS 알림 활성화를 체크해 주고, SMS 서비스 제공업체 추가를 클릭 합니다.

다음을 그대로 입력 합니다(서버 주소는 바꾸셔야 합니다).

https://dev.example.io/chat.php?token=XXXXXXXX&user=1&pass=2&phone=3&a=4&text=Hello World

다음, 다음을 클릭 하고 매개변수를 다음과 같이 설정 합니다.

적용을 클릭하고, SMS 서비스 제공업체를 방금 입력한 내용으로 선택 해 줍니다. 사용자 이름, 패스워드, 패스워드 확인은 아무거나 입력하고, API 키에 chat에서 얻은 token을 %22 까지 모두 넣어 줍니다. 기본 전화 번호에 아무 번호나 입력하고 적용을 누르고, 테스트 SMS 메시지 전송을 눌러 Chat으로 통지가 오는지 확인 합니다.

Spring Boot Admin

SBA(Spring Boot Admin)에 등록된 Spring Application의 상태 변화를 Chat으로 통지 받을 수 있습니다. Spring Boot Admin의 Configuration에 다음 처럼 Bean을 등록 합니다.

@Bean
public ChatGwNotifier chatNotifier(InstanceRepository repository) {
    	return new ChatGwNotifier(repository, "https://dev.example.io/chat.php", "여기에 토큰");
}

다음 두 클래스를 추가 합니다.

public class ChatGwNotifier extends AbstractEventNotifier {
	private ChatGwClient client;
	protected ChatGwNotifier(InstanceRepository repository) {
		super(repository);
		throw new IllegalStateException("server & token must be set.");
	}

	public ChatGwNotifier(InstanceRepository repository, String server, String token) {
		super(repository);
		client = new ChatGwClient(server, token);
	}
	
	@Override
	protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
		return Mono.fromRunnable(()->{
			StringBuilder sb = new StringBuilder("Instance : ");
			sb.append(instance.getRegistration().getName()).append('(').append(instance.getId()).append(')')
			.append(", event - ").append(event.getType()).append('(').append(instance.getStatusInfo().getStatus()).append(')');
			client.send(sb.toString());
		});
	}
}
public class ChatGwClient {
	private static final String SUCCESS_STRING = "{\"success\":true}";
	private String url;
	private String token;
	private RestTemplate restTemplate;

	public ChatGwClient(String url, String token) {
		this.url = url;
		this.token = token;
		this.restTemplate = new RestTemplate();
	}

	public boolean send(String text) {
		ResponseEntity<String> response = restTemplate.getForEntity(buildRequest(text, this.token), String.class);
		return response.getStatusCode() == HttpStatus.OK && SUCCESS_STRING.equals(response.getBody());
	}

	protected String buildRequest(String text, String token) {
		return UriComponentsBuilder.fromHttpUrl(url)
			.queryParam("text", text)
			.queryParam("token", token)
			.toUriString();
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUrl() {
		return url;
	}
	public void setToken(String token) {
		this.token = token;
	}
	public String getToken() {
		return token;
	}
}

Application이 실행되거나 다운되면 Chat으로 Notification됩니다.

Grafana

Grafana에서 Alert Channel을 추가하여, 임계치에 도달한 리소스에 대한 통지를 Chat으로 받을 수 있습니다. func.php가 있는 디렉토리에 다음의 grafana.php를 추가합니다.

<?php
include_once 'func.php';

$text = '';
$file_url = '';
$token = $_GET['token'];

$data = json_decode(file_get_contents('php://input'), true);
if( $data != '' && $token != '') {
    $file_url=$data['imageUrl'];
    $text = $text.'Grafana Event : ';
    $text = $text = $text.$data['title'].', ';
    $text = $text.'Message = '.$data['message'].',';
    $text = $text.'ruleUrl = '.$data['ruleUrl'];

    $result = send_request($token, $text, $file_url);
    echo $result;
}else{
    echo '<pre>missing param</pre>';
}
?>

Grafana 에서 New Alert Channel을 선택하고 Type에 webhook을 선택 합니다. Include Image 를 체크해 주고, URL에 https://dev.example.io/grafana.php?token=Chat에서얻은토큰 을 입력해 줍니다. Http Method는 POST를 선택하고 username과 password는 아무거나 입력 합니다. Send Test 를 클릭 하여 chat으로 통지가 가는지 확인 합니다.

1 comment

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다