본문 바로가기

Open Source

APM(Scouter) Alert 설정 및 지표, 기능, Plugin 활용

반응형

APM(Scouter) 소개 및 구축

이전 포스팅 참고 https://developercc.tistory.com/30

 

APM(Scouter) 소개 및 구축

APM APM에 대하여 APM은 Application Performance Management 라고 한다. 어플리케이션의 성능을 관리하고 통제하는 모니터링 도구라고 할 수 있다. 서비스를 운영함에 있어서 APM의 활용은 많은 이점을 주기

developercc.tistory.com

Scouter Alert 설정

Scouter Alert은 Scouter Client(이클립스 기반)에서 여러 지표에 관한 Alert 설정이 가능하다.

아래 스크린샷은 Elapsed Time 지표 Alert을 설정하는 화면이다.

Alert Script를 통해 간단하게 자바 기반으로 스크립트를 짤 수 있다. 아래는 Elapsed Time이 2000ms 이상일 경우 Alert이 발생하도록 하는 스크립트이다.

Scouter Alert Settings

또한 스카우터는 설정한 Alert을 외부로 알림이 가능하다.

위에서 설정한 Elasped Time Alert을 Teams로 알림 발송 하였다.

스카우터는 확장을 가능하게 만들어 주는 Plugin을 지원하므로, Plugin을 통하여 스카우터 수집 데이터를 선 처리 할 수 있다. 이런 Plugin을 수정하여 입맛에 맞게 사용할 수 있으며, 혹은 새로운 Plugin을 만들 수 있다.

 

Scouter Plgin은 기본적으로 지원하는 Slack, E-mail, Telegram 등 알림을 받을 수 있도록 플러그인을 지원하지만 Teams는 없었다. 그러므로 직접 구현 하는 수 밖에 없다.

 

Scouter Plugin Github 주소 : https://github.com/scouter-project/scouter-plugin-server-null.git

위 Github 프로젝트를 받아와서 Plugin을 이용하여 직접 Teams Incoming Webhook을 통해 Alert을 알림 받도록 구현하였다.

 

NullPlugin.java

package scouter.plugin.server.none;
 
import scouter.lang.pack.*;
import scouter.lang.plugin.PluginConstants;
import scouter.lang.plugin.annotation.ServerPlugin;
import scouter.server.Configure;
 
/**
 * @author Gun Lee (gunlee01@gmail.com) on 2016. 3. 19.
 */
public class NullPlugin {
    Configure conf = Configure.getInstance();
 
    // 설정한 Alert 발생 시
    @ServerPlugin(PluginConstants.PLUGIN_SERVER_ALERT)
    public void alert(AlertPack pack){
        if(conf.getBoolean("ext_plugin_null_alert_enabled", true)) {
            // Teams 알림 발송
            AlertToTeams.sendTeamsMessage(pack);
        }
    }
 
    ... 생략
 
    @ServerPlugin(PluginConstants.PLUGIN_SERVER_XLOG)
    public void xlog(XLogPack pack){
        if(conf.getBoolean("ext_plugin_null_xlog_enabled", true)) {
//            Test.sendTeamsMessage(pack);
        }
    }
}

 

AlertToTeams.java

package scouter.plugin.server.none;
 
import scouter.lang.TextTypes;
import scouter.lang.pack.AlertPack;
import scouter.lang.pack.XLogPack;
import scouter.server.core.AgentManager;
import scouter.server.db.TextRD;
import scouter.util.DateUtil;
 
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class AlertToTeams {
	// temas incoming webhook url
    private static final String TEAMS_WEBHOOK_URL = "https://teams...";
 
    private static String createTeamsMessage(AlertPack pack) throws Exception {
        StringBuilder payload = new StringBuilder();
        payload.append("{");
        payload.append("\"@type\": \"MessageCard\",");
        payload.append("\"@context\": \"https://schema.org/extensions\",");
        payload.append("\"themeColor\": \"").append(pack.level).append("\",");
        payload.append("\"title\": \"")
                .append("Scouter Alert!")
                .append("\",");
        payload.append("\"text\": \"")
                .append("\\\\[")
                .append(AgentManager.getAgentName(pack.objHash))
                .append("\\\\] ")
                .append("\\\\\n")
                .append(pack.message)
                .append("\",");
        payload.append("}");
 
        return payload.toString();
    }
 
    public static void sendTeamsMessage(AlertPack pack) {
        try {
            URL url = new URL(TEAMS_WEBHOOK_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
            String payload = createTeamsMessage(pack);
 
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setRequestProperty("Content-Length", String.valueOf(payload.getBytes().length));
 
            OutputStream os = connection.getOutputStream();
            os.write(payload.getBytes());
            os.close();
 
            int responseCode = connection.getResponseCode();
            if (responseCode != HttpURLConnection.HTTP_OK) {
                System.err.println("Failed to send alert to Microsoft Teams: " + responseCode);
            }
        } catch (Exception e) {
            System.err.println("Failed to Server: " + e.getMessage());
        }
    }
 
}

 

Scouter 모니터링 지표 소개 및 활용

API 호출 기록(XLog)

  • Http 요청부터 응답까지 한 단위로 묶인 하나의 트랜잭션 처리 시간 별 지표 제공
  • 아래 차트 데이터를 마우스로 drag하여 일부 점들을 선별하여 선택할 수 있다.
  • 이렇게 선택된 트랜잭션들은 리스트로 나타나며, 리스트에서 하나를 선택하면 해당 트랜잭션에 대한 상세 정보를 볼 수 있다.

XLog
drag로 선택 된 트랜잭션 리스트
1개의 트랜잭션에 대한 상세 정보

 

  • 서비스 연계 추적도 가능하다. 특히 MSA 환경에서 server to server의 통신에 대해 추적 할 수 있다.

  • XLog 점들에 대한 통계를 바로 확인할 수 있는 기능도 제공한다. 예를 들면 각 서비스에 대한 총 호출 건수 및 총 응답시간, 평균 응답시간, SQL 및 API 호출에 대한 평균 응답시간 등을 확인 할 수 있다.
  • Filter를 이용하여 원하는 조건의 XLog 데이터를 확인 할 수 있다. 예를 들면 Error가 발생한 요청, SQL이 포함된 요청 등등 이다.

 

JVM GC 횟수 및 소모 시간

 

JVM Heap 메모리

 

JVM Perm Used

  • GC 대상에서 제외되는 영역 메모리를 확인할 수 있다.

 

자바 어플리케이션 CPU 사용율

 

TPS(Transactions Per Second)

  • TPS는 서비스의 성능 기준이 된다. TPS가 더 이상 증가하지 않는 지점을 Saturation Point라고 한다.
  • Saturation Point가 넘으면서 사용자가 더 몰리면 TPS가 증가하지 않고 고정된 수치에서 응답 시간이 길어진다.
  • 부하 테스트 및 스펙 산정으로 활용이 가능하다.

 

SQL Time by Service

 

로그 저장 비율 선정

  • 따로 설정하지 않았다면, 스카우터의 지표 데이터는 스카우터 서버(수집기) 내부에 저장 된다.
  • 만약 장비 디스크가 가득 차게 된다면 해당 장비에 있는 다른 서비스들도 영향을 줄 수 있기 때문에 위험하다.
  • 스카우터는 OS의 디스크 사용량이 특정 비율을 넘게 된다면 스카우터의 오래된 데이터부터 삭제하도록 설정 할 수 있다.
  • 스카우터 서버 설정 중 mgr_purge_disk_usage_pct라는 설정에 비율을 입력해주면 된다.

 

Reference

https://team-platform.tistory.com/19

반응형