티스토리 뷰

안녕하세요 강정호입니다.

올해 7~8월까지 Cloudwatch API를 사용한 서버 모니터링 시스템을 개발하는 프로젝트를 진행했습니다. 제가 개발한 서버 API 코드에 대해 설명 드릴게요.



서버 모니터링 시스템 개요




기존 AWS Cloudwatch 시스템의 문제점 및 개선방안






Cloudwatch API 연동 1단계 : 인증된 사용자 객체 생성하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public AmazonCloudWatchClient createAmazonCloudWatchClient(String key1, String key2, 
String endPoint) {
        
        /*API CALL을 요청할 사용자 객체 정보입력*/
        setKey1(this.key1); //Key1은 Cloudwatch 접속에 필요한 accessKey
        setKey2(this.key2); //Key2는 Cloudwatch 접속에 필요한 secretKey
        setEndPoint(this.endPoint); //Endpoint는 원격 서버가 위치한 리전의 엔드포인트
        
        /*BasicAWSCredentials 인증 객체 생성*/
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(getKey1(),
                getKey2());
        
        /*위에서 생성한 인증 객체를 AmazonCloudwatchClient 객체에 주입*/
        AmazonCloudWatchClient amazonClient = new AmazonCloudWatchClient(awsCreds);
        amazonClient.setEndpoint(getEndPoint());// 엔드 포인트 
        System.out.println("=====AmazonCloudWatchClient 생성 완료=========");
        return amazonClient;
    }
cs


Cloudwatch API 연동을 하기 위해서는 API 콜을 하기 위한 AmazonCloudwatchClient 객체를 생성하는 것이 핵심입니다. 인증된 AmazonCloudwatchClient 객체를 생성하기 위해서는

  • 1단계 : AccessKey, SecretKey, Endpoint 입력.
  • 2단계 : BasicAWSCredentials 인증 객체 생성
  • 3단계 : AmazonCloudwatchClient 객체에 BasicAWSCredentials 인증 객체 주입.
위 3단계를 거치면 인증된 사용자 객체를 생성할 수 있습니다. 이 사용자 객체를 사용하여 API 콜을 하게 됩니다.


Cloudwatch API 연동 2단계 : Request 객체로 API 호출하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*Request 객체를 생성하여 request리스트에 추가하는 코드*/
List<GetMetricStatisticsRequest> getMetricStatisticsRequest=new ArrayList<GetMetricStatisticsRequest>();
for(int i=0; i<dimenNameList.size(); i++){
    getMetricStatisticsRequest.add//Dimension이름, Dimension값, 지표 정보 등을 입력하여 Request정보를 생성한다.
            metricStat.createMetricStatisticsRequest(dimenNameList.get(i), 
    dimenValueList.get(i), metricNamespaceList.get(i)));
}
 
/*Cloudwatch로부터 받은 resultList에 관한 코드*/
List<GetMetricStatisticsResult> resultList=new ArrayList<GetMetricStatisticsResult>();
for(int k=0; k<dimenNameList.size(); k++){
    System.out.println("매트릭스 request 정보 : "+getMetricStatisticsRequest.get(k).toString());
 
    //생성된 Request정보를 이용하여 Cloudwatch API 콜을 한다.
    resultList.add(amazonCloudWatchClient.getMetricStatistics(getMetricStatisticsRequest.get(k)));
}
cs


Request 객체를 생성하는 이유?

Cloudwatch API를 호출하기 위해서는 다음과 같은 정보들이 필요하다.

- 디멘션 이름 : 원격 서버가 가지는 이름

- 디멘션 값 : 원격 서버 인스턴스 고유의 ID. 중복되지 않는 유니크한 아이디이다.

- 지표 이름 : API를 통해 응답받을 때 어떤 지표 데이터를 받을 것인가?

- 지표 네임스페이스 : 어떤 원격 서버의 지표를 받을 것인가? AWS/EC2, AWS/RDS 등등.

- 시작 시점, 끝나는 시점 : 시작과 끝나는 시점 사이의 지표를 가져온다.

- 통계 유형

- 단위


위의 정보들을 모두 가지고 있는 것이 Request 객체이다. 이 객체를 이용하여

1
amazonCloudWatchClient.getMetricStatistics(리퀘스트 객체));
cs
위와 같이 API 콜을 할 수 있다.



Cloudwatch API 연동 3단계 : 응답 받은 객체를 DB에 저장하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*Result객체의 datapoint를 List<Response>에 넣기*/
//ResponseVO 객체가 1개 만들어질 때마다 insert문 호출
for(int j=0; j<4; j++){
    for(int i=0; i<resultList.get(j).getDatapoints().size(); i++){
        ResponseVO respVO=new ResponseVO();
        respVO.setRespNo(null); //응답의 고유 시퀀스 번호. DB insert 시 자동 발행.
        respVO.setReqNo(Integer.toString(reqNo)); //Request 객체의 번호
        respVO.setMaxVal(Math.round((resultList.get(j).getDatapoints().get(i).getMaximum())*100d)/100d);
        respVO.setAvgVal(Math.round((resultList.get(j).getDatapoints().get(i).getAverage())*100d)/100d);
        respVO.setTimeStamp(resultList.get(j).getDatapoints().get(i).getTimestamp());
        respVO.setUnit(resultList.get(j).getDatapoints().get(i).getUnit());
        respVO.setLabel(resultList.get(j).getLabel());
        respVO.setCpuName(reqList.get(j).getCpuName());
        dashBoardDAO.insertResponse(respVO);
    }
}
cs


위와 같이 응답 받은 객체를 for 문을 돌린 후에 insertResponse() 함수를 호출하여 DB에 저장합니다. (컬렉션 insert 참고 링크)

DB에 insert하는 MyBatis 쿼리문은 다음과 같아요.

1
2
3
4
5
6
7
<insert id="insertResponse" parameterType="responseVO">
    <selectKey keyProperty="respNo" resultType="String" order="BEFORE">
        select resp_no.nextval from dual
    </selectKey>
    INSERT INTO c_response(resp_no, req_no, max_val, avg_val, time_stamp, unit, label, cpu_name)
    VALUES(#{respNo}, #{reqNo}, #{maxVal},#{avgVal},#{timeStamp}, #{unit}, #{label},#{cpuName})
/insert>
cs




이상으로 서버 모니터링 시스템을 개발할 때 가장 핵심이었던 Cloudwatch API 연동하는 코드에 대해 소개해 드렸습니다.





댓글